第7章进程和线程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章进程和线程

第7章 进程和线程 操作系统的存在归根结底是为了提供一个运行程序的空间。按照Unix的术语,将正在运行的程序为进程。Linux内核和其它Unix变种一样,都是采用了多任务技术;它可以在许多进程之间分配时间片从而使这些进程看起来似乎在同时运行一样。这里通常是内核对有关资源的访问作出仲裁;在这种情况下,资源就是CPU时间。 进程传统上都有唯一的执行程序的上下文——这是说明在某个时刻它正在处理一项内容的流行的方法。在给定的时刻,我们可以精确地知道代码的哪一部分正在执行。但是有时我们希望一个进程同时处理多件事情。例如,我们可能希望Web浏览器获取并显示Web页,同时也要监视用户是否点击停止按钮。只为监视停止按钮而运行一个全新的程序显然是不必要的,但是对于Web浏览器来说要对其时间进行分隔也并不总是非常方便——获取一些Web页信息,检测停止按钮,再获取一些Web页信息,再重新检测停止按钮,等等。 对于这个问题的比较流行的解决方法是线程。从概念上来说,线程是同一个进程中独立的执行上下文——更简单一点地说,它们为单一进程提供了一种同时处理多件事情的方法,就像是进程是一个自行控制的微缩化了的多任务操作系统。同一线程组中的线程共享它们的全局变量并有相同的堆(heap),因此使用malloc给线程组中的一个线程分配的内存可以被该线程组中的其它线程读写。但是它们拥有不同的堆栈(它们的局部变量是不共享的)并可以同时在进程代码不同的地方运行。这样,你的Web浏览器可以让一个线程来获取并显示Web页,同时另外一个线程观测停止按钮是否被点击,并且在停止按钮被点击时停止第一个线程。 和线程等价的一种观点——这是Linux内核使用的观点——线程只是偶然的共享相同的全局内存空间的进程。这意味着内核无需为线程创建一种全新的机制,否则必然会和现在已经编写完成的进程处理代码造成重复,而且有关进程的讨论绝大多数也都可以应用到线程上。 当然,以上的说明仅仅适用于内核空间的线程。实际中也有用户空间的线程,它执行相同的功能,但是却是在应用层实现的。用户空间的线程和内核空间的线程相比有很多优点,也有很多缺点,但是有关这些问题的讨论超出了本书的范围。而使人更加容易造成混淆是一个名为kernel_thread(2426行)的函数,尽管该函数被赋予了这样一个名字,但是它实际和内核空间的线程没有任何关系。 部分是由于历史的原因,部分是由于Linux内核并没有真正区分进程和线程这两者在概念上的不同,在内核代码中进程和线程都使用更通用的名字“任务”来引用。根据同样的思路,本书中所出现的 “任务”和“进程”具有相同的意义。 调度和时间片 对CPU访问的裁决过程被称为调度(Scheduling)。良好的调度决策要尊重用户赋予的优先级,这可以建立一种所有进程都在同时运行的十分逼真的假象。糟糕的调度决策会使操作系统变得沉闷缓慢。这是Linux调度程序必须经过高度优化的一个原因。 从概念上来说,调度程序把时间分为小片断,并根据一定的原则把这些片断分配给进程。你可能已经猜到,时间的这些小片断称为时间片。 实时进程 Linux提供了三种调度算法:一种传统的Unix调度程序和两个由POSIX.1b(原名为POSIX.4)操作系统标准所规定的“实时”调度程序。因此,本书中有时会使用实时进程(从技术上考虑,系统使用术语“非实时进程(nonrealtime process)”来作为实时进程的对应,虽然我更倾向于使用另外一个术语unrealtime process)。不要过分计较“实时”这个术语,虽然——如果从硬件的角度来看待这个问题,实时意味着你可以得到有关操作系统的某种性能保证,例如有关中断等待时间的承诺,但是这一点在Linux实时调度规则中并没有提供。相反的,Linux的调度规则是“软件实时”,也就是说如果实时进程需要,它们就只把CPU分配给实时进程;否则就把CPU时间让出给非实时进程。 但是如果你真正需要,一些Linux的变种也承诺提供一种“硬实时”。但是,在当前的Linux内核中——因此也就是在本章中——“实时”仅指“软件实时”。 优先级 非实时进程有两种优先级,一种是静态优先级,另一种是动态优先级。实时进程又增加了第三种优先级,实时优先级。优先级是一些简单的整数,它代表了为决定应该允许哪一个进程使用CPU的资源时判断方便而赋予进程的权值——优先级越高,它得到CPU时间的机会也就越大: 静态优先级——被称为“静态”是因为它不随时间而改变,只能由用户进行修改。它指明了在被迫和其它进程竞争CPU之前该进程所应该被允许的时间片的最大值。(但是也可能由于其它原因,在该时间片耗尽之前进程就被迫交出了CPU。) 动态优先级——只要进程拥有CPU,它就随着时间不断减小;当它小于0时,标记进程重新调度。它指明了在这个

文档评论(0)

cynthia_h + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档