【Linux后端服务器开发】进程与地址空间概述

目录

一、进程创建

二、进程状态

1. 运行状态R

2. 睡眠状态S

3. 僵尸状态Z

4. 孤儿进程

三、进程优先级 PRI

四、地址空间的层次结构

五、虚拟地址和物理地址


一、进程创建

  • fork()函数创建子进程,若创建成功,则给父进程返回子进程的pid,给子进程返回0
  • 父子进程关系:子进程ppid == 父进程pid
  • 父子进程可同时运行,互不干扰
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() 
{pid_t id = fork();if (id == 0) {while (1) {printf("这是一个子进程,pid=%d, ppid=%d\n", getpid(), getppid());sleep(1);}}else {while (1) {printf("这是一个父进程,pid=%d, ppid=%d\n", getpid(), getppid());sleep(1);}}return 0;
}

进程特性:

  • 竞争性:系统进程数目众多,但cpu只有少数,所有进程之间根据优先级有了竞争性
  • 独立性:多进程运行,需要独享各种资源,各个进程之间互不干扰
  • 并行:多个进程在多个cpu上,分别同时进行运行
  • 并发:多个进程在一个cpu上,采用进程切换的方式,在一段时间内让多个进程得以推进

进程在切换的时候,进行上下文保护,上下文是寄存器内的数据

进程在恢复的时候,进行上下文修复

二、进程状态

查看进程状态: ps ajx | head -1 && ps ajx | grep "myproc"

  • 杀死进程: kill -9 pid
  • 暂停进程: kill -19 pid
  • 继续进程: kill -18 pid
  • 进程状态带+号,代表是前台进程,否则是后台进程
  • 前台进程在终端运行,后台进程不受终端控制

进程状态STAT:

  • R:running,运行状态
  • X:dead
  • Z:zombie,僵尸状态,进程退出了但是还没被(父进程/os)回收
  • T:stopped,暂停状态
  • D:disk sleep,深度睡眠状态,改状态下的进程无法被os杀死
  • S:sleeping,睡眠状态

1. 运行状态R

int main() 
{while (1);return 0;
}

 

2. 睡眠状态S

程序运行的时候,99%以上的时间在等待加载,1%的时间在执行

int main() 
{while (1) {printf("pid = %d\n", getpid());}
}

3. 僵尸状态Z

子进程结束了,但是父进程和os并没有回收子进程,子进程进入僵尸状态

int main() 
{pid_t id = fork();if (id == 0) {while (1) {printf("子进程:pid=%d, ppid=%d\n", getpid(), getppid());sleep(5);exit(1);}}while (1) {printf("父进程:pid=%d, ppid=%d\n", getpid(), getppid());sleep(1);}
}

4. 孤儿进程

父进程结束了,但是子进程还在运行

孤儿进程会被os领养,变成后台进程

int main() 
{pid_t id = fork();if (id == 0) {while (1) {printf("子进程:pid=%d, ppid=%d\n", getpid(), getppid());sleep(1);}}else {while (1) {printf("父进程:pid=%d, ppid=%d\n", getpid(), getppid());sleep(5);exit(1);}}
}

三、进程优先级 PRI

  • linux支持进程运行中,进行优先级调整(修改nice值)
  • 最终优先级 = 原优先级 + nice值
  • 每一次设置,原优先级都默认变为80
  • 优先级的数值越小,优先级别越高
  • nice的取值范围[-20, 19]

四、地址空间的层次结构

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct AddRoom 
{int code_start;int code_end;int init_start;int init_end;int heap_start;int heap_end;int stack_start;int stack_end;//...
};  //虚拟地址空间数据结构int g_unval;
int g_val = 100;int main(int argc, char* argv[], char* env[]) 
{printf("code addr: %p\n", main);const char* str = "hello";printf("the const str addr: %p\n", str);printf("init globle addr: %p\n", &g_val);printf("uninit globle addr: %p\n", g_unval);char* heap_mem0 = (char*)malloc(10);char* heap_mem1 = (char*)malloc(10);char* heap_mem2 = (char*)malloc(10);char* heap_mem3 = (char*)malloc(10);printf("heap addr: %p\n", heap_mem0);printf("heap addr: %p\n", heap_mem1);printf("heap addr: %p\n", heap_mem2);printf("heap addr: %p\n", heap_mem3);printf("stack addr: %p\n", &heap_mem0);printf("stack addr: %p\n", &heap_mem1);printf("stack addr: %p\n", &heap_mem2);printf("stack addr: %p\n", &heap_mem3);for (int i = 0; i < argc; ++i) {printf("argv[%d]: %p\n", i, argv[i]);}for (int i = 0; env[i]; ++i) {printf("env[%d]: %p\n", i, env[i]);}return 0;
}

