OS第四章进程与并发程序

进程与线程

并发与并行

顺序执行:按顺序一个任务一个任务执行。

并发:设有两个活动a1和a2,如果在某一指定的时间t,无论a1和a2是在同一处理机上还是在不同的处理机上执行,只要a1和a2都处在各自的起点和终点之间的某一处,则称a1和a2是并发执行的。(两活动只要有时间段上的重合就可以成为并发)

并行:如果考虑两个程序,它们再同一时间度量下同时运行在不同的处理机上,则称这两个程序是并行执行的。(两个进程同时运行在不同的处理机上,处理机被占用)

程序的顺序执行与特征

顺序性:按照程序结构所指定的次序。(可能有分支或循环)

封闭性:独占全部资源,计算机的状态只由于该程序的控制逻辑所决定。

可再现性:初始条件相同则结果相同。

程序的并发执行

程序的并发执行是指若干个程序(或程序段)同时在系统中运行,这些程序(或程序段)的执行在时间上是重叠的。

所谓执行在时间上是重叠的,是指执行一个程序(或程序段)的第一条指令是在执行另一个程序(或程序段)的最后一条指令完成之前开始。

程序并发执行时的特征

间断性:并发程序具有“执行——暂停——执行”这种间断性的活动规律。

非封闭性:多个程序共享系统中的资源,这些资源的状态将由多个程序来改变,致使程序之间相互影响。

不可再现性:在初始条件相同的情况下,程序的执行结果依赖于执行的次序。

竞争:多个进程在读写一个共享数据时结果依赖于它们执行的相对时间,这种情形就叫做竞争。

竞争条件:多个进程并发访问和操作统一数据且执行结果与访问的特定顺序有关,成为竞争条件。

并行性的确定——Bernstein条件

 B条件是判断程序并发执行结果是否可再现的充分条件。

进程的定义和特征

进程是程序的一次执行;

进程是可以和别的计算并发执行的计算;

进程可定义为一个数据结构,并且能在其上进行操作的一个程序;

进程是一个程序及其数据,在处理机上顺序执行时所发生的活动;

进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

进程的特征:

  • 动态性:进程是程序的一次执行过程,动态性表现为他因创建而产生,因调度而执行,因无资源而暂停,因撤销而消亡,而程序是静态实体。
  • 并发性:多个进程实体同时存在于内存中,能在一段时间内同时运行。
  • 独立性:在传统OS中,进程是独立运行的基本单位。
  • 异步性:进程之间相互制约,进程以各自独立的不可预知的速度向前推进。

进程结构:程序段,数据段,进程控制块PCB;

  • 程序的代码;
  • 程序的数据;
  • PC中的值,用来指示下一条将运行的指令;
  • 一组通用的寄存器的当前值,堆、栈;
  • 一组系统资源

进程与程序的区别与联系

进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制。

进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存。

进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。

进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。

进程的状态与控制

进程控制的主要任务:创建和撤销进程、进程的状态转换。(由内核来实现)

进程创建:提交一个批处理作业、用户登录、由OS创建向用户提供服务、由已存在的进程创建。

进程撤销:用户推出登录、进程执行中止服务请求、出错及失败因素、正常结束等等。

Unix中的进程层次结构

进程控制由原语实现,如创建原语(fork,exec),撤销原语(kill)

进程的三种状态

就绪状态:进程已获得除处理机外的所需资源,等待分配处理机资源,只要分配CPU就可执行。

执行状态:占用处理机资源;处于此状态的进程数小于等于CPU的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的idle进程(相当于空操作)。

阻塞状态:正在执行的进程,由于发生某种事件而暂时无法执行,便发起处理机处于暂停状态。

 就绪->运行:调度程序选择一个进程运行

运行->就绪:运行进程用完了时间片;运行进程被中断,因为一高优先级进程处于就绪状态。

运行->阻塞:

  • 当一进程所需的资源必须等待时
  • OS尚未完成服务
  • 对一资源的访问尚不能进行
  • 初始化I/O 且必须等待结果
  • 等待某一进程提供输入(IPC)

阻塞->就绪:当所等待的事件发生时

进程控制块(PCB)

系统为每个进程定义了一个数据结构:进程控制块PCB。

PCB作用:进程创建、撤销;进程唯一标志、限制系统进程数目。

进程控制块是进程管理和控制的最重要的数据结构,每个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤销而撤销。

进程上下文切换 vs 陷入内核

进程上下文切换:

  • 通常由调度器执行
  • 保存进程执行断点
  • 切换内存映射(页表基址、flush TLB)

陷入内核:

  • CPU状态改变
  • 由中断、异常、Trap指令(系统调用)引起
  • 需要保存执行现场(寄存器、堆栈等)

