linux内核注释-第7章进程和线程
- 桑蚕
-
256 次阅读
-
86 次下载
- 共 29 页(0.67 M)
-
2022-05-02 22:37:51
点此付费下载 ¥ 2 知币
无需注册也可下载,点击付费按钮在弹框页面选择 "扫码直接下载”
在线预览效果若不佳,推荐下载后阅读 建议在PC浏览器扫码下载
文档简介(最多显示3000字):
1.doc--81第第7章章进程和线程进程和线程操作系统的存在归根结底是为了提供一个运行程序的空间。按照Unix的术语,将正在运行的程序为进程。Linux内核和其它Unix变种一样,都是采用了多任务技术;它可以在许多进程之间分配时间片从而使这些进程看起来似乎在同时运行一样。这里通常是内核对有关资源的访问作出仲裁;在这种情况下,资源就是CPU时间。进程传统上都有唯一的执行程序的上下文——这是说明在某个时刻它正在处理一项内容的流行的方法。在给定的时刻,我们可以精确地知道代码的哪一部分正在执行。但是有时我们希望一个进程同时处理多件事情。例如,我们可能希望Web浏览器获取并显示Web页,同时也要监视用户是否点击停止按钮。只为监视停止按钮而运行一个全新的程序显然是不必要的,但是对于Web浏览器来说要对其时间进行分隔也并不总是非常方便——获取一些Web页信息,检测停止按钮,再获取一些Web页信息,再重新检测停止按钮,等等。对于这个问题的比较流行的解决方法是线程。从概念上来说,线程是同一个进程中独立的执行上下文——更简单一点地说,它们为单一进程提供了一种同时处理多件事情的方法,就像是进程是一个自行控制的微缩化了的多任务操作系统。同一线程组中的线程共享它们的全局变量并有相同的堆(heap),因此使用malloc给线程组中的一个线程分配的内存可以被该线程组中的其它线程读写。但是它们拥有不同的堆栈(它们的局部变量是不共享的)并可以同时在进程代码不同的地方运行。这样,你的Web浏览器可以让一个线程来获取并显示Web页,同时另外一个线程观测停止按钮是否被点击,并且在停止按钮被点击时停止第一个线程。和线程等价的一种观点——这是Linux内核使用的观点——线程只是偶然的共享相同的全局内存空间的进程。这意味着内核无需为线程创建一种全新的机制,否则必然会和现在已经编写完成的进程处理代码造成重复,而且有关进程的讨论绝大多数也都可以应用到线程上。当然,以上的说明仅仅适用于内核空间的线程。实际中也有用户空间的线程,它执行相同的功能,但是却是在应用层实现的。用户空间的线程和内核空间的线程相比有很多优点,也有很多缺点,但是有关这些问题的讨论超出了本书的范围。而使人更加容易造成混淆是一个名为kernel_thread(2426行)的函数,尽管该函数被赋予了这样一个名字,但是它实际和内核空间的线程没有任何关系。部分是由于历史的原因,部分是由于Linux内核并没有真正区分进程和线程这两者在概念上的不同,在内核代码中进程和线程都使用更通用的名字“任务”来引用。根据同样的思路,本书中所出现的“任务”和“进程”具有相同的意义。调度和时间片调度和时间片对CPU访问的裁决过程被称为调度(Scheduling)。良好的调度决策要尊重用户赋予的优先级,这可以建立一种所有进程都在同时运行的十分逼真的假象。糟糕的调度决策会使操作系统变得沉闷缓慢。这是Linux调度程序必须经过高度优化的一个原因。从概念上来说,调度程序把时间分为小片断,并根据一定的原则把这些片断分配给进程。你可能已经猜到,时间的这些小片断称为时间片。
评论
发表评论