版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、江塚大吟學(xué)與通信工程學(xué)院操作系統(tǒng)課程設(shè)計(jì)報(bào)告題目:linux系統(tǒng)下實(shí)現(xiàn)PV操作班級(jí)軟件工程1401姓名學(xué)號(hào): 指導(dǎo)老師:2016年12月27日1 / 19目錄11 / 19、 實(shí)驗(yàn)題目、 實(shí)驗(yàn)?zāi)康暮鸵?三、 環(huán)境配置四、設(shè)計(jì)思路五、代碼實(shí)現(xiàn)六、總結(jié)17實(shí)驗(yàn)題目1.Linux 系統(tǒng)簡單使用認(rèn)識(shí) Linux ubuntu 安裝終端的簡單使用4)python3.5.2 源碼安裝2.多線程和多進(jìn)程同步方法解決水果分配問題:水果分配的問題:桌上有一只盤子,每次只能放入 5 只水果。爸爸專放蘋果, 媽媽專放橘子,一個(gè)兒子專等吃盤子中的橘子,一個(gè)女兒專等吃盤子中的蘋果.用P, V操作實(shí)現(xiàn)爸爸、媽媽、兒子、
2、女兒進(jìn)程的同步控制。補(bǔ)充 :設(shè)有兩個(gè)籃子,分別有若干個(gè)蘋果或橘子,爸爸和媽媽將每次從水果籃子中拿出一個(gè)水果放入水果盤中, 兒子女兒則挑選各自喜歡 的水果。1)2)分析問題,寫出偽代碼線程實(shí)現(xiàn)進(jìn)程實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康暮鸵?. 認(rèn)識(shí)和學(xué)會(huì)使用 linux 系統(tǒng):Linux是一種可以在PC機(jī)上執(zhí)行的類似UNIX的操作系統(tǒng),是一個(gè)完全免費(fèi)的操作系統(tǒng)。1991年,芬蘭學(xué)生Linus Torvalds開發(fā)了這個(gè)操作系統(tǒng)的核心部分,因?yàn)槭?Linus 改良的 minix 系統(tǒng),故稱之為 Linux.2. 理解線程和進(jìn)程的互斥和同步原理:同步是操作系統(tǒng)級(jí)別的概念 ,是在多道程序的環(huán)境下, 存在著不同的制約關(guān)系,為了
3、協(xié)調(diào)這種互相制約的關(guān)系,實(shí)現(xiàn)資源共享和進(jìn)程協(xié)作,從而避免 進(jìn)程之間的沖突,引入了進(jìn)程同步。進(jìn)程互斥是間接制約關(guān)系。當(dāng)一個(gè)進(jìn)程進(jìn)入臨界區(qū)使用臨界資源時(shí),另一個(gè)進(jìn)程必須等待。只有當(dāng)使用臨界資源的進(jìn)程退出臨界區(qū)后,這個(gè)進(jìn)程才 會(huì)解除阻塞狀態(tài)。3. 使用信號(hào)量和互斥量解決問題:通過設(shè)置一個(gè)表示資源個(gè)數(shù)的信號(hào)量S,通過對(duì)信號(hào)量S的P和V操作來實(shí)現(xiàn)進(jìn)程的的互斥。通過設(shè)置一個(gè)表示資源個(gè)數(shù)的信號(hào)量S,通過對(duì)信號(hào)量S的P和V操作來實(shí)現(xiàn)進(jìn)程的的互斥。P和V操作分別來自荷蘭語Passeren和Vrijgeven ,分別表示占有和釋 放。 P V 操作是操作系統(tǒng)的原語,意味著具有原子性。P 操作首先減少信號(hào)量,表示有
4、一個(gè)進(jìn)程將占用或等待資源,然后檢測(cè)S是否小于0,如果小于0則阻塞,如果大于0則占有資源進(jìn)行執(zhí)行。V操作是和P操作相反的操作,首先增加信號(hào)量,表示占用或等待資源的進(jìn)程減少了 1個(gè)。然后檢測(cè)S是否小于0,如果小于0則喚醒等待使用S 資源的其它進(jìn)程。環(huán)境配置1. 安裝ubuntu1)下載系統(tǒng)鏡像, ubuntu-16.04.1-desktop-amd64.iso制作啟動(dòng)U盤,使用Ultraiso軟件將系統(tǒng)鏡像寫入U(xiǎn)盤 開機(jī)進(jìn)入BIOS界面,從U盤啟動(dòng)。對(duì)磁盤分區(qū),等待安裝結(jié)束。設(shè)置 root 密碼, sudo passwd root 命令后輸入兩遍密碼。2. 熟悉 ubuntu 的使用常用命令:(1
5、)su命令,切換用戶pwd命令,打印當(dāng)前工作目錄的絕對(duì)路徑(6)(7)(8)(9)Is命令,cd命令,mv命令,rm命令,打印當(dāng)前目錄下的文件切換工作目錄移動(dòng)文件或目錄刪除文件或目錄shutdown命令,關(guān)閉計(jì)算機(jī)reboot命令,重啟電腦tar命令,解壓命令3.安裝vim編輯器在終端下運(yùn)行ap t-get in stall-y vim即可。安裝結(jié)束后,輸入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 安裝結(jié)果四、1.題目分析:father、mather、son、daughter 是四個(gè)線程或進(jìn)程。盤子plate是它們共享的變量,對(duì)盤子的操作要互斥。Father 和 daughter 要對(duì) apple 同步。Mother 和 son 要對(duì) 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)五、代碼實(shí)現(xiàn)1. 線程實(shí)現(xiàn)(1)原理threading.py 模塊提供了對(duì)線程的操作。創(chuàng)建線程 threading.Thread(target, args),target 數(shù), args 是函數(shù)所需的參數(shù)。是要運(yùn)行的函2)創(chuàng)建信號(hào)量 threading.Semaphore(value), value acquire() 信號(hào)量 -1
8、,當(dāng)為 0 時(shí),阻塞當(dāng)前線程。+1,大于 0,喚醒等待此信號(hào)量的一個(gè)線程。創(chuàng)建互斥鎖, threading.Lock(), acquire() 變量 定義 list類型的是信號(hào)量的初始值。release() 信號(hào)量加鎖, release() 解鎖。定義 list類型的apples_basket 存放所有的蘋果 oranges_basket 存放所有的橘子定義 list定義方法plate 當(dāng)做水果盤,可以放入蘋果和橘子 father , 用于將蘋果放入水果盤,也就是把類型的apples_basket的一個(gè)蘋果,放入 plate 列表中。并打印相關(guān)信息。oranges_basketplate 的一
9、個(gè)定義方法 mather , 用于將蘋果放入水果盤, 也就是把 的一個(gè)橘子,放入 plate 列表中。并打印相關(guān)信息。定義方法 son , 用于從水果盤取出一個(gè)橘子,也就是把 橘子,拿出來,并打印相關(guān)信息。定義方法 daughter , 用于從水果盤取出一個(gè)蘋果,也就是把 plate 的 一個(gè)蘋果,拿出來,并打印相關(guān)信息。代碼import randomimport threadingimport timeempty = threading.Semaphore(5) # 盤子的容量apple = threading.Semaphore(0) # 同步蘋果的信號(hào)量 orange = threadi
10、ng.Semaphore(0) # 同步橘子的信號(hào)量mutex = threading.Event() # 表示四個(gè) 進(jìn)程互斥的 訪問盤 子plate = list() # 模擬 水果 盤lock = threadi ng丄ock() # p late 互斥 鎖mutex.set() # 設(shè)置為 Truedef father(basket):global empty, mutex, lock, applewhile len(basket) != 0: # 當(dāng)蘋果 籃子中沒有蘋果, 則終止# 1.p(empty)empty.acquire() # 將容量 empty 減去 1# 2.p(mute
11、x) mutex.clearO # mutex設(shè)置為False其它線程將等待 # 3.put appleif lock.acquire():temp = basket.pop() plate.append(temp) # 從蘋果 籃子里拿出一個(gè)蘋果放入水果 盤print(-father put an apple(0) into plate.format(temp) print( current plate = , plate)lock.release()# 4.v(mutex)mutex.set() # mutex設(shè)置為True, 其它線程可以使用# 5.v(apple) apple.rele
12、ase() time.sleep(random.random() def mother(basket): global empty, mutex, lock, orangewhile len(basket) != 0: # 當(dāng)橘子 籃子中沒有橘子, 則終止# 1.p(empty)empty.acquireO # 將容量 empty 減去 1# 2.p(mutex) mutex.clearO # mutex設(shè)置為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 設(shè)置 為 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 設(shè)置 為 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 設(shè)置 為 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 設(shè)置 為 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 設(shè)置 為 True, 其它 線程可以使用# 5.v(empty)empty.release() # 將 empty + 1 time.sleep(ran
17、dom.random()if _name_ = _main_:# 初始化蘋果和橘子的個(gè)數(shù)apples_basket = Apple-A, Apple-B, Apple-C, Apple-D #模擬蘋果籃子,一共有 4 個(gè)蘋果要放入水果 盤oranges_basket = Orange-A, Orange-B, Orange-C # 模擬橘子籃子,一共有 3 個(gè)橘子要放入水果 盤# 創(chuàng)建 4 個(gè)線程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 線程# 啟動(dòng)線 程daughter.start() son.start() father.
19、start()mother.startO(4)結(jié)果 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線程實(shí)現(xiàn)結(jié)果2.進(jìn)程實(shí)現(xiàn)(1) 原理multi processi ng. py模塊提供了對(duì)線程的操作。倉 J建線程 mult ip rocess ing.P rocess(target, args),target是要運(yùn)行的函數(shù),args是函數(shù)所需的參數(shù)。倉 J建信號(hào)量 mult ip rocessi ng.Sema phore(value),
23、value是信號(hào)量的初始值。acquire() 信號(hào)量-1,當(dāng)為0時(shí),阻塞當(dāng)前線程。release()信號(hào)量+1,大于0,喚醒等待此信號(hào)量的一個(gè)線程。創(chuàng)建互斥鎖,mult ip rocess in g.Lock(),acquire()力卩鎖,release()解鎖。12 / 19變量定義 list類型的定義 list類型的定義 list類型的定義方法father ,apples_basket 存放所有的蘋果oranges_basket 存放所有的橘子plate 當(dāng)做水果盤,可以放入蘋果和橘子用于將蘋果放入水果盤,也就是把a(bǔ)pples_basket的一個(gè)蘋果,放入 plate 列表中。并打印相關(guān)
24、信息。 定義方法 mather , 用于將蘋果放入水果盤, 也就是把oranges_basket的一個(gè)橘子,放入 plate 列表中。并打印相關(guān)信息。定義方法 son , 用于從水果盤取出一個(gè)橘子,也就是把 橘子,拿出來,并打印相關(guān)信息。plate 的一個(gè)定義方法 daughter , 用于從水果盤取出一個(gè)蘋果,也就是把 plate 的 一個(gè)蘋果,拿出來,并打印相關(guān)信息。3) 代碼import randomimport multiprocessingimport timeempty = multiprocessing.Semaphore(5) # 盤 子的容量 apple = multipro
25、cessing.Semaphore(0) # 同步蘋果的信號(hào)量 orange = multiprocessing.Semaphore(0) # 同步橘子的信號(hào)量mutex = multiprocessing.Event() # 表示四個(gè) 進(jìn)程互斥的 訪問盤 子manager = multiprocessing.Manager()plate = manager.list() # 模擬水果 盤lock = multiprocessing.Lock() # plate 互斥鎖mutex.set() # 設(shè) 置為 Truedef father(basket):global empty, mutex,
26、lock, applewhile len(basket) != 0: # 當(dāng)蘋果籃子中沒有蘋果, 則終止# 1.p(empty)empty.acquire() # 將容量 empty 減去 1# 2.p(mutex)mutex.clear() # mutex 設(shè)置 為 False 其它 線 程將等待18 / 19# 3.put appleif lock.acquire():temp = basket.pop() plate.append(temp) # 從蘋果 籃 子里拿出一個(gè)蘋果放入水果 盤print(-father put an apple(0) into plate.format(tem
27、p) print( current plate = , plate)lock.release()# 4.v(mutex) mutex.set() # mutex 設(shè)置 為 True, 其它 線程可以使用# 5.v(apple)apple.release() time.sleep(random.random() def mother(basket):global empty, mutex, lock, orange while len(basket) != 0: # 當(dāng)橘子 籃子中沒有橘子, 則終 止# 1.p(empty)empty.acquire() # 將容量 empty 減去 1# 2.
28、p(mutex) mutex.clear() # mutex 設(shè)置 為 False 其它 進(jìn) 程將等待# 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 設(shè)置 為 True, 其它 進(jìn)程可以使用# 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 設(shè)置 為 False 其它 進(jìn) 程將等待# 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 設(shè)置 為 True, 其它 進(jìn)程可以使用# 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 設(shè)置 為 False 其它 進(jìn) 程將等待# 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 設(shè)置 為 True, 其它 進(jìn)程可以使用# 5.v(empty)empty.release() # 將 empty + 1time.sleep(random.random()if _name_ = _main_:# 初始化蘋果和橘子的個(gè)數(shù) apples_basket = Apple-A, Apple-B, Apple-C, Apple-D #模擬蘋果籃子,一共有 4 個(gè)蘋果要放入水果 盤oranges_basket = Orange-A, Orange-B, Orange-C # 模
33、擬橘子籃子,一共有 3 個(gè)橘子要放入水果 盤# 創(chuàng)建 4 個(gè)進(jìn)程father = multiprocessing.Process(name=Father, target=father,args=(apples_basket, ) # father 進(jìn)程mother = multiprocessing.Process(name=Mother, target=mother,args=(oranges_basket, ) # mother 進(jìn) 程son = multiprocessing.Process(name=Son, target=son,args=(len(oranges_basket),
34、) # son 進(jìn)程daughter = multiprocessing.Process(name=Daughter,target=daughter, args=(len(apples_basket), ) # daughter 進(jìn)程# 啟動(dòng)進(jìn) 程daughter.start() son.start() father.start() mother.start() daughter.join() son.join() father.join() mother.join() print(End !)4) 結(jié)果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時(shí)_女鞏腫$Figure 5進(jìn)程實(shí)現(xiàn)結(jié)果Pythoni main-process.py六、總結(jié)因?yàn)橹熬驮谀秸n網(wǎng)上看過linux使用的教程,學(xué)過centos7字符界面的使用。在課程設(shè)計(jì)前就裝好了 winlO + Ubuntu 16.04 LTS雙系統(tǒng)。所以在熟悉linux使用上并沒有花時(shí)間。初期使用linux最大的麻煩就是安裝軟件。安裝方式有源碼安裝和二進(jìn)制包安裝。使用熟
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 皮膚黑色素瘤的臨床護(hù)理
- 《數(shù)字證書及公鑰》課件
- 化膿性鼻竇炎的健康宣教
- 天皰瘡的臨床護(hù)理
- 《單片機(jī)原理及應(yīng)用 》課件-第8章
- 《Java程序設(shè)計(jì)及移動(dòng)APP開發(fā)》課件-第07章
- 手癬的臨床護(hù)理
- 變應(yīng)性接觸性皮炎的臨床護(hù)理
- 《齒輪西農(nóng)版》課件
- JJF(陜) 050-2021 光電式皮帶張力計(jì)校準(zhǔn)規(guī)范
- 芯片散熱市場(chǎng)分析報(bào)告
- 城市公園環(huán)境設(shè)計(jì)前期調(diào)研與分析
- 重大隱患判定標(biāo)準(zhǔn)培訓(xùn)課件
- 力帆汽車ERP項(xiàng)目實(shí)施建議-德勤-SAP-v1.1
- 2024年陜西中陜核工業(yè)集團(tuán)招聘筆試參考題庫含答案解析
- 眼視光學(xué)專業(yè)大學(xué)生職業(yè)生涯規(guī)劃書
- 30題供應(yīng)鏈管理經(jīng)理崗位常見面試問題含HR問題考察點(diǎn)及參考回答
- 無人機(jī)路徑規(guī)劃與優(yōu)化
- 酒駕后雙方賠償收據(jù)范本
- 受性侵犯的女生的心理輔導(dǎo)方案
- (施工單位)投標(biāo)人承擔(dān)項(xiàng)目優(yōu)勢(shì)
評(píng)論
0/150
提交評(píng)論