- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36040 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13753
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 10
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
---|
签到天数: 74 天 [LV.6]常住居民II
群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
文章目录
进程的概念理解
进程 的内部结构 与行为
进程在内核中的组织形式:进程控制块(PCB)
进程的状态
文件管理结构
内存管理结构
进程之间的结构关系
进程环境
进程的用户空间布局
命令行参数
环境变量
创建进程
fork函数的工作流程
fork函数执行后父子进程的主要异同
父子进程共享文件
fork用法
vfork
参考
主要以linux进程为例
进程的概念理解
为何引入进程?
世界可以看作是过程的集合体,进程这一概念很好的体现了这一点,每个进程相当于一个独立的过程。
操作系统,需要控制它的子民,其中一个便是进程,它需要了解进程的基本状况,以便于宏观规划、调度。
专业理解:
程序是包含可执行代码以及执行代码需要的数据等信息的文件,存放在磁盘等介质上。
当程序被操作系统装载到内存并分配给它一定资源后,此时可称为进程。
程序是静态概念,进程是动态概念。
进程 的内部结构 与行为
通过查看进程相关的核心结构(PCB),我们能够从表明上了解、推测进程所具有的基本功能、行为。
进程在内核中的组织形式:进程控制块(PCB)
首先介绍进程的控制块,是因为后面的要讲的主要内容是围绕着PCB展开的。
【进程状态】反映了进程生命周期的存在。
【调度信息】为操作系统提供进程调度依据
【文件管理】文件资源的相关使用
…(更多内容将在后面展开)
进程控制块(task_struct结构)在代码层次的体现:
与上面的文字信息对比体会下面各个变量的含义
pid_t pid;
uid_t uid,euid;
gid_t gid,egid;
volatile long state;
int exit_state;
unsigned int rt_priority;
unsigned int policy;
struct list_head tasks;
struct task_struct *real_parent;
struct task_struct *parent;
struct list_head children,sibling;
struct fs_struct *fs;
struct files_struct *files;
struct mm_struct *mm;
struct signal_struct *signal;
struct sighand_struct *sighand;
cputime_t utime, stime;
struct timespec start_time;
struct timespec real_start_time;tas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
进程的状态
其在进程控制块中体现为:
volatile long state;
1
state成员的可能取值如下(意味着进程的生命周期状态):
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
1
2
3
4
5
进程状态的转化图:
文件管理结构
文件管理相关的结构:
【文件在操作系统中的表示】 通过下面的3张表:(1)文件描述表;(2)文件表;(3)索引结点表
【文件描述表】 所有打开的文件 。
【文件表】文件每一次打开所独有的状态,包括文件状态标识等。
【索引结点表】 用来存储该文件在存储介质中相关的位置信息
代码层级的文件管理结构:
fs:
【root】进程可执行文件对应的根目录
【pwd】进程的当前工作目录(解释了为什么你在某个dir下,不用输入完整路径就能执行该路径下的文件)
files:
【files_struct】fd[0],fd[1] … fd[255]一个一个只想文件表的指针。
【file】该进程打开的文件状态 1) f_op表示当前访问的文件的位置;(2)f_inode表示文件在物理介质上的存储位置;(3)更多信息参考:Linux下的FILE*结构体
内存管理结构
vm_area_struct:
它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。
通常,进程所使用到的虚存空间不连续,且各部分虚存空间的访问属性也可能不同。所以一个进程的虚存空间需要多个vm_area_struct结构来描述。(参考:vm_area_struct)
【示例】下图例子中,有的vm_area_struct指向了数据区,有的指向了代码区。
进程之间的结构关系
【物理组织结构】 示例:等待队列,就绪队列,优先级队列等。
【逻辑组织结构】 父子结构、树状结构。进程创建有先后次序、被其他进程创建。(linux 命令: pstree)
进程环境
进程的资源分为两部分:(1)内核空间资源;(2)用户空间资源。前面介绍了内核空间的资源PCB,接下来介绍用户空间的资源。
进程的用户空间布局
【正文】CPU执行的代码部分,正文段通常是共享、只读的
【初始化数据】包含了程序中需明确赋初值的变量,如全局变量int maxcount=99;
【未初始化数据】程序执行之前,将此段中的数据初始化为0,如全局变量long sum[1000];
【堆】用于动态分配内存
【栈】主要用于支撑函数调用存放参数、局部变量等
命令行参数
用户空间从外界接收参数
举例:
ls ./dir
1
环境变量
环境变量表:
【注意】每个进程都有自己的一个环境变量表
【子进程】用fork方式创建子进程,会自动复制父进程的用户空间,故在子进程中可直接使用相应的环境变量。
创建进程
代码示例:
int main(int argc,char **argv){
pid_t pid;
pid=fork();
if(pid==-1)
printf(“fork error\n”);
else if(pid==0){
printf(“the returned value is %d\n”,pid);
printf(“in child process!!\n”);
printf(“My PID is %d\n”,getpid();}
else{
printf(“the returned value is %d\n”,pid);
printf(“in father process!!\n”);
printf(“My PID is %d\n”,getpid();}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
结果:
fork函数的工作流程
fork函数执行后父子进程的主要异同
父子进程共享文件
上面提到的fork复制的方式,也容易导致父子共享文件时,重复处理的问题,这是因为他们共享了打开的文件,而文件中的f_pos可能会被父子进程共同处理。(如下图所示)
对父子进程共享文件的常见处理方式:
【等待】父进程等待子进程完成。当子进程终止后,文件当前位置已经得到了相应的更新
【避免共享】父子进程各自执行不同的程序段,各自关闭不需要的文件
fork用法
vfork
参考
【中国大学mooc】linux操作系统编程
---------------------
作者:TheSnowBoy_2
来源:CSDN
原文:https://blog.csdn.net/TheSnowBoy_2/article/details/84707130
版权声明:本文为博主原创文章,转载请附上博文链接!
|
zan
|