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

linux 2.6源代码情景分析笔记之进程1

2009-12-25 01:59 435 查看
进程是程序执行时的一个实例,是充分描述程序已经执行到何种程度的数据结构的汇集。在linux中,常将进程称为任务(task)或者线程(thread)。进程的目的就是承担分配系统资源的实体。

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

linux使用轻量级进程(lightwetght process)对多线程应用程序提供更好的支持。两个轻量级进程基本上可以共享一些资源,诸如地址空间、打开的文件等等。只要其中一个修改共享资源,另一个就立即查看这种修改。两个线程访问共享资源时就必须同步它们自己。实现多线程应用程序的另一个简单方式就是把轻量级进程与每个线程关联起来。线程之间就可以通过简单地共享同一内存地址空间、同一打开文件集等来访问相同的应用程序数据结构集;同时,每个线程都可以由内核独立调度,以便于一个睡眠的同时另一个仍然是可以运行的。

描述进程数据结构的是task_struct,它的字段包含了与一个进程相关的所有信息。/include/linux/sched.h

进程的状态和进程的父/子间关系

进程状态:

进程描述符中的state字段描述了进程当前所处的状态。由一组标志组成,其中每个标志描述一种可能的进程状态。这些状态是互斥,因此只能设置一种状态,其余的标志将被清除。

#define TASK_RUNNING 0

可运行状态,进程要么在cpu上执行,要么准备执行。

#define TASK_INTERRUPTIBLE 1

可中断等待状态,进程被挂起(睡眠),直到某个条件变为真。产生一个硬件中断,释放进程正等待的系统资源,或传递一个信号都是可以唤醒进程的条件(把进程的状态放回到TASK_RUNNING).

#define TASK_UNINTERRUPTIBLE 2

不可中断的等待状态,与可中断的等待状态类似,担忧一个例外,把信号传递到睡眠进程不能改变它的状态。这种状态很少用到,但在一些特定的情况下(进程必须等待,直到一个不能被中断的事件发生),这种状态是很有用的。例如,当进程打开一个设备文件,其相应的设备驱动程序开始探测相应的硬件设备时会用到这种状态。探测完成以前,设备驱动程序不能被中断,否则,硬件设备会处于不可预知的状态。

#define TASK_STOPPED 4

暂停状态,进程的执行被暂停。当进程接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信号后,进入暂停状态。

#define TASK_TRACED 8

跟踪状态,进程的执行已由debugger程序暂停。当一个进程被另一个进程监控时,任何信号都可以把这个进程至于此状态。

以下两个状态,既可以存在进程描述符state字段中,也可以放在exit_state字段中。只有当进程的执行被终止时,进程的状态才会变为这两种状态中的一种。

#define EXIT_ZOMBIE 16

僵死状态,进程的执行被终止,但是父进程还没有发布wait4()或者waitpid()系统调用来返回有关死亡进程的信息。发布wait()类系统调用前,内核不能丢弃包含在死进程描述符中的数据,因为父进程可能还需要它。

#define EXIT_DEAD 32

僵死撤销状态,最终状态:由于父进程刚发出wait4()或者waitpid()系统调用,因而进程由系统删除。为了防止其他执行线程在同一个进程上也执行wait()类系统调用(这是一种竞争条件),而把进程的状态由僵死改为僵死撤销状态。

对于task_struct中的state字段,设置其的方法为:p->state=TASK_RUNNING;

内核也使用set_task_state和set_current_state宏。分别设置指定进程的状态和当前执行进程的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: