现代操作系统之进程与线程(下)

来源:互联网 发布:vb6数据库实例 贴吧 编辑:程序博客网 时间:2024/05/20 08:25

进程间通信

竞争条件

当两个或多个进程读写某些共享数据,而最好当结果取决于进程允许当精确时许,称为竞争条件。

临界区

实际上凡涉及共享内存、共享文件以及共享任何资源的情况都会引发与前面类似的错误,我们把对共享内存进行访问对程序片段称作临界区。

而一个好的解决方案满足一下四点:
  1. 任何两个进程不能同时处于临界区
  2. 不应对CPU对速度和数量做任何假设
  3. 临界区外允许对进程不得阻塞其他进程
  4. 不得使进程无限期等待进入临界区

忙等待的互斥

屏蔽中断

在屏蔽中断之后CPU将不会被切换到其它进程,于是,当某个进程屏蔽中断之后,他就可以检查和修改共享内存,而不必担心其他进程介入,

这个方案很不好,一旦没有关闭屏蔽中断,可以整个系统都会停止。而且屏蔽中断只对单个CPU有效,其它CPU仍旧继续运行,并可以访问共享内存。

结论:屏蔽中断对于操作系统而言是一门非常有用的技术,但对于用户进程则不是一种合适的通用互斥机制。


锁变量

同样存在进程切换问题

严格轮换法

这种方法在一个进程比另外一个进程慢很多情况下不好用,且违反要求3

Peterson解法

P69


TSL指令

 TSL命令读和写是不可分割的(通过硬件支持)


睡眠和唤醒


信号量

检查树脂、修改变量值以及可能发生的睡眠操作均作为一个单一的、不可分割的原子操作完成。

如果使用多个CPU,那么每个信号量应由一个锁变量进行保护。

互斥是避免混乱所必须的操作。

信号量的另一用途是实现同步。



互斥量

互斥量是信号量的简化版。


条件变量允许线程由于一些为达到的条件而阻塞。
条件变量和互斥量经常一起使用,让一个线程锁住一个互斥量,然后当他不能获得它期待结果时等待一个条件变量。

条件变量(不像信号量)不会存在内存中。如果将一个信号量传递给一个没有线程在等待的条件变量,那么该信号会丢失。


管程

一个管程是一个有过程、变量及数据结构等组成的一个集合,他们组成一个特殊的模块或软件包。进程可以调用管程中的过程,但他们不能在管程之外声明的过程直接访问管程内的数据结构。

进入管程氏的互斥由编译器负责,但通常的做法是用一个互斥量或二元信号量。

signal可以唤醒另一个伙伴进程,通常该语句作为管程最后一句使用。

管程必须要有语言支持

如果以后 i 个分布式系统具有多个CPU,并且每个CPu都拥有自己的私有内存,它们通过局域网项链,那么原语句豆浆失效,因为信号量太低级。


消息传递

对信息进行编址——第一种方法是赋一个唯一地址,让消息按进程的地址编址。另一种是引进新的数据结构,称作信箱,信箱是一个用来对一定数量对消息进行缓冲的地方,信箱中消息数量的设置方法也有多种。

信箱的另一种极端方法是彻底取消缓存,不收到信息直接阻塞。


屏障



调度

尽管有一些不同,但许多适用于进程调度的处理方法也同样适用于线程调度。当内核管理线程的时候,调度经常是按县城疾病,与线程所属的进程基本或根本没有联系。


调度介绍

进程切换的代价是高昂的——首先用户态必须切换到内合同,然后报错当前进程状态,接着通过运行调度算法选定一个新进程。之后,应该将新进程的内存映像重新装入MMU,最后新进程开始运行。

几乎所有的进程的(磁盘)IO请求或计算都是交替突发的。

典型的计算密集型进程具有较长时间的CPU集中使用和较小的IO等待,而IO密集型进程具有较短时间的CPU集中使用和频繁的IO等待。

何时调度:
  1. 创建新进程
  2. 一个进程退出
  3. 当一个进程阻塞
非抢占式算法挑选一个进程,然后让该进程运行直至阻塞,或者直到该进程自动释放CPU。这样做的结果就是时钟中断发生时不会进行调度,在处理完时钟中断后,如果没有更高优先级的进程等待到时,则中断的进程会继续执行。

如果没有可用的时钟,那么非抢占性算法是唯一的选择。

调度算法分类
  1. 批处理
  2. 交互式
  3. 实时

实时系统和交互式系统的差别是,实时系统只允许那些用来推进现有应用的程序,而交互式系统是通用的,它可以运行人员的非写作甚至是有恶意的程序。

调度算法目标
P84

批处理通常考察三个指标:吞吐量,周转时间以及CPU利用率。
吞吐量是系统每小时完成的作业量。
周转时间是指从一个批处理作业提交时刻开始直到该作业完成时刻为止的平均统计时间,
CPU利用率不是一个好的统计指标,但是直到CPU利用率要比知道可用计算能力重要。

对于交互式系统最重要的最小响应时间。

实时系统的特定是或多或少必须满足截止时间。


批处理系统的调度

先来先服务
最短作业游戏
最短剩余时间优先(总是运行时间最短的)

交互式系统中的调度

轮转调度
优先级调度(为防止高优先级永远运行,可以在每次轮转降低优先级,若降低导致其成为次高的,则进程切换)优先级可以动态赋予或静态赋予
多级队列(不同优先级分配不同的时间片)
最短进程优先(要进行行为预测)
保证调度(基本爆炸每个用户运行时间相同)
彩票调度(分配不同比例的运行时间)
公平分享调度(一般所有进程运行时间相同)

实时系统的调度

实时系统是一种时间起着主导作用的系统。
实时系统放必须在一个确定的时间范围内给出反应。
实时系统分为硬实时(必须)和软实时(允许偶尔出错)

设周期性时间所花的时间为C,周期为P,那么所有C/P之和<=1则称为可调度的。



策略和机制

解决问题的一个方法是将调度机制和调度策略公开,也就是将调度算法以某种形式参数化。


线程调度

当若干进程都有多个线程时,就存在两个层次的并行:进程和线程。在这雨的系统中调度处理有本质差别,这取决于所支持的是用户级线程还是内核级线程。


用户级线程和内核级线程之间的差别在于性能,但是内核级线程出现阻塞时不会像用户级线程那样将整个进程挂起。

不过用户级线程可以为应用程序专门订制线程调度算法。


经典IPC问题

哲学家就餐问题

读者写者问题





原创粉丝点击