运行结果:

五、虚拟地址和物理地址

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>int g_val = 100;int main() 
{pid_t id = fork();if (id < 0) {printf("子进程创建失败\n");return 1;}else if (id == 0) {int cnt = 0;while (1) {printf("子进程: pid=%d, ppid=%d, g_val=%d, &g_val=%p\n", getpid(), getppid(), g_val, &g_val);sleep(1);++cnt;if (cnt == 5) {g_val = 300;printf("子进程已将全局变量修改为 300 \n");}}}else {while (1) {printf("父进程: pid=%d, ppid=%d, g_val=%d, &g_val=%p\n", getpid(), getppid(), g_val, &g_val);sleep(1);}}return 0;
}

执行结果:

原理:

虚拟地址存在的意义:

  • 阻止非法访问,保护物理内存数据
  • 内存管理模块与进程管理模块进行了解耦合
  • 防止物理空间内存浪费
  • 地址空间+页表,将内存分部有序化
  • 实现对程序的分批加载,分批换出

虚拟地址转换为物理地址:

  • 地址空间是进程能看到的资源窗口
  • 页表决定进程真正拥有资源的情况
  • 合理的对地址空间空间+页表进行资源划分,我们可以对一个进程的所有资源进行分类管理

  • 先用虚拟地址的前10位查页目录
  • 再用虚拟地址的中间10位查页表
  • 最后用虚拟地址的后12位查页内偏移
  • 磁盘内每一个页帧的大小为4KB,对应最大页内偏移量为2^12
  • 页表只有在需要使用的时候才被创建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20884.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP以及Servlet的学习

HTTP和Servlet 联系&#xff1a; HTTP是一个通信协议&#xff0c;而Servlet是服务器端程序&#xff0c;用于处理HTTP请求。Servlet通常用于处理HTTP请求&#xff0c;在服务器上生成动态内容&#xff0c;并生成HTTP响应。HTTP协议就是Servlet处理的基础。 区别&#xff1a; …

【图像处理】Python判断一张图像是否亮度过低

比如&#xff1a; 直方图&#xff1a; 代码&#xff1a; 这段代码是一个用于判断图像亮度是否过暗的函数is_dark&#xff0c;并对输入的图像进行可视化直方图展示。 首先&#xff0c;通过import语句导入了cv2和matplotlib.pyplot模块&#xff0c;用于图像处理和可视化。 i…

解决win11中快捷键不能使用的问题(shift+F6)

1.背景 windows11在某次开机之后&#xff0c;idea的shiftF6快捷键不生效了&#xff0c;很不方便。本来想着凑合着用吧&#xff0c;但是越凑合越不爽&#xff01;直到今天&#xff0c;一定得搞定这个问题。在网上找了好几种检测热键冲突的软件&#xff0c;在windows11上&#x…

C语言进阶之指针的进阶

指针的进阶 1. 字符指针2. 指针数组3. 数组指针3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4. 数组参数、指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 5. 函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数9. 指…

汇报方案设计方案规划方案资源下载

标题汇报方案设计方案规划方案资源下载https://wheart.cn/so/home?mdw&tag%E5%AE%89%E5%85%A8文章标签事业单位人事人才信息综合管理系统建设设计报价方案人事系统,人事人才,事业单位,工资系统,职称系统xx纪检委智慧监督平台建设方案汇报.docx建设方案,规划设计,汇报方案营…

HTML语法

文章目录 前言HTML 文件基本结构常见标签标签种类特殊符号图片链接a链接 双标签链接 列表表格 &#xff1a;表单多行文本域: 前言 HTML是有标签组成的 <body>hello</body>大部分标签成对出现. 为开始标签, 为结束标签. 少数标签只有开始标签, 称为 “单标签”. 开…

Acwing:第 111 场周赛(2023.7.12 C++)

目录 5047. 1序列 题目描述&#xff1a; 实现代码&#xff1a; 5048. 无线网络 题目描述&#xff1a; 实现代码&#xff1a; 二分 贪心 5049. 选人 题目描述&#xff1a; 实现代码&#xff1a; 数学 5047. 1序列 题目描述&#xff1a; 实现代码&#xff1a; #incl…

MySQL(九):MySQL语法-高级

