ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2022-05-10 00:32:56  阅读:321  来源: 互联网

标签:full 操作系统 进程同步 value 信号量 mutex sem empty


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

【实验目的】

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

【实验软件环境】

​ 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有