系统调用涉及到进程从用户态到内核态的切换,这个时候涉及到的切换主要是寄存器上下文的切换,和通常所说的进程上下文切换不同,mode switch的消耗相对要小很多。

线程

进程的不足:

  • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
  • 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

资源拥有者(进程)和可执行单元(线程)

线程:将资源与计算分离,提高并发效率。

进程 = 资源 + 指令执行序列

引入线程的目的

  • 减少进程切换的开销,
  • 提高进程内的并发程度,
  • 共享资源。

进程在过程中:创建进程、撤销进程、进程切换。

线程:进程中的一个实体、是一个CPU调度和分派的单位、基本不拥有资源,只有必不可少的少量资源、可以与其他同进程的线程共享进程拥有的所有资源。

引入进程:多个程序可以并发执行,改善资源利用率,提高系统效率。(并发的基础)

引入线程:减少并发程序执行时所付出的时空开销,使得并发粒度更细、并发性更好。(通过多线程切换使资源利用更充分)

进程拥有虚空间、进程映像、处理机保护、文件、I/O空间。

线程额外的资源:运行状态、保存上下文(程序计数器)、执行栈、资源共享机制。

一个进程执行指令时要通过映射表来确定地址,上图可以看出,每个线程都有自己的栈,在进程中不断进行切换,将资源和指令序列分离开来,实质时映射表不变而PC指针变,所以不同的线程中只是不断的更改执行的指令序列。

引入线程的好处

  • 线程比进程轻量:容易创建、撤销;
  • 有些应用要求并行实体共享同一个地址空 间和所有可用数据的能力;(即要满足共享资源,其实也并非非要共享,而是这样可以节省内存空间)
  • 创建一个线程比一个进程快10-100倍;
  • 对于存在大量计算和大量I/O处理的应用, 大幅度提高性能;(进行I/O操作时占用资源但是不进行计算,切换线程可以保证粒度更小资源充分利用)
  • 在多CPU/多核CPU系统中更有优势。

线程 v.s.进程

  • 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有。
  • 进程是资源分配的基本单位,线程是处理机调度的基本单位,所有的线程共享其所属进程的所有资源与代码。
  • 线程执行过程之中很容易进行协作同步,而进程需要通过消息通信进行同步。
  • 线程的划分尺度更小,并发性更高。
  • 线程共享进程的数据的同时,有自己私有的的堆栈。
  • 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口。它必须组成进程才能被执行。

线程的实现方式

用户级线程

用户级线程,通过用户主动进行切换,不用内核帮助。用户级线程是可以独立于操作系统的。

线程在用户空间,通过library模拟的thread,不需要或仅需要极少的kernel支持;

上下文切换比较快,因为不用更改page table等,使用起来较为轻便快速.

提供操控视窗系统的较好的解决方案.

用户级线程的优缺点

优点:线程切换与内核无关;线程的调度由应用决定,容易进行优化;可运行在任何操作系统上,只需要线程库的支持。

缺点:很多系统调用会引起阻塞,内核会因此而阻塞所有相关的线程;内核只能将处理器分配给进程,即使有多个处理器,也无法实现一个 进程中的多个线程的并行执行。

内核级线程

内核级线程就是kernel有好几个分身,一个分身可以处理一件事.

这用来处理非同步事件很有用, kernel可以对每个非同步事件产生一个分身来处理.

支持内核线程的操作系统内核称作多线程内核。

内核级线程的优缺点 

优点:内核可以在多个处理器上调度一个进程的多个线程实现同步并行执行;阻塞发生在线程级别;内核中的一些处理可以通过多线程实现。

缺点:一个进程中的线程 、切换需要内核参与, 线程的切换涉及到两个模式的切换 (进程-进程、线程-线程);降低效率。

混合的线程实现方式

使用内核级线程,然后将用户级线程与某些或者全部内核线程多路复用起来,形成混合的线程实现方式。

采用这种方法,编程人员可以决定有多少个内核级线程和多少个用户级线程彼此多路复用。这一模型带来最大的灵活度。

内核只识别内核级线程,并对其进行调度。其中一些内核级线程会被多个用户级线程多路复用。如同在没有多线程能力操作系统中某个进程中的用户级线程一样,可以创建、撤销和调度这些用户级线程 。在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合。

三种线程实现的方式对比

线程编程问题—线程安全

线程安全:多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。

TIP:可重入与线程安全不同,可重入不一定线程安全,线程安全不一定可重入。

同步与互斥

程序的并发执行

并发是OS的基础(没有并发就无需OS的管理),也是所有问题产生的原因。

进程的三个特征:

  • 并发:体现在进程的执行是间断性的;进程的相对执行速度是不可测的。(间断性)
  • 共享:体现在进程/线程之间的制约性(如共享打印机)。(非封闭性)
  • 不确定性:进程执行的结果与其执行的相对速度有关,是不确定的。(不可再现性)

