您的位置:首页 > 运维架构 > Linux

linux内核设计与实现笔记之第三章进程管理

2013-04-09 15:49 417 查看
一、进程和线程

进程:进程是处于执行期的程序以及相关资源的总称,它是系统程序执行和资源分配的基本单位。在进程切换时需要相对复杂的

上下文切换。

线程:线程是进程内独立的一条运行线路,线程是内核调度的最小单位。线程可以对进程的内存空间和资源进行访问,并于同一

进程的其他线程共享这些空间和资源。

一个进程可以有多个线程,这些线程共享该进程的用户地址空间,同一进程内任何线程对系统资源的操作都会给其他线程带来影响。

二、进程描述符

内核通过一个唯一的进程描述符(PID)来标识每个进程。PID是一个数,表示为pit_t隐含类型,实际上是一个int类型。可通过current宏查找当前正在运行的进程。

进程描述符中的state域描述了进程当前的状态。系统中的每个进程都必然处于5种进程状态中的一种:

·TASK_RUNNING(运行)--进程是可执行的;它或者正在执行,或者在运行队列中等待执行。

·TASK_ INTERRUPTIBLE(可中断)--进程正在睡眠,也就是说进程被阻塞,等待某些条件的达成。一旦这些条件达成,内核就会

把进程状态设置为TASK_RUNNING。处于此状态的进程也会因为接收到信号而提前被唤醒并随时准备投入运行。

·TASK_UNINTERRUPTIBLE(不可中断)--接收到信号也不会被唤醒的睡眠状态。

·__TASK_TRACED--被其他进程跟踪的进程。

·__TASK_STOPPED(停止)--进程停止执行。

三、设置进程状态

1、设置当前进程的状态

set_current_state(state); //将当前进程的状态设置为state

set_task_state(current, state); //将当前进程的状态设置为state

state为前面提到的5种状态。

2、设置进程task的状态

set_task_state(task, state); //将进程task的状态设置为state

具体的实现可以看<linux/sched.h>

三、进程家族树

linux中所有的进程都是PID为1 的init进程的后代,内核在启动的最后阶段启动init进程。该进程读取系统的初始化脚本(initscript)

并执行其他的相关程序,最终完成系统启动的整个过程。

系统中的每个进程必有一个父进程,相应的,每个进程也可以拥有零个或多个子进程。拥有同一个父进程的所有进程被称为兄弟。进程间的关系被存放在进程描述符中。

四、线程在linux中的实现

linux实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。linux把所有的线程都当作进程来实现。线程仅仅被视为一个与其它进程共享某些资源的进程。

五、内核线程

内核经常需要在后台执行一些操作,这些操作可以通过内核线程来完成---独立运行于内核空间的标准进程。内核线程和普通进程的区别在于内核线程没有独立的地址空间。它们只是在内核空间运行,从来不切换到用户空间去。内核线程和普通进程一样,可以被调度,也可以被抢占。

在装有linux系统的机子上运行ps -ef命令,你就可以看到内核线程。

六、孤儿进程

如果父进程在子进程之前推出,必须有机制来保证子进程能够找到一个新的父亲,否则这些成为孤儿的进程就会在退出时永远处于僵死状态,白白消耗内存。解决的方法是给子进程在当前线程组内找一个线程作为父亲,如果不行,就让init进程做它的父进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: