操作系统实验六 信号量实现进程同步

操作系统实验六 信号量实现进程同步

【实验目的】

​ 进程同步是操作系统多进程/多线程并发执行的关键之一,进程 同步是并发进程为了完成共同任务采用某个条件来协调他们的活动,这是进程之间发生的一种直接制约关系。本次试验是利用信号量进行进程同步。

【实验软件环境】

​ 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操作环境下进程的创建、共享内存的创建、信号量的初始化、信号量的操作也更加熟悉。