进程间需要相互合作完成某项任务叫做进程同步,进程间通信是直接制约因素.
进程间竞争同一共享资源,产生相应的制约关系.当分配到时独占分配到的,或全部共享的资源.
临界资源:一段时间内只允许一个进程访问的资源
如:打印机、磁带机等
临界区:每个进程中访问临界资源的代码段
各进程互斥地进入临界区,可实现互斥访问临界资源
同步机制的规则:
空闲让进:当无进程处于临界区时,允许一个请求进入临界区的进程立即进入自己的临界区
忙则等待:当已有进程进入自己的临界区时,所有其它试图进入临界区的进程必须等待.
有限等待:对要求访问临界资源的进程,应保证该进程能在有效时间内进入自己的临界区,以免进入“死等”状态
让权等待:当进程不能进入自己的临界区时,应释放CPU,以免进程陷入“忙等”
实现同步机制的基本方法有软件方法,硬件方法和信号量方法.
- 硬件方法:
通过管理CPU的中断实现.我们知道,进程间切换是通过CPU中断实现的,当进程访问临界区资源的时候,关闭cpu中断,即可.
-软件方法:
有两个进程Pi, Pj竞争使用临界资源
单标志法:设立一个公用整型变量 turn,用于描述允许进入临界区的进程标识
缺点:强制轮流进入临界区,没有考虑进程的实际需要。容易造成资源利用不充分:在Pi出让临界区之后,Pj使用临界区之前,Pi不可能再次使用临界区
While(turn == i)
critical section
turn = j;
remainder section
双标志法:设立一个标志数组flag[2],用于描述进程是否在临界区,初值均为FALSE
先检查、后修改:可能导致Pi和Pj同时进入临界区
先修改、后检查:可能导致Pi和Pj都进入不了临界区
while(flag[ j ]== FALSE) flag[ i ] = TRUE;
flag[ i ] = TRUE; while(flag[ j ] == FALSE)
critical section critical section
flag[ i ]= FALSE; flag[ i ]= FALSE;
remainder section remainder section
OS提供 信号量实现:
- 信号量是用来表示某一资源的剩余数量或是某一资源申请的资源数量.
- 信号量是被保护的变量只能通过初始化和wait()singal()原语操作,作为OS核心代码执行.
-wait() 进程申请使用临界资源的操作,类似于进入临界区的操作.
- singal操作,进程归还临界资源的操作,类似于离开临界区的操作.
信号量类型
- 整型:S为初值为非负的整型变量,通常描述可用资源,通常描述资源的状态或可用资源的数量.
- 记录型 :(S,Q)Q初始状态为空的队列.
- AND型 :一次需要多个共享资源
- 信号量集合型:一次需要N个多类资源
整型:
int s
wait(s)
{
while s<= 0 do no-op
s–
}
signal(s)
记录型:
wait(S) {
S.value- - ;
if S.value<0 then
block(S.L); //将该进程状态置为等待状态;并 将该进程的PCB插入相应的等待队列S.L末尾
}
singnal(s){
S.value++;
if S.value<0 then
wakeup(S.L);//唤醒等待队列的第一个,并为将状态设置为就绪,并插入到就绪队列
}
AND型变量:若某一进程需要不止一个变量,那么一次性将资源全部给这个进程,除非有一个资源不足,那么就一个也不给,让其进入等待队列.
Swait(S1,S2,…,Sn)
if Si>=1 and … and Sn>=1 then
for i:=1 to n do
Si:=Si-1;
endfor
else
place the process in the waiting queue associated with the first Si found with Si<1,and set the program count of this process to the beginning of Swait operation
endif
Ssignal(S1,S2,…,Sn)
for i:=1 to n do
Si:=Si+1;
Remove all the process waiting in the queue associated with Si into the ready queue.
endfor;
步骤:1 信号量的设置;2 给信号量赋初值(常用的互斥和同步信号量值的大小);3 wait、signal操作安排的位置(其中,wait的顺序不能颠倒,signal的顺序任意)
注意:
1)互斥信号量 :互斥时使用的信号量(二元信号量):其初值为1或n,表示临界资源的数目,用作互斥。它联系着一组并行进程,一个进程成对之施加wait、signal操作。
2)同步信号量:它联系着一组并行进程,但其初值为0或为某个正整数n,主要用于进程同步,wait、signal操作在两个进程中配对出现。
例1 :(进程互斥)兄弟分别同时取钱,存钱
将信号量设置为1
然后:
SAVE:
{
wait(mutex)
m1=amount
m1=m1+10
amount=m1
signal(mutex)
}
TAKE:
{
wait(mutex)
m2=amount
m2=m2-10
amount=m2
signal(mutex)
}
例2:(进程同步)前趋关系:并发执行的进程P1和P2中,分别有代码C1和C2,要求C1在C2开始前完成。
为该前趋关系设置一个同步信号量S12,其初值为0。
例3: 利用信号量来描述前趋图关系
信号量初值全部设为0,然后将结点看作并发进程,连线看作信号量.
smaphore a,b,c,d,e,f,g,h,I,j=0,0,0,0,0,0,0,0,0,0;
parbegin
{S1;signal(a); signal(b);signal(c);}
{wait(a);S2; signal(d);}
{wait(b);S3; signal(e); signal(f);}
{wait(c);S4; signal(g);}
{wait(d); wait(e);S5; signal(h);}
{wait(f); wait(g);S6;signal(i);}
{wait(h); wait(i);S7; signal(j);}
{wait(j);S8;}
parend
1 生产者消费者问题
生产者与消费者互斥访问公用数据缓冲区
生产“数据”,消费“数据”
生产者—消费者问题分类:
第一类:一个生产者,一个消费者,单一资源
第二类:一个生产者,一个消费者,多个资源
第三类:一个生产者,一个消费者,无限资源
第四类:多个生产者,多个消费者,多个资源
情况一:单一资源的Producer-Consumer问题(同步问题)
设进程P的同步信号量:buffer (empty),初值为1,表示缓冲区个数(空缓冲区的个数)。
设进程C的同步信号量:product (full) ,初值为0,表示产品个数(满缓冲区的个数)。
生产者:
生产一个产品
wait(buffer)
提交到缓冲区
singnal(product)
消费者:
消费一个产品
wait(product)
singnal(buffer)
情况二:多个资源的P-C操作
生产产品要加上有序号标识
in=in+1 % n
消费产品也有序号
out = out+1 % n
情况三:无线资源的P-C操作
buffer是无限的所以
生产者不用归还product
消费者不用归还buffer
in=in%n
out=out%n
**wait、signal必须成对出现,但不一定一一对应。
当互斥操作时,处于同一进程
当同步操作时,则在不同进程**
2 哲学家进餐问题
5个哲学家,5个筷子。5个哲学家围坐在一张桌子上,筷子放在分别放在每个哲学家的两旁。如果所有哲学家在某个时刻同时拿起左边的筷子,那么右边的筷子就都被其他的哲学家拿了,造成大家都无法吃饭。但是大家都不想放下左边的筷子(规则是先拿起左边筷子在拿起右边的,吃完饭在放下左,再放下右),这就是死锁。
解决这个问题有个办法是在拿起筷子前先判断左右两个筷子是否可用,可用才能拿,而且是同时拿,这样不相邻的哲学家就可以吃上饭,不会造成死锁。
多资源共享及互斥访问
五个哲学家的思考与互斥共享五根筷子就餐的问题
AND型信号量
3 读者写者问题
这个博主写的非常好:http://blog.csdn.net/c1194758555/article/details/52805918
转载于: http://blog.csdn.net/wangzhicheng1983/article/details/7832237
1 进程通信概念
进程通信,是指进程之间的信息交换。交换的信息量,少者是一个状态或数值,多者则是成千上万个字节。进程通信分为低级和高级通信.
低级通信:信号量机制.
1. 效率低:,生产者每次只能想缓冲池投放一个产品,消费者只能重缓冲区取得一个消息;
2. 通信对用户不透明:OS只为进程之间的通信提供了共享存储器.
高级通信:
3. 使用方便.OS隐藏了实现进程通信的具体细节,向用户提供了一组用于实现高级通信的命令,用户可方便的直接利用他实现进程之间通信,
4. 高效的传送大量数据.用户可直接利用高级通信民灵搞笑的传送大量数据.
2 进程通信的类型
1 共享存储器系统(shared-Memory system)
相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信.
5. 基于共享数据结构的通信方式.这种通信方式中,要求诸进程公用某些数据结构,借以实现进程的信息交换.
6. 基于共享存储区的通信方式.为了和传输大量数据,在内存中划出了一个区域,诸进程可通过对该共享去的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是由进程负责.属于高级通信,
2 管道(pipe)通信系统
管道是用于链接一个读进程和一个写进程实现他们之间的通信的一个共享文件,又名pipe文件.想管道提供输入的发送进程以字符流形式将大量的数据送入管道,而接受管道输出的接受进程.
管道机制必须有a互斥:当一个进程对pipe进行读/写操作的时候,另一进程必须等待.b同步.当写进程写的时候,等待读进程取走管道数据之后,再唤醒.c确认对方存在才能通信
3 消息传递系统(message passing system)
不需要任何共享存储区或数据结构,而是将通信数据封装在消息中,利用操作系统提供的通信命令(原语)进行消息传递.计算机网络中,消息又称报文(datagram);微内核与服务器的通信都是消息传递机制;由于该机制支持多处理机,分布式系统,和计算机网路,因此成为这些领域最主要的通信工具.
7. 直接通信:利用原语直接把消息发送给目标,
8. 间接通信:是指发送和接收进程,通过共享中间实体(邮箱)进行消息的发送和接受.
4 客户机-服务器系统(client-server system)
前几种可用于不同计算机见进程的双向通信,但CS通信机制,在网络环境中的各种应用领域已成为主流.主要实现方法:套接字,远程过程调用和远程方法调用.
1)套接字(socket)
套接字是一个通信标识类型的数据结构,包含了
9. -通信目的的地址.
10. -通信使用的端口号,
11. -通信网络的传输层,
12. -通信网络的传输层协议
13. -进程所在的网络地址,
14. -针对客户或服务器程序提供的不同系统调用,
是进程和网络通信的基本构件.
基于文件型:通信进程都运行在同一台机器中,套接字是基于本地文件系统支持的,通信双方通过对这个特殊文件的读写实现通信,原理类似于管道.
基于网络型:非对称方式通信,及发送者需要提供接收者命名.通信双方运行在不同的主机网络环境中,被分配了一对套接字,一个属于接受进程Server,一个属于发送进程Client.发送进程发出链接请求时,随即申请一个套接字,主机位置分配一个端口,与该套接字绑定,不再分配给其他进程,接收进程拥有全局公认的套金额字和制定的端口,并通过坚挺端口等待客户请求.因此,任何进程都可以向他发出链接请求和信息请求,一方便进程之间的通信链接的建立.接受进程一旦受到请求就接受来自发送进程的链接,完成链接.
2)远程过程调用和远程方法调用
1 线程的基本概念
为了是多个程序能够并发执行,以提高资源利用率,和系统吞吐量而引入进程的概念.
为了减少程序在并发执行时,所付出的时空开销,使OS具有更好的并发性引入了线程的概念.
1)进程的基本属性:a可拥有资源的独立单位. b可独立调度和分派的基本单位.
2)程序并发执行的所需开销
a创建进程,分配其所需的资源,内存空间,IO设备,PCB
b撤销进程,对其所战友的资源执行回收操作,再撤销PCB
c进程切换,对进程上下文切换时,需保留当前进程的CPU环境,设置新选中的进程的CPU环境
3)线程-作为调度和分派的基本单位
将进程的两个属性分开,即调度的基本单位并不拥有资源;对于拥有资源的单位,不对之施以频繁的切换.
1 调度的基本单位
想比与传统OS,现代OS的线程作为调度和分派的基本单位,当线程切换时,仅需要保存和设置少量寄存器内容,
ps:寄存器:是中央处理器内的组成部分,有限存贮容量的高速存贮部件 .它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,存器有累加器(ACC)。
2 并发性
引入线程的OS,进程中的线程之间也可以并发执行,
3 拥有资源
进程可以拥有资源,并作为系统中拥有资源的一个基本单位,然而,县城本身并不拥有系统资源,而是仅有一点必不可少的,能保证独立运行的资源
4 独立性
线程之间的独立性,比进程之间的独立性,差得多.因为每个进程都一个独立的地址空间和其他资源,除了共享全局变量外,不允许其他进程访问.但是县城往往是为了提高并发性以及进行相互之间的合作而创建的,共享进程的内存地址空间和资源.
5 系统开销
创建进程和撤销,系统都要为之分配和回收进程控制块,分配和回收其他资源.进程切换,涉及到进程上下文的切换,线程则小的多,
6 支持多处理机系统
在多处理机系统中,对于传统的进程,即单线程进程,不管多少处理机,只能运行在一个处理机上,对于多线程进程就可以将一个进程中的多个线程分配到处理机上使他们并发执行.
1 线程运行的三个状态
a执行状态,表示线程已获得处理机而正在运行
b就绪状态,指线程已具备了各种执行条件,只须再获得CPU便可执行
c阻塞状态,线程在执行中因某时间受阻而处于暂停状态
2 线程控制块TCB
3 多线程OS的进程属性