系统相关
首页 > 系统相关> > 操作系统实验六 信号量实现进程同步

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

作者:互联网

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

【实验目的】

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

【实验软件环境】

​ 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