




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机科学与通信工程学院操作系统课程设计报告题目:linux系统下实现PV操作班级: 软件工程1401 姓名: 学号: 3 指导老师: 2016年12月27日目录一、实验题目3二、实验目的和要求3三、环境配置4四、设计思路6五、代码实现7六、总结17一、 实验题目1. Linux 系统简单使用(1) 认识Linux(2) ubuntu安装(3) 终端的简单使用(4) python3.5.2源码安装2. 多线程和多进程同步方法解决水果分配问题:水果分配的问题:桌上有一只盘子,每次只能放入5只水果。爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果.用P,V操作实现爸爸、妈妈、儿子、女儿进程的同步控制。补充:设有两个篮子,分别有若干个苹果或橘子,爸爸和妈妈将每次从水果篮子中拿出一个水果放入水果盘中,儿子女儿则挑选各自喜欢的水果。(1) 分析问题,写出伪代码(2) 线程实现(3) 进程实现二、 实验目的和要求1. 认识和学会使用linux系统:Linux 是一种可以在PC机上执行的类似UNIX的操作系统,是一个完全免费的操作系统。1991年,芬兰学生Linus Torvalds开发了这个操作系统的核心部分,因为是Linus 改良的minix系统,故称之为Linux.2. 理解线程和进程的互斥和同步原理:同步是操作系统级别的概念,是在多道程序的环境下,存在着不同的制约关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步。进程互斥是间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。3. 使用信号量和互斥量解决问题:通过设置一个表示资源个数的信号量S,通过对信号量S的P和V操作来实现进程的的互斥。通过设置一个表示资源个数的信号量S,通过对信号量S的P和V操作来实现进程的的互斥。P和V操作分别来自荷兰语Passeren和Vrijgeven,分别表示占有和释放。P V操作是操作系统的原语,意味着具有原子性。P操作首先减少信号量,表示有一个进程将占用或等待资源,然后检测S是否小于0,如果小于0则阻塞,如果大于0则占有资源进行执行。V操作是和P操作相反的操作,首先增加信号量,表示占用或等待资源的进程减少了1个。然后检测S是否小于0,如果小于0则唤醒等待使用S资源的其它进程。三、 环境配置1. 安装ubuntu(1) 下载系统镜像,ubuntu-16.04.1-desktop-amd64.iso(2) 制作启动U盘,使用Ultraiso软件将系统镜像写入U盘(3) 开机进入BIOS界面,从U盘启动。(4) 对磁盘分区,等待安装结束。(5) 设置root密码,sudo passwd root 命令后输入两遍密码。2. 熟悉ubuntu的使用常用命令:(1) su命令,切换用户(2) pwd命令,打印当前工作目录的绝对路径(3) ls命令,打印当前目录下的文件(4) cd命令,切换工作目录(5) mv命令,移动文件或目录(6) rm命令,删除文件或目录(7) shutdown命令,关闭计算机(8) reboot命令,重启电脑(9) tar命令,解压命令3. 安装vim编辑器在终端下运行apt-get install y vim即可。安装结束后,输入vim命令,显示如下图就说明安装成功:Figure 1 安装vim后输入vim显示的结果4. 源码安装python3.5.2因为linux内置的python的版本为2.7.5,所以为了程序设计的方便,使用3.5.2版本的。终端下输入python即可进入python交互模式。安装前:Figure 2 内置python运行结果安装步骤:(1) 进入下载目录,tar zxvf Python-3.5.2.tar.gz 解压到当前目录下(2) 进入解压目录,cd Python-3.5.2(3) 验证系统配置,./configure(4) 编译和安装,make & make install(5) 建立软链接,在/usr/bin目录下生成python3的软链接文件安装结果:Figure 3 python3安装结果四、 设计思路1. 题目分析:father、mather、son、daughter是四个线程或进程。盘子plate是它们共享的变量,对盘子的操作要互斥。Father和daughter要对apple同步。Mother和son要对orange同步。2. 伪代码:father:while(True): p(empty) p(mutex) put apple v(mutex) v(apple)mother:while(True): p(empty) p(mutex) put orange v(mutex) v(orange)son:while(True): p(orange) p(mutex) get orange v(mutex) v(empty)daughter:while(True): p(apple) p(mutex) get apple v(mutex) v(empty)五、 代码实现1. 线程实现(1) 原理threading.py模块提供了对线程的操作。创建线程threading.Thread(target, args),target是要运行的函数,args是函数所需的参数。创建信号量threading.Semaphore(value), value是信号量的初始值。acquire() 信号量-1,当为0时,阻塞当前线程。release() 信号量+1,大于0,唤醒等待此信号量的一个线程。创建互斥锁,threading.Lock(), acquire() 加锁,release()解锁。(2) 变量定义list类型的 apples_basket 存放所有的苹果定义list类型的 oranges_basket 存放所有的橘子定义list类型的plate当做水果盘,可以放入苹果和橘子定义方法father ,用于将苹果放入水果盘,也就是把apples_basket的一个苹果,放入plate列表中。并打印相关信息。定义方法mather ,用于将苹果放入水果盘,也就是把oranges_basket的一个橘子,放入plate列表中。并打印相关信息。定义方法son ,用于从水果盘取出一个橘子,也就是把plate的一个橘子,拿出来,并打印相关信息。定义方法daughter ,用于从水果盘取出一个苹果,也就是把plate的一个苹果,拿出来,并打印相关信息。(3) 代码import randomimport threadingimport timeempty = threading.Semaphore(5) # 盘子的容量apple = threading.Semaphore(0) # 同步苹果的信号量orange = threading.Semaphore(0) # 同步橘子的信号量mutex = threading.Event() # 表示四个进程互斥的访问盘子plate = list() # 模拟水果盘lock = threading.Lock() # plate互斥锁mutex.set() # 设置为Truedef father(basket): global empty, mutex, lock, apple while len(basket) != 0: # 当苹果篮子中没有苹果,则终止 # 1.p(empty) empty.acquire() # 将容量empty减去1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它线程将等待 # 3.put apple if lock.acquire(): temp = basket.pop() plate.append(temp) # 从苹果篮子里拿出一个苹果放入水果盘 print(-father put an apple(0) into plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它线程可以使用 # 5.v(apple) apple.release() time.sleep(random.random()def mother(basket): global empty, mutex, lock, orange while len(basket) != 0: # 当橘子篮子中没有橘子,则终止 # 1.p(empty) empty.acquire() # 将容量empty减去1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它线程将等待 # 3.put(orange) if lock.acquire(): temp = basket.pop() plate.append(temp) print(-mother put an orange(0) into plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它线程可以使用 # 5.v(orange) orange.release() time.sleep(random.random()def son(count): global empty, mutex, lock, orange for i in range(count): # 1.p(orange) orange.acquire() # orange -1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它线程将等待 # 3.get orange if lock.acquire(): for fruit in plate: if fruit.startswith(Orange): temp = fruit plate.remove(fruit) break print(-son take an orange(0) from plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它线程可以使用 # 5.v(empty) empty.release() # 将empty + 1 time.sleep(random.random()def daughter(count): global empty, mutex, lock, apple for i in range(count): # 1.p(apple) apple.acquire() # apple -1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它线程将等待 # 3.get apple if lock.acquire(): for fruit in plate: if fruit.startswith(Apple): temp = fruit plate.remove(fruit) break print(-daughter take an apple(0) from plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它线程可以使用 # 5.v(empty) empty.release() # 将empty + 1 time.sleep(random.random()if _name_ = _main_: # 初始化苹果和橘子的个数 apples_basket = Apple-A, Apple-B, Apple-C, Apple-D # 模拟苹果篮子,一共有4个苹果要放入水果盘 oranges_basket = Orange-A, Orange-B, Orange-C # 模拟橘子篮子,一共有3个橘子要放入水果盘 # 创建4个线程 father = threading.Thread(name=Father, target=father, args=(apples_basket, ) # father 线程 mother = threading.Thread(name=Mother, target=mother, args=(oranges_basket, ) # mother 线程 son = threading.Thread(name=Son, target=son, args=(len(oranges_basket), ) # son 线程 daughter = threading.Thread(name=Daughter, target=daughter, args=(len(apples_basket), ) # daughter 线程 # 启动线程 daughter.start() son.start() father.start() mother.start()(4) 结果 Figure 4线程实现结果2. 进程实现(1) 原理multiprocessing.py模块提供了对线程的操作。创建线程multiprocessing.Process(target, args),target是要运行的函数,args是函数所需的参数。创建信号量multiprocessing.Semaphore(value), value是信号量的初始值。acquire() 信号量-1,当为0时,阻塞当前线程。release() 信号量+1,大于0,唤醒等待此信号量的一个线程。创建互斥锁,multiprocessing.Lock(), acquire() 加锁,release()解锁。(2) 变量定义list类型的 apples_basket 存放所有的苹果定义list类型的 oranges_basket 存放所有的橘子定义list类型的plate当做水果盘,可以放入苹果和橘子定义方法father ,用于将苹果放入水果盘,也就是把apples_basket的一个苹果,放入plate列表中。并打印相关信息。定义方法mather ,用于将苹果放入水果盘,也就是把oranges_basket的一个橘子,放入plate列表中。并打印相关信息。定义方法son ,用于从水果盘取出一个橘子,也就是把plate的一个橘子,拿出来,并打印相关信息。定义方法daughter ,用于从水果盘取出一个苹果,也就是把plate的一个苹果,拿出来,并打印相关信息。(3) 代码import randomimport multiprocessingimport timeempty = multiprocessing.Semaphore(5) # 盘子的容量apple = multiprocessing.Semaphore(0) # 同步苹果的信号量orange = multiprocessing.Semaphore(0) # 同步橘子的信号量mutex = multiprocessing.Event() # 表示四个进程互斥的访问盘子manager = multiprocessing.Manager()plate = manager.list() # 模拟水果盘lock = multiprocessing.Lock() # plate互斥锁mutex.set() # 设置为Truedef father(basket): global empty, mutex, lock, apple while len(basket) != 0: # 当苹果篮子中没有苹果,则终止 # 1.p(empty) empty.acquire() # 将容量empty减去1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它线程将等待 # 3.put apple if lock.acquire(): temp = basket.pop() plate.append(temp) # 从苹果篮子里拿出一个苹果放入水果盘 print(-father put an apple(0) into plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它线程可以使用 # 5.v(apple) apple.release() time.sleep(random.random()def mother(basket): global empty, mutex, lock, orange while len(basket) != 0: # 当橘子篮子中没有橘子,则终止 # 1.p(empty) empty.acquire() # 将容量empty减去1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它进程将等待 # 3.put(orange) if lock.acquire(): temp = basket.pop() plate.append(temp) print(-mother put an orange(0) into plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它进程可以使用 # 5.v(orange) orange.release() time.sleep(random.random()def son(count): global empty, mutex, lock, orange for i in range(count): # 1.p(orange) orange.acquire() # orange -1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它进程将等待 # 3.get orange if lock.acquire(): for fruit in plate: if fruit.startswith(Orange): temp = fruit plate.remove(fruit) break print(-son take an orange(0) from plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它进程可以使用 # 5.v(empty) empty.release() # 将empty + 1 time.sleep(random.random()def daughter(count): global empty, mutex, lock, apple for i in range(count): # 1.p(apple) apple.acquire() # apple -1 # 2.p(mutex) mutex.clear() # mutex设置为False 其它进程将等待 # 3.get apple if lock.acquire(): for fruit in plate: if fruit.startswith(Apple): temp = fruit plate.remove(fruit) break print(-daughter take an apple(0) from plate.format(temp) print( current plate = , plate) lock.release() # 4.v(mutex) mutex.set() # mutex设置为True, 其它进程可以使用 # 5.v(empty) empty.release() # 将empty + 1 time.sleep(random.random()if _name_ = _main_: # 初始化苹果和橘子的个数 apples_basket = Apple-A, Apple-B, Apple-C, Apple-D # 模拟苹果篮子,一共有4个苹果要放入水果盘 oranges_basket = Orange-A, Orange-B, Orange-C # 模拟橘子篮子,一共有3个橘子要放入水果盘 # 创建4个进程 father = multiprocessing.Process(name=Father, target=father, args=(apples_basket, ) # father 进程 mother = multiprocessing.Process(name=Mother, target=mother, args=(oranges_basket, ) # mother 进程 son = multiprocessing.Process(name=Son, target=son, args=(len(oranges_basket), ) # son 进程 daughter = multiprocessing.Process(name=Daughter, target=daughter, args=(len(apples_basket), ) # daughter 进程 # 启动进程 daughter.start() son.start() father.start() mother.start() daughter.join() son.join() father.join() mother.join()print(End !)(4) 结果 Figure 5进程实现结果六、 总结因为之前就在慕课网上看过linux使用的教程,学过centos7字符界面的使用。在课程设计前就装好了win10 + Ubuntu 16.04 LTS双系统。所以在熟悉linux使用上并没有花时间。初期使用linux最大的麻烦就是安装软件。安装方式有源码安装和二进制包安装。使用熟练后装软件的速度还是比windows上慢。不过各有优缺点。因为软件开发在linux上比较方便,就逐渐从windows平台转移到linux上了。Ubuntu这个发行版本的图形界面做的还是比较美观的。使用linux的过程中让我对多用户操作
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 矿山工人劳务合同协议
- 长期合作订购合同范本
- 淘宝商家供货合同范本
- 运动队赞助合同协议书
- 电脑耗材买卖合同范本
- 美发转让店铺合同范本
- 游艺设备转让合同范本
- 自助台球转让合同协议
- 酒店招商租售合同范本
- 线上店铺转让合同协议
- 电池厂化成柜安全操作规范规章
- 2025年销售逻辑笔试题目及答案
- 宏村简介课件
- 2025四川安和精密电子电器股份有限公司招聘NPI工程师1人备考练习题库及答案解析
- 9 古代科技 耀我中华 课件(共2课时) 部编版道德与法治五年级上册
- 潍坊市2026届高三开学调研监测考试数学试题及答案
- 力帆集团摩托车营销策略优化研究:基于市场竞争与消费者洞察
- 2025江西南昌市西湖城市建设投资发展集团有限公司及下属子公司招聘40人考试参考试题及答案解析
- 2025年体育组织行业研究报告及未来行业发展趋势预测
- 2024年永州市工会社会工作者招聘笔试真题
- 推进文旅医养融合发展的策略及实施路径
评论
0/150
提交评论