现代操作系统(二)

二.进程与线程

进程

1.进程模型:一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和当前变量的值。一个进程是某种类型的一个活动,它有程序、输入、输出以及状态

2.进程的创建
四种主要事件会导致进程的创建:

  • 系统初始化
  • 正在运行的程序执行了创建进程的系统调用
  • 用户请求创建一个新进程
  • 一个批处理作业的初始化

进程创建之后,父进程和子进程有各自不同的地址空间

3.进程的终止
进程的终止通常由下列条件引起:

  • 正常退出(自愿),进程完成了工作
  • 出错退出(自愿),进程发现了严重错误
  • 严重错误(非自愿),由进程引起的错误
  • 被其他进程杀死(非自愿),某个进程执行一个系统调用通知操作系统杀死某个其他进程

4.进程的层次结构
在UNIX中,进程和它的所有子进程以及后裔共同组成一个进程组,所有的进程都属于以init为根的一棵树

5.进程的状态

  • 运行态(该时刻进程实际占用CPU)
  • 就绪态(可运行,但是因为其他进程正在运行而暂停运行)
  • 阻塞态(除非某种外部事件发生,否则进程不能运行)

6.进程的实现
操作系统维护着一张表格,即进程表。每个进程占用一个进程表项。
该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换为就绪态或阻塞态时必须保存的信息

线程
1.线程的使用

  • 在许多应用中同时发生这多种活动,并行实体拥有共享同一个地址空间和所有可用数据的能力
  • 线程比进程更轻量级,所以比进程更容易创建和撤销
  • 性能方面的讨论,存在大量I/O时,多个线程允许彼此重叠运行,加快应用执行速度
  • 在多CPU系统中,多线程是有益的,真正的并行有了实现的可能

2.经典的线程模型
进程:用某种方法把相关的资源集中在了一起。进程有存放程序正文和数据以及其他资源的地址空间。这些资源中包括打开的文件、子进程、即将发生的计时器、信号处理程序、账号信息等。把它们都放到进程中可以更容易管理。
线程:有一个程序计数器,用来记录要执行哪一条指令。寄存器,用来保存线程当前的工作变量。堆栈,用来记录执行历史,其中每一帧保存了一个以调用的但是没有从中返回的过程。
进程用于把资源集中到一起,线程则是在CPU上被调度执行的实体
线程概念试图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作

3.POSIX线程

线程调用 描述
pthread_create 创建一个新线程
pthread_exit 结束调用的线程
pthread_join 等待一个特定的线程退出
pthread_yield 释放CPU来运行另一个线程

4.在用户空间中实现线程
优点:
用户级线程包可以在不支持线程的操作系统上实现
在用户空间管理线程时,每个进程需要有其专用的线程表,用来跟踪该进程中的线程
进行线程切换比陷入内核要快一个数量级以上,这是使用用户级线程包的极大的优点
不需要陷入内核,不需要上下文切换,也不需要对内存高速缓存进行刷新,使得线程调度非常快捷
允许每个进程有自己定制的调度算法
缺点:
如何阻塞系统调用
如果一个线程开始运行,那么在该进程中的其他线程就不能运行,除非第一个线程自动放弃CPU

5.在内核中实现线程
内核中有用来记录系统中所有线程的线程表
内核的线程表中保存了每个线程的寄存器、状态和其他信息

6.混合实现
使用内核级线程,然后将用户级线程与某些或者全部内核线程多路复用起来
每个内核级线程有一个可以轮流使用的用户级线程集合

7.调度程序激活机制
目标是模拟内核线程的功能,但是为线程包提供通常在用户空间中才能实现的更好的性能和更大的灵活性
当内核了解到一个线程被阻塞后,内核通知该进程的运行时系统,并且在堆栈中以参数形式传递有问题的线程编号和所发生事件的一个描述
把当前线程标记为阻塞,从就绪表中取出另一个线程,设置其寄存器,然后再启动之。

8.弹出式线程
一个消息的到达导致系统创建一个处理该消息的线程

9.使单线程代码多线程化

进程间通信

1.竞争条件
即两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件

2.临界区
互斥:以某种手段确保当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作
把对共享内存进行访问的程序片段称作临界区域或临界区
满足的条件:

  • 任何两个进程不能同时处于其临界区
  • 不应对CPU的速度和数量做任何假设
  • 临界区外运行的进程不得阻塞其他进程
  • 不得使进程无限期等待进入临界区

3.忙等待的互斥
(1)屏蔽中断 :在单处理器系统中,最简单的办法是使每个进程在刚刚进入临界区后立即屏蔽所有中断,并在就要离开之前在打开中断。屏蔽中断对于操作系统本身而言是一项很有用的技术,但对于其他用户进程则不是一种合适的通用互斥机制
(2)锁变量:软件方式,通过设置一个共享变量来检测是否有进程访问临界区
(3)严格轮换法:利用忙等待的锁(自旋锁)实现
(4)Peterson解法
(5)TSL:硬件解法(测试并加锁),执行TSL指令的CPU将锁住内存总线,以禁止其他CPU在本指令结束之前访问内存。为了使用TSL指令,要使用一个共享变量lock来协调对共享内存的访问。一个可替代TSL的指令时XCHG,它原子性地交换了两个位置的内容

