进程管理74362.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程管理74362

进程 进程是多任务系统的基本概念。通常把进程定义为程序执行的一个实例。在linux源代码中,常把进程称为任务或者线程。 进程、轻量级进程和线程 进程的定义通常是:程序执行时的一个实例。从内核的观点来看,进程的目的就是担当分配资源(CPU时间、内存)的实体。 当进程被创建时,它几乎与父进程相同。它接受父进程地址空间的一个(逻辑)拷贝。并从进程创建系统调用的下一条指令开始执行与父进程相同的代码。尽管父子进程可以共享程序代码页,但是它们各自有独立的数据拷贝(栈和堆),因此子进程对一个内存单元的修改对父进程是不可见的。反之亦然。 不过这是早期unix使用的简单模式。现代unix系统没有如此使用。它们支持多线程应用程序。在这样的系统中,一个进程由几个用户线程组成,每个线程代表进程的一个执行流。大部分多线程应用程序都是用pthread线程库的标准库函数集编写的。 早期linux内核没有提供多线程应用的支持。在内核看来,多线程应用程序仅仅是一个普通进程。多线程应用程序多个执行流的创建、处理、调度都是在用户态进行的(通常使用posix兼容的pthread库)。 现在,linux使用轻量级进程对多线程应用程序提供更好的支持。两个轻量级进程基本上可以共享一些资源:地址空间、打开的文件等。只要其中一个修改共享资源,另一个就立即查看这种修改。当然,两个进程间可能需要同步。 实现多线程应用程序的一个简单方式就是把轻量级进程与每个线程关联起来。这样,线程之间就可以通过简单地共享同一内存地址空间、同一打开文件集等来访问相同的应用程序结构。同时,每个线程都可以由内核独立调度,以便一个睡眠的同时,另一个仍然是可运行的。POSIX兼容的pthread库使用linux轻量级进程有3个例子:LinuxThreads、Native Posix Thread Library(NPTL)和IBM的下一代Posix线程包NGPT(Next Generation Posix Threading Package)。 POSIX兼容的多线程应用程序由支持“线程组”的内核来处理是最好不过的。在Linux中,一个线程组基本上就是实现了多线程应用的一组轻量级进程,对于象getpid,kill和_exit这样的系统调用,它象一个组织,起整体的作用。 进程描述符 为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。例如,内核必须知道进程的优先级,是否在运行还是被阻塞,给它分配了什么样的地址空间,允许它访问哪个文件等等。这是进程描述符的作用。进程描述叫struct task_struct,同时被定义成task_t。 Task_struct有以下重要成员: State-进程状态。 Thread_info-进程的基本信息。 mm-指向内存区描述符的指针。 Tty-与进程相关的tty Fs-当前目录 Files-指向文件描述符的指针。 Signal:进程信号描述符的指针。 进程状态 进程的state字段描述了进程当前所处的状态。它由一组标志组成,每个标志描述一种可能的进程状态。当前版本的linux版本中,这些状态是互斥的。以下是可能的状态: /** * 进程要么在CPU上执行,要么准备执行。 */ #define TASK_RUNNING 0 /** * 可中断的等待状态。 */ #define TASK_INTERRUPTIBLE 1 /** * 不可中断的等待状态。 * 这种情况很少,但是有时也有用:比如进程打开一个设备文件,其相应的驱动程序在探测硬件设备时,就是这种状态。 * 在探测完成前,设备驱动程序如果被中断,那么硬件设备的状态可能会处于不可预知状态。 */ #define TASK_UNINTERRUPTIBLE 2 /** * 暂停状态。当收到SIGSTOP,SIGTSTP,SIGTTIN或者SIGTTOU信号后,会进入此状态。 */ #define TASK_STOPPED 4 /** * 被跟踪状态。当进程被另外一个进程监控时,任何信号都可以把这个置于该 */ #define TASK_TRACED 8 /** * 僵死状态。进程的执行被终止,但是,父进程还没有调用完wait4和waitpid来返回有关 * 死亡进程的信息。在此时,内核不能释放相关数据结构,因为父进程可能还需要它。 */ #define EXIT_ZOMBIE 16 /** * 在父进程调用wait4后,删除前,为避免其他进程在同一进程上也执行wait4调用 * 将其状态由EXIT_ZOMBIE转为EXIT_DEAD,即僵死撤销状态。 */ #define EXIT_DEAD 32 State状态可以通过一个简单的赋值语句设置,如: p-state = TASK

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档