第三章 进程、作业管理章节情况
3.1 进程管理概述
3.2 作业管理
3.3 并发进程
3.4 线程管理
3.1 进程管理概述
一,进程的概念
二,进程的调度
三,处理器调度
四,进程的控制一,进程的概念
1、进程概念的引入
2、进程的概念
3、进程的状态
1、进程概念的引入
有如下的程序段
S1:scanf(“%d”,&x);
S2:y=x*2;
S3:printf(“y=%d”,y);
由上面程序段可以看出,顺序程序的执行的特点如下:
1)、顺序性,处理机的操作是严格的按照程序所规定的顺序执行的,即上一个操作必须在下一个操作开始之前结束。
2)、封闭性:程序的执行结果仅与初始条件和程序本身决定。
3)、可再现性:程序执行的最终结果与执行速度无关。
4)、资源独占性:程序执行时独占系统中的全部资源,即这些资源的状态由该程序本身确定。
多道程序系统的引入:
内存中同时驻留多道程序,从宠观上看是几道程序同时执行,但从微观上看则是几道程序交替执行,轮流占用资源。
宏观上执行时间有重迭的几个程序称为并发程序。
多道程序系统的实质就是把并发程序的执行引入到系统中。
程序并发执行所带来的新的问题
1)、失去了程序的封闭性
如果一程序变量是其他程序执行时不可接触的,那么这个程序执行后的输出结果一定是其输入的一个与时间无关的函数,即封闭性。
如果一个程序的执行可以改变另一程序的变量,那么其输出的就可能依赖各种程序执行的速度,也就失去了程序的封闭性
Main()
{ int n=0,j1=2,j2=2;
cobegin
while(j1--)/*任务 j1*/
{n++;}
while(j2--)/*任务 j2*/
{ printf(“n is%d.,,n); n=0;}
Coend
}
2)、并发程序之间的相互制约。
间接制约关系:因竞争同一资源而相互制约
直接制约关系:由于程序间需要相互协同而引起的
2.进程的概念
1)、一些关于进程的定义:
进程是一个正在执行的程序。
进程是可以分配给处理器并由处理器执行的一个实体。
进程是一个具有独立功能的程序关于某个资料集合的一次运行活动。
进程是由一个顺序线程、一个当前状态和一组相关的系统资源所刻画的活动单元。
2)、进程的组成
( 1)一段可执行的程序
( 2)程序所需要的相关资料
(变量、工作空间、缓冲区等)
( 3)程序执行的上下文环境
(又称为进程状态)
在( 3)中,包括操作系统管理进程以及处理器执行进程所需要的所有信息。如处理器寄存器的内容,进程的优先级,
进程是否等待特定的 I/O事件。
3)、进程的实现方法
给每个进程分配一块内存区域,并在由操作系统建立和维护的进程表中进行记录。
每个进程表项都包含进程的存储块地址指针和部分或全部进程状态信息。
任何时候整个进程状态都包含在它的进程状态信息当中。
进程的五大特征
动态性:是程序的一次执行过程。
并发性:多个进程可以同时在一个系统中运行,
轮流占用处理器和各类系统资源。
独立性:是一个能独立运行的基本单位,独立分配得到所要求的资源。
异步性:相互制约
结构特征,PCB
3、进程的状态
1),5状态模型
运行:获得处理器及其他一切所需资源,正在
处理器上运行。
就绪:获得了除处理器以外的切所需资源,
阻塞:进程在某些事件发生前不能执行
新建:刚刚创建的进程。
退出:从可执行进程中释放出的进程。
其状态转换图见书 80
2)、有挂起状态的状态模型
为了让处理器尽量忙起来,为了让更多的进程进入主存并发执行的解决方法:
( 1)扩充主存
( 2)交换:就是将主存中的某进程的一部分或全部移到磁盘中。
当主存中没有处于就绪状丰收的进程时,就将被阻塞的进程换出到磁盘的挂起队列中。操作系统再从挂起队列中取出另一个进程,或接受一个新进程的请求,将其纳入主存运行。
几种可能的状态:
就绪:进程在主存中并可以执行
阻塞:进程在主存中并等待一个事件
就绪 /挂起:进程在辅存中,但是只要被加载主存就可以执行。
阻塞 /挂起:进程在辅存中,并等待一个事件。
二,进程的调度
1、进程调度的功能
2、进程调度的方式
3、进程调度的算法
4、调度的性能准则
1、进程调度的功能
1)、进程调度的功能
记录:记录系统中各进程的执行情况
调度:根据一定的算法,对就绪队列进行排序,以便选择一个就绪进程使之在处理器上运行。
分派:执行处理的分配操作。
2、进程调度的方式
1)、不可剥夺方式:
2)、可剥夺方式:
剥夺原则有:
优先权高的可剥夺优先权低的处理器运行;
短进程可剥夺长进程的处理器运行;
时间片用完后交出处理器重新调度
3、进程调度的算法
1),FCFS算法
2),FPF算法
静态优先级:
动态优先级:
3)时间片轮换法
4、调度的性能准则
周转时间:作业从提交到完成所经历的时间
带权周转时间:
响应时间:
公平性:
优先级:
三,处理器调度
1、前言
2、处理器调度的类型
3、调度的性能准则
4、进程调度器
5、调度算法
1、前言
操作系统必须为多个进程可能有竞争的请求分配计算机资源。
对处理器而言,可分配的资源是在处理器上的执行时间,分配途径是调度。
调度功能必须设计成为可以满足多个目标,包括公平、任何进程都不会饿死、
有效地使用处理器时间和低开销。
2、处理器调度的类型
1)、单处理器系统中的调度
长程调度
中程调度
短程调度长程调度
长程调度决定哪一个程序可以进入到系统中,
因此,它控制多道程序的调度。
在批处理系统中,或者通用的操作系统中的批处理部分,新提交的作业被发送到磁盘,并保存在一个批处理队列中。长程调度程序在可以时,从队列中创建一个进程。这里涉及到两个决策:之一调度程序必须决定操作系统可以接纳一个进程还是多个进程;之二调度程序必须决定接受哪个作业或哪些作业,并转变成进程。
中程调度
中程序调度是交换功能的一部分,决定加入到部分或全部在主存的进程集合中。
典型的,换入决策基于管理多道程序调度的要求。对不使用虚存的系统,存储器管理也是一个问题。因此,换入决策将考虑换出进程的存储需求。
短程调度
短程调度真正决定下一次处理器执行哪一个就绪进程。
2)多处理器系统中的调度
在多处理器系统中,有 3种比较突出的方法进行处理器分配:
负载分配:
成组调度:
专用处理器分配:
3、调度的性能准则
周转时间:作业从提交到完成所经历的时间。
带权周转时间:是指周转时间除以进程执行时间。
响应时间:是指用户输入一个请求到系统给出首次响应的时间。
公平性:是指调度算法不会因作业或进程本身的特性而使上述指标过分恶化。
与系统利用率相关的处理器调度指标包括吞吐量和处理器利用率等。
吞吐量:是指单位时间内所完成的作业数
4、进程调度器
进程调度器:操作系统中与进程调度相关的代码
进程调度器的主要功能是进程状态维护和进程的上下文切换。
5、调度算法
FCFS算法
SJF算法,最短剩余时间优先
最高响应比优先
时间片时钟算法
多级队列算法
优先级算法
多级反馈队列算法四,进程的控制
1、进程创建
2、进程切换
3、进程撤消
4、进程阻塞
5、进程唤醒
6,windows 2000的进程管理
1、进程创建
1)给新进程分配一个唯一的内部标识号
2)给进程分配空间
3)初始化进程控制块 PCB
4)设置正确的链接,
5)创建扩充其他数据结构
2、进程切换
进程切换就是在某一时刻,一个正在运行的进程被中断,
操作系统被转换到另一个状态,则操作系统必须使其环境产生实质的变化,一个完整的进程切换步骤如下,
1)保存处理器的上下文环境
2)更新当前处于运行状态的进程的进程控制块
3)把进程的 PCB移到相应的队列中
4)选择另一进程执行埋头苦干更新此进程的 PCB
5)根据地址管理的特点更新存储管理的数据结构
6)用被选中的进程的信息重载处理器的上下文环境信息
6,windows 2000的进程管理
Windows 2000的进程设计由给各种操作系统环境提供支持的需求所驱动,其内核所提供的进程结构和服务是相当简单和通用的,同时允许每个操作系统子系统模拟某种特定的进程结构和功能.
Windows 2000进程的重要特点是:
1) Windows 2000进程是作为对象实现的
2)一个可执行的进程包含有一个或多个线程
3)进程对象具有内置的同步能力
3.2作业管理
一、作业
二、批处理作业的管理一、作业
1、作业和作业步
2、作业控制方式
1、作业和作业步
作业:用户要求计算机系统处理的一个计算问题
把编制好的源程序和准备好的初始数据输入到计算机系统中,在操作系统控制下经过编译、连接装配、运行等步骤就能得到处理结果。
作业:一个作业所经历的加工步骤
2、作业控制方式
用户根据操作系统提供的手段来说明作业加工步骤的方式。
批处理方式:(脱机控制方式)
交互方式:(联机控制方式)
二、批处理作业的管理
1、作业控制语言
作业控制说明书
2、批处理作业的输入
SPOOLING/作业流
3、批处理作业的调度
3、批处理作业的调度
1)、先来先服务算法
2)、计算时间短的作业优先算法
3)、响应比高者优先算法
4)、优先数调度算法
5)、均衡调度算法
3.3 并发进程
一,进程的并发性
二,进程的互斥和同步
三,信号量
四,进程间的通信
五,进程的死锁一,进程的并发性
进程在执行过程中,不同运行阶段进程使用不同的系统资源,有着交替、重叠执行的可能性。正是因为多道程序系统中进程的相对执行速度不可预测,给系统也就带来了一些困难。
1、并发的存在带来的困难
1)操作系统必须记下诸进程
2)操作系统必须为每个进程分配和释放各类资源
3)操作系统必须保护每个进程的数据和物理资源,避免其他进程的无意干涉
4)操作系统的结果必须与执行速度无关,
即不会出现与时间有关的错误
2、进程间的相互制约关系
基于进程间相互知道对方是否存在的程度分三种可能:
1)、进程之间不知道对方
2)、进程间接知道对方
3)、进程直接知道对方
3、进程中的资源竞争
当并发进程竞争使用同一个资源时,它们相互之间会发生冲突,而竞争进程间没有任何信息交换,却可能影响到竞争进程的一些行为。
饿死:因得不到运行所需的资源,而处于长期等待,
临界资源:对一个不可共享的资源;在执行过程中,每个需要使用此资源时都要给其发命令,接收状态信息,
发送数据和接收数据的资源
临界区:使用临界资源的那段程序就称为程序的临界区。
注:对临界资源的访问必须满足互斥要求
4、进程间通过共享的合作
通过共享进行合作的进程间相互不确切知道对方的情况下进行交互。如诸进程可能访问同一个共享的变量、文件或数据库,进程在使用修改这些数据时,并不涉及到其他进程,但是它们知道其他进程也可能访问同一数据。
因此系统的控制机制必须要能确保共享数据的完整性。
5、进程间通过通信合作
当进程通过通信进行合作时,各个进程都参与其他进程的连接,而通信就是给其提供同步和协调各种活动的方法。
通常通信可以被描述成由各种类型的消息组成。
二,进程的互斥和同步
并发进程管理的主要任务是:使并发执行的诸进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现性。
1、进程互斥
当并发的进程要竞争使用某些临界资源时,为了提供互斥的支持,必须满足以下要求:
空闲让进:
忙则等待:
有限等待
让权等待
一些可以满足这些互斥条件方法:
软件方法:让希望并发的进程认为都需要与另一个进程合作,以实施互斥。
硬件支持:这种方法会涉及到使用专门的机器指令。
语言支持:即在操作系统或程序设计上提供某种级别的支持。
2、互斥
Dekker算法:
1)第一种尝试
给共享的互斥资源保留一个标记为 sign的全局存储器单元,希望使用这一临界资源的进程在进入临界区前必须首先检查
sign的内容。如果 sign的值等于该进程的进程号时,则该进程就可处于临界区,
否则必须等待。
忙等:
如第 I号进程的程序代码段如下:
…………
While (sing !=I) ; /*什么都不做 */
/*临界区 */
Sign=s;/*s为等待此资源的一个进程的进程号 */
………………
2)、第二种尝试
/*进程 0*/
……
While (flag[1])/*延迟 */;
Flag[0]=-1;/*赋值为真 */
/*临界区 */
Flag[0]=0;/*赋值为假 */
……
/*进程 1*/
……
While (flag[0])/*延迟 */;
Flag[1]=-1;/*赋值为真 */
/*临界区 */
Flag[1]=0;/*赋值为假 */
……
会导致死锁
3)第三种尝试
/*进程 0*/
……
Flag[0]=-1;
While (flag[1])
{flag[0]=0;
/*延迟 */;
Flag[0]=-1;
}
/*临界区 */
Flag[0]=0;
……
/*进程 1*/
……
Flag[1]=-1;
While (flag[0])
{flag[1]=0;
/*延迟 */;
Flag[1]=-1;
}
/*临界区 */
Flag[1]=0;
……
4)Dekker算法
Int flag[2]={0,0},sign=1;
Void main( )
{parbegin (p0( ),p1( ));
/*结构 parbegin的含义是挂起主程序的执行,开始并发执行进程 P0和 P1*/
}
Void P0( )
{……
Flag[0]=-1;
While(flag[1])
If(sign==1)
{flag[0]=0;
While(sign==1) ;
Flag[0]=-1;
}
/*临界区 */
Sign=1;
Flage[0]=0;
……
}
Void P1( )
{……
Flag[1]=-1;
While(flag[0])
If(sign==0
{flag[1]=0;
While(sign==01) ;
Flag[1]=-1;
}
/*临界区 */
Sign=0;
Flage[1]=0;
……
}
Perterson算法
Int flag[2]={0,0},sign;
Void main( )
{ parbegin (P0( ),P1());}
Void P0 ( )
{……
Flag[0]=-1;
Sign=1;
While (flag[1]&&sign==1);
/*临界区 */
Flag[0]=0;
……
}
Void P1 ( )
{……
Flag[1]=-1;
Sign=1;
While (flag[0]&&sign==0);
/*临界区 */
Flag[1]=0;
……
}
3、互斥(用硬件支持的方法)
1)中断禁用(即在临界区段前后加上启用和禁止中断就可以了)
2)专门的机器指令
test和 set 指令
exchange指令可能会产生饿死、死锁现象
Test和 set指令
Boolean testset(int bolt)
{ if (bolt==0) { bolt; return ture; }
else return false;
}
Const int N=进程数
Int bolt=0;
Void main()
{ parbegin (P(1),P(2),……,P(N)); }
Void P(int I)
{……
While (! Testset(bolt));
/*临界区 */
Bolt=0;
……
}
Exchange指令
Void exchange (int reg,int mem)
{ int temp;
temp=mem;mem=reg;reg=temp;
}
Const int N=进程数;
Int bolt=0;
Void main() {parbegin(P(1),P(2),…,P(N));}
Void p(int I)
{int key=1;
……
While(key!=0) exchange(key,bolt);
/*临界区 */
Exchage(key,bolt);
……
}
机器指令方法的特点:
优点:适用于单处理器和多处理器的系统上的任何数目的并发进程;简单、易懂、容易证明;只要给每个临界区定义自已的变量,就可用于支持多个临界区的并进程。
缺点:使用的是忙等,可能饿死
可能死锁
4、进程同步
1)、并发进程间间接和直接的相互制约关系的区别:
间接制约大都是以竞争资源或共享临界资源引起的,
是互斥关系;
直接制约主要是诸并发进程之间的合作引起的是同步关系
进程同步:是在某些进程未获得合作进程发来消息之前,进程阻塞,消息到来之方可继续执行的进程合作关系
2)概念:是在某些进程未获得合作进程发来消息之前,进程得阻塞,消息到来之后方可继续执行的进程合作关系称为进程 同步。
进程同步就是为了并发进程之间能够正确的交换信息,以便达到协调步伐的目的,对进程操作的时间顺序所加的某种限制。
合作进程就是通过在执行进度上彼此协调,以完成相关的操作。
5,windows2000的进程互斥与同步
1)内核同步
2)执行体同步
1)内核同步
内核临界区:是修改共用数据结构的代码段
(只有在内核能保证线程以互斥方式访问这些数据结构时操作系统才能正常工作)
对是中断的处理:通过把处理器的“中断请求级”提高到任意潜在的访问全局数据的中断资源使用的最高级来达到这个目的。
自旋锁:一个与共用数据结构有关的锁机制
2)执行体同步在多处理环境下,在内核之外的执行体软件同样需要同步访问共用数据结构,自旋锁只是部分满足了执行体对同步机制的需要,这是因为在自旋锁上等等待,实际上处理器暂停,通常自旋锁只可在下列严格的环境使用:
1、被保护的资源必须被快速访问,并且没有与其它代码有复杂的交互作用。
2、临界区代码不能换出内存,不能引用可分页数据,不能调用外部程序,包括系统服务,不能生成中断或异常情况。
三,信号量
1、信号量的基本概念
2、用信号量实现进程互斥
3、用信号量实现进程同步
4、经典进程同步实例
1、信号量的基本概念
信号量 S:
1)是一个整型变量,而且初值是非负数
2)对信号量仅能实施 PV操作
3)对每一个信号量,都对应有一个等待队列
4) S>0表示可用资源的数量,S<0表示进程的申请不能被满足,其绝对值就是等待使用此资源的进程数
P(S)原语操作
1)将 S值减 1
2)若 S<0表明资源已经分配完了,则进程阻塞,
将它插到该信号量的等待队列中,调度另一个就绪进程运行。
3)若 S>=0表明有资源提供给进程使用,则当前进程继续运行
V(S)原语操作
1)将 S值加 1
2)若 S<=0表明有进程在等待,则要其相应的等待队列中,调一个进程为插入就绪队列中。
如果是剥夺方式 的进程管理,还需进行进程调度
3)若 S>0表明无其他进程等待此资源,则当前进程继续运行。
2、用信号量实现进程互斥
利用 P,V操作和信号量来解决互斥时,
只要将这些进程共享共一个公用信号量 S,
并赋初值为 1。
利用互斥信号量实现进程互斥可以描述如下:
Const int N=进程数;
Semaphore S=1;
Void main ( )
{ parbegin (P(1),P(2),……,P(N));}
Void P(int I)
{……
P(S);
/*临界区 */
V(S);
……
}
作业:
一个小河上有一座独木桥,每次只允许一个人通过,现在河的东西两岸各有一个要过桥,如果把每一个过桥的人看作一个进程,请用 PV操作实现管理。
3、用信号量实现进程同步
1),int S=0;
Void mian( )
{parbegin(P1(),P2());}
Void P1()
{……V(S);}
Void P2( )
{P(s);
……
}
2),Int S2=0,S3=0;
Void main( )
{ parbegin (P1(),P2( ),P3());}
Void P1( )
{……V(s2);V(s3);}
Void P2( )
{P(S2); ……}
Void P3( )
{P(s3);……}
3),Int S1=0,S2=0;
Void main ( )
{parbegin(P1(),P2(),P3());}
Void P1()
{……V(S1);}
Void P2( )
{……V(S2) ; }
Void P3( )
{P(S1);P(S2);……}
4),Int S1=0,int S2=1;
Void main( )
{parbegin(CP(),IOP());}
Void CP( )
{while(计算未完成)
{得到一个计算结果;
P(S2);
将数据送入 buf;
V(S1);
}
Void IOP ( )
{while(打印未完成 )
{P(S1);
从 buf中取出数据; V( S2);
将数据在打印机上输出;
}
}
4、经典进程同步实例
1)、生产者 —消费者问题
在计算机系统中,每个进程都申请和释放系统中的各种不同类型的软、硬资源,
系统中使用某一类资源的进程被称为此类资源的消费者,而把释放同类资源的进程称为此类资源的生产者。
生产者 —消费者问题描述了一组生产者向一组消费者提供新产品,它们通过共享一组缓冲区联系起来。类似上述的单缓冲的打印问题,是它的一扩充。
生产者和消费者是相互等效的,生产者向缓冲池中投放消息,消费者从获取消息。他们之间满足以下条件:消费者要想取消息时,有界缓冲池中至少要有一个缓冲区是满的;生产者要想发送消息时,有界缓冲池中至少要有一个缓冲区是空的。
根据分析用 P,V操作实现生产者 — 消费者之间的同步,需定义三个信号量:
Mutex:用以保证生产者和消费者进程之间的互斥,初值为 1
Empty:表示有界缓冲池中可用缓冲区的个数,初始值为 N。
Full:表示有界缓冲池中多少个缓冲区中有消息,初始值为 0。
Int mutex=1;
Int empty =N;
Int full=0;
Void main( )
{parbegin(producer( ),consumer());}
Void producer( )
{while(生产未完成)
{ 生产一个产品;
P(empty);P(mutex);
将产品到缓冲区;
V(full);V(mutex);
}
}
Void consumer( )
{ while (还要继续消费)
{ P(full);P(mutex);
从缓冲区中取一个产品;
V(empty);V(mutex);
消费产品;
}
}
2)、读者 —作者问题
定义:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间,甚至可以是一组处理器。有一些只读取这个数据区的进程 read和一些只往数据区中写数据的进程 write。而必须满足以下条件:任意多的读进程可以同时读这个文件;一次只有一个写进程可以往文件中写;如果一个写进程正在往文件中写,要禁止任何其他读或写进程操作此文件。
Mutex:用来控制实现读者和作者之间的互斥关系,初值为 1。
Readercount:用来记录读者个数。
X:用来实现对 readercount进行操作时的正确性,即防止两个作者同时进行修改。
同步方式一:
Int mutex=1,x=1;
Int rsem=1,y=1,z=1;
Int readercount=0,writercount=0;
Void write( );
Void read( );
Void main( )
{parbegin(read( ),write( ));}
Void read( )
{P(z); P(rsem); P(x);
Readercount ++;
If(readercont==1)
P(mutex); V(x); V(rsem);
V(z);
读文件 ;
P(x);
Readercount--;
If(readercount==0)
V(mutex);V(x);
}
Void write( )
{P(y);
Writercount++;
If(writercount==1)
P(rsem); V(y);P(mutex);写文件 ;V(mutex);
P(y);
Writercount--;
If(writercount==0)
V(rsem);
V(y);
}
读者和作者同步方式二:
Int mutex=1,x=1,rsem=1;
Int readercount=0;
Void main( )
{
Parbegin(read( ),write( ));
}
Void read ( )
{P(rsem); P(x);
Readercount++;
If(readercount==1)
P(mutex);V(x);V(rsem);读文件; P(x);
Readercount--;
If(readercount==0)
V(mutex);
V(x);
}
Void write( )
{ P(rsem); P(mutex);
写文件 ;
V(mutex);
V(rsem);
}
四,进程间的通信
进程通信就是指进程间的信息交换。
低级通信方式,P,V
高级通信方式:共享存储器系统、管道通信系统和消息传递系统。
1、共享存储器系统
1)基于共享数据结构的通信方式:进程之间能够通过某种类型的数据结构交换信息。这种通信方式效率低,只适于传递小批量信息。
2)基于共享存贮区的通信方式:即在存贮器中划出一块共享的存贮区,诸进程间可通过对共享存贮区中的数据进行读或写操作来实现通信。
2、管道通信系统
管道通信系统是一种基于原有文件系统形成的一种通信方式,即是利用共享文件夹来实现进程间的通信的。这个共享文件就是管道。
其工作是以先进先出为顺序的单向通信方式。
为了协调通信双方,管道通信机制必须提供以下三个方面的协调能力。
1)互斥:当一个进程正对管道进行读或写数据时,另一进程必须等待。
2)同步:当写进程把一定数据写入管道后便阻塞等待,直到读进程取走数据后才能将写进程唤醒;当读进程在读空管道时也应阻塞等待,直到写进程将消息写入管道后才能将读进程唤醒。
3)对方是否存在:只有在确定进程通信的双方都存在时,方可进行通信。
3、消息传递系统
在消息传递系统中,进程的数据交换以消息为单位,程序员利用系统提供的一组通信命令来实现,消息传递系统可以分为:
1)、消息缓冲通信
2)、信箱通信
1)、消息缓冲通信
2)、信箱通信五,进程的死锁
1、产生死锁的原因和必要条件
2、死锁的预防
3、死锁的避免
4、死锁的检测和解除
1、产生死锁的原因和必要条件
产生死锁的原因:
系统资源不足、进程推进顺序不当
产生死锁的必要条件:
互斥条件
不剥夺条件
部分分配条件
环路分配条件
2、死锁的预防
要想防止死锁的发生,只需破坏死锁的四个必要条件之一即可:
1)、破坏互斥条件
2)、破坏不剥夺条件
3)、破坏部分分配条件
4)、破坏环路条件
3、死锁的避免
在预防死锁的方法中所采取的几种策略,
总的来说都是增加较强的限制条件,虽然实现起来较简单,但却严重地损害了系统性能。死锁的避免方法中,所施加的限制条件较弱,同时把系统的状态分为安全状态和不安全状态,只要能使系统处于安全状态便可避免死锁的发生。
1)、安生与不安全状态
若在某一时刻,系统能按某种顺序如P 1 P 2 …… P n
来为每个进程分配其所需要的资源,直至最大需求量,
每个进程都可顺利的完成,则称此时的系统状态为安全状态,序列P 1 P 2 …… P n为安全序列。若某一时刻系统中不存在这样的一个安全序列,则称此时刻的系统状态为不安全状态。
在避免死锁的方法中,允许进程动态申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程等待。虽然并非所有不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免死锁状态。
4、死锁的检测和解除
3.4 线程管理
一,线程的概念
二,线程的特性
三,windows2000线程的调度一,线程的概念二,线程的特性三,windows2000线程的调度三,windows2000线程的调度
3.1 进程管理概述
3.2 作业管理
3.3 并发进程
3.4 线程管理
3.1 进程管理概述
一,进程的概念
二,进程的调度
三,处理器调度
四,进程的控制一,进程的概念
1、进程概念的引入
2、进程的概念
3、进程的状态
1、进程概念的引入
有如下的程序段
S1:scanf(“%d”,&x);
S2:y=x*2;
S3:printf(“y=%d”,y);
由上面程序段可以看出,顺序程序的执行的特点如下:
1)、顺序性,处理机的操作是严格的按照程序所规定的顺序执行的,即上一个操作必须在下一个操作开始之前结束。
2)、封闭性:程序的执行结果仅与初始条件和程序本身决定。
3)、可再现性:程序执行的最终结果与执行速度无关。
4)、资源独占性:程序执行时独占系统中的全部资源,即这些资源的状态由该程序本身确定。
多道程序系统的引入:
内存中同时驻留多道程序,从宠观上看是几道程序同时执行,但从微观上看则是几道程序交替执行,轮流占用资源。
宏观上执行时间有重迭的几个程序称为并发程序。
多道程序系统的实质就是把并发程序的执行引入到系统中。
程序并发执行所带来的新的问题
1)、失去了程序的封闭性
如果一程序变量是其他程序执行时不可接触的,那么这个程序执行后的输出结果一定是其输入的一个与时间无关的函数,即封闭性。
如果一个程序的执行可以改变另一程序的变量,那么其输出的就可能依赖各种程序执行的速度,也就失去了程序的封闭性
Main()
{ int n=0,j1=2,j2=2;
cobegin
while(j1--)/*任务 j1*/
{n++;}
while(j2--)/*任务 j2*/
{ printf(“n is%d.,,n); n=0;}
Coend
}
2)、并发程序之间的相互制约。
间接制约关系:因竞争同一资源而相互制约
直接制约关系:由于程序间需要相互协同而引起的
2.进程的概念
1)、一些关于进程的定义:
进程是一个正在执行的程序。
进程是可以分配给处理器并由处理器执行的一个实体。
进程是一个具有独立功能的程序关于某个资料集合的一次运行活动。
进程是由一个顺序线程、一个当前状态和一组相关的系统资源所刻画的活动单元。
2)、进程的组成
( 1)一段可执行的程序
( 2)程序所需要的相关资料
(变量、工作空间、缓冲区等)
( 3)程序执行的上下文环境
(又称为进程状态)
在( 3)中,包括操作系统管理进程以及处理器执行进程所需要的所有信息。如处理器寄存器的内容,进程的优先级,
进程是否等待特定的 I/O事件。
3)、进程的实现方法
给每个进程分配一块内存区域,并在由操作系统建立和维护的进程表中进行记录。
每个进程表项都包含进程的存储块地址指针和部分或全部进程状态信息。
任何时候整个进程状态都包含在它的进程状态信息当中。
进程的五大特征
动态性:是程序的一次执行过程。
并发性:多个进程可以同时在一个系统中运行,
轮流占用处理器和各类系统资源。
独立性:是一个能独立运行的基本单位,独立分配得到所要求的资源。
异步性:相互制约
结构特征,PCB
3、进程的状态
1),5状态模型
运行:获得处理器及其他一切所需资源,正在
处理器上运行。
就绪:获得了除处理器以外的切所需资源,
阻塞:进程在某些事件发生前不能执行
新建:刚刚创建的进程。
退出:从可执行进程中释放出的进程。
其状态转换图见书 80
2)、有挂起状态的状态模型
为了让处理器尽量忙起来,为了让更多的进程进入主存并发执行的解决方法:
( 1)扩充主存
( 2)交换:就是将主存中的某进程的一部分或全部移到磁盘中。
当主存中没有处于就绪状丰收的进程时,就将被阻塞的进程换出到磁盘的挂起队列中。操作系统再从挂起队列中取出另一个进程,或接受一个新进程的请求,将其纳入主存运行。
几种可能的状态:
就绪:进程在主存中并可以执行
阻塞:进程在主存中并等待一个事件
就绪 /挂起:进程在辅存中,但是只要被加载主存就可以执行。
阻塞 /挂起:进程在辅存中,并等待一个事件。
二,进程的调度
1、进程调度的功能
2、进程调度的方式
3、进程调度的算法
4、调度的性能准则
1、进程调度的功能
1)、进程调度的功能
记录:记录系统中各进程的执行情况
调度:根据一定的算法,对就绪队列进行排序,以便选择一个就绪进程使之在处理器上运行。
分派:执行处理的分配操作。
2、进程调度的方式
1)、不可剥夺方式:
2)、可剥夺方式:
剥夺原则有:
优先权高的可剥夺优先权低的处理器运行;
短进程可剥夺长进程的处理器运行;
时间片用完后交出处理器重新调度
3、进程调度的算法
1),FCFS算法
2),FPF算法
静态优先级:
动态优先级:
3)时间片轮换法
4、调度的性能准则
周转时间:作业从提交到完成所经历的时间
带权周转时间:
响应时间:
公平性:
优先级:
三,处理器调度
1、前言
2、处理器调度的类型
3、调度的性能准则
4、进程调度器
5、调度算法
1、前言
操作系统必须为多个进程可能有竞争的请求分配计算机资源。
对处理器而言,可分配的资源是在处理器上的执行时间,分配途径是调度。
调度功能必须设计成为可以满足多个目标,包括公平、任何进程都不会饿死、
有效地使用处理器时间和低开销。
2、处理器调度的类型
1)、单处理器系统中的调度
长程调度
中程调度
短程调度长程调度
长程调度决定哪一个程序可以进入到系统中,
因此,它控制多道程序的调度。
在批处理系统中,或者通用的操作系统中的批处理部分,新提交的作业被发送到磁盘,并保存在一个批处理队列中。长程调度程序在可以时,从队列中创建一个进程。这里涉及到两个决策:之一调度程序必须决定操作系统可以接纳一个进程还是多个进程;之二调度程序必须决定接受哪个作业或哪些作业,并转变成进程。
中程调度
中程序调度是交换功能的一部分,决定加入到部分或全部在主存的进程集合中。
典型的,换入决策基于管理多道程序调度的要求。对不使用虚存的系统,存储器管理也是一个问题。因此,换入决策将考虑换出进程的存储需求。
短程调度
短程调度真正决定下一次处理器执行哪一个就绪进程。
2)多处理器系统中的调度
在多处理器系统中,有 3种比较突出的方法进行处理器分配:
负载分配:
成组调度:
专用处理器分配:
3、调度的性能准则
周转时间:作业从提交到完成所经历的时间。
带权周转时间:是指周转时间除以进程执行时间。
响应时间:是指用户输入一个请求到系统给出首次响应的时间。
公平性:是指调度算法不会因作业或进程本身的特性而使上述指标过分恶化。
与系统利用率相关的处理器调度指标包括吞吐量和处理器利用率等。
吞吐量:是指单位时间内所完成的作业数
4、进程调度器
进程调度器:操作系统中与进程调度相关的代码
进程调度器的主要功能是进程状态维护和进程的上下文切换。
5、调度算法
FCFS算法
SJF算法,最短剩余时间优先
最高响应比优先
时间片时钟算法
多级队列算法
优先级算法
多级反馈队列算法四,进程的控制
1、进程创建
2、进程切换
3、进程撤消
4、进程阻塞
5、进程唤醒
6,windows 2000的进程管理
1、进程创建
1)给新进程分配一个唯一的内部标识号
2)给进程分配空间
3)初始化进程控制块 PCB
4)设置正确的链接,
5)创建扩充其他数据结构
2、进程切换
进程切换就是在某一时刻,一个正在运行的进程被中断,
操作系统被转换到另一个状态,则操作系统必须使其环境产生实质的变化,一个完整的进程切换步骤如下,
1)保存处理器的上下文环境
2)更新当前处于运行状态的进程的进程控制块
3)把进程的 PCB移到相应的队列中
4)选择另一进程执行埋头苦干更新此进程的 PCB
5)根据地址管理的特点更新存储管理的数据结构
6)用被选中的进程的信息重载处理器的上下文环境信息
6,windows 2000的进程管理
Windows 2000的进程设计由给各种操作系统环境提供支持的需求所驱动,其内核所提供的进程结构和服务是相当简单和通用的,同时允许每个操作系统子系统模拟某种特定的进程结构和功能.
Windows 2000进程的重要特点是:
1) Windows 2000进程是作为对象实现的
2)一个可执行的进程包含有一个或多个线程
3)进程对象具有内置的同步能力
3.2作业管理
一、作业
二、批处理作业的管理一、作业
1、作业和作业步
2、作业控制方式
1、作业和作业步
作业:用户要求计算机系统处理的一个计算问题
把编制好的源程序和准备好的初始数据输入到计算机系统中,在操作系统控制下经过编译、连接装配、运行等步骤就能得到处理结果。
作业:一个作业所经历的加工步骤
2、作业控制方式
用户根据操作系统提供的手段来说明作业加工步骤的方式。
批处理方式:(脱机控制方式)
交互方式:(联机控制方式)
二、批处理作业的管理
1、作业控制语言
作业控制说明书
2、批处理作业的输入
SPOOLING/作业流
3、批处理作业的调度
3、批处理作业的调度
1)、先来先服务算法
2)、计算时间短的作业优先算法
3)、响应比高者优先算法
4)、优先数调度算法
5)、均衡调度算法
3.3 并发进程
一,进程的并发性
二,进程的互斥和同步
三,信号量
四,进程间的通信
五,进程的死锁一,进程的并发性
进程在执行过程中,不同运行阶段进程使用不同的系统资源,有着交替、重叠执行的可能性。正是因为多道程序系统中进程的相对执行速度不可预测,给系统也就带来了一些困难。
1、并发的存在带来的困难
1)操作系统必须记下诸进程
2)操作系统必须为每个进程分配和释放各类资源
3)操作系统必须保护每个进程的数据和物理资源,避免其他进程的无意干涉
4)操作系统的结果必须与执行速度无关,
即不会出现与时间有关的错误
2、进程间的相互制约关系
基于进程间相互知道对方是否存在的程度分三种可能:
1)、进程之间不知道对方
2)、进程间接知道对方
3)、进程直接知道对方
3、进程中的资源竞争
当并发进程竞争使用同一个资源时,它们相互之间会发生冲突,而竞争进程间没有任何信息交换,却可能影响到竞争进程的一些行为。
饿死:因得不到运行所需的资源,而处于长期等待,
临界资源:对一个不可共享的资源;在执行过程中,每个需要使用此资源时都要给其发命令,接收状态信息,
发送数据和接收数据的资源
临界区:使用临界资源的那段程序就称为程序的临界区。
注:对临界资源的访问必须满足互斥要求
4、进程间通过共享的合作
通过共享进行合作的进程间相互不确切知道对方的情况下进行交互。如诸进程可能访问同一个共享的变量、文件或数据库,进程在使用修改这些数据时,并不涉及到其他进程,但是它们知道其他进程也可能访问同一数据。
因此系统的控制机制必须要能确保共享数据的完整性。
5、进程间通过通信合作
当进程通过通信进行合作时,各个进程都参与其他进程的连接,而通信就是给其提供同步和协调各种活动的方法。
通常通信可以被描述成由各种类型的消息组成。
二,进程的互斥和同步
并发进程管理的主要任务是:使并发执行的诸进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现性。
1、进程互斥
当并发的进程要竞争使用某些临界资源时,为了提供互斥的支持,必须满足以下要求:
空闲让进:
忙则等待:
有限等待
让权等待
一些可以满足这些互斥条件方法:
软件方法:让希望并发的进程认为都需要与另一个进程合作,以实施互斥。
硬件支持:这种方法会涉及到使用专门的机器指令。
语言支持:即在操作系统或程序设计上提供某种级别的支持。
2、互斥
Dekker算法:
1)第一种尝试
给共享的互斥资源保留一个标记为 sign的全局存储器单元,希望使用这一临界资源的进程在进入临界区前必须首先检查
sign的内容。如果 sign的值等于该进程的进程号时,则该进程就可处于临界区,
否则必须等待。
忙等:
如第 I号进程的程序代码段如下:
…………
While (sing !=I) ; /*什么都不做 */
/*临界区 */
Sign=s;/*s为等待此资源的一个进程的进程号 */
………………
2)、第二种尝试
/*进程 0*/
……
While (flag[1])/*延迟 */;
Flag[0]=-1;/*赋值为真 */
/*临界区 */
Flag[0]=0;/*赋值为假 */
……
/*进程 1*/
……
While (flag[0])/*延迟 */;
Flag[1]=-1;/*赋值为真 */
/*临界区 */
Flag[1]=0;/*赋值为假 */
……
会导致死锁
3)第三种尝试
/*进程 0*/
……
Flag[0]=-1;
While (flag[1])
{flag[0]=0;
/*延迟 */;
Flag[0]=-1;
}
/*临界区 */
Flag[0]=0;
……
/*进程 1*/
……
Flag[1]=-1;
While (flag[0])
{flag[1]=0;
/*延迟 */;
Flag[1]=-1;
}
/*临界区 */
Flag[1]=0;
……
4)Dekker算法
Int flag[2]={0,0},sign=1;
Void main( )
{parbegin (p0( ),p1( ));
/*结构 parbegin的含义是挂起主程序的执行,开始并发执行进程 P0和 P1*/
}
Void P0( )
{……
Flag[0]=-1;
While(flag[1])
If(sign==1)
{flag[0]=0;
While(sign==1) ;
Flag[0]=-1;
}
/*临界区 */
Sign=1;
Flage[0]=0;
……
}
Void P1( )
{……
Flag[1]=-1;
While(flag[0])
If(sign==0
{flag[1]=0;
While(sign==01) ;
Flag[1]=-1;
}
/*临界区 */
Sign=0;
Flage[1]=0;
……
}
Perterson算法
Int flag[2]={0,0},sign;
Void main( )
{ parbegin (P0( ),P1());}
Void P0 ( )
{……
Flag[0]=-1;
Sign=1;
While (flag[1]&&sign==1);
/*临界区 */
Flag[0]=0;
……
}
Void P1 ( )
{……
Flag[1]=-1;
Sign=1;
While (flag[0]&&sign==0);
/*临界区 */
Flag[1]=0;
……
}
3、互斥(用硬件支持的方法)
1)中断禁用(即在临界区段前后加上启用和禁止中断就可以了)
2)专门的机器指令
test和 set 指令
exchange指令可能会产生饿死、死锁现象
Test和 set指令
Boolean testset(int bolt)
{ if (bolt==0) { bolt; return ture; }
else return false;
}
Const int N=进程数
Int bolt=0;
Void main()
{ parbegin (P(1),P(2),……,P(N)); }
Void P(int I)
{……
While (! Testset(bolt));
/*临界区 */
Bolt=0;
……
}
Exchange指令
Void exchange (int reg,int mem)
{ int temp;
temp=mem;mem=reg;reg=temp;
}
Const int N=进程数;
Int bolt=0;
Void main() {parbegin(P(1),P(2),…,P(N));}
Void p(int I)
{int key=1;
……
While(key!=0) exchange(key,bolt);
/*临界区 */
Exchage(key,bolt);
……
}
机器指令方法的特点:
优点:适用于单处理器和多处理器的系统上的任何数目的并发进程;简单、易懂、容易证明;只要给每个临界区定义自已的变量,就可用于支持多个临界区的并进程。
缺点:使用的是忙等,可能饿死
可能死锁
4、进程同步
1)、并发进程间间接和直接的相互制约关系的区别:
间接制约大都是以竞争资源或共享临界资源引起的,
是互斥关系;
直接制约主要是诸并发进程之间的合作引起的是同步关系
进程同步:是在某些进程未获得合作进程发来消息之前,进程阻塞,消息到来之方可继续执行的进程合作关系
2)概念:是在某些进程未获得合作进程发来消息之前,进程得阻塞,消息到来之后方可继续执行的进程合作关系称为进程 同步。
进程同步就是为了并发进程之间能够正确的交换信息,以便达到协调步伐的目的,对进程操作的时间顺序所加的某种限制。
合作进程就是通过在执行进度上彼此协调,以完成相关的操作。
5,windows2000的进程互斥与同步
1)内核同步
2)执行体同步
1)内核同步
内核临界区:是修改共用数据结构的代码段
(只有在内核能保证线程以互斥方式访问这些数据结构时操作系统才能正常工作)
对是中断的处理:通过把处理器的“中断请求级”提高到任意潜在的访问全局数据的中断资源使用的最高级来达到这个目的。
自旋锁:一个与共用数据结构有关的锁机制
2)执行体同步在多处理环境下,在内核之外的执行体软件同样需要同步访问共用数据结构,自旋锁只是部分满足了执行体对同步机制的需要,这是因为在自旋锁上等等待,实际上处理器暂停,通常自旋锁只可在下列严格的环境使用:
1、被保护的资源必须被快速访问,并且没有与其它代码有复杂的交互作用。
2、临界区代码不能换出内存,不能引用可分页数据,不能调用外部程序,包括系统服务,不能生成中断或异常情况。
三,信号量
1、信号量的基本概念
2、用信号量实现进程互斥
3、用信号量实现进程同步
4、经典进程同步实例
1、信号量的基本概念
信号量 S:
1)是一个整型变量,而且初值是非负数
2)对信号量仅能实施 PV操作
3)对每一个信号量,都对应有一个等待队列
4) S>0表示可用资源的数量,S<0表示进程的申请不能被满足,其绝对值就是等待使用此资源的进程数
P(S)原语操作
1)将 S值减 1
2)若 S<0表明资源已经分配完了,则进程阻塞,
将它插到该信号量的等待队列中,调度另一个就绪进程运行。
3)若 S>=0表明有资源提供给进程使用,则当前进程继续运行
V(S)原语操作
1)将 S值加 1
2)若 S<=0表明有进程在等待,则要其相应的等待队列中,调一个进程为插入就绪队列中。
如果是剥夺方式 的进程管理,还需进行进程调度
3)若 S>0表明无其他进程等待此资源,则当前进程继续运行。
2、用信号量实现进程互斥
利用 P,V操作和信号量来解决互斥时,
只要将这些进程共享共一个公用信号量 S,
并赋初值为 1。
利用互斥信号量实现进程互斥可以描述如下:
Const int N=进程数;
Semaphore S=1;
Void main ( )
{ parbegin (P(1),P(2),……,P(N));}
Void P(int I)
{……
P(S);
/*临界区 */
V(S);
……
}
作业:
一个小河上有一座独木桥,每次只允许一个人通过,现在河的东西两岸各有一个要过桥,如果把每一个过桥的人看作一个进程,请用 PV操作实现管理。
3、用信号量实现进程同步
1),int S=0;
Void mian( )
{parbegin(P1(),P2());}
Void P1()
{……V(S);}
Void P2( )
{P(s);
……
}
2),Int S2=0,S3=0;
Void main( )
{ parbegin (P1(),P2( ),P3());}
Void P1( )
{……V(s2);V(s3);}
Void P2( )
{P(S2); ……}
Void P3( )
{P(s3);……}
3),Int S1=0,S2=0;
Void main ( )
{parbegin(P1(),P2(),P3());}
Void P1()
{……V(S1);}
Void P2( )
{……V(S2) ; }
Void P3( )
{P(S1);P(S2);……}
4),Int S1=0,int S2=1;
Void main( )
{parbegin(CP(),IOP());}
Void CP( )
{while(计算未完成)
{得到一个计算结果;
P(S2);
将数据送入 buf;
V(S1);
}
Void IOP ( )
{while(打印未完成 )
{P(S1);
从 buf中取出数据; V( S2);
将数据在打印机上输出;
}
}
4、经典进程同步实例
1)、生产者 —消费者问题
在计算机系统中,每个进程都申请和释放系统中的各种不同类型的软、硬资源,
系统中使用某一类资源的进程被称为此类资源的消费者,而把释放同类资源的进程称为此类资源的生产者。
生产者 —消费者问题描述了一组生产者向一组消费者提供新产品,它们通过共享一组缓冲区联系起来。类似上述的单缓冲的打印问题,是它的一扩充。
生产者和消费者是相互等效的,生产者向缓冲池中投放消息,消费者从获取消息。他们之间满足以下条件:消费者要想取消息时,有界缓冲池中至少要有一个缓冲区是满的;生产者要想发送消息时,有界缓冲池中至少要有一个缓冲区是空的。
根据分析用 P,V操作实现生产者 — 消费者之间的同步,需定义三个信号量:
Mutex:用以保证生产者和消费者进程之间的互斥,初值为 1
Empty:表示有界缓冲池中可用缓冲区的个数,初始值为 N。
Full:表示有界缓冲池中多少个缓冲区中有消息,初始值为 0。
Int mutex=1;
Int empty =N;
Int full=0;
Void main( )
{parbegin(producer( ),consumer());}
Void producer( )
{while(生产未完成)
{ 生产一个产品;
P(empty);P(mutex);
将产品到缓冲区;
V(full);V(mutex);
}
}
Void consumer( )
{ while (还要继续消费)
{ P(full);P(mutex);
从缓冲区中取一个产品;
V(empty);V(mutex);
消费产品;
}
}
2)、读者 —作者问题
定义:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间,甚至可以是一组处理器。有一些只读取这个数据区的进程 read和一些只往数据区中写数据的进程 write。而必须满足以下条件:任意多的读进程可以同时读这个文件;一次只有一个写进程可以往文件中写;如果一个写进程正在往文件中写,要禁止任何其他读或写进程操作此文件。
Mutex:用来控制实现读者和作者之间的互斥关系,初值为 1。
Readercount:用来记录读者个数。
X:用来实现对 readercount进行操作时的正确性,即防止两个作者同时进行修改。
同步方式一:
Int mutex=1,x=1;
Int rsem=1,y=1,z=1;
Int readercount=0,writercount=0;
Void write( );
Void read( );
Void main( )
{parbegin(read( ),write( ));}
Void read( )
{P(z); P(rsem); P(x);
Readercount ++;
If(readercont==1)
P(mutex); V(x); V(rsem);
V(z);
读文件 ;
P(x);
Readercount--;
If(readercount==0)
V(mutex);V(x);
}
Void write( )
{P(y);
Writercount++;
If(writercount==1)
P(rsem); V(y);P(mutex);写文件 ;V(mutex);
P(y);
Writercount--;
If(writercount==0)
V(rsem);
V(y);
}
读者和作者同步方式二:
Int mutex=1,x=1,rsem=1;
Int readercount=0;
Void main( )
{
Parbegin(read( ),write( ));
}
Void read ( )
{P(rsem); P(x);
Readercount++;
If(readercount==1)
P(mutex);V(x);V(rsem);读文件; P(x);
Readercount--;
If(readercount==0)
V(mutex);
V(x);
}
Void write( )
{ P(rsem); P(mutex);
写文件 ;
V(mutex);
V(rsem);
}
四,进程间的通信
进程通信就是指进程间的信息交换。
低级通信方式,P,V
高级通信方式:共享存储器系统、管道通信系统和消息传递系统。
1、共享存储器系统
1)基于共享数据结构的通信方式:进程之间能够通过某种类型的数据结构交换信息。这种通信方式效率低,只适于传递小批量信息。
2)基于共享存贮区的通信方式:即在存贮器中划出一块共享的存贮区,诸进程间可通过对共享存贮区中的数据进行读或写操作来实现通信。
2、管道通信系统
管道通信系统是一种基于原有文件系统形成的一种通信方式,即是利用共享文件夹来实现进程间的通信的。这个共享文件就是管道。
其工作是以先进先出为顺序的单向通信方式。
为了协调通信双方,管道通信机制必须提供以下三个方面的协调能力。
1)互斥:当一个进程正对管道进行读或写数据时,另一进程必须等待。
2)同步:当写进程把一定数据写入管道后便阻塞等待,直到读进程取走数据后才能将写进程唤醒;当读进程在读空管道时也应阻塞等待,直到写进程将消息写入管道后才能将读进程唤醒。
3)对方是否存在:只有在确定进程通信的双方都存在时,方可进行通信。
3、消息传递系统
在消息传递系统中,进程的数据交换以消息为单位,程序员利用系统提供的一组通信命令来实现,消息传递系统可以分为:
1)、消息缓冲通信
2)、信箱通信
1)、消息缓冲通信
2)、信箱通信五,进程的死锁
1、产生死锁的原因和必要条件
2、死锁的预防
3、死锁的避免
4、死锁的检测和解除
1、产生死锁的原因和必要条件
产生死锁的原因:
系统资源不足、进程推进顺序不当
产生死锁的必要条件:
互斥条件
不剥夺条件
部分分配条件
环路分配条件
2、死锁的预防
要想防止死锁的发生,只需破坏死锁的四个必要条件之一即可:
1)、破坏互斥条件
2)、破坏不剥夺条件
3)、破坏部分分配条件
4)、破坏环路条件
3、死锁的避免
在预防死锁的方法中所采取的几种策略,
总的来说都是增加较强的限制条件,虽然实现起来较简单,但却严重地损害了系统性能。死锁的避免方法中,所施加的限制条件较弱,同时把系统的状态分为安全状态和不安全状态,只要能使系统处于安全状态便可避免死锁的发生。
1)、安生与不安全状态
若在某一时刻,系统能按某种顺序如P 1 P 2 …… P n
来为每个进程分配其所需要的资源,直至最大需求量,
每个进程都可顺利的完成,则称此时的系统状态为安全状态,序列P 1 P 2 …… P n为安全序列。若某一时刻系统中不存在这样的一个安全序列,则称此时刻的系统状态为不安全状态。
在避免死锁的方法中,允许进程动态申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程等待。虽然并非所有不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可避免死锁状态。
4、死锁的检测和解除
3.4 线程管理
一,线程的概念
二,线程的特性
三,windows2000线程的调度一,线程的概念二,线程的特性三,windows2000线程的调度三,windows2000线程的调度