全部博文(436)
分类: LINUX
2013-01-20 10:06:24
《深入理解Linux内核》第三章有关进程方面的理解与问题:
1.
进程是任何多道程序设计的操作系统中的基本概念,通常被定义为程序执行时的一个实例。在Linux源代码中,进程常被称为“任务”。
2.
进程描述符: 为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。例如:内核必须知道进程的优先级,它是正在CPU上运行还是因为某些事件而被阻塞,给它分配了什么样的地址空间,允许它访问哪个文件等等,这正是进程描述符的作用。
3.
进程状态:进程描述符中的状态域描述了进程当前所处的状态,它是一组标志,其中,每一个标志描述了一种可能的进程状态。以下是进程可能的状态:
可运行状态:进程要么在CPU上执行,要么准备执行。
可中断的等待状态:进程被挂起,直到某个条件变为真。
不可中断的等待状态:与可中断等待状态类似,但有一个例外:把信号传递到睡眠进程不能改变它的状态。
暂停状态:进程的执行被暂停。
跟踪状态:进程的执行已由Debugger程序暂停。当一个进程被另一个进程监控时,任何信号都可以把个进程置于跟踪状态。
僵死状态:进程的执行被终止,但父进程还没有发布wait4()或waitpid()系统调用来返回有关死忘进程的信息。在发布wait()类系统调用前,内核不能丢弃包含在死进程描述符中的数据,因此父进程可能还需要它。
僵死撤消状态:最终状态,由于父进程刚发出wait4()或waitpid()系统调用,因而进程由系统删除。为了防止其他执行线程在同一个进程上也执行wait()类系统调用,而把进程的状态由僵死状态改为僵死撤消状态。
4.
标识一个进程:内核对进程的大部分引用都是通过进程描述符指针进行的。类Unix操作系统允许用户使用一个叫做进程标识符(PID)的数来标识进程,PID存放在进程描述符的pid字段中,PID被顺序编号,新创建进程的PID通常是前一个进程的PID加1。不过,PID的值有一个上限,当内核使用的PID达到这个上限值的时候必须开始循环使用已闲置的小PID号。缺省情况下,最大的PID号是32767。由于循环使用PID号,内核必须通过管理一个pidmap_array位图来表示当前已分配的PID号和闲置的PID号。因为一个页框包含32768个位,所以32位体系结构中pidmap_array位置存放在一个单独的页中。Linux把不同的PID与系统中每个进程或轻量级进程相关联。对于线程组,一个线程组中的所有线程使用和该线程组的领头线程相同的PID,即该组中第一个轻量级进程的PID,它被存入进程描述符的tgid字段。getpid()系统调用返回当前进程的tgid值而不是pid值。
5.
轻量级进程:两个轻量级进程基本上可以共享一些资源,诸如地址空间、打开的文件等。(之所以说轻量级,就是说偏向线程,可以共享一些资源,但是又不是完全的线程。) 线程,内核看做是简单的进程。
问题:轻量级进程和线程的区别,为什么要轻量级进程而非线程?