操作系统精髓于设计原理(原书第6版) 第四章线程、对称多处理和微内核 学习笔记(1)

                         第四章 线程、对称多处理和微内核

 


4.1 进程和线程


1 进程的概念包含两个特点:

(1)资源所有权:一个进程包含一个存放进程映像的虚拟地址空间。一个进程总是拥有对资源的控制或所有权。操作系统执行保护功能,以防止进程之间发生不必要的与资源相关的冲突。(2)调度/执行:一个进程沿着通过一个或多个程序的一条执行路径执行。一个进程具有一个执行状态和一个分配的优先级,并且是一个可被操作系统调度和分派的实体。

2 为区分进程的这两个特点,分派的单位通常称作线程或轻量级进程,而拥有资源所有权的是进程或任务

3 多线程是值操做系统在当进程内支持多个并发执行路径的能力。

4 MS-DOS是一个支持单用户进程和单线程的例子。各种版本的Unix系统支持多用户进程,但只支持每个进程一个线程。Windows、Solaris和现在版本的Unix等操作系统支持多进程且每个进程支持多个线程的情况。

5 在多线程环境中,进程被定义为资源分配的单位和一个被保护的单位,与进程相关联的有:●存放进程映像的虚拟地址空间;●受保护的对处理器、其他进程、文件和I/O资源的访问。

6 每个进程中可以有一个或多个线程,每个线程有:线程执行状态;在未运行时保存的线程上下文;一个执行栈;用于每个线程局部变量的静态存储空间;与进程内的其他线程共享的对进程的内存和资源的访问

7 单线程和多线程:每个进程中都有一个进程控制块和用户地址空间。还有在进程执行中管理调用/返回行为的用户栈和内核栈。多线程与它的区别在于多线程的每个线程都有一个独立的栈,还有独立的控制块用于包含寄存器值、优先级和其他与线程有关的状态信息。进程中的所有线程共享该进程的状态和资源。下图展现了单线程与多线程的进程模型。

8 线程的优点(性能方面):(1)在一个已有的进程中创建一个线程比新创建一个进程所需的时间要少得多。(2)终止一个线程要比终止一个进程花费的时间少。(3)同一进程内线程间切换比进程间切换花费的时间少。(4)线程提高了不同的执行程序间通信的效率。大多数操作系统中,独立进程之间的通信需要内核的介入,以提供保护和通信所需要的机制。

9 文件服务器是一个使用线程的例子。当每个新文件请求到达时,回味文件管理进程创建一个新的线程。文件服务中的进程或线程都要共享文件数据,并根据此协调他们的行为,使用线程和共享内存比使用进程和消息传递要快。

10 如果服务器运行在多处理器机器上,同一进程的多个线程就可以同时在不同的处理器上执行。

11 单用户多处理系统中使用线程的例子:(1)前台和后台工作:例如,电子表格程序,一个线程负责显示菜单并读取输入,另一个线程执行用户命令并更新表格。这种程序允许前一条命令完成前提示输入下一条命令。(2)异步处理:程序中的异步元素可以使用线程实现。例如:可以创建一个线程,专门负责周期性的进行备份数据以防断电等带来数据丢失,并且由操作系统调度这线程。(3)执行速度:一个多线程进程在计算这批数据的同时可以从设备读取下一批数据。在多处理器系统上,同一个进程中的不同线程可以同时执行。(4)模块化程序结构:涉及多种活动或多种输入输出的源和目的程序更易于线程设计和实现。

12 在支持线程的操作系统中,调度和分派识在线程基础上完成的,因此大多数与执行相关的信息可以保存在线程级的数据结构中,但是一些影响着进程中所有线程的活动,操作系统必须在进程级对他们进行管理。

13 进程的终止会导致进程中所有线程的终止。

14 如果一个进程被换出,那么它所有的线程也被换出,

15 线程的关键状态有;运行态、就绪态和阻塞态。

16 与线程状态改变相关的四种操作:

派生:在典型情况下,当派生一个新进程时,同时也为该进程派生了一个新线程。

阻塞:当一个线程需要等待一个事件时,他将被阻塞(保存它的用户寄存器、程序计数器、栈指针),此时处理器转而执行另一个处于同一进程中或不同进程中的就绪线程。

解除阻塞:当阻塞一个线程的事件发生时,线程会被转移到就绪队列。

结束:当一个线程完成时,器寄存器上下文和栈都被释放。

17 下图展示了使用线程的远程调用过程:可以观察到使用线程使得速度得到了实质性的提高。如果这个程序运行在单处理器上,那么必须顺序的产生请求并且顺序的处理结果,但是对两个应答的等待时并发的。

