操作系统实验六 信号量实现进程同步
操作系统实验六 信号量实现进程同步
【实验目的】
进程同步是操作系统多进程/多线程并发执行的关键之一,进程 同步是并发进程为了完成共同任务采用某个条件来协调他们的活动,这是进程之间发生的一种直接制约关系。本次试验是利用信号量进行进程同步。
【实验软件环境】
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操作环境下进程的创建、共享内存的创建、信号量的初始化、信号量的操作也更加熟悉。