Notes Understanding the Linux kernel

第三章 进程

进程,轻量级进程和线程

进程是程序执行时的一个实例。从内核观点看,进程的目的是担当分配系统资源的实体。

当一个进程创建时,它几乎与父进程相同。它接受父进程地址空间的一个逻辑拷贝,从进程创建系统调用的下一条指令开始执行与父进程相同的代码。尽管父子进程可以共享含有程序代码的页,但是它们有各自独立的数据拷贝(栈和堆),因此子进程对一个内存单元的修改对父进程是不可见的,反之亦然。

从内核观点来看,多线程应用程序仅仅是一个普通进程。多线程应用程序多个执行流的创建、处理、调度整个都是在用户态进行的。

Linux使用轻量级进程(lightweight process)对多线程应用程序提供支持。两个轻量级进程基本可以共享一些资源,诸如地址空间,打开的文件。只要其中一个修改共享资源,另一个就立即查看这种修改。当两个线程访问共享资源时就必须同步它们自己。

进程描述符

为了管理进程,内核必须对每个进程所做的事情进行清除的描述。内核必须知道进程的优先级。即进程描述符的作用。

进程状态

进程描述符中的state字段描述了进程当前所处的状态。

标识一个进程

能被独立调度的而每个执行上下文都必须拥有它自己的进程描述符;因此,即使共享内核的大部分数据结构的轻量级进程,也有她们自己的task_struct结构。

进程描述符指针指向这些地址,内核对进程的大部分引用是通过进程描述符指针进行的。

另一方面,类UNIX系统允许用户使用一个叫做进程标识符process ID的数来标识进程,PID存放在进程描述符的pid字段里。PID被顺序标号,新创建进程的PID通常是前一个进程的PID+1.PID上限是32767,也快更改。64位系统中,上限为4194303.

Linux把不同的PID与系统中每个进程或轻量级进程相关联。unix程序员希望同一组中的线程由共同的PID。Linux引入线程组的表示,一个线程组的所有线程使用该线程组领头线程相同的PID。

进程描述符处理

对每个内存来说,Linux把两个不同的数据结构紧凑地存放在一个单独为进程分配的存储区域内:一个是内核态的进程堆栈,另一个是紧挨进程描述符的小数据结构,叫做线程描述符。这块存储区域为8192个字节(两个页框)。


进程链表

进程链表把所有进程的描述符链接起来。每个task_struct结构都包含一个list_head类型的tasks字段,这个类型的prev和next字段分别指向前面和后面的task_struct元素。

提高调度程序运行速度的诀窍是建立多个可运行进程链表,每种进程优先权对应一个不同的链表。

进程间的关系

程序创建的进程具有父子关系。如果一个进程创建多个子进程,则子进程之间具有兄弟关系。在进程描述符中引入几个字段来表示这些关系。进程0和进程1是由内核创建的。

内核要从进程的PID导出对应的进程描述符指针,为了加速查找,引入了4个散列表。需要4个散列表是因为进程描述符包含了表示不同类型PID的字段。

pid 进程pid

tgid 线程组领头进程的pid

pgrp 进程组领头进程的pid

session会话领头进程的pid


Linux利用链表来处理冲突的PID:每一个表项是由冲突的进程描述符组成的双向链表。

pid散列表的数据结构是4个pid结构的数组,它在进程描述符的pid字段中。


创建进程

clone(),fork(),vfork()

在Linux中,轻量级进程是由名为__clone()的函数创建

__clone()是一个在c语言库中定义的封装函数,c语言库对使用者隐藏一个系统调用,名叫clone()。Linux用clone()实现了传统的fork()调用。clone()第一个参数指定为sigchld信号,并把所有的克隆标识清零,第二个参数为0;


内核线程

传统的Unix系统把一些重要任务委托给周期性执行的进程,这些任务包括刷新磁盘高速缓存,交换不同的页框,维护网络链接等。把它们放在后台调度,对于函数或者是终端用户进程都能得到比较好的响应。因为一些系统进程只在内核态进行,现在操作函数把它们的函数委托给内核线程,内核线程不受不必要的用户态上下文的拖累。

每个内核线程执行一个单独指定的内核函数,而普通进程只通过系统调用执行内核函数。

内核线程只运行在内核态,而普通进程既可以运行在内核态,也可以运行在用户态。

内核线程只运行在内核态,所以只是用大于page-offset的线性地址空间。另一方面,不管在用户态还是在内核态,普通进程可以用4gb的线性地址空间。这里原文指的应该是32位系统

撤销进程

进程终止的一般方式是调用exit()系统调用。可由编程者明确插入,当控制流到达主函数最后一条语句时,执行exit()系统调用。

内核可以有选择的强迫进程死。当进程接受一个不能处理或忽视的信号时,或者在内核态产生一个不可到达的cpu异常时,而内核正在代表进程运行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值