操作系统linux系统下实现pv操作.docx

上传人:太** 文档编号:60561763 上传时间:2022-11-16 格式:DOCX 页数:23 大小:37.99KB
返回 下载 相关 举报
操作系统linux系统下实现pv操作.docx_第1页
第1页 / 共23页
操作系统linux系统下实现pv操作.docx_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《操作系统linux系统下实现pv操作.docx》由会员分享,可在线阅读,更多相关《操作系统linux系统下实现pv操作.docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、。江林大学计算机科学与通信工程学院操作系统课程设计报告题目:linux系统下实现PV操作班级:软件工程1401姓名: 学号:匚一指导老师:2016年12月27日1/21print(-mother put an orange(0) intoplate.format(temp)printC current plate = : plate)lock.relcase()# 4.v(mutex)mutex.setO # mutex设置为True,其它线程可以使用# 5.v(orange) orange.release()time.sleep(random.random()def son(count):g

2、lobal empty, mutex, lock, orangefor 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.startsvvith(Orange):temp = fruit plate.remove( fruit) breakprint(-son take an orange(0) fromplat

3、e.format(temp)printC current plate = plate)lock.rclcase()# 4.v(mutex)mutex.setO # mutex设置为True,其它线程可以使用# 5.v(empty)empty.release() # 将 empty + 1time.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

4、.clear() # mutex设置为False其它线程将等待# 3.get apple10/21if lock.acquire():for fruit in plate:if fruit.startswith(Apple1):temp = fruitplate.reinove(fruit) breakprint(-daughter take an apple(0) from plate.formaUtemp)print( current plate = plate) lock.release()# 4.v(mutex)mutex.set() # mutex设置为True,其它线程可以使用#

5、5.v(emply)empty.release() # 将 empty + 1timc.slccp(random.random()if_name= _main_# 初始化苹果和橘子的个数apples_basket = Apple-A, Apple-B, Apple-C, Apple-D #模拟苹果篮子,一共有4个苹果要放入水果盘oranges_baskct = Orange-A Orange-B*, Orange-C # 模拟橘子篮子,一共有3个橘子要放入水果盘# 创立4个线程father = threading.Thread(name=,Father, target=father,args=

6、(apples_basket,) # father 线程mother = threading.Thread(name=Mother, target=mother,args=(orangcs_baskct,) # 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 线程# 启动线程

