第一章:进程与线程总结

    从本章开始我们将深入考察操作系统是如何设计和构造的。操作系统最核心的概念就是进程:

这是对正在运行的程序的一个抽象。操作系统的其他所有内容都是围绕着进程的概念展开的,]

所以,让操作系统的设计者尽在并透彻的理解进程是非常重要的。

    进程是操作系统提供的最古老也是最抽象的概念之一。

1、进程:在任何多道程序设计系统中,CPU由一个进程切换至另一个进程,使每个进程

各运行几十或几百个毫秒。严格的说来,在某一个瞬间,CPU只能运行一个进程。但在

1秒钟期间,他可能运行多个进程,这样就产生了并行的错觉。

2、进程模型:在进程模型中,计算机上所有可运行的软件,通常包括操作系统,被组织成若干 顺序进程,简称进程。一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量的当前值。从概念上来说,每个进程都拥有自己的虚拟CPU。当然,实际上真正的CPU在各进程之间来回切换。为了理解这种系统,考虑并行情况下运行的进程集,要比我们试图跟踪CPU如何在程序间来回切换简单。这种切换就叫做多道程序设计。

    由于CPU在个进程之间来回快速切换,所以每个进程执行其运算的速度是不确定的。而且当同一进程再次运行时,其运算速度通常也不可在现。所以,每个进程执行其运算的速度是不确定的。

    进程和程序之间的区别很微妙,非常重要。

    一个进程是某种类型的一个活动,她有程序,输入,输出,以及状态。单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。

    注意:一个进程是某种类型1的一个活动,它由程序,输入,输出,状态。单个处理器可以被若干个进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。

    值得注意的是,如果一个程序运行了两遍,则算作两个进程。

3、创建进程:

    有四种主要事件导致进程的创建: 

    (1)系统初始化

    (2)执行了正在运行的进程所调用的进程创建系统调用

    (3)用户请求创建一个进程

    (4)一个批处理作业的初始化

    启动操作系统之后通常会创建若干个进程。其中有些是前台进程,也就是同用户交互并完成工作的那些进程。其他的是后台进程,那么这些进程与特定的用户没有关系,相反,却具有某些专门的功能。

    除了在启动操作系统阶段创建进程之外,新的进程也可以以后创建。一个正在运行的进程经常发出系统调用以便创建一个或多个新的进程就1特别有效果。例如:如果有大量的数据要通过网络调取并进行顺序处理,那么创建一个进程取数据,并把数据放入共享缓冲区,而让第二个进程取走数据项并处理之,应该比较容易。

    在交互式系统中,键入一个命令或者点击一个图标就可以启动一个程序。这两个动作中的任一个都会开始一个新的进程,并在其中运行所选择的程序。在基于命令行的unix系统中运行程序x,新的进程会从该进程接管开其他的窗口。在一个进程开始时,他并没有窗口,但是他可以创建一个进程。通过鼠标可以选择一个窗口并且与该进程交互。

    最后一种创建进程的情形仅在大型机的批处理钟应用。

    从技术上看,一个新的进程都是由于一个已知存在的进程执行了一个用于创建进程的系统调用而创建的。这个进程可以是一个运行的用户进程,

4、进程的终止:

    进程在创建之后,他开始运行完成其工作。但永恒是不存在的,进程也是一样的。迟早这个进程会终止。

    (1)正常退出

    (2)出错推出

    (3)严重错误

    (4)被其它进程杀死

    多数进程是由于完成了工作而被终止。

5、进程的层次结构:

    某些系统中,进程创建了另外一个进程之后,父进程和紫禁城就以某种形式继续保持关联。子进程可以创建更多的进程,组成一个进程的层次结构。请注意,进程只有一个父进程(可以有0,1,2,个或多个子进程)

    windows中没有进程层次的概念,所有进程都是地位相同的。唯一类似进程层次的暗示是在创建进程的时候,父进程得到一个特别的令牌(句柄),该句柄可以用来控制子进程。但是他有权把这个令牌传送给某个其他的进程,这样就不存在进程层次了。

6、进程的状态:

    尽管每个进程都是一个独立的实体,由其自己的内部状态,但进程之间经常需要相互合作。一个进程的输出结果可能作为另一个进程的输入。