18 在单处理器中,多道程序设计使得多个进程中的多个线程可以交替执行。下图中,两个进程中的三个线程在处理器中交替执行,在当前正在运行的线程阻塞或它的时间片用完,执行传递给另一个线程。

19 例子:Adobe PageMaker

    使用多线程的一个例子。是一个用于桌面排版系统的编辑、设计和生产出版工具。有3个线程总是活跃的:事件处理线程、屏幕重画线程、服务线程。它的主要线程结构如下图所示:

20 线程的实现可以分为两类:用户级线程和内核级线程。

21 在一个纯粹的用户级线程中,有关线程管理的所有工作都由应用程序完成。,内核意识不到线程的存在。如下图4.6a所示:

默认应用程序从单线程开始,并在该线程中开始执行。该应用程序和它的线程被分配给一个由内核管理的进程。在应用程序处于运行态的任意时刻,该应用程序都可以派生出一个相同进程中运行的新线程。派生线程是通过调用线程库中的派生例程完成的。通过过程调用,控制权被传递给派生例程。这些活动都发生在用户空间中,并且发生在一个进程中,而内核并不知道这些活动。内核以进程为单位进行调度。

线程调度与进程调度问题:(如下图4.7所示)

假设进程B在它的线程2中执行,进程和作为进程一部分的两个用户级线程的状态如图4.7a所示,则可能发生以下任何一种情况:

1)线程2中执行的应用程序进行系统调用,阻塞了进程B。例如,进行一次I/O调用。这导致控制转移到内核,内核启动I/O操作,把进程B置于阻塞状态,并切换到另一个进程。在此期间,根据线程库维护的数据结构,进程B的线程2仍处于运行态。值得注意的是,从在处理器上执行的角度看,线程2实际上并不处于运行态,但是在线程库看来,它处于运行态。相应的状态图见图4.7b。

2)时钟中断把控制传递给内核,内核确定当前正在运行的进程B已经用完了它的时间片。内核把进程B置于就绪态并切换到另一个进程。同时,根据线程库维护的数据结构,进程B的线程2仍处于运行态。相应的状态图如图4.7c所示。

3)线程2运行到需要进程B的线程1执行某些动作的一个点。此时,线程2进人阻塞态,而线程I从就绪态转换到运行态,进程自身保留在运行态。相应的状态图如图4.7d所示。

在第1种和第2种情况中(如图4.7b和图4.7c所示),当内核把控制切换回进程B时,线程2会恢复执行。还需注意进程在执行线程库中的代码时可以被中断,或者是由于它的时间片用完了,或者是由于被一个更高优先级的进程所抢占。因此在中断时,进程有可能处于线程切换的中间时刻,即正在从一个线程切换到另一个线程。当该进程被恢复时,线程库得以继续运行,并完成线程切换和把控制转移给该进程中的另一个线程。

22 使用用户级线程相对于内核级线程的优点:

1)由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核态特权、因此,进程不需要为了线程管理而切换到内核态,这节省了两次状态转换(从用户态到内核态;从内核态返回到用户态)的开销

2)调度可以是应用程序相关的。一个应用程序可能更适合简单的轮转调度算法,而另一个应用程序可能更适合基于优先级的调度算法。可以做到为应用程序量身定做调度算法而不扰乱底层的操作系统调度程序。

3)用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程。 线程库是一组供所有应用程序共享的应用程序级别的函数。

22 用户级线程相对于内核级线程的缺点:

1)在典型的操作系统中,许多系统调用都会引起阻塞。因此,当用户级线程执行一个系统调用时,不仅这个线程会被阻塞,进程中的所有线程都会被阻塞。

2)在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术。内核一次只把一个进程分配给一个处理器,因此一个进程中只有一个线程可以执行。 事实上,在一个进程内,我们相当于实现了应用程序级别的多道程序。虽然多道程序会使得应用程序的速度明显提高,但是同时执行部分代码更会使某些应用程序受益。

23 上述问题(缺点)的解决方案:

1)可以通过把应用程序写成一个多进程程序,而不是多线程程序来克服这两个问题。但是,这个方法消除了线程的主要优点:每次切换都变成了进程间的切换,而不是线程间的切换,从而导致开销过大

2)使用一种称为jacketing的技术。jacketing的目标是把一个产生阻塞的系统调用转化成一个非阻塞的系统调用。例如,不是直接调用一个系统I/O例程,而是让线程调用一个应用级的 I/O jacket例程,这个jacket例程中的代码用来检查并确定I/O设备是否忙。如果忙,该线程进入阻塞状态并将控制传送给另一个线程。当这个线程后来又重新获得控制时,jacket例程会再次检查IO设备。

