操作系统课程设计 linux系统下实现PV操作_第1页
操作系统课程设计 linux系统下实现PV操作_第2页
操作系统课程设计 linux系统下实现PV操作_第3页
操作系统课程设计 linux系统下实现PV操作_第4页
操作系统课程设计 linux系统下实现PV操作_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、江塚大吟学与通信工程学院操作系统课程设计报告题目:linux系统下实现PV操作班级软件工程1401姓名学号: 指导老师:2016年12月27日1 / 19目录11 / 19、 实验题目、 实验目的和要求 三、 环境配置四、设计思路五、代码实现六、总结17实验题目1.Linux 系统简单使用认识 Linux ubuntu 安装终端的简单使用4)python3.5.2 源码安装2.多线程和多进程同步方法解决水果分配问题:水果分配的问题:桌上有一只盘子,每次只能放入 5 只水果。爸爸专放苹果, 妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果.用P, V操作实现爸爸、妈妈、儿子、

2、女儿进程的同步控制。补充 :设有两个篮子,分别有若干个苹果或橘子,爸爸和妈妈将每次从水果篮子中拿出一个水果放入水果盘中, 儿子女儿则挑选各自喜欢 的水果。1)2)分析问题,写出伪代码线程实现进程实现实验目的和要求1. 认识和学会使用 linux 系统:Linux是一种可以在PC机上执行的类似UNIX的操作系统,是一个完全免费的操作系统。1991年,芬兰学生Linus Torvalds开发了这个操作系统的核心部分,因为是 Linus 改良的 minix 系统,故称之为 Linux.2. 理解线程和进程的互斥和同步原理:同步是操作系统级别的概念 ,是在多道程序的环境下, 存在着不同的制约关系,为了

3、协调这种互相制约的关系,实现资源共享和进程协作,从而避免 进程之间的冲突,引入了进程同步。进程互斥是间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才 会解除阻塞状态。3. 使用信号量和互斥量解决问题:通过设置一个表示资源个数的信号量S,通过对信号量S的P和V操作来实现进程的的互斥。通过设置一个表示资源个数的信号量S,通过对信号量S的P和V操作来实现进程的的互斥。P和V操作分别来自荷兰语Passeren和Vrijgeven ,分别表示占有和释 放。 P V 操作是操作系统的原语,意味着具有原子性。P 操作首先减少信号量,表示有

4、一个进程将占用或等待资源,然后检测S是否小于0,如果小于0则阻塞,如果大于0则占有资源进行执行。V操作是和P操作相反的操作,首先增加信号量,表示占用或等待资源的进程减少了 1个。然后检测S是否小于0,如果小于0则唤醒等待使用S 资源的其它进程。环境配置1. 安装ubuntu1)下载系统镜像, ubuntu-16.04.1-desktop-amd64.iso制作启动U盘,使用Ultraiso软件将系统镜像写入U盘 开机进入BIOS界面,从U盘启动。对磁盘分区,等待安装结束。设置 root 密码, sudo passwd root 命令后输入两遍密码。2. 熟悉 ubuntu 的使用常用命令:(1

5、)su命令,切换用户pwd命令,打印当前工作目录的绝对路径(6)(7)(8)(9)Is命令,cd命令,mv命令,rm命令,打印当前目录下的文件切换工作目录移动文件或目录删除文件或目录shutdown命令,关闭计算机reboot命令,重启电脑tar命令,解压命令3.安装vim编辑器在终端下运行ap t-get in stall-y vim即可。安装结束后,输入vim命令,显示如下图就说明安装成功:VIw - Vi IMprovedversion T-4-160by Brafl Hooleraar et at.Modf f (t(l by -u, - IL.% JI1 i opflR &QUrca

6、fra exlt()voldvold-pcIFigure 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(or

7、ange)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 是函数所需的参数。是要运行的函2)创建信号量 threading.Semaphore(value), value acquire() 信号量 -1

8、,当为 0 时,阻塞当前线程。+1,大于 0,唤醒等待此信号量的一个线程。创建互斥锁, threading.Lock(), acquire() 变量 定义 list类型的是信号量的初始值。release() 信号量加锁, release() 解锁。定义 list类型的apples_basket 存放所有的苹果 oranges_basket 存放所有的橘子定义 list定义方法plate 当做水果盘,可以放入苹果和橘子 father , 用于将苹果放入水果盘,也就是把类型的apples_basket的一个苹果,放入 plate 列表中。并打印相关信息。oranges_basketplate 的一

9、个定义方法 mather , 用于将苹果放入水果盘, 也就是把 的一个橘子,放入 plate 列表中。并打印相关信息。定义方法 son , 用于从水果盘取出一个橘子,也就是把 橘子,拿出来,并打印相关信息。定义方法 daughter , 用于从水果盘取出一个苹果,也就是把 plate 的 一个苹果,拿出来,并打印相关信息。代码import randomimport threadingimport timeempty = threading.Semaphore(5) # 盘子的容量apple = threading.Semaphore(0) # 同步苹果的信号量 orange = threadi

10、ng.Semaphore(0) # 同步橘子的信号量mutex = threading.Event() # 表示四个 进程互斥的 访问盘 子plate = list() # 模拟 水果 盘lock = threadi ng丄ock() # p late 互斥 锁mutex.set() # 设置为 Truedef father(basket):global empty, mutex, lock, applewhile len(basket) != 0: # 当苹果 篮子中没有苹果, 则终止# 1.p(empty)empty.acquire() # 将容量 empty 减去 1# 2.p(mute

11、x) mutex.clearO # mutex设置为False其它线程将等待 # 3.put appleif 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.rele

