《操作系统》实验二:进程同步
【实验题目】:进程同步(互斥)
【实验学时】:4学时
【实验目的】
通过这次实验,加深对进程同步概念的理解,进一步掌握进程同步机制、进程同步算法和进程同步的评价。
【实验内容】
问题描述:
以生产者消费者模型为基础,在Windows环境下创建一个控制台进程(或者界面进程),在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,然后释放缓冲区。当写者线程写入数据时,如果没有空缓冲区可用,那么写者线程必须等待读者线程释放出一个空缓冲区。当读者线程读取数据时,如果没有满的缓冲区,那么读入线程将被阻塞,直到新的数据被写进去。
实现提示:
本实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,本实验中取N=16)。你需要使用如下信号量:
一个互斥信号量mutex,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
一个信号量full,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;
一个信号量empty,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;
源代码:复制到Pycharm或者jupyter notebook可以直接跑!!!
import threading
import time
import randomcount=0 #使用共享区的模拟变量
condition = threading.Condition()class Producer(threading.Thread): #使创建的类继承threading.Threaddef __init__(self,threadName): #重写其构造方法threading.Thread.__init__(self)self.threadName = threadNamedef run(self):global count #引入全局变量while True:if condition.acquire(): #使用条件对象获取锁并锁定if count>=16: #判断是否超过上限print('共享区已满,生产者Producer进入阻塞状态,停止放入!')condition.wait() #使当前进程进入阻塞状态else:count += 1 #放入缓冲区msg = time.ctime()+' '+self.threadName+'生产了1件商品放入缓冲区,共享区总计商品个数:'+str(count)print(msg)condition.notify() #唤醒其他阻塞状态的进程condition.release() #解除锁定time.sleep(random.randrange(10)/5) #随机休息n秒class Customer(threading.Thread): #消费者的线程类def __init__(self,threadName):threading.Thread.__init__(self)self.threadName = threadNamedef run(self):global countwhile True:if condition.acquire():if count < 1:print("共享区为空,消费者Customer线程进入阻塞状态,停止获取!")condition.wait() #当前进程进入阻塞状态else:count -= 1msg=time.ctime()+' '+self.threadName + '消费了1件商品,共享区总计商品个数为:'+str(count)print(msg)condition.notify() #唤醒其他阻塞线程condition.release() #解除锁定time.sleep(random.randrange(10)/2) #随即休眠n秒if __name__ == "__main__":for i in range(2):p = Producer('[生产者-'+str(i+1)+']')p.start() #启动生产者线程for i in range(5):c = Customer('[消费者-'+str(i+1)+']')c.start() #启动消费者线程
特别说明:需要手动终止运行,否则程序会一直进行输出!!!
《操作系统》实验二:进程同步相关推荐
- 操作系统实验二:物理内存管理系统
操作系统实验二:物理内存管理系统 一. 实验目的 二. 实验内容 三. 实验准备 [实验概述] [关键数据结构] [执行流程] 四. 实验步骤 (一) 练习0:填写已有实验 (二) 练习1:实现 fi ...
- 广州大学2020操作系统实验二:银行家算法
相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...
- 操作系统 实验五 进程同步问题实现
实验五 进程同步问题实现 一.实验目的 利用实验四提供的方法和例子,解决进程同步相关问题,例如:生产者消费者问题,哲学家进餐等问题. 二.实验环境 硬件环境:计算机一台,局域网环境: 软件环境:Lin ...
- 2020 操作系统 实验二 进程通信
实验二.进程通信 一.实验名称 进程通信 二.实验目的 掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法. 三.实验原理 邮箱机制类似于日常使用的信 ...
- 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)
实验二 进程调度 一. 实验目的 1. 理解进程运行的并发性. 2. 理解处理器的三级调度. 3. 掌握先来先服务的进程调度算法. 4. 掌握短 ...
- 杭电(杭州电子科技大学)操作系统实验二:Linux内核模块编程
实验内容 (1)设计一个模块,要求列出系统中所有内核线程的程序名.PID.进程状态.进程优先级.父进程的PID. (2)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信 ...
- 操作系统实验二实验报告
实验二:物理内存管理 练习0:填写已有实验 将lab1中已完成的代码更新到lab2中,在这里分别尝试了diff+patch和meld两种方法 在lab2目录下,trap.c的更新如下(注意可能需要手动 ...
- 操作系统实验二总结(生产者消费者问题)
为了这个实验二,资料查了巨多,pv操作什么的好不容易弄明白了,但是感觉老师要求的好像用不到这个. 大部分都是某位同学的成果哈哈哈. 自己总结了一下: 1.队列和链表在c++中是可以直接用已经有的模板的 ...
- 操作系统——实验二 进程管理
1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...
- 操作系统实验二(银行家算法)
实验二 银行家算法 一.实验目的 用高级语言编写和调试一个银行家算法程序,并可以利用银行家算法模拟分配资源以及进行安全性检查.加深对银行家算法的理解. 二.实验指导 银行家算法中的数据结构 (1) 可 ...
最新文章
- leetcode算法题--反转单词前缀
- HoloLens开发手记-全息Hologram
- 前端学习(2746):uniapp--基本介绍
- 文档上传到服务器上,将文件上传到服务器上
- tp5 分页php不能foreach,tp5框架无刷新分页实现方法分析
- python中range函数和xrange函数有什么异同?
- Linux下gdb调试(GUI)
- 增强for循环(foreach解析)—带冒号的for循环
- windows电脑记事本怎么自由排序?
- 小三拆散原配上位结婚 因丈夫偷情将其捅死
- iOS 视频边下边播
- PO系列之 PO中使用webService
- 【创新实训】BERT4EL,基于文本相似度的实体消歧实现
- 【Aegisub相关】math.random 行为记录
- VBScript之表白代码(有运行视频)
- MATLAB 函数之resample
- 开放式激光振镜运动控制器(二):ZMC408SCAN激光接口与控制
- 信息安全保障人员CISAW证书期延续、续证
- 【考研】东北大学二叉树相关算法(2)
- CSS的背景(背景颜色,背景图片,背景平铺,背景图片位置,背景图片固定(图片附着),背景复合写法)
热门文章
- PowerMock代码
- Java取整函数的使用
- PhotoShop导出icon图标(*.ico,*.icon文件)
- 思科路由器的DNS及DHCP功能
- stable diffusion 入门 视频和教程
- 一步转移概率矩阵的实现
- Altium Designer 21 怎么切换成中文界面
- 记录一下使用腾讯企业邮箱的坑Sending the email to the following server failed : smtp.exmail.qq.com:465
- label qt 自动换行_qt qlabel 自动换行
- 从OA技术解析OA系统的协同魅力