Linux進(jìn)程同步設(shè)計(jì)報(bào)告_第1頁
Linux進(jìn)程同步設(shè)計(jì)報(bào)告_第2頁
Linux進(jìn)程同步設(shè)計(jì)報(bào)告_第3頁
Linux進(jìn)程同步設(shè)計(jì)報(bào)告_第4頁
Linux進(jìn)程同步設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、精選文庫 課程設(shè)計(jì) (操作系統(tǒng)) 目: Linux進(jìn)程同步 級: 計(jì)算機(jī)科學(xué)與技術(shù) 名: 指導(dǎo)教師: 系主任: 2017年03月02日 2 4 .7 8 10 1題目分析 2數(shù)據(jù)結(jié)構(gòu). 3流程圖 4實(shí)現(xiàn)技術(shù) 5設(shè)計(jì)結(jié)論和心得 1題目分析 編寫讀者一寫者同步程序,要求: (1) 在Linux下用C語言編程,利用信號量實(shí)現(xiàn)進(jìn)程同步; 讀寫要求隨機(jī)產(chǎn)生,如按鍵盤輸入 R或W,動態(tài)顯示當(dāng)前狀態(tài),有多少個(gè)讀 者、寫者在等待訪問;每個(gè)讀者寫者的時(shí)間可預(yù)先設(shè)定; 讀者寫者共享一個(gè)數(shù)據(jù)區(qū),用數(shù)組表示,如可初始化為 1、2、3、4、5、6、 7、8、9、10、;寫者隨即對其修改。 Linux環(huán)境下相關(guān)技術(shù): 線

2、程定義:Pthread.h 信號量:sem.h 讀寫鎖與互斥量相似,不過讀寫鎖允許更高的并行性?;コ饬恳词擎i住狀態(tài),要不 是不加鎖狀態(tài),而且一次只有一個(gè)線程可以對其進(jìn)行加鎖。 讀寫鎖實(shí)際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者 自旋鎖而 只對共享資源進(jìn)行讀訪問,寫者則需要對共享資源進(jìn)行寫操作。這種鎖相對于 言,能提高并發(fā)性,因?yàn)樵诙嗵幚砥飨到y(tǒng) 中,它允許同時(shí)有多個(gè)讀者來訪問共享資源,最 大可能的讀者數(shù)為實(shí)際的邏輯CPL數(shù)。寫者是排他性的,一個(gè)讀寫鎖同時(shí)只能有一個(gè)寫者 或多個(gè)讀者(與CPI數(shù)相關(guān)),但不能同時(shí)既有讀者又有寫者。 讀寫鎖有三種狀態(tài):讀模式加鎖,寫模式加鎖,

3、不加鎖。 1.當(dāng)讀寫鎖是寫加鎖時(shí),在這個(gè)鎖被解索之前所有企圖對它加鎖的線程都將要阻塞。 2.當(dāng)讀寫鎖是讀加鎖時(shí),在這個(gè)鎖被解索之前所有企圖以讀模式對它加鎖的線程都可 以獲得訪問權(quán);以寫模式加鎖的線程將堵塞,并且堵塞隨后的讀模式加鎖。這樣可以避免 讀模式鎖長期占用,導(dǎo)致等待的寫模式鎖請求一直得不到滿足。 信號量的使用主要是用來保護(hù)共享資源,使得資源在一個(gè)時(shí)刻只有一個(gè)進(jìn)程(線 程)所擁有。 信號量的值為正的時(shí)候,說明它空閑。所測試的線程可以鎖定而使用它。若為0, 說明它被占用,測試的線程要進(jìn)入睡眠隊(duì)列中,等待被喚醒。 內(nèi)核信號量類似于自旋鎖,因?yàn)楫?dāng)鎖關(guān)閉著時(shí),它不允許內(nèi)核控制路徑繼續(xù)進(jìn)行。 然而,

