进程同步
一、实验目的
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分别表示缓冲池中空缓冲区和满缓冲区的数量。假定这些生产者和消费者相互等效,只要缓冲池未满,生产者便可以将消息送入缓冲池;只要缓冲池未空,消费者便便可从缓冲池中取走一个消息。