ImageVerifierCode 换一换
格式:DOC , 页数:21 ,大小:383.98KB ,
资源ID:2228449      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/2228449.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(操作系统linux系统下实现pv操作.doc)为本站上传会员【a199****6536】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

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

1、计算机科学与通信工程学院操作系统课程设计报告题目: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操作实现

2、爸爸、妈妈、儿子、女儿进程的同步控制。补充:设有两个篮子,分别有若干个苹果或橘子,爸爸和妈妈将每次从水果篮子中拿出一个水果放入水果盘中,儿子女儿则挑选各自喜欢的水果。(1) 分析问题,写出伪代码(2) 线程实现(3) 进程实现二、 实验目的和要求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. 安装ubuntu(1) 下载系统镜像,ubuntu-16.04.1-desktop-amd64.iso(2) 制作启动U盘,使用Ultraiso软件将系统镜像写入U盘(3) 开机进入BIOS界面,从U盘启动。(4) 对磁盘分区,等待安装结束。(5) 设置root密码,sudo passwd root 命令后输入两遍密码。2. 熟悉u

5、buntu的使用常用命令:(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

6、.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、so

7、n、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)daught

8、er: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(),

9、acquire() 加锁,release()解锁。(2) 变量定义list类型的 apples_basket 存放所有的苹果定义list类型的 oranges_basket 存放所有的橘子定义list类型的plate当做水果盘,可以放入苹果和橘子定义方法father ,用于将苹果放入水果盘,也就是把apples_basket的一个苹果,放入plate列表中。并打印相关信息。定义方法mather ,用于将苹果放入水果盘,也就是把oranges_basket的一个橘子,放入plate列表中。并打印相关信息。定义方法son ,用于从水果盘取出一个橘子,也就是把plate的一个橘子,拿出来,并打印相关

10、信息。定义方法daughter ,用于从水果盘取出一个苹果,也就是把plate的一个苹果,拿出来,并打印相关信息。(3) 代码import randomimport threadingimport timeempty = threading.Semaphore(5) # 盘子的容量apple = threading.Semaphore(0) # 同步苹果的信号量orange = threading.Semaphore(0) # 同步橘子的信号量mutex = threading.Event() # 表示四个进程互斥的访问盘子plate = list() # 模拟水果盘lock = thread

11、ing.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

12、) # 从苹果篮子里拿出一个苹果放入水果盘 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)

13、!= 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(m

14、utex) 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():

15、 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.r

16、andom()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

17、(-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-

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

19、read(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模块提供了对线程的操作。创建线程

20、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 存放所

21、有的橘子定义list类型的plate当做水果盘,可以放入苹果和橘子定义方法father ,用于将苹果放入水果盘,也就是把apples_basket的一个苹果,放入plate列表中。并打印相关信息。定义方法mather ,用于将苹果放入水果盘,也就是把oranges_basket的一个橘子,放入plate列表中。并打印相关信息。定义方法son ,用于从水果盘取出一个橘子,也就是把plate的一个橘子,拿出来,并打印相关信息。定义方法daughter ,用于从水果盘取出一个苹果,也就是把plate的一个苹果,拿出来,并打印相关信息。(3) 代码import randomimport multipr

22、ocessingimport timeempty = multiprocessing.Semaphore(5) # 盘子的容量apple = multiprocessing.Semaphore(0) # 同步苹果的信号量orange = multiprocessing.Semaphore(0) # 同步橘子的信号量mutex = multiprocessing.Event() # 表示四个进程互斥的访问盘子manager = multiprocessing.Manager()plate = manager.list() # 模拟水果盘lock = multiprocessing.Lock()

23、# 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) # 从苹果篮子里拿

24、出一个苹果放入水果盘 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: # 当橘子

25、篮子中没有橘子,则终止 # 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

26、.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

27、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

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

29、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 # 模拟苹果篮子,

30、一共有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 = multiproc

31、essing.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.jo

32、in()print(End !)(4) 结果 Figure 5进程实现结果六、 总结因为之前就在慕课网上看过linux使用的教程,学过centos7字符界面的使用。在课程设计前就装好了win10 + Ubuntu 16.04 LTS双系统。所以在熟悉linux使用上并没有花时间。初期使用linux最大的麻烦就是安装软件。安装方式有源码安装和二进制包安装。使用熟练后装软件的速度还是比windows上慢。不过各有优缺点。因为软件开发在linux上比较方便,就逐渐从windows平台转移到linux上了。Ubuntu这个发行版本的图形界面做的还是比较美观的。使用linux的过程中让我对多用户操作系统

33、更加了解,虽然windows系统也是多用户操作系统,但是平常使用的时候都是超级管理员身份,所以感触不深。Linux对文件权限管理十分严格,只有相应的用户身份才能获得使用这个文件的特定权限。使用python的原因是python的语法简洁、优雅。没有c和c+的指针,实现比较方便。Java的代码太过繁琐,不适合快速实现想法。Python的中文文档相对较少,有些模块是对c的封装,看不见源码。所以在学习threading.py 和multiprocessing.py 的时候百度的东西十分琐碎,影响了开发速度。本次实验后,对线程和进程也有了更深更具体的体会。进程是具有一定独立功能的程序关于某个数据集合上的

34、一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。具体区别如下:地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信需要进程同步和互斥手段的辅助,以保证数据的一致性。调度和切换:线程上下文切换比进程上下文切换要快得多。Python

35、对线程的支持不如java等语言好。因为Python多线程下,每个线程的执行方式:1.取GIL2.执行代码直到sleep或者是python虚拟机将其挂起。3.释放GIL可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高。但是并不意味着python的多线程就没有用了,在执行密

36、集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,所以python的多线程对IO密集型代码比较友好。在多核CPU下,用多进程效率高,在单核CPU下,使用多线程效率高。此次课程设计收获最大的还是学会了,怎么用信号量控制线程和多个进程之间的同步和互斥。目 录第1章总 论31.1.项目背景与概况31.2.主要技术经济指标71.3.问题与建议8第2章项目投资环境与市场研究92.1.投资环境分析92.2.区域房地产市场分析112.3.销售预测152.4.营销策略19第3章建设规模与项目开发条件213.1.建设规模213.2.项目概况现状21

37、3.3.项目建设条件22第4章建筑方案264.1.设计依据264.2.项目设计主题和开发理念264.3.项目总体规划方案274.4.建筑设计284.5.结构设计294.6.给排水设计30第5章节能节水措施325.1.设计依据325.2.建筑部分节能设计32第6章环境影响评价336.1.编制依据336.2.环境现状336.3.项目建设对环境的影响346.4.环境保护措施34第7章劳动卫生与消防357.1.指导思想357.2.职业安全卫生健康对策与措施357.3.消防设计36第8章组织机构与人力资源配置388.1.组织机构388.2.人力资源配置38第9章项目实施进度399.1.项目开发期399.

38、2.项目实施进度安排399.3.项目实施过程控制措施39第10章项目招投标4110.1.工程项目招标投标概述4110.2.工程项目招标投标因素分析4210.3.招标依据4410.4.招标范围4410.5.招标方式44第11章投资估算与资金筹措4511.1.投资估算4511.2.资金筹措45第12章财务评价4712.1.项目评估依据4712.2.财务评价基础数据的选择4712.3.财务评价4712.4.不确定性分析48第13章社会评价4913.1.项目对社会的影响分析4913.2.风险分析5013.3.社会评价结论51第14章研究结论与建议5214.1.可行性研究结论5214.2.建议52 21 / 21

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服