- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux进程、线程简介
目录1引言51.1 文档目的51.2 参考文档52概述53进程管理53.1 进程描述符53.2 进程标识63.3 进程状态73.4 设置进程状态83.5 进程上下文83.6 进程家族树93.7 进程组93.8 进程地址空间103.9 创建进程113.9.1 写时拷贝113.9.2 函数system()123.9.3 函数fork()123.9.4 函数exec143.9.5 函数fork()和exec()协同工作153.9.6 函数vfork()153.9.7 函数wait()164进程调度164.1 调度策略164.1.1处理器消耗型和I/O消耗性的进程164.1.2进程优先级174.2调度算法224.2.1可执行队列224.2.2优先级数组224.2.3schedule()234.2.4重新计算时间片235线程255.1 线程创建255.2 线程同步265.2.1 用信号量进行同步265.2.2 用互斥量进行同步275.2.3 用条件变量进行同步285.3 线程安全函数295.4 重入函数305.4 线程池316文档历史31引言1.1 文档目的对Linux进程、线程知识做一个简单的介绍,让读者对Linux进程、线程的工作原理有一个初步的了解。1.2 参考文档《Linux内核设计与实现》《UNIX环境高级编程》《深入理解LINUX内核》《Linux程序设计》概述进程是Unix操作系统最基本的抽象之一。一个进程就是处于执行期的程序,通常由程序代码、数据、变量、打开的文件和环境组成,进程是内核分配资源的基本单位。线程是一个进程内部的控制序列,所有的进程至少有一个线程,线程是内核调度的基本单位(不是进程)。在现代的操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。虽然实际上可能是许多进程在分享一个处理器,但虚拟机处理器给进程一种假象,让这些进程觉得自己在独享处理器;而虚拟内存让进程在获取和使用内存时觉得自己拥有整个系统的所有内存资源。同一个进程的线程之间可以共享虚拟内存,但拥有各自的虚拟处理器。进程管理进程的另一个名字是任务(task)。Linux内核通常把进程叫做任务,任务通常指的是从内核观点所看到的进程。3.1 进程描述符内核把进程存放在叫做任务队列(task list)的双向链表中。链表中的每一项都是类型为task_struct、称为进程描述符(process descriptor)的结构,该结构定义在linux/sched.h文件中。进程描述符中包含一个具体进程的所有信息。task_struct相对较大,在32位机器上,它大约有1.7K字节。但如果考虑到该结构内包含了内核管理一个进程所需的所有信息,那么它的大小也算相当小了。进程描述符中包含的数据能完整的描述一个正在执行的程序:它打开的文件,进程的地址空间、挂起的信号、进程的状态,还有其他更多信息。Linux通过slab分配器预先分配task_struct结构,这样能达到对象复用和缓存着色的目的。进程描述符task_struct的内容: 3.2 进程标识内核通过一个唯一的进程标识值(process identification value)或PID来标识每个进程。PID是一个数,表示为pid_t隐含类型,实际上就是一个int类型。为了与老版本的Linux兼容,PID的最大值默认设置为32768(short int短整型的最大值),尽管这个值也可以增加到类型所允许的范围。内核把每个进程的PID存放在它们各自的进程描述符中。这个最大值很重要,因为它实际上就是系统中允许同时存在的进程的最大数据。尽管32768对于一般的桌面系统足够用了,但是大型服务器可能需要更多的进程。如果确实需要的话,可以不考虑与老式系统的兼容,由系统管理员通过修改/proc/sys/kernel/pid_max来提高上限。3.3 进程状态进程描述符中的state域描述了进程的当前状态(参见图-3)。系统中的每个进程都必然处于五种进程状态中的一种。该域的值也必为下列5种状态标志之一:TASK_RUNNING(运行) ------ 进程是可执行的;它或者正在执行,或者在运行队列中等待执行;TASK_INTERRUPTIBLE(可中断) ------ 进程正在睡眠(也就是说它被阻塞),等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为可运行。处于此状态的进程也会因为接收到信号而提前被唤醒并投入运行。TASK_UNINTERRUPTIBLE(不可中断) ------ 除了不会因为接收到信号而被唤醒从而投入运行之外,这个状态与可中断状态相同。这个状态通常在进程必须在等待时不受干扰或等待事件很快就会发生时出现。由于处于此状态的任务对信号不作响应,所以较之可中断状态,使用得较少。TASK_ZOMBIE(僵
文档评论(0)