2009年7月21日星期二

Linux笔记之进程

1.进程
Linux进程貌似是一个相当复杂的系统,每一个进程就是一个运行的程序的抽象。通过他可以管理和监视程序使用的内存,CPU时间,输入输出资源。
一个进程包含地址空间以及一系列的内置于内核的数据结构。
地址空间就是一些被内核标记为归进程使用的内存页(pages,内存单元PC机上为4k),里面包含进程执行的代码和库,进程的变量,进程使用的栈,以及其他进程运行时内核需要的额外信息。因为Linux是虚拟内存系统,因此这些地址到底是在物理内存中还是swap分区中并没有关系。
内核内置的数据结构每个进程的一些信息,一些比较重要的列举如下:
*进程的地址空间映射
*进程当前的状态(sleeping,stopped,runnable等)
*进程运行的优先级
*进程所使用资源的信息
*进程所打开的文件以及使用的网络端口号
*进程的信号标志(信号被阻塞记录)
*进程的所有者
一些进程共享这些属性产生了所谓的进程群(thread group),这个是Linux类似传统的UNIX系统的多进程机制。虽然这些进程共享地址空间,但是这些进程群中的进程都有自己的执行优先级和执行状态。其实很少有程序使用多进程机制来运行程序。

进程有很多参数都会影响程序的运行,比如:他所得到的处理器时间,他能读取的文件。这些参数有:PID,PPID,UID&EUID,GID&EGID
1)PID:process ID number
内核给每个进程都分配一个ID,很多命令和系统的调用都会用到。
2)PPID:parent PID
Linux系统中并不会通过系统命令产生一个新的进程,而是一个已经存在的进程通过复制自己产生。这个复制的新进程然后,改变当前的属性运行另外一个程序。这样原来的那个进程就相当于该进程的父亲,这里用PPID表示。
PPID在处理一个未知进程的时候比较有用,因为有其父必有其子么。
3)UID&EUID:real and effective user ID
UID就是创建该进程的用户的编号,更精确的说应该是其父进程的UID。EUID标识号负责标识以什么用户身份来给新创建的进程赋所有权、检查文件的存取权限和检查通过系统调用kill向进程发送软中断信号的许可权限。UID&EUID其实差不多的,用两个就是为了把进程本身和权限操作分开来。这样setuid程序就不用经常去更改权限了。
另外还有一个FSUID控制文件系统的访问权限,这个在内核外一般很少使用。
4)GID&EGID
GID用来标识一个群的进程。EGID作用和EUID差不多的。

2.进程的生命周期
一个进程通过fork的系统调用复制自己产生一个新的进程,这个新进程跟原来的进程非常相像,但是他们有不同的PID。fork有一个非常独特的性质就是他返回两个不同的值,对于子进程他将返回0,而对于父进程返回子进程的最新PID,因此通过检验两个值就可以区分那个是儿子,那个是老子。之后,子进程就会通过系统调用之其中一种exec运行新的程序。这个调用会初始化所有的数据,栈。不同形式的exec只不过在指令的参数,运行环境上有一些不同。
Linux操作系统用一种另外的和fork不同的创建的方式。就是调用clone产生一个共享内存或I/O的进程,这个多用于产生多进程程序的产生。
系统启动是第一个创建的进程就是init,这个进程负责运行所有的启动脚本,同时这个进程还负责管理进程的任务。当一个进程结束的时候,就会调用 _exit通知内核他已经死了。还会返回一个数字告诉他是怎么死的(程序退出的原因)。。。一般用0表示正常退出。在把这个进程火化之前,Linux会用 wait通知他的父母。如果不是该进程自己找死,父母会通过(exit code)知道孩子是怎么被杀死的。同样还可以知道他孩子的财产总数(用的资源:))
这个设计在wait调用正常的时运作的非常棒。但如果该进程的父母已经去世了或者其他原因wait没反应,那么就把该进程的孩子作为孤儿归init养(这不是林妹妹么)。

没有评论:

发表评论