Linux(4)——进程的创建

一、进程的创建

1、一个进程的创建主要有两个步骤:一是找到一个空闲进程资源(find_empty_process),Linux0.11来说可以同时运行的进程数目是64个,是有限的,因此需要先得到一个空闲的进程表中的一项用来索引即将创建的进程信息;第二个主要步骤就是复制(copy_process),这个函数具体来实现子进程基于父进程的复制创建。

主要包括的步骤和内容是:

1)  为新进程在内存中分配一个物理页,将新进程的描述符信息填充在该页的开头,并设置新进程的描述符里各项信息;

2)  拷贝父进程的页表,使得它们共同指向相同的物理页,同时将父进程的各个页表属性改为只读,这样将来可以使用写时复制机制。

3)  在GDT中设置该进程项的TSS和LDT选择符。

       Linux0.11版本子进程内容的设置主要内容就是这些,当然不同版本会有不同,在改进执行性能上也会有改进,但这个版本体现出来的最基本创建过程基本上反映了操作系统创建进程的主要过程。

2、具体的进程创建方法

(1)、创建一个进程
进程是系统中基本的执行单位(线程是最小的调度单位)。
linux系统允许任何一个用户创建一个子进程,创建之后,子进程存于系统之中,并且独立于父进程。该子进程可以接受调度,可以分配得到系统资源。
fork函数创建一个新的进程:
#include 
pid_t fork(void);
 
注:系统中,除了0号进程以外(0号进程是由系统创建的),任何一个进程都是由其他进程创建的。
fork()函数不需要参数,返回一个进程ID。返回值有三种情况:
(1)对于父进程,fork函数返回新的子进程的ID。
(2)对于子进程,fork函数返回0。
(3)如果出错,fork函数返回-1。
 
fork函数创建一个新的进程,并从内核中为此进程得到一个新的可用进程ID,之后为这个新进程分配进程空间,并将父进程的进程空间中的内容复制到子进程的进程空间中,包括父进程的数据段+堆栈段,并与父进程共享代码段
 
fork函数之后,子进程从等待fork返回开始执行,而不是从头开始

(2)、父子进程的共享资源
子进程完全复制了父进程的地址空间的内容,包括堆栈段+数据段的内容。但是,子进程并没有复制代码段,而是和父进程共享代码段。代码段是只读的,不存在修改的问题,因此可以共用。
 
(3)、创建一个共享父进程空间的子进程

在创建一个子进程后,子进程的地址空间完全和父进程分开,父子进程是两个独立的进程。接受系统调度和分配系统资源的机会均等。父子进程完全分家,除了代码段这部分。


二、程序和进程的区别(自己总结的笔记)

1、程序是文件,由文件系统管理。

2、一旦程序加载到内存后,操作系统就必须用结构体描述他的信息,这个结构体就叫做task_struct,在操作系统层面上就叫做PCB(进程控制块),然后操作系统也必须组织这些信息结构体。至此,程序就变成了进程,由进程管理系统管理。

三、程序和进程的区别

1、程序是静态的,它知识一组冰冷的指令的集合,不具有任何的运行意义。而进程是程序运行在数据集上的动态过程,进程是一个动态实体,它应创建而产生,应调度执行,应等待资源或者是事件而处于等待状态,应完成了任务而被撤销,它有自己的生命周期,它反应了程序在数据集上运行的全部动态过程。

2、进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程。

3、进程还具有并发性和交往性,而程序却是封闭的。


四、任务(task)和进程(process)的区别

    任务和进程很容易被人混淆,甚至在Linux中进程描述符结构体也是用task_struct表示,而不是process,这更让人有的时候搞不清楚。我个人认为,其实任务的概念更底层,可以认为是基于CPU的角度来考虑的,进程所处的层次更高一些,应当可以认为是操作系统一级的概念。

    任务关注点是一组程序操作,这组操作实现了某个功能,它最终会涉及到指令级别,我们说任务的切换最终需要关注的还是CPU的相关指令。

    进程的概念通常是指程序的执行,是动态的过程。进程除了包含其要运行的程序之外,还包括运行时的诸多信息,如运行时间,信号等等。


五、补充一个有趣的——0号进程

子进程的创建是基于父进程的,因此一直追溯上去,总有一个进程是原始的,即没有父进程的。这个进程在Linux中的进程号是0,也就是传说中的0号进程(可惜很多理论书上对这个重要的进程只字不提)。

如果说子进程可以通过规范的创建进程的函数(如:fork())基于父进程复制创建,那么0号进程并没有可以复制和参考的对象,也就是说0号进程拥有的所有信息和资源都是强制设置的,不是复制的,这个过程我称为手工设置,也就是说0号进程是“纯手工打造”,这是操作系统中“最原始”的一个进程,它是一个模子,后面的任何进程都是基于0号进程生成的。

手工打造0号进程最主要包括两个部分:创建进程0运行时所需的所有信息,即填充0号进程,让它充满“血肉”;二是调度0号进程的执行,即让它“动”起来,只有动起来,才是真正意义上的进程,因为进程本身实际上是个动态的概念。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值