4.睡眠与唤醒
通过sleep和wakeup原语:使得进程在无法进入临界区时阻塞而不是忙等待

5.信号量
它使用一个整型变量来累计唤醒次数,一个信号量的取值可以为0(表示没有保存下来的唤醒操作)或者为正数(表示有一个或多个唤醒操作)
设立两种操作down和up
对一信号量执行down操作,则是检查其值是否大于0,若该值大于0,则将其值减1并继续;若该值为0,则进程将睡眠,而且此时down操作并未结束
up操作对信号量的值增1。如果一个或多个进程在该信号量上睡眠,无法完成一个先前的操作down,则由系统选择一个并允许该进程完成它的down操作

6.互斥量
信号量的简化版本,仅仅适用于管理共享资源或者一小段代码

7.管程
一个管程是一个由过程、变量及数据结构等组成的一个集合,它们组成一个特殊的模块或软件包
管程有一个很重要的特性,即任意时刻管程中只能有一个活跃进程,这一特性使进程能有效的完成互斥
阻塞问题通过条件变量wait和signal解决

8.消息传递
使用send和receive原语进行进程间通信
为了防止信息丢失,发送方和接收方达成如下协议:一旦接收到消息,接收方马上回送一条特殊的确认消息;如果发送方在一段时间间隔内未收到确认,则重发消息。通过设置序列号避免重复接收消息

9.屏障
用于进程组的同步机制

10.避免锁:读—复制—更新

调度

1.调度简介:
某些进程花费了绝大多数时间在计算上,称为计算密集型;某些进程在等待I/O上花费了绝大多数时间,称为I/O密集型
调度算法的目标
所有系统
公平——给每个进程公平的CPU份额
策略强制执行——保证规定的策略被执行
平衡——保持系统的所有部分都忙碌
批处理系统
吞吐量——每小时最大作业数
周转时间——从提交到终止间的最小时间
CPU利用率——保持CPU始终忙碌
交互式系统
响应时间——快速响应请求
均衡性——满足用户的期望
实时系统
满足截止时间——避免丢失数据
可预测性——在多媒体系统中避免品质降低

2.批处理系统中的调度
(1)先来先服务:进程按照它们请求CPU的顺序使用CPU。一个单链表记录了所有的就绪进程
(2)最短作业优先:适用于运行时间可以预知的另一个非抢占式的批处理调度算法
(3)最短剩余时间优先:最短作业优先的抢占式版本,调度程序总是选择剩余运行时间最短的那个进程运行

3.交互式系统中的调度
(1)轮转调度:每个进程被分配一个时间段,称为时间片,即允许该进程在该时间段运行;时间段设置的太短会导致过多的进程切换降低了CPU效率;设置太长又可能引起对短的交互请求的响应时间变长
(2)优先级调度:每个进程被赋予一个优先级,允许优先级最高的可运行进程先运行;为了防止高优先级进程无休止的运行,可以通过每个时钟中断降低当前进程的优先级或者为每个进程赋予一个允许运行的最大时间片
(3)多级队列:属于最高优先级类的进程运行一个时间片,属于次高级优先类的进程运行2个时间片,再次一级的进程运行4个时间片,以此类推
(4)最短进程优先
(5)保证调度:向用户作出明确的性能保证并实现,系统必须跟踪各个进程自创建以来使用了多少CPU时间
(6)彩票调度:基本思想是为进程提供各种系统资源的彩票,一旦需要做出一项调度决策时,就随机抽出一张彩票,拥有该彩票的进程获得该资源
(7)公平分享调度:考虑进程拥有者这一因素,根据用户分配CPU时间

4.实时系统中的调度
硬实时:必须满足绝对的截止时间
软实时:虽然不希望偶尔错失截止时间,但是可以容忍

5.策略和机制
调度机制位于内核,调度策略由用户进程决定

6.线程调度
用户级线程:内核不知道线程的存在,所以只是把时间片分给进程使用;当线程用完了该进程被分配的时间片之后,内核会选择另一个进程运行。一般使用轮转算法或者优先级算法
内核级线程:内核选择一个特定的线程运行
两者的差别在于性能:用户级线程的线程切换只需要少量的机器指令,内核级线程需要完整的上下文切换,修改内存映像,使高速缓存失效,这导致若干数量级的延迟;用户级线程可以使用专为应用程序定制的线程调度程序

经典的IPC问题

哲学家就餐问题
读—写问题

猜你喜欢

转载自blog.csdn.net/u011955067/article/details/80239708