进程同步与信号量解决方案

进程同步即多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。具体来说,一个进程运行到某一点时,需要另一个伙伴进程为它提供信息,在获得消息之前,该进程进入阻塞态,获得消息后被唤醒进入就绪态。

1 生产者/消费者问题

问题描述:

1) 生产者进程生产某种类型数据放置在缓冲区

2) 消费者从缓冲区取数据,每次取一项

3) 只能有一个生产者或者消费者对缓冲区进行操作

要解决的问题:

1)  缓冲区满,生产者不再生产

2)  缓冲区空,消费者不再取

3)  生产与消费不可同时操作

 1 #define N 100
 2 int count = 0;
 3 void producer(void)
 4 {
 5     int item;
 6     while(true) {
 7         item = produce_item();
 8         if(count == N)
 9             sleep();
10         insert_item(item);
11         count++;
12         if(count == 1)
13             wake_up(consumer);
14     }
15 }
16
17 void consumer(void)
18 {
19     int item;
20     while(true) {
21         if(count==0)
22             sleep();
23         item = remove_item();
24         count--;
25         if(count == N-1)
26             wake_up(producer);
27         consume_item(item);
28     }
29 }

会产生什么问题?

当消费者判读count==0后在进入睡眠之前,被切换下CPU,生产者生产1,为唤醒消费者(未睡眠),直到生产满。之后,两个进程都将处于睡眠状态无法唤醒。

2 信号量及P、V操作

起初是为了解决互斥(二元信号量),之后推广到一般信号量(多值)解决同步。

信号量上只可进行三种操作:初始化、P和V操作。

 1 struct semaphore
 2 {
 3     int count;
 4     queueType queue;
 5 };
 6
 7 P(s)
 8 {
 9     s.count--;
10     if(s.count < 0) {
11         该进程状态变为阻塞态;
12         将该进程插入到相应等级队列s.queue末尾;
13         重新调度;
14     }
15 }
16
17 Q(s)
18 {
19     s.count++;
20     if(s.count <= 0)
21     {
22         唤醒相应等级等待队列s.queue中的一个进程;
23         改变其状态为就绪态,并将其插入到就绪队列;
24     }
25 }

3 用信号量解决进程互斥

1)分析并发进程的关键活动,划分临界区

2)设置互斥量mutex,初值为1

3)进临界区前P(mutex)

4)出临界区后Q(mutex)

4 用信号量解决生产者/消费者问题

 1 #define N 100
 2 typedef int semaphore;
 3 semaphore mutex = 1;
 4 semaphore empty = 100;
 5 semaphore full = 0;
 6
 7 void producer(void)
 8 {
 9     int item;
10     while(true) {
11         item = produce_item();
12         P(empty);
13         P(mutex);
14         insert_item(item);
15         V(mutex);
16         V(full);
17     }
18 }
19
20 void consumer(void)
21 {
22     int item;
23     while(true) {
24         P(full);
25         P(mutex);
26         item = remove_item();
27         V(mutex);
28         V(empty);
29         consume_item();
30     }
31 }

5 用信号量解决读者/写者问题

问题要求:1) 允许多个读者同时读 2) 不允许多个写者同时写 3) 读写不可同时运行。

第一类读者/写者问题:读者优先

如果读者执行:

1)无其他读者、写者,该读者可读

2)若有写者等待,但有其他读者读,则该读者也可以读

3)若有写者写,则该读者必须等

如果写者执行;

1)      无其他读者、写者,则该写者写

2)      若有读者正在读,该写者等

3)      若有其他写者在写,则等

 1 void reader(void)
 2 {
 3     while(true) {
 4         P(mutex);
 5         rc++;
 6         if(rc==1)
 7             P(w);    //第一个读者
 8         V(mutex);
 9
10         读操作
11
12         P(mutex);
13         rc--;
14         if(rc==0)
15             V(w);    //最后一个读者
16         V(mutex);
17     }
18
19 }
20
21 void writer(void)
22 {
23     while(true) {
24         P(w);
25
26         写操作
27
28         V(w);
29     }
30 }
时间: 2024-08-10 20:59:39

进程同步与信号量解决方案的相关文章