MySQL语法-高级 LIMITLIKEASCREATE UNIQUE INDEX、DROP INDEXCREATE VIEW、DROP VIEWGROUP BYHAVINGMYSQL - JOININNER JOIN、JOINLEFT JOIN、LEFT OUTER JOINRIGHT JOIN、RIGHT OUTER JOINLEFT JOIN ... WHERE ...RIIGHT JOIN ... WHERE ... TRUNCATE TABLEINSERT INTO 表1 (列…

反垄断在中国

中国通过反垄断法 中国通过了具有里程碑意义的反托拉斯立法,外国企业表示谨慎性的欢迎,希望该法案能带来更大的开放性,但需要观察它是如何实施的。(华尔街日报 2007年8月32日报道) 反垄断法禁止垄断协议和诸如卡特尔及价格操纵,但允许能促进创新和技术进步的垄断之存在。…

C人脸识别

1、原始图片&#xff1a; 2、灰度化下&#xff1a; 3、均值滤波&#xff1a; 4、 二值图加边缘检测 5、生成积分图 6、把待检测的人脸区域划分为25个&#xff0c;因为是一个数组&#xff0c;这样分别统计每个区域的像素个数&#xff1a; x0: 60, y0: 100, x1: 157, y1: 200 …

动态内存管理

目录 动态内存分配存在的原因 动态内存函数的介绍 malloc和free calloc realloc 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟…

Vue+elementUI实现下拉框多选和反选

Vue代码如下&#xff1a; <el-form-item label"下拉框名称&#xff1a;"><el-select size"mini" v-model"testModelName" focus"getSelectInfo" :disabled"SelectStyle" filterable clearable placeholder"&…

基于 FPGA 的 HDMI/DVI 显示

文章目录 前言一、HDMI 与 DVI 的区别与联系1.1 DVI 接口含义1.2 HDMI 接口含义1.3 HDMI 与 DVI 的区别1.4 HDMI 与 DVI 的兼容性1.5 HDMI 与 DVI 接口对比 二、DVI 数据链路介绍2.1 输入接口层2.2 TMDS 发送器2.3 TMDS 接收器2.4 输出接口层 三、传输原理与实现3.1 TMDS原理3.…

express框架使用express-generator工具

1.全局安装 npm install -g express-generator 2.检测是否安装成功 express -h 3. 快速创建Express应用程序的工具 express -e express-generator 说明&#xff1a;express-e和express-generator都是用于快速创建Express应用程序的工具。express-e是一个命令行工具&#xff0…

基于Javaweb实现ATM机系统开发实战(九)存款功能实现

先看前端界面确定后端需要处理的参数&#xff0c;把一些参数进行修改&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com…

ubuntu使用WHEELTE N100并用rviz显示

写在最开头&#xff0c;如果wheeltec n100被自己改动过参数导致无法读取数据&#xff0c;建议在window的上位机中恢复出厂设置并重新上电&#xff0c;在转入ubuntu。因为我就是这个问题&#xff0c;客服远程操控才帮我解决的。 所有官方资料共享&#xff0c;侵删&#xff1a; …

bug:file name too long文件名超出系统最大限制

各操作系统支持最长的文件和目录名称长度&#xff08;Linux、Win、Mac&#xff09; 今天开发需求的时候发现无法新建文件&#xff0c;提示file name too lang&#xff0c;于是翻阅和查询了一些资料&#xff0c;发现不同操作系统下文件名和目录名最长的长度不同。 操作系统文件名…

Live800在线客服系统:工单系统如何提升企业服务效率?

随着企业规模的扩大和客户需求的增加&#xff0c;如何有效地管理客户服务日益成为企业发展过程中重要的一环。作为客户服务的重要支撑系统之一&#xff0c;工单系统被越来越多的企业所采用。那么工单系统究竟是如何帮助企业提升服务效率的呢&#xff1f;本文将从工单的分配、追…

LeetCode[470]用Rand7()实现Rand10()

难度&#xff1a;Medium 题目&#xff1a; 给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数&#xff0c;试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。 你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。 每个测试用例将有一个内部…

Android Java代码与JNI交互 JNI访问Java构造方法(九)

🔥 Android Studio 版本 🔥 🔥 创建包含JNI相关函数类 JNIConstructorClass.java 🔥 package com.cmake.ndk1.jni;import com.cmake.ndk1.model.Animal;public class JNIConstructorClass {static {System.loadLibrary("constructor-class-lib");}public …