12、ase() time.sleep(random.random() def mother(basket): global empty, mutex, lock, orangewhile len(basket) != 0: # 当橘子 篮子中没有橘子, 则终止# 1.p(empty)empty.acquireO # 将容量 empty 减去 1# 2.p(mutex) mutex.clearO # mutex设置为False其它线程将等待# 3.put(orange)if lock.acquire(): temp = basket.pop() plate.append(temp)print(-mo

13、ther 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()

14、 # orange -1# 2.p(mutex) mutex.clear() # mutex 设置 为 False 其它 线 程将等待# 3.get orangeif lock.acquire():for fruit in plate:if fruit.startswith(Orange): temp = fruit plate.remove(fruit) breakprint(-son take an orange(0) from plate.format(temp)print( current plate = , plate) lock.release()# 4.v(mutex) mute

15、x.set() # mutex 设置 为 True, 其它 线程可以使用# 5.v(empty)empty.release() # 将 empty + 1 time.sleep(random.random() def daughter(count):global empty, mutex, lock, applefor i in range(count):# 1.p(apple)apple.acquire() # apple -1# 2.p(mutex) mutex.clear() # mutex 设置 为 False 其它 线 程将等待# 3.get apple if lock.acquir

16、e():for fruit in plate:if fruit.startswith(Apple): temp = fruit plate.remove(fruit) breakprint(-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(ran

17、dom.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 = thre

18、ading.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.

19、start()mother.startO(4)结果 A 自 voi devoid-pc; /MyCode/BasicTest-Python/osdesignvot(Jvol(J-pc:-/*iyCod*e/B3str-it*pyhcn/os_;iesti;- Is natnprocesspy nain threod.pyvoldOvold-pt: 灯日 Fi Lzt -Pthnn/os_dpip ythons ma tn-thread. py“father put an current pistematn 22312 -?inother put an 匚urrent plate -daught

20、er take current plateappleCAppLc D) into plate. =ftpple-DorangeOrange-C) Into plate. -Apple-D, orange-c an apple(AppLe-D) fron plate -orangCi:tkc an orangc Into plate.cur rent piste =Orang?ft-rather pur an appleCAppke匚J into plate, current plate -OrengeB, Apple-C-son take an orangeorangCB) from plat

21、e* 二Apple-C an appleApple-c) fron plate =fcurrent plate -daugtiter take current plate -inother put nn current plate -father put sn current plate daughter take current plateorngporringp-A) Inro pl确re.-f Orange A appletAppl?ft) into plate.-Orange-A,Jan apple(Apple-B) fron plate -orange-AASon take an o

22、ronflcdaughter take an apple(Apple A) fron platecurrent plate =votdgvot(li-pc:/4yCode/Hasvc-est = Pythoii/os_tieEt9nS |Figure 4线程实现结果2.进程实现(1) 原理multi processi ng. py模块提供了对线程的操作。仓 J建线程 mult ip rocess ing.P rocess(target, args),target是要运行的函数,args是函数所需的参数。仓 J建信号量 mult ip rocessi ng.Sema phore(value),

23、value是信号量的初始值。acquire() 信号量-1,当为0时,阻塞当前线程。release()信号量+1,大于0,唤醒等待此信号量的一个线程。创建互斥锁,mult ip rocess in g.Lock(),acquire()力卩锁,release()解锁。12 / 19变量定义 list类型的定义 list类型的定义 list类型的定义方法father ,apples_basket 存放所有的苹果oranges_basket 存放所有的橘子plate 当做水果盘,可以放入苹果和橘子用于将苹果放入水果盘,也就是把apples_basket的一个苹果,放入 plate 列表中。并打印相关

24、信息。 定义方法 mather , 用于将苹果放入水果盘, 也就是把oranges_basket的一个橘子,放入 plate 列表中。并打印相关信息。定义方法 son , 用于从水果盘取出一个橘子,也就是把 橘子,拿出来,并打印相关信息。plate 的一个定义方法 daughter , 用于从水果盘取出一个苹果,也就是把 plate 的 一个苹果,拿出来,并打印相关信息。3) 代码import randomimport multiprocessingimport timeempty = multiprocessing.Semaphore(5) # 盘 子的容量 apple = multipro

25、cessing.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,

26、lock, applewhile len(basket) != 0: # 当苹果篮子中没有苹果, 则终止# 1.p(empty)empty.acquire() # 将容量 empty 减去 1# 2.p(mutex)mutex.clear() # mutex 设置 为 False 其它 线 程将等待18 / 19# 3.put appleif lock.acquire():temp = basket.pop() plate.append(temp) # 从苹果 篮 子里拿出一个苹果放入水果 盘print(-father put an apple(0) into plate.format(tem

27、p) 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.

28、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.rele

29、ase() 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 orangeif lock.acquire():for fruit in plate:if fruit.startswith(Orange): temp = fruit plate.r

30、emove(fruit) breakprint(-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, applefor i in r

31、ange(count):# 1.p(apple)apple.acquire() # apple -1# 2.p(mutex) mutex.clear() # mutex 设置 为 False 其它 进 程将等待# 3.get appleif lock.acquire():for fruit in plate:if fruit.startswith(Apple): temp = fruit plate.remove(fruit) breakprint(-daughter take an apple(0) from plate.format(temp)print( current plate =

32、, plate) lock.release()# 4.v(mutex) mutex.set() # mutex 设置 为 True, 其它 进程可以使用# 5.v(empty)empty.release() # 将 empty + 1time.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 # 模

33、拟橘子篮子,一共有 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),

34、) # 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) 结果wold甘old-pc: /MyCode/BaskTeit-Pytl1Dn/os_de%l

35、gnIs0 Evoid电votd-pc:/evccdc/BasicTf&ut-P$ naln-process.py f石in-threadpy voldvotd-pc:/wycedc/BastcTESt pyt冷c:i/c_dei;ign$ -mothfr put An orj)ngp(Orangfr-C) into plfltF.current plate = Orange-C -son take an orange(Orange-C fron plate, current plate-father put an current plate-daughter take current pla

36、te nothcr put an current plate-J apple(Apple-D into plate. =Apple-D an appTe(Apple-D) fron plate -J orangc(Orangc-D) into plotc. -orange-B5on take an orjngcfather put an current plate daughtcr take current plate Fiothcr put on Current plate=J ppIeCAppIt C into plate. =Appie-C jn opplefApple C) fron

37、plate =J orsngc(Orangc A) into plate. =Ofdftge-Ason tokc an orjngc current plate fathcr put on currpnt pte dQughtcr take currpnt pte -father put an currpnt plate -daughter take current plate End I=J jpplc(AppLc & =Apple-B jn opplc(AppIc =J ippIeCAppte-A) =Apple-Afron o plate.B) fron plotcinto plate.an apple(Apple-A) fron plate -J- pc: -/My Codey BasicTest -凸讣0时_女巩肿$Figure 5进程实现结果Pythoni main-process.py六、总结因为之前就在慕课网上看过linux使用的教程,学过centos7字符界面的使用。在课程设计前就装好了 winlO + Ubuntu 16.04 LTS双系统。所以在熟悉linux使用上并没有花时间。初期使用linux最大的麻烦就是安装软件。安装方式有源码安装和二进制包安装。使用熟

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论