7、daughter.start()son.start()father.start()11/21mother.start()(4)结果一色 void(pvoid-pc: */MyCode/BasicTest-Python/os_cjesignvotdQvotd-pc:/MyCode/BastcTest-Python/os_destgn$ Is nainprocess.py nain-thread.pyvold0votd-pc:*/MyCode/8astcTest-Python/os_destgn$ python3 main-thread.py-father put an current plate

8、main 22812-another put an current plate-daughter take current plateapple(Apple-D) into plate. =Apple-Dorange(Orange-C) into plate.= ,Apple-D*, orange-c an apple(Apple-D) fron plate=Orange-C -son take an orange(Orange-C) fron plate.current plate onother put an current plate -father put an current pla

9、te= orange(Orangc-B) into plate.=Orange-B apple(Apple-C) into plate. =Orange-B*, Apple-C-son take an orange(orange-B) from plate.current plate -,daughter take current plate -nother put an current plate father put an current plate-daughter take current plate=Apple-Can apple(Applec) fron plate-orange(

10、Orange-A) into plate.=Orange-A appte(Apple-B) into plate.- Orange-A, Apple-B an apple(Apple-B) fron plate=,Orange-A*-son take an orangc(Orange A) fron plate, current plate =-father put an apple(Apple-A) into plate.current plate = Apple-A-daughter take an apple(Apple-A) fron plate current plate = vot

11、dQvotd-pc:/MyCode/BastcTestPython/os_desl9n$ 1Figure 4线程实现结果2.进程实现(1) 原理multiprocessing. py模块提供/对线程的操作。创立线程 multiprocessing. Process (target, args), target 是要运 行的函数,args是函数所需的参数。创立信号量 multiprocessing. Semaphore (value), value 是信号量的 初始值。acquire()信号量T,当为0时,阻塞当前线程。releaseO 信号量+1,大于0,唤醒等待此信号量的一个线程。创立互斥锁

12、,multiprocessing. Lock。, acquireO 加锁,releaseO 解锁。12/21(2) 变量定义list类型的apples_basket存放所有的苹果定义list类型的orangcs_basket存放所有的橘子定义list类型的plate当做水果盘,可以放入苹果和橘子定义方法father,用于将苹果放入水果盘,也就是把apples_basket 的一个苹果,放入plate列表中。并打印相关信息。定义方法malher ,用于将苹果放入水果盘,也就是把oranges_baskel 的一个橘子,放入plate列表中。并打印相关信息。定义方法son,用于从水果盘取出一个橘子

13、,也就是把plate的一个 橘子,拿出来,并打印相关信息。定义方法daughter,用于从水果盘取出一个苹果,也就是把plate的 一个苹果,拿出来,并打印相关信息。(3) 代码import randomimport multiprocessingimport timeempty = multiprocessing.Semaphore(5) # 盘子的容量apple = multiprocessing.Semaphore(O) # 同步苹果的信号量 orange = multiprocessing.Scm叩horc(O) # 同步橘子的信号量mutex = multiprocessing.Ev

14、ent() #表示四个进程互斥的访问盘子manager = muhiprocessing.Manager()plate = manager.list() # 模拟水果盘lock = multiprocessing.Lock() # plate 互斥锁mutex.set() # 设置为 Truedef father(basket):global empty, mutex, lock, applewhile len(basket) != 0: #当苹果篮子中没有苹果,那么终止# l.p(empty)empty.acquire() # 将容量 empty 减去 1# 2.p(mutex)mutex.

15、clear() # mutex设置为False其它线程将等待13/21# 3.put apple if lock.acquire():temp = basket.popOplate.append(temp) #从苹果篮子里拿出一个苹果放入水果盘print(-fathcr put an applc(0) into plate.format(tcmp) print( current plate = plate)lock.release() # 4.v(mutex)mutex.set() # mutex设置为True,其它线程可以使用# 5.v(apple) apple.release() time

16、.sleep(random.random() def mother(basket):global empty, mutex, lock, orangewhile lcn(baskct) != 0: #当橘子篮子中没有橘子,那么终止# 1 .p(empty)empty.acquire() # 将容量 empty 减去 1 # 2.p(mutex)mutex.clear() # mutex设置为False其它进程将等待# 3.put(orange) if lock.acquire():temp = basket.popOplate.append(temp)print(-mother put an

17、orange(0) intop 1 ate. for mat (te m p)print( current plate = plate) lock.rclcase()# 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 -

18、114/21# 2.p(mutex)mutex.clear() # mutex设置为False其它进程将等待# 3.get orangeif lock.acquire():for fruit in plate:if fruit.startswith(Orange):temp = fruitplate.remove(fruit)breakprint(-son take an orange(0) fromplate. format(temp)print( current plate = plate)lock.release()# 4.v(mutex)mutex.set() # mutex设置为Tr

19、ue,其它进程可以使用# 5.v(empty)empty.release() # 将 emply + Itimc.slccp(random.randomO)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 appleif lock.acqiiire():for fruit in plate:if fruit.s

20、tartswithC Apple1):temp 二 fruitplate.remove(fruit)breakprint(-daughtcr take an applc(0) from plate.formaUtemp)print( current plate = plate) lock.release()# 4.v(mutex)mutex.set() # mutex设置为True,其它进程可以使用# 5.v(empty)empty.release() # 将 empty + 115/21time.sleep(random.random()if_name= _main_# 初始化苹果和橘子的个

21、数apples_baskct = lApple-A, Apple-B*, Apple-C, nApple-Dn #模拟苹果篮子,一共有4个苹果要放入水果盘oranges_basket = Orange-A Orange-B, Orange-Cl # 模拟橘子篮子,一共有3个橘子要放入水果盘# 创立4个进程father = multiprocessing.Process(name=Father target=father, args=(applcs_baskct,) # father 进程mother = multiprocessing.Process(name=Mother, target=m

22、other, args=(oranges_basket,) # mother 进 程son = multiprocessing.Process(name=,Son, target=son, args=(len(oranges_basket),) # son 进 程daughter = multiprocessing.Process(name=,Daughter,target=daughter, args=(Ien(apples_basket),) # daughter 进程# 启动进程daughtcr.start()son.start()father.slart()mother.startOd

23、aughter.join()son.join()fathcr.join()mother.joinOprint(HEnd !”)(4) 结果16/21Figure 5进程实现结果六、总结因为之前就在慕课网上看过linux使用的教程,学过centos?字符界面的使 用。在课程设计前就装好了 winlO + Ubuntu 16. 04 LTS双系统。所以在熟悉linux 使用上并没有花时间。初期使用linux最大的麻烦就是安装软件。安装方式有源码安装和二进制包 安装。使用熟练后装软件的速度还是比windows上慢。不过各有优缺点。因为软 件开发在linux上比拟方便,就逐渐从windows平台转移到

24、linux上了。Ubuntu这个发行版本的图形界面做的还是比拟美观的。使用linux的过程中让我对多用户操作系统更加了解,虽然windows系统也 是多用户操作系统,但是平常使用的时候都是超级管理员身份,所以感触不深。17/21Linux对文件权限管理十分严格,只有相应的用户身份才能获得使用这个文件的 特定权限。使用python的原因是python的语法简洁、优雅。没有c和c+的指针,实 现比拟方便。Java的代码太过繁琐,不适合快速实现想法。Python的中文文档相对较少,有些模块是对c的封装,看不见源码。所以 在学习threading, py和multiprocessing, py的时候百

25、度的东西十分琐碎,影 响了开发速度。本次实验后,对线程和进程也有了更深更具体的体会。进程是具有一定独立 功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调 度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是 比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有 一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同 属一个进程的其他的线程共享进程所拥有的全部资源。具体区别如下:地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程 内的线程在其它进程不可见。通信:进程间通信IPC,线程间可以直接读写进程

26、数据段(如全局变量)来 进行通信一一需要进程同步和互斥手段的辅助,以保证数据的一致性。调度和切换:线程上下文切换比进程上下文切换要快得多。Python对线程的支持不如java等语言好。因为Python多线程下,每个线程的 执行方式:1 .取 GIL2 .执行代码直到sleep或者是python虚拟机将其挂起。3 .释放GIL可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行 证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允 许进入CPU执行。每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且 由于GIL锁存在,python里一个进程永

27、远只能同时执行一个线程(拿到G1L的线 程才能执行),这就是为什么在多核CPU , python的多线程效率并不高。18.21但是并不意味着python的多线程就没有用了,在执行密集型代码(文件处理、 网络爬虫等),多线程能够有效提升效率(单线程下有10操作会进行10等待,造成 不必要的时间浪费,所以python的多线程对T0密集型代码比拟友好。在多核CPU下,用多进程效率高,在单核CPU下,使用多线程效率高。此次课程设计收获最大的还是学会 召怎么用信譬控制线程和多个进程 之间的同步和互斥。目 录第1章总论错误!未定义书签。1.1. 工程背景与概况错误!未定义书签。1.2. 主要技术经济指标错

28、误!未定义书签。1.3. 问题与建议错误!未定义书签。第2章 工程投资环境与市场研究错误!未定义书签。2.1.投资环境分析错误!未定义书签。2. 2.区域房地产市场分析错误!未定义书签。2. 3.销售预测错误!未定义书签。2. 4.营销策略错误!未定义书签。第3章 建设规模与工程开发条件错误!未定义书签。3.1.建设规模错误!未定义书签。3. 2.工程概况现状错误!未定义书签。3.3.工程建设条件错误!未定义书签。第4章 建筑方案错误!未定义书签。4.1.设计依据错误!未定义书签。4. 2.工程设计主题和开发理念错误!未定义书签。4. 3.工程总体规划方案错误!未定义书签。4.4. 建筑设计错

29、误!未定义书签。4.5. 结构设计错误!未定义书签。19/21目录一、实验题目3二、实验目的和要求3三、环境配置4四、设计思路6五、代码实现8六、总结172.214. 6.给排水设计错误!未定义书签。第5章 节能节水措施错误!未定义书签。4.1. 设计依据错误!未定义书签。5. 2.建筑局部节能设计错误!未定义书签。第6章 环境影响评价错误!未定义书签。5.1. 编制依据错误!未定义书签。6. 2.环境现状错误!未定义书签。6.1. 工程建设对环境的影响错误!未定义书签。6.2. 环境保护措施错误!未定义书签。第7章 劳动卫生与消防错误!未定义书签。6.3. 指导思想错误!未定义书签。7. 2

30、.职业平安卫生健康对策与措施错误!未定义书签。7. 3.消防设计错误!未定义书签。第8章 组织机构与人力资源配置错误!未定义书签。7.1. 组织机构错误!未定义书签。8. 2.人力资源配置错误!未定义书签。第9章 工程实施进度错误!未定义书签。9.1.工程开发期错误!未定义书签。9. 2.工程实施进度安排错误!未定义书签。9. 3.工程实施过程控制措施错误!未定义书签。第10章工程招投标错误!未定义书签。10.2 工程工程招标投标因素分析10. 3招标依据10. 4招标范围错误错误错误错误10.1 工程工程招标投标概述20. 2110.5招标方式错误!第11章投资估算与资金筹措11.1错误!未

31、定义书签。投资估算错误!11.2资金筹措错误!第12章 财务评价错误!未定义书签。12.1 工程评估依据错误!12.2 财务评价基础数据的选择错误!12.3 财务评价错误!12.4 不确定性分析错误!第13章 社会评价错误!未定义书签。13.1 工程对社会的影响分析错误!13.2 风险分析错误!13.3 社会评价结论错误!第14章 研究结论与建议错误!未定义书签。14.1 可行性研究结论错误!14.2 建议错误!21/21一、实验题目1. Linux系统简单使用(1) 认识 Linux(2) ubuntu 安装(3)终端的简单使用(4) python3. 5. 2 源码安装2. 多线程和多进程

32、同步方法解决水果分配问题:水果分配的问题:桌上有一只盘子,每次只能放入5只水果。爸爸专放苹果,妈妈专放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘 子中的苹果.用P, V操作实现爸爸、妈妈、儿子、女儿进程的同步控制。补充:设有两个篮子,分别有假设干个苹果或橘子,爸爸和妈妈将每 次从水果篮子中拿出一个水果放入水果盘中,儿子女儿那么挑选各自喜欢 的水果。(1)分析问题,写出伪代码(2)线程实现(3)进程实现二、实验目的和要求1 .认识和学会使用linux系统:Linux是一种可以在PC机上执行的类似UNIX的操作系统,是一个完 全免费的操作系统。1991年,芬兰学生Linus Torvald

33、s开发了这个操作系统 的核心局部,因为是Linus改良的minix系统,故称之为Linux.2 .理解线程和进程的互斥和同步原理:3/21同步是操作系统级别的概念,是在多道程序的环境下,存在着不同的制约 关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而防止进 程之间的冲突,引入了进程同步。进程互斥是间接制约关系。当一个进程进入临界区使用临界资源时,另 一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才 会解除阻塞状态。3 .使用信号量和互斥量解决问题:通过设置一个表示资源个数的信号量S,通过对信号量S的P和V操作 来实现进程的的互斥。通过设置一个表示资源个数的信号

34、量S,通过对信号量S的P和V操作 来实现进程的的互斥。P和V操作分别来自荷兰语Passercn和Vrijgcvcn,分别表示占有和释 放。P V操作是操作系统的原语,意味着具有原子性。P操作首先减少信号量,表示有一个进程将占用或等待资源,然后检测S 是否小于0,如果小于0那么阻塞,如果大于0那么占有资源进行执行。V操作是和P操作相反的操作,首先增加信号量,表示占用或等待资源 的进程减少了 1个。然后检测S是否小于0,如果小于0那么唤醒等待使用S 资源的其它进程。三、环境配置1 .安装 ubuntu(1) 下载系统镜像,ubuntu-16. 04. l-desktop-amd64. iso(2)

35、 制作启动U盘,使用Ultraiso软件将系统镜像写入U盘(3) 开机进入BIOS界面,从U盘启动。(4) 对磁盘分区,等待安装结束。(5) 设置root密码,sudo passwd root命令后输入两遍密码。2 .熟悉ubuntu的使用4/21常用命令:(1) SU命令,切换用户(2) pwd命令,打印当前工作目录的绝对路径(3) 1s命令,打印当前目录下的文件(4) cd命令,切换工作目录(5) mv命令,移动文件或目录(6) rm命令,删除文件或目录(7) shutdown命令,关闭计算机(8) reboot命令,重启电脑(9) tar命令,解压命令3 .安装vim编辑器在终端下运行a

36、pt-get install - y vim即可。安装结束后,输入vim命令,显示如下列图就说明安装成功:VIM - Vi IMprovedversion 7.4.160 by Bram Hoolcnndr et Al Modified by bugzillaG- idhat.cu,4 is opn source and freely distributableHelp poor children 1n Uganda Itype:help1ccfforInformationtype:qto exittype:helpEnter orforon-linehelptype:helpversion/

37、 nrrforversionnnfoe,e-i ahFigure 1安装vim后输入vim显示的结果4 .源码安装 python3. 5. 2因为linux内置的python的版本为2. 7. 5,所以为了程序设计的方便,使 用3. 5. 2版本的。终端下输入python即可进入python交互模式。5/21安装前:void0Void-pc:pythonPython 2.7.12 (default, Nov 19 2016, 06:48:10)GCC 5.4.0 20160609 on Xinux2Type help, copyright, credits or license for mor

38、e information. exit()voldvotd-pc:-$ |jFigure 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的软链接文件安装结果:votdvotd-pc:-$ python3Python 3.5.2 (default, Dec 24 2016, 11:36

39、:59)GCC 5.4.0 20160609 on linuxType help, copyright, credits or license for more information. exit()votdvolci-pc:$ ,Figure 3 python3 安装结果设计思路1 .题目分析:father、mather、son、daughter 是四个线程或进程。盘子plate是它们共享的变量,对盘子的操作要互斥。Father 和 daughter 要对 apple 同步。Mother 和 son 要对 orange 同步。2 .伪代码:father:while(True):p(cmpty

40、)6.21p( mutex) put apple v(mutex) v(apple)mother:while(True):p(empty) p( mutex) put orange v(mutex) v(orange)son:whilc(Truc):p(orange) p(mutex) get orange v(mutex) v(empty)daughter:whiie(True):p(apple)p( mutex) get apple v(mutex) v(empty)7/21五、代码实现1.线程实现(1)原理threading, py模块提供了对线程的操作。创立线程 threading.

41、Thread (target, args), target 是要运行的函 数,args是函数所需的参数。创立信号量threading. Semaphore (value), value是信号量的初始值。 acquire0信号量T,当为0时,阻塞当前线程。release()信号量 + 1,大于0,唤醒等待此信号量的一个线程。创立互斥锁,threading. LockO, acquire0 加锁,release。解锁。(2)变量定义list类型的apples_basket存放所有的苹果定义list类型的oranges_basket存放所有的橘子定义list类型的plate当做水果盘,可以放入苹果和

42、橘子定义方法father,用于将苹果放入水果盘,也就是把apples_basket 的一个苹果,放入plate列表中。并打印相关信息。定义方法mather,用于将苹果放入水果盘,也就是把oranges_basket 的一个橘子,放入plate列表中。并打印相关信息。定义方法son,用于从水果盘取出一个橘子,也就是把plate的一个 橘子,拿出来,并打印相关信息。定义方法daughter,用于从水果盘取出一个苹果,也就是把plate的 一个苹果,拿出来,并打印相关信息。(3)代码import randomimport threadingimport timeempty = threading.S

43、cmaphorc(5) # 盘子的容量apple = thrcading.Scmaphorc(O) # 同步苹果的信号量 orange = threading.Semaphore(O) # 同步橘子的信号量mutex = threading.Event() #表示四个进程互斥的访问盘子8.21plate = Iist() #模拟水果盘lock = threading.Lock() # plate 互斥锁mutex.set() # 设置为 Truedef father(basket):global empty, mutex, lock, applewhile len(basket) != 0:

44、#当苹果篮子中没有苹果,那么终止# 1 .p(cmpty)empty.acquire() # 将容量 empty 减去 1# 2.p(mutex)niutex.clear() # mutex设置为False其它线程将等待# 3.put appleif lock.acquire():temp = basket.popOplatc.appcnd(tcmp) #从苹果篮子里拿出一个苹果放入水果盘print(-father put an apple(0) into plate.fonnat(temp) print( current plate = plate)lock.release()# 4.v(m

45、utex)mutex.set() # mulex设置为True,其它线程可以使用# 5.v(apple)apple.release()time.slecp(random.randomO)def mother( basket):global empty, mulex, lock, orangewhile len(basket) != 0: #当橘子篮子中没有橘子,那么终止# 1 .p(empty)empty.acquireO # 将容量 empty 减去 1# 2.p(mutcx)mutcx.clcar() # mutex设置为False其它线程将等待# 3.put(orange)if lock.acquire():temp = basket.popOplate.append(temp)9.21

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