操作系统实验六 信号量实现进程同步
作者:互联网
操作系统实验六 信号量实现进程同步
【实验目的】
进程同步是操作系统多进程/多线程并发执行的关键之一,进程 同步是并发进程为了完成共同任务采用某个条件来协调他们的活动,这是进程之间发生的一种直接制约关系。本次试验是利用信号量进行进程同步。
【实验软件环境】
VC++或者 Linux 操作系统
【实验内容】
-
生产者进程生产产品,消费者进程消费产品。
-
当生产者进程生产产品时,如果没有空缓冲区可用,那么生产 者进程必须等待消费者进程释放出一个缓冲区。
-
当消费者进程消费产品时,如果缓冲区中没有产品,那么消费 者进程将被阻塞,直到新的产品被生产出来
【实验程序及分析】
通过使用sem_t类型的信号量full,empty, mutex来实现对两个消费者进程和一个生产者进程之间的同步问题。需要特别注意的是,对信号量需要进行互斥访问,所以需要P(mutex)和V(mutex)夹紧互斥访问的操作。
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
sem_t *full, *empty, *mutex;
void *createSharedMemory(size_t size) {
void *addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if (addr == MAP_FAILED) {
return NULL;
}
return addr;
}
int main(){
full = (sem_t*)createSharedMemory(sizeof(sem_t));
empty = (sem_t*)createSharedMemory(sizeof(sem_t));
mutex = (sem_t*)createSharedMemory(sizeof(sem_t));
if (full == NULL || empty == NULL || mutex == NULL) {
printf("creat share memory error\n");
return 0;
}
sem_init(full, 10, 0);
sem_init(empty, 10, 6);
sem_init(mutex, 10, 1);
pid_t pid1 = fork();
int i = 0;
if (pid1 > 0) {
while(1) {
//生产
sem_wait(empty);
sem_wait(mutex);
sem_post(full);
int value;
sem_getvalue(full, &value);
printf("Producer %d: produce 1 thing, now there are %d things\n", getpid(), value);
sem_post(mutex);
i++;
sleep(2);
}
} else if (pid1 == 0) {
pid_t pid2 = fork();
if (pid2 > 0) {
//消费
while(1){
sleep(2);
sem_wait(full);
sem_wait(mutex);
int value;
sem_getvalue(full, &value);
printf("Customer %d: use 1 thing, now there are %d things\n", getpid(), value);
sem_post(mutex);
sem_post(mutex);
sleep(2);
}
} else if (pid2 == 0) {
pid_t pid3 = fork();
if (pid3 > 0) {
//消费
while(1){
sleep(2);
sem_wait(full);
sem_wait(mutex);
int value;
sem_getvalue(full, &value);
printf("Customer %d: use 1 thing, now there are %d things\n", getpid(), value);
sem_post(mutex);
sem_post(empty);
sleep(2);
}
}
}
}
return 0;
}
【实验截图】
【实验心得与体会】
在本次上机中,通过对信号量full, empty, mutex的sem_wait()和wem_post()操作,对通过PV操作来实现进程同步的方法理解更加深刻,同时对linux操作环境下进程的创建、共享内存的创建、信号量的初始化、信号量的操作也更加熟悉。
标签:full,操作系统,进程同步,value,信号量,mutex,sem,empty 来源: https://www.cnblogs.com/oneOmega/p/16251822.html