并发执行,不可避免地产生了多个进程对同一个共享资源访问,造成了资源的争夺。

竞争:两个或多个进程对同一共享数据同时进行访问,而最后的结果是不可预测的,它取决于各个进程对共享数据访问的相对次序。这种情形叫做竞争。

竞争条件:多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关。

临界资源:我们将一次仅允许一个进程访问的资源称为临界资源。

临界区:每个进程中访问临界资源的那段代码称为临界区。

进程的同步与互斥

进程互斥(间接制约关系):

  • 两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥。
  • 进程互斥是进程间发生的一种间接性作用,一般是程序不希望的。

进程同步(直接制约关系):

  • 系统中各进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性的过程称为进程同步。
  • 进程同步是进程间的一种刻意安排的直接制约关系。即为完成同一个任务的各进程之间,因需要协调它们的工作而相互等待、相互交换信息所产生的制约关系。

同步与互斥的区别与联系

互斥:某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。互斥无法限制访问者对资源的访问顺序,即访问是无序访问。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有对资源的写入的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

互斥区管理应满足的条件:

  1. 没有进程在临界区时,想进入临界区的进程可进入。
  2. 任何两个进程都不能同时进入临界区(Mutual Exclusion);
  3. 当一个进程运行在它的临界区外面时,不能妨碍其他的进程进入临界区(Progress);
  4. 任何一个进程进入临界区的要求应该在有限时间内得到满足(Bounded Waiting)。

机制设计上应遵循的准则:

  • 空闲让进:临界资源处于空闲状态,允许进程进入临界区。如,临界区内仅有一个进程执行
  • 忙则等待:临界区有正在执行的进程,所有其他进程则不可以进入临界区
  • 有限等待:对要求访问临界区的进程,应在保证在有限时间内进入自己的临界区,避免死等
  • 让权等待:当进程(长时间)不能进入自己的临界区时,应立即释放处理机,尽量避免忙等

基于忙等待的互斥方法

软件方法

Dekker算法:

N个进程互斥的软件算法

 实现进程互斥的软件的结构框架是:

面包店算法( Bakery Algorithm )

 

硬件方法

中断屏蔽

中断屏蔽方法:使用“开关中断”指令。

  • 执行“关中断”指令,进入临界区操作;
  • 退出临界区之前,执行“开中断”指令。

优缺点:

  • 简单。
  • 不适用于多CPU系统:往往会带来很大的性能损失;
  • 单处理器使用:很多日常任务,都是靠中断的机制来触发的,比如时钟,如果使用屏蔽中断,会影响时钟和系统效率,而且用户进程的使用可能很危险!
  • 使用范围:内核进程(少量使用)。

使用test and set指令

TS(test-and-set )是一种不可中断的基本原语(指令)。它会写值到某个内存位置并传回其旧值。在多进程可同时存取内存的情况下,如果一个进程正在执行检查并设置,在它执行完成前,其它的进程不可以执行检查并设置。

使用swap指令

 进程互斥实现:

几个算法的共性问题

无论是软件解法(如Peterson)还是硬件(如 TSL或XCHG)解法都是正确的,它们都有一个共同特点:当一个进程想进入临界区时,先检查是否允许进入,若不允许,则该进程将原地等待,直到允许为止。

1.忙等待: 浪费CPU时间

2.优先级反转:低优先级进程先进入临界区,高优先级进程一直忙等

基于信号量的方法

其基本思路是使用一种新的变量类型(semaphore),信号量只能通过初始化和两个标准的原语来访问,作为OS核心代码执行,不受进程调度的打断。

信号量的使用:必须置一次且只能置一次初值,只能由P、V操作来改变。

互斥:利用信号量实现进程互斥(S=1)。

同步:利用信号量实现进程同步(S=0)。

信号量在并发中的典型应用

多进程同步原语:屏障Barriers 

用于进程组的同步:

 

“信号量集”机制

当利用信号量机制解决了单个资源的互斥访问后,我们讨论如何控制同时需要多个资源的互斥访问。信号量集是指同时需要多个资源时的信号量操作。

AND型信号量集机制

基本思想:将进程需要的所有共享资源一 次全部分配给它;待该进程使用完后再一起释放。

 

一般“信号量集”机制

基本思想:在AND型信号量集的基础上进行扩充: 进程对信号量Si的测试值为ti(用于信号量的判断, 即Si >= ti,表示资源数量低于ti时,便不予分配), 占用值为di(用于信号量的增减,即Si = Si - di和 Si = Si +di)

 

 

P.V操作的优缺点

优点:简单,而且表达能力强(用P.V操作可解决任何同步互斥问题)

缺点:不够安全;P.V操作使用不当会出现死锁; 遇到复杂同步互斥问题时实现复杂。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值