进程的三种状态:运行态,就绪态,阻塞态

7、进程的实现:

为了实现进程模型,操作系统维护着一张表格(一个结构数组),即进程表。每个进程占用一个进程表项。(进程控制块)该表项包含了进程状态的重要信息,包括进程计数器,堆栈指针,内存分配情况,所打开文件的状态,账号,和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样。

麦库截图20171521151124249.jpg 

    在了解进程表之后,就可以对在单个CPU上如何维持多个顺序进程的错觉做更多的阐述。与每一I/O类关联的是一个称作中断向量的位置。它包括有中断服务程序的入口地址。假设当一个磁盘中断发生时,用户进程3正在运行,则终端硬件将程序计数器,程序状态字,有时还有一个或多个寄存器压入堆栈,计算机随机跳转到中断向量所指示的地址。这些是硬件完成的所有操作,然后软件,特别是中断服务例程就接管一切剩余的工作。

    所有的中断都从保存寄存器开始,对于当前今晨而言,通常是在进程表象中。

二、线程。

    传统操作系统中,每个进程都有一个地址空间和一个控制线程。事实上,这就是进程的定义。

不过,经常在同一个地址空间中并行多个控制线程,这些线程就像分离的进程。

1、线程的使用:

    在许多应用中,同时发生着多种活动。其中某些活动会随着时间的推移会被阻塞。(1)通过将这些

应用程序分解成可以并行的多个顺序线程,程序设计模型会变得更加简单。(2)由于线程比进程更加的轻量级

,所以他们比进程更容易创建,撤销。(3)涉及性能方面的考虑:如果多个线程都是CPU密集型的,那么并不能获得性能上的增强,但是如果存在着大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠进行,从而会加快应用程序执行的速度。

    通过一些典型的列子,我们可以清楚的看出多线程的有益之处。第一个列子,文件处理软件按站在打印页上的格式在屏幕上显示文档。特别的行分隔符和页分隔符都在正确的位置上精确显示文档。这样在需要时,用户可以检查和修改文档。

2、经典的线程模型。

    既然已经明白线程的创建与使用,不如让我们进一步研究进程模型。进程模型基于两种独立的概念:(1)资源分组(2)执行

将它们分开这才有了线程的概念。

    理解线程的一个角度就是:用某种方法把相关资源集中在一起。进程存放程序正文和数据以及其他资源的地址空间。这些资源中包括打开的文件、打开的进程、即将发生的进程。吧他们都放在进程中可以更容易的管理。

    另一个概念就是:进程拥有一个执行的线程,通常简写为线程。在线程中有一个程序技术器,用来记录接着要执行那一条指令。线程拥有寄存器,用来保存线程当前的工作变量。线程还拥有一个堆栈,用来记录执行理事,每一帧保存了一个调用的但是还没有从中返回的过程。尽管线程必须在某个进程中执行,但是线程和他的进程是不同的。进程负责把资源集中到一起,而线程则是在CPU上被调度的实体。

    在同一个进程中并行运行着多个线程。

    线程给进程模型增加了一项内容,即在同一个进程环境中,允许彼此之间有较大的独立性的多个线程执行。同一个进程中并行运行着多个线程,是对在同一台计算机上运行多个进程的模拟。前一种情况下,多个线程共享一个地址空间和其他的资源。而在后一种情况下,多个进程共享物理内存,磁盘。多线程这个术语就是用来描述在同一个进程中允许多个线程的情况。

    更何况,现在一些CPU已经有直接硬件支持多线程,并允许线程切换在纳秒级完成。

麦库截图20172322230304199.jpg 

    如上有三个传统的进程,每个进程有自己的地址空间和单个控制进程。尽管在两种情况中,都有3个线程,但是每一个线程都在不同的地址空间中运行,线程轮流运行。

    进程中的不同线程不像不同进程之间那样存在很大的独立性。所有的线程都有完全一样的地址空间,这意味着他们也共享同样的全局变量。由于各个线程都可访问进程地址空间中的每一个内存地址,所以一个线程也可以读,写,或清除另一个线程的堆栈。线程之间是没有保护的。

原文地址:https://www.cnblogs.com/yjds/p/8597438.html