4、當(dāng)內(nèi)核控制路徑試圖獲取內(nèi)核信號量鎖保護(hù)的忙資源時(shí),相應(yīng)的進(jìn)程就被掛起。只 有在資源被釋放時(shí),進(jìn)程才再次變?yōu)榭蛇\(yùn)行。 只有可以睡眠的函數(shù)才能獲取內(nèi)核信號量;中斷處理程序和可延遲函數(shù)都不能使用 內(nèi)核信號量。 內(nèi)核信號量是struct semaphore 類型的對象,它在vasm/semaphore.h定義: struct sema phore atomiCt count; int slee pers; wait_queue_head_t wait; count :相當(dāng)于信號量的值,大于0, 資源空閑;等于0,資源忙,但沒有進(jìn)程等待這 個(gè)保護(hù)的資源;小于0,資源不可用, 并至少有一個(gè)進(jìn)程等待資源。

5、wait :存放等待隊(duì)列鏈表的地址,當(dāng)前等待資源的所有睡眠進(jìn)程都會放在這個(gè)鏈表中。 sleepers :存放一個(gè)標(biāo)志,表示是否有一些進(jìn)程在信號量上睡眠。 通過對讀寫鎖以及信號量的理解,以及對題目的分析,我們需要用信號量來實(shí)現(xiàn)進(jìn)程 間的同步,通過讀寫鎖來訪問臨界資源。 2數(shù)據(jù)結(jié)構(gòu) 讀者一一寫者問題中涉及的數(shù)據(jù)結(jié)構(gòu)包括讀者、寫者共用的緩沖區(qū),讀寫鎖,以及同 步需要的信號量集。 主要應(yīng)用頭文件以及主要變量定義和初始化如下: #in cludevsema phore.h #i nclude vp thread.h sem_t my_sem; int a10=1,2,3,4,5,6,7,8,9,10;

