您的位置:首页 > 其它

进程同步

2013-10-05 16:23 302 查看
进程同步体现在两个方面:

①直接制约关系:共享某个临界资源

②间接制约关系:各进程、线程间按某个规定的顺序执行

同步机制遵循的准则:

1)空闲让进

2)忙则等待

3)有限等待

4)让权等待

解决同步问题用到的两种机制:

Ⅰ、信号量机制 P V操作

1)解决互斥问题 mutex

Mutex初值为1

进程A要访问临界资源必须先执行P(wait)操作申请资源,当且仅当mutex=1时申请成功且将mutex置0,用完之后将mutex重置为1,若申请失败该进程被阻塞。

P V操作必须成对出现

2)使用信号量实现进程间前驱关系

假设要实现先A进程后B进程的前驱关系

将Mutex初值为0,只有A进程执行完后进行V(mutex),B进程P(mutex)成功,B进程才能执行

Ⅱ、管程机制

上面信号量机制对临界资源的控制是从进程这个角度来考虑的,进程本身有了对资源的一个PV操作,这样使大量的同步操作分散在进程中,不仅显得凌乱不好管理且可能会带来死锁。

如果让对临界资源的操作由这些资源自己来控制的话就整哉些

管程机制就是从资源本身来考虑的一种机制。

管程=资源管理模块=用一个结构体封装资源+一组过程(包含进程对资源的操作(请求及释放)),这组过程就可以根据资源的情况来处理进程的请求,或接受或阻塞,进而保证每次只有一个进程访问临界资源,实现互斥。

Hansan这样定义管程“一个管程定义了一个数据结构和能为并发进程所能调用的在该数据结构上进行的一组操作,这组操作能同步进程和改变数据结构中的数据”

经典进程同步问题

一、生产者——消费者问题

三个信号量:empty——空缓冲区的数目

Full——满缓冲区的数目

Mutex——有界临界缓冲区的互斥(不能同时有两个进程一个来判空要给进放一个判满要取,如果此时消费者进程一看缓冲区是空的就取不成进程被阻塞,但同时生产者再给里面放东西,那么就造成不一致性)

下面给出生产者、消费者进程的流程图:

生产者进程
消费者进程



二、哲学家进餐问题

问题描述:5个人,5根筷子,在每个的左右手边分别放一只筷子,只有当哲学家两只手都拿起筷子才可以进餐。

约束条件:①只有当哲学家左右手都拿起筷子才可就餐

②如果筷子被别人拿走,只能等别人吃完后放下筷子才可拿到筷子

③哲学家在没有成功拿到两只筷子的情况下不会放下自己已拿到的筷子

信号量机制表示互斥:

哲学家总是先P(左手边的筷子),成功后P(右手边的筷子),成功后,用餐,用餐完毕释放两个筷子

但如果所有的哲学家在同一时刻都饿了,同时拿起左手边的筷子,那就会陷入死锁的僵局,没有人能成功用餐

死锁的解决:

Way1.破坏请求与保持条件——当哲学家P操作失败后就立即释放自己已拥有的资源

Way2:破坏环路等待条件——奇数号哲学家首先拿起左手边筷子,偶数号哲学家首先拿起右手边筷子,这样就破坏了死锁的同方向环路等待

或者规定一次最多只能有4个哲学家同时拿起筷子,这样就保证至少有一个哲学家能成功用餐,完了释放资源

三、读者——写者问题

读者写者问题是一个一对多共享的问题

约束条件:①允许多个读进程同时读一个共享对象

②不允许一个写进程与其他读进程同时访问共享对象

③不允许多个写进程同时访问一个共享对象

为此,我们需三个信号量:

① RC——读者数

② Wmutex——读写进程间的互斥量

③ Rmutex——读进程间的互斥量(防止他们在同一时间改写读者数,造成不一致)

下面给出读写进程的流程图:

读进程



写进程



具体有关这三个经典进程同步问题的代码请看这篇文章
http://hbuqy.diandian.com/post/2010-10-10/4712443
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息