第二章
1.程序执行的特性:(1)顺序性(2)可再现性(3)封闭性
2.并发程序执行时的特征:(1)间断性(2)失去封闭性(3)结果不可再现性
3.进程的定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
4.特性:;进程的根本——PCB
(1)动态性
(2)并发性
(3)独立性
(4)异步性
进程执行时的间断性,决定了其具有多种状态。把握各进程所属的状态对进程控制至关重要
5.进程的三种基本状态:
(1)就绪状态
(2)运行状态
(3)阻塞状态
6、还有其他状态:挂起、新建、终止等
7、分析OS调度某进程的过程
查该进程的PCB,获取其状态、优先级
根据PCB保存的处理机状态信息,恢复现场
根据PCB中程序和数据的内存始址,找到其程序和数据
执行中的同步信号等也要查阅PCB,暂停时进程执行的处理机环境保存回PCB。
8、与进程调度相关:进程状态、进程优先级、调度算法、事件等
9、Pcb的重要性
进程控制块是进程存在的唯一标志:
进程创建时,PCB建立并伴随进程运行的全过程,直到进程撤消而撤消。PCB就象我们的户口。
10、进程管理和控制的最重要的数据结构
11、进程控制块中的信息(pcb内)
(1)进程标识符信息
(2)处理机状态信息
(3)进程调度信息
(4)进程控制信息
12、PCB信息存放:若干个PCB存放在内存的PCB区,采用的数据结构:PCB结构体、PCB链表或队列。
13、PCB组织方式:链接方式依靠链接指针形成的队列。索引方式,以索引表的方式记录PCB的地址
进程同步与控制
1.原语是由若干指令构成的原子操作过程,作为整体实现功能,不可被打断。
2、OS通过调用进程创建原语Creat()创建新进程。
3、控制并发:
基本控制
进程、PCB、状态、基本控制过程
合理控制
-
控制进程的相互影响,得到可再现的正确结果 *
同步
4、两种制约关系:
间接相互制约关系:主要源于资源共享,表现为
进程A—打印机资源—进程B(互斥)
直接相互制约关系:主要源于进程合作,表现为
进程A写缓冲—进程B读缓冲(有序
5、互斥:在操作系统中,当一个进程进入临界区使用临界资源时,另一个进程必须等待,直到占用临界资源的进程退出临界区,我们称进程之间的这种相互制约关系为“互斥”。
同步:多个相互合作的进程,在一些关键点上可能需要互相等待或互相交换信息,这种相互制约关系称为进程同步关系。可理解为“有序”。
6、每个进程中访问临界资源的那段代码叫临界区。
为了正确同步,对临界区的代码要增加控制
7、进入区:对欲访问的临界资源进行检。若此刻未被访问,设正在访问的标志
临界区:访问临界资源的代码。
退出区:将正在访问的标志恢复为未被访问的标志
剩余区:其余部分
8、实现互斥的方法应符合如下每条原则
空闲让进:资源使用最基本原则
忙则等待:保证互斥
有限等待:合适时被唤醒防止死等
让权等待:能主动释放CPU防止忙等经典同步问题
生产者-消费者的问题
有多个生产者和消费者对n个缓冲区的使用。
生产者
produce an item in nexp;
wait(empty);
wait(mutex);
buffer(in):=nexp;
in:=(in+1) mod n;
signal(mutex);
signal(full);
消费者
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
full是满信号量 empty是空信号量 这个比较好理解 放入的时候就wait(empty)看看是否有空来放入 放完后signal(full)满信号量加1 表示放入了一个 取的时候就先wait(full)看看缓冲区内是否有东西 取完后signal(empty)空信号量加1 表示空的区域又多了一个
mutex是缓冲区互斥的信号量 保证不能同时对一个缓冲区同时放入和取出。也不能同时多个消费者对同一个缓冲区同时取出。
mutex要记住是缓冲区互斥的!!!
哲学家进餐问题:
五个哲学家共用一张圆桌, 分别坐在周围的五张椅子上,在 桌子上有五只碗和五只筷子,他 们的生活方式是交替地进行思考 和进餐。平时,一个哲学家进行 思考,饥饿时便试图取用其左右 最靠近他的筷子,只有在他拿到 两只筷子时才能进餐。进餐毕, 放下筷子继续思考。
可见:相邻两位不能同时进餐; 最多只能有两人同时进餐。
记录型信号量解决哲学家进餐问题:筷子是临界资源,在一段时间内只允许 一个哲学家使用。为实现对筷子的互斥使用, 用一个信号量表示一只筷子,五个信号量构 成信号量数组。
Var chopstick: array [0, …, 4] of semaphore; 所有信号量均被初始化为1。
第i位哲学家的活动描述为:
repeat
wait(chopstick[ i ]);
wait(chopstick[ ( i +1) mod 5];
eat;
signal(chopstick[ i ]);
signal(chopstick[ ( i +1) mod 5] );
think;
until false;
就餐死锁问题
假如五位哲学家同时饥饿而各自拿起左 边的筷子时,就会使五个信号量chopstick 均为0,当他们再试图去拿右边的筷子时,都 将因无筷子可拿而无限等待。
解决方法: 数量控制: 至多只允许有四位哲学家同时去拿左 边的筷子,最终能保证至少有一位哲学家 能够进餐,并在用毕后释放出他用过的两 只筷子,从而使更多的哲学家能够进餐。–限制并发执行的进程数 一刀切: 仅当哲学家的左右两只筷子均 可用时,才允许他拿起筷子进餐。 —采用AND信号量。
在哲学家进餐问题中,要求每个哲学家先获得两个临界 资源(筷子)后方能进餐。
Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1); Process i repeat think; Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] ); eat; Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] ); until false;
规定奇数号哲学家先拿他左边的 筷子,然后再去拿右边的筷子;偶数 号哲学家则相反。保证总会有一个哲 学家能同时获得两只筷子而进餐
读者写者问题:
一个数据文件被多个进程共享。Reader进程 只要求读文件,Writer进程要求写入内容。
同步关系是:
多个读进程可同时读,Writer进程与任何其他进程(包括 Reader进程或其他Writer进程)不允许 同时访问文件。
readcount 表示正在读的进程数目,防止多个读者对readcount操作出问题 加互斥信号量 初值1
semaphore rmutex=1,wmute=1;
int readcount=0;
void reader()
{
do{
wait(rmutex);
if(readcount==0)
wait(wmutex);
readcount++;
signal(rmutex);
…
wait(rmutex);
readcount–;
if(readcount==0)
signal(wmutex);
signal(rmutex);
}while(1)
}
void writer()
{do{
wait(wmutex);
write
signal(wmuex);
}while(1)
信号量
1、什么是同步;
使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性
2、控制同步的关键在哪里。
不被打断的进行标志值的判断和修改
3、同步原则
空闲让进,忙则等待,有限等待,让权等待
4、整型信号量
信号量定义为一个整型量;
根据初始情况赋相应的值;
仅能通过两个原子操作来访问。
P操作 wait(S):
While S<=0 do no-op;
S:=S-1;
V操作 signal(S):
S:=S+1;
5、记录型信号量
整型信号量符合“有限等待”原则
signal释放资源后,当CPU被分配给等待进程后,等待进程仍可继续执行,可以符合“有限等待”。
但整型信号量不符合“让权等待”原则
整型信号量的wait操作,当s ≤0时,当前进程会占着CPU不断测试;
信号量原语不能被打断,这个占有CPU的进程会一直不断的占据CPU循环下去,陷入忙等。
Value>0,表示当前可用资源的数量;
Value≤0,其绝对值表示等待使用该资源的进程数,即在该信号量队列上排队的PCB的个数。
6、定义信号量semaphore代表可用资源实体的数量。又叫信号灯。
当≥0,代表可供并发进程使用的资源实体数
当<0,表示正在等待使用该资源的进程数。
建立一个信号量必须经过说明,包括
信号量所代表的意义
赋初值
建立相应的数据结构,以便指向等待使用临界区的进程。
除初值外,信号量的值仅能由标准原子操作P、V操作来改变。 PV操作是荷兰语通过和释放的意思。
7、互斥信号量注意点:
互斥信号量mutex初值为1;
每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
必须成对使用P和V原语(在同一进程中),不能次序错误、重复或遗漏:
遗漏P原语则不能保证互斥访问
遗漏V原语则不能在使用临界资源之后将其释放(给其他等待的进程);
8、信号量集的一个特例
只有一个信号量S的几种特殊情况:
Swait(S, d, d),,允许每次申请d个资源,若现有资源数少于d,不予分配。
Swait(S, 1, 1),蜕化为一般的记录型信号量,一次申请一个,至多分配一个(S>1时可计数,或S=1时可控制互斥)。
Swait(S, 1, 0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可控开关。并不对S资源的数量产生影响。
进程通信 线程
1、进程通信是指进程之间的信息交换。
一、低级通信——进程之间的互斥和同步
信号量机制是有效的同步工具,但作为通信工具缺点如下:
(1)效率低(通信量少)
(2)通信对用户不透明(程序员实现,操作系统只提供共享存储器供代码操作)
二、高级进程通信
用户直接利用操作系统提供的一组通信命令,高效地传送大量数据的通信方式。
操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。
2、
高级通信机制可归结为四大类
(1)共享存储器系统(操作存储区方式)
在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。
(2)消息传递系统(发–收方式)
最广泛使用的一种,进程间的数据交换,以格式化的消息为单位。屏蔽底层复杂操作。
(3)管道通信(中间文件方式)
所谓“管道”,是指用于连接一读进程和一写进程以实现通信的一个共享文件,又名pipe文件。
(4)Client-Server system
3、单机和网络环境下的高级进程通信广泛采用“消息传递”方式,需要考虑的问题:
通信链路的建立
消息格式
同步方式
4、限制并发程度问题所在:进程实体信息量大,对进程的管理操作越多,与运行时间的比值就越大,运行效率就低。
5、多线程OS中,一个进程包括多个线程,每个线程都是利用CPU的基本单位。
6、* 线程与进程的比较
调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。
并发性:进程之间可以并发,实质上是不同进程中的两个线程并发。一个进程的多个线程之间亦可并发。
拥有资源:进程间资源相互独立;同一进程的各线程间共享。某进程内的线程在其它进程不可见
系统开销:线程上下文切换在同进程环境下上下文切换要快得多。因为同进程内线程间共享内存地址和打开的文件资源;
7、内核线程KST(kernel-level thread)
依赖于内核,利用系统调用由OS内核在内核空间完成创建、撤消、切换等线程工作。
8、KST优缺点
多处理器系统下可实现多线程并行
一个线程发起系统调用而阻塞,不会影响其它线程的运行
线程切换开销远小于进程切换
内核本身也采用多线程技术可提高系统执行速度和效率
9、用户线程ULT(user-level thread)
无须利用系统调用,不依赖于OS核心。进程利用线程库函数创建、同步、调度和管理控制用户线程。
调度由应用软件内部进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,速度比kst快。
管程
1、信号量机制的不足
正确性分析困难;
分散的P、V操作:易出错,使用不当可能导致死锁。
修改、维护困难:易读性差,任一修改都可能影响全局;测试期间发现错误困难,即使发现错误也不容易定位出错位置。
2、管程特点
任何进程只能通过调用管程提供的过程入口才能进入管程访问共享数据;
就如同使用临界资源,就要先通过其信号量的申请。
任何时刻,仅允许一个进程在管程中执行某个内部过程。
3、管程如何实现同步?
对共享变量互斥操作:
管程的特点直接实现了该要求,进程一次一个进入管程调用内部过程操作共享变量。
管程的互斥访问完全由编译程序在编译时自动添上,无须程序员关心,能保证正确。
操作的同步控制:
靠条件变量的操作管理实现。
进入管程但不能获取资源操作的过程将阻塞,并在满足条件时被唤醒执行。
4、管程的优点
保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。管程可以以函数库的形式实现。相比之下,管程比信号量好控制。
管程可增强模块的独立性:系统按资源管理的观点分解成若干模块,用数据表示抽象系统资源,使同步操作相对集中,从而增加了模块的相对独立性
引入管程可提高代码的可读性,便于修改和维护,正确性易于保证:采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰。
5、管程的缺点
大多数常用的编程语言中没有实现管程,如果某种语言本身不支持管程,那么加入管程是很困难的。
虽然大多数编程语言也没有实现信号量,但可将P、V操作作为一个独立的子例程或操作系统的管理程序调用加入。