进程同步

进程同步

一、实验目的

1、加深对进程同步的理解。
2、进一步加深对信号量工作原理的理解。
3、掌握信号量的使用方法。

二、实验原理

使用信号量解决生产者-消费者问题。Windows操作系统中,信号量的使用如下:

1、创建信号量
HANDLE CreateSemaphore(
 LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性指针,一般可设置为NULL
 LONG lInitialCount, // 初始计数
 LONG lMaximumCount, // 最大计数
 LPCTSTR lpName // 对象名指针,例如(LPCTSTR)”abc”
);
2、P操作(wait操作)
DWORD WaitForSingleObject(
HANDLE hObject, //指明一个内核对象的句柄,即之前创建的信号量
DWORD dwMilliseconds); //等待时间,毫秒为单位,如果要用于阻塞可设置为INFINITE
3、V操作(signal操作)
BOOL ReleaseSemaphore(
  HANDLE hSemaphore, // 信号量句柄,即之前创建的信号量
  LONG lReleaseCount, // 计数递增数量,每次释放时信号量增加的量,一般设为1
  LPLONG lpPreviousCount // 先前计数,一般可设置为NULL
);
4、关闭信号量,回收信号量资源
一般创建信号量之后都需要关闭,但是本次实验不对这个做明确要求
CloseHandle(
HANDLE handle; //创建的信号量
);

三、实验操作方法和步骤

1、搭建工程
(1)利用Visual Studio创建一个名为producer的工程,表示生产者。
(2)利用Visual Studio创建一个名为consumer的工程,表示消费者。
2、导入文件
(1)把pdc_main.c和csm_main.c两个文件分别复制到producer工程和consumer工程目录中。
(2)把pdc_main.c和csm_main.c两个文件分别导入到producer工程和consumer工程中。
3、完善代码
pdc_main.c和csm_main.c中的代码没有考虑进程同步问题,运行之后会出现错误。利用信号量完善这两个工程中的代码。

四、实验结果与分析

1、对pdc_main.c和csm_main.c中修改部分代码进行截图,并结合简要说明
在这里插入图片描述
在这里插入图片描述
该程序模拟生产者消费者问题,首先要设置缓冲区的大小,输入请求资源的各个进程的信息以及请求时间,并且按照请求时间对各进程进行排序,创建线程,然后按序依次对缓冲区进行操作
2、对修改之前和修改之后的进行结果进行截图,做简要分析:
修改前
在这里插入图片描述
修改后
在这里插入图片描述

首先,在每个程序中用于实现互斥的wait(mutex)和signal(mutex)必须成对的出现;其次,对资源信号量empty和full的wait和signal操作,同样需要成对地出现,但它们分别处于不同的程序中。
3、总结分析本次实验中信号量的用法
本次实验通过信号量解决对生产者-消费者的问题,可以利用记录型信号量解决生产者-消费者问题,也可以利用AND信号量解决生产者-消费者的问题。
记录型信号量解决生产者-消费者问题:假定在生产者和消费者之间的公用缓冲池中具有n个缓冲区,这时可以利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量。假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可以将消息送入缓冲池;只要缓冲池未空,消费者便便可从缓冲池中取走一个消息。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值