6、pthread_rwlock_t rwlock; sem_in it( p thread_rwlock_i nit( 讀線程的工作如下: void * p thread_read(void *arg) int id; while(flag) if(sem_wait( /prin tf(lm %d readn,(i nt)arg); sran d(time(0); id=ra nd()%10; prin tf(Im %d readthread! Im readi ng the %d shu: %dn,(i nt)arg,id,aid); slee p(3); if(flag2) coun t_r

7、ead+; pthread_rwlock_ un lock( sem _po st( slee p(2); prin tf(Im the %d read_thread,exit!n,(i nt)arg); pthread_exit(void *)1); 寫線程的工作如下: void *p thread_write(void *arg) int id; int num; while(flag) if(sem_wait( sran d(time(O); id=ra nd()%10; num = ran d()%20; aid=num; prin tf( Im %d writethread!lm w

8、rit ing the %d shu:%dn,(i nt)arg,id ,nu m); slee p(3); if(flag2) coun t_write+; pthread_rwlock_ un lock( sem _po st( slee p(1); prin tf(Im the %d write_thread. exit!n, (in t)arg); pthread_exit(void *)1); 3流程圖 讀、寫線程流程圖如下圖所示。 4實(shí)現(xiàn)技術(shù) 為了實(shí)現(xiàn)上述設(shè)計(jì),使用Linux系統(tǒng)環(huán)境,采用C語言。具體采用的技術(shù)如下: (1) 通過Linux內(nèi)核信號量機(jī)制實(shí)現(xiàn)進(jìn)程同步。 通過讀寫鎖來

9、訪問臨界資源。 采用模擬隨機(jī)數(shù)的方法隨機(jī)訪問緩沖區(qū)內(nèi)的資源。 實(shí)現(xiàn)步驟如下: (1) 定義信號量集,定義讀寫鎖,并將其初始化。 根據(jù)輸入的讀寫線程的數(shù)量分別創(chuàng)建線程。 在讀寫線程中分別構(gòu)造相應(yīng)代碼,通過wait信號量實(shí)現(xiàn)進(jìn)程同步。 對臨界區(qū)加上讀寫鎖,防止數(shù)據(jù)出現(xiàn)紊亂。 運(yùn)行結(jié)果如下: please input read_num 5 3 Im Im Im Im Im Im Im Im Im and write num 0 1 2 3 4 7 2 1 0 readthread! Im readthread! Im readthread! Im readth read! Im readthread

10、! Im writethread!Im readthread! Im readthread! Im readthread! Im reading reading reading reading reading writing reading reading reading the the the the the the the the the 1 1 1 2 2 7 6 6 7 shu Shu shu shu shu shu shu shu shu 2 2 2 3 3 16 7 7 15 w Im 1 There I*m G r Im 7 There readthread! Im readin

11、g are 3 writer waiting readthread! Im reading the the shu; 1 shu; 9 writethread!*m writing are 4 reader waiting the shu:11 q Im Im Im I*m Im Im Im Im I*m Im Im Im I*m the 2 read_thread|exit! 0 readthread! IF reading the the 5 write_thread. exit! 1 readtbread! Im reading the Q read_thread,Gxit! 3 rea

12、dthread! Im reading the 1 read_thread,exit! 4 readthread! Im reading the 3 read_thread,exit! 6 writethreadJIm writing the 4 read thread,exit! 7 writethread!m writing the the the the the the 6 writethread, exit! the 7 write thread, exit! Shu: 11 shu; 4 shu: 5 shu: 17 Shu: 7 shu:15 5設(shè)計(jì)結(jié)論和心得 通過課程設(shè)計(jì)得到如下

13、結(jié)論: (1)如果讀寫鎖當(dāng)前沒有讀者,也沒有寫者,那么寫者可以立刻獲得讀寫鎖,否則 它必須自旋在那里,直到?jīng)]有任何寫者或讀者。如果讀寫鎖沒有寫者,那么讀者可以立即 獲得該讀寫鎖,否則讀者必須自旋在那里,直到寫者釋放該讀寫鎖。一次只有一個(gè)線程可 以占有寫模式的讀寫鎖,但是可以有多個(gè)線程同時(shí)占有讀模式的讀寫鎖.正是因?yàn)檫@個(gè)特 性,當(dāng)讀寫鎖是寫加鎖狀態(tài)時(shí),在這個(gè)鎖被解鎖之前,所有試圖對這個(gè)鎖加鎖的線程都會 被阻塞.當(dāng)讀寫鎖在讀加鎖狀態(tài)時(shí),所有試圖以讀模式對它進(jìn)行加鎖的線程都可以得到訪 問權(quán),但是如果線程希望以寫模式對此鎖進(jìn)行加鎖,它必須直到所有的線程釋放鎖.通常, 當(dāng)讀寫鎖處于讀模式鎖住狀態(tài)時(shí),如果

14、有另外線程試圖以寫模式加鎖,讀寫鎖通常會阻塞 隨后的讀模式鎖請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求長期阻塞. 讀寫鎖適合于對數(shù)據(jù)結(jié)構(gòu)的讀次數(shù)比寫次數(shù)多得多的情況.因?yàn)?,讀模式鎖定時(shí)可以共享, 以寫模式鎖住時(shí)意味著獨(dú)占。 (2)信號量可以分為二進(jìn)制信號量(bi nary sema phore)、整型信號量(in teger semaphore)和記錄型信號量(record semaphore)。信號量通過一個(gè)計(jì)數(shù)器控制對共享資 源的訪問,信號量的值是一個(gè)非負(fù)整數(shù),所有通過它的線程都會將該整數(shù)減一。如果計(jì)數(shù) 器大于0,則訪問被允許,計(jì)數(shù)器減1;如果為0,則訪問被禁止,所有試圖通過

15、它的線 程都將處于等待狀態(tài)。 計(jì)數(shù)器計(jì)算的結(jié)果是允許訪問共享資源的通行證。因此,為了訪問共享資源,線程必 須從信號量得到通行證, 如果該信號量的計(jì)數(shù)大于 0,則此線程獲得一個(gè)通行證,這將 導(dǎo)致信號量的計(jì)數(shù)遞減,否則,此線程將阻塞直到獲得一個(gè)通行證為止。當(dāng)此線程不再需 要訪問共享資源時(shí),它釋放該通行證,這導(dǎo)致信號量的計(jì)數(shù)遞增,如果另一個(gè)線程等待通 行證,則那個(gè)線程將在那時(shí)獲得通行證。 有如下幾點(diǎn)心得體會: (1)讀寫鎖比互斥量允許更高的并行性?;コ饬恳词擎i住狀態(tài),要不是不加鎖狀 態(tài),而且一次只有一個(gè)線程可以對其進(jìn)行加鎖。讀寫鎖有三種狀態(tài):讀模式加鎖,寫模式 加鎖,不加鎖。當(dāng)讀寫鎖是寫加鎖時(shí),在這個(gè)鎖被解索之前所有企圖對它加鎖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論