[No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore

操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − 消费者实例 共享数据 #define BUFFER_SIZE 10 typedef struct { . . . } item; item buffer[BUFFER_SIZE]; int in = out = counter = 0; 注意:这些都是用户态程序! 生产者进程 while (true

进程同步和信号量

进程的同步 进城合作:多进程完成同一个任务 ? 实例1: 司机 ? ? ? ? ? ? ? ? ? ? ? ? ?售票员 while)true){ ? ? ? ? ? ? ? ? ?while)true){ 等待 启动车辆; ? ? ? ? ? ? ? ? ? ?关门; 发送信号 ? ? 正常运行: ? ? ? ? ? ? ? ? ? ?售票; ? ? 到站停车:发送信号 ? ? ? ? ? ?等待 开门; } ? ? ? ? ? ? ? ? ? ? ? ? ? ? } 两个进程如何实现同步合作

【操作系统总结】进程同步的信号量机制

信号量机制是由dijkstra 1965年提出,是解决进程同步重要的工具 下面方法适用与几个进程访问同一个临界区 整形信号量 定义一个表示资源数目的整形信号量S,仅能同步P, V操作改变.原始值S=1,每一个进程来的时候会执行: 首先执行wait()操作,如果信号量s<=0就会一直检测并阻塞 如果不小于0就会进入临界区,并把S设为0,保证其他进程无法进去临界区 在临界区执行完,再把信号量设置回来. wait(S) { while(S <= 0);//资源如果小余0就会阻塞.一直在这边检测 S-

16.信号量互斥编程

我们先来看一个例子.就是两个进程访问同一个文件,由于线程的先后,导致内容的异常.即是数据内容的混乱. Student1.c: #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> ? void main(){ ????//open file ????int fd = 0; ????fd = open("/home/wen",O

进程同步——生产者、消费者问题

进程同步是对多个相关进程在执行次序上进行协调,使并发执行的多个进程之间按照一定的规则共享系统资源. 1.生产者消费者问题: 生产者.消费者问题生产者生产产品放入缓冲区中,消费者从缓冲区中取出产品去消费.不允许消费者从空缓冲区中取产品,也不允许生产者向已经满了的缓冲区添加产品. 2.过程描述: 生产者: void producer(){ while(1) { while(counter==n);//缓冲池已满,不再执行后面的操作 buffer[in]=nextp;//将生产出来的产品放入缓冲池 i

【操作系统】总结

概论(Operating system) '>概论(Operating system) 1.操作系统的定义.特征.功能 '>1.操作系统的定义.特征.功能 操作系统定义: ">操作系统定义: 是系统软件, 是程序模块集合 组织和管理计算机软硬件资源 合理组织计算机的工作流程 控制程序执行 向用户提供服务,使用户能够灵活.方便.有效的使用计算机 使整个计算机系统能高效地运行 '> 是系统软件, 是程序模块集合 组织和管理计算机软硬件资源 合理组织计算机的工作流程 控制程序执

Linux进程间通信总结

Linux进程间通信总结 1. 管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: (1)管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): (3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. (4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出

常见笔试题总结

1.冒泡排序 1 int a[5] = {96,73,12,46,98}; 2 int i = 0,j = 0,t = 0; 3 4 for (j = 0;j < 4;j++) { 5 for (i = 0;i < 4 - j;i++) { 6 if (a[i] > a[i+1]) { 7 t = a[i]; 8 a[i] = a[i+1]; 9 a[i+1] = t; 10 } 11 } 12 } 2.操作系统中,进程可以分为(系统进程)和(用户进程)两类 3.ISO七层模型是什么?T

OS——进程简答题(1)

1,叙述进程和程序的主要区别. 解:进程和程序是两个既有联系又有区别的两个概念,它们的主要区别如下: (1)程序是指令的有序集合,其本身没有任何运行的含义,它是一个静态的概念.而进程是程序在处理机上的一次执行过程,它是一个动态的概念. (2)程序的存在是永久的.而进程是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停,因撤消而消亡. (3)程序仅是指令的有序集合.而进程则由程序,数据和进程数据块组成. (4)进程与程序之间不是一一对应的,即同一个程序同时运行与若干不同的数据集合上,它