24 内核级线程:在一个纯粹的内核级线程软件中,有关线程管理的所有工作都是由内核完成的。应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口(AP)。Windows是内核级线程的例子。

    上图4.6b展示了内核级线程的方法。内核为进程及其内部的每个线程维护上下文信息。调度是由内核基于线程实现的。

25 内核级线程的优点

1)内核可以同时把同一个进程中的多个线程调度到多个处理器中;其次,如果进程中的一个线程被阻塞,内核可以调度同一个进程中的另一个线程。

2)内核例程自身也是可以使用多线程的。

26内核级线程方法的主要缺点是:

在把控制从一个线程传送到同一个进程内的另一个线程时,需要到内核的状态切换,比较耗费时间。

27从表面上看,虽然使用内核级线程多线程技术会比使用单线程的进程有明显的速度提高,但是使用用户级线程却比内核级线程又有额外提高。(无需转换内核态,消耗时间)

28 在组合的系统中,线程创建完全在用户空间中完成,线程的调度和同步也是在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些内核级线程上。在组合方法中,同一个应用程序中的多个线程可以在多个处理器上并行的运行,某个会引起阻塞的系统调用不会阻塞整个进程。(Solaris系统是一个很好的例子)

29 线程和进程间的关系:(如下图所示)


4.2 对称多处理


1 计算机系统分为4类:单指令单数据流(SISD)、单指令多数据流(SIMD)、多指令单数据流(MISD)(该结构从未实现过)、多指令多数据流(MIMD)(该结构中的处理器都是通用的)

2 并行处理器的体系结构:(见下图)

    共享内存多处理器系统:处理器共享一个专用内存,每个处理器都访问保存在共享内存中的程序和数据,处理器间通过该内存互相通信,这类系统称为共享内存多处理器系统。

    在主/从结构中,操作系统内核总是在某个特定的处理器上运行,其他处理器只用于执行用户程序,还可能执行一些操作系统实用程序。主处理器负责调度进程或线程。该方法的缺点是:(1)主处理器的失效将导致整个系统失效,(2)由于主处理器需要单独完成所有的调度和进程管理,他可能成为性能瓶颈

    在对称多处理系统中:内核可以在任何处理器上进行,并且通常是每个处理器从可用的 进程或线程池在进行自己的调度工作。内核可以由多进程或多线程构成,允许部分内核可以并行执行。SMP方法增加了操作系统的复杂性,必须确保两个处理器不会选择同一个进程,并且确保不会由于某种原因从队列中丢失

3 SMP的组织结构:SMP中有多个处理器,每个都含有它自己的控制单元、算术逻辑单元和寄存器:每个处理器都可以通过某种形式的互连机制访问一个共享内存和I/O设备,共享总线就是一个通用方法。处理器可以通过内存(留在共享地址空间中的消息和状态信息)互相通信,还可以直接交换信号。内存通常被组织成允许同时有多个对内存不同独立部分的访问。

4 高速缓存的一致性问题:由于每个本地高速缓存包含部分内存的映像,如果修改了高速缓存中的一个字,使得在其他高速缓存中这个字都变成无效的。为避免这一点,当发生更新时,别的处理器必须被告知发生了更新。通常由硬件解决该问题。

5多处理操作系统的设计关键点:

(1)同时的并发进程或线程:为允许多个处理器同时执行相同的内核代码,内核例程必须是可重人的(reentrant)。多个处理器执行内核的相同或不同部分时,必须对内核表和管理结构进行合适的管理,以避免死锁或非法操作。

(2)调度:调度可以由任何处理器执行,因此必须避免冲突。

(3)同步:因为多个活动进程都可能访问共享地址空间或共享I/O资源,因而需注意提供有效的同步。同步是保证互斥和事件排序的机制,锁(lock)是多处理器操作系统中一个通用的同步机制。

(4)存储管理:多处理器上的存储管理必须处理在单处理器机器上发现的所有问题。此外,为达到最佳性能,操作系统需要尽可能地利用硬件并行性,如多端口内存;还必须协调不同处理器上的分页机制,以保证当多个处理器共享页或段时页面的一致性,以及决定页面置换的策略.

(5)可靠性和容错:当处理器失效时,操作系统应该提供适当的功能降低。调度程序和操作系统的其他部分必须知道处理器的失效情况,并且据此重新组织管理表。
 


4.3 - 4.6见下一篇

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值