




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實驗二 進程管理設計一. 目的和要求進程調(diào)度是處理機管理的核心內(nèi)容。本實驗要求用C語言編寫和調(diào)試一個簡單的進程調(diào)度程序。通過本實驗可以加深理解有關進程控制塊、進程隊列的概念,并體會和了解優(yōu)先數(shù)和時間片輪轉調(diào)度算法的具體實施辦法。二. 實驗內(nèi)容1. 設計進程控制塊PCB表結構,分別適用于優(yōu)先數(shù)調(diào)度算法和循環(huán)輪轉算法。PCB結構通常包括以下信息:進程名、進程優(yōu)先數(shù)(或輪轉時間片)、進程所占用的CPU時間、進程的狀態(tài)、當前隊列指針等。根據(jù)調(diào)度算法的不同,PCB結構的內(nèi)容可以做適當?shù)膭h除。2. 建立進程就緒隊列,對兩種不同算法編制入鏈子程序。3. 編制兩種進程調(diào)度算法:1)優(yōu)先數(shù)調(diào)度;2)循環(huán)輪轉調(diào)度
2、。三. 實驗環(huán)境1. IBM 286以上微型計算機及其兼容機。2. DOS系統(tǒng)要求3.3及更高的版本。3. TURBO C 2.0。四. 實驗要求本實驗要求用C 語言編寫,選用優(yōu)先數(shù)算法和簡單時間片輪轉法對五個進程進行調(diào)度,每個進程可以有三種狀態(tài):運行狀態(tài)(RUN)、就緒狀態(tài)(READY)和完成狀態(tài)(FINISH)。并假定初始狀態(tài)為就緒狀態(tài)。五. 模擬算法提示1 數(shù)據(jù)結構設計進程控制塊結構如下:PCB:NAMEPRIO/ROUND CPUTIMECOUNTNEEDTIMESTATENEXT其中:NAME進程標識符PRIO進程優(yōu)先數(shù)ROUND進程輪轉時間片CPUTIME進程占用CPU時間COUN
3、T計數(shù)器NEEDTIME進程完成還要的CPU時間STATE進程的狀態(tài)NEXT鏈指針進程控制塊鏈結構中主要指針如下: RUN當前運行進程指針READY就緒隊列頭指針TAIL就緒隊列尾指針FINISH完成隊列頭指針為了方便處理,程序中進程的運行時間以時間片為單位計算。各進程的優(yōu)先數(shù)或輪轉時間片數(shù)以及進程需運行的時間片數(shù)的初值均由用戶給定。2程序說明1)在優(yōu)先數(shù)算法中,進程每執(zhí)行一次,優(yōu)先數(shù)減3,CPU時間片數(shù)加1,進程還需要的時間片數(shù)減1。在輪轉法中,采用固定時間片,時間片數(shù)為2,進程每次執(zhí)行一次,CPU時間片加2,進程還需要的時間片數(shù)減2,并排列就緒隊列的尾上。2) 程序結構說明如下:整個程序由
4、FIRSTIN,INSERT1,INSERT2,PRINT,CREAT,PRISCH和ROUNDSCH函數(shù)組成。其中:INSERT1的功能是把還未完成且優(yōu)先數(shù)小于別的進程的進程PCB按進程優(yōu)先數(shù)的順序插入到就緒隊列中。INSERT2是輪轉法使用的函數(shù),將執(zhí)行了一個單位時間片數(shù)(為2)且還未完成的進程的PCB插到就緒隊列的隊尾。FIRSTIN 的功能是將就緒隊列中的第一個進程投入運行。PRINT打印每執(zhí)行一個時間片后的所有進程的狀態(tài),這里,就緒(等待)用“W”代表。CREATE 的功能是創(chuàng)建新的進程,即創(chuàng)立進程的PCB,并將此PCB鏈入到就緒隊列中去。PRISCH按優(yōu)先數(shù)算法調(diào)度進程。ROUND
5、SCH按時間片輪轉法調(diào)度進程。主程序中定義了PCB 的結構和其它變量:number進程數(shù),algo為10個字符長的字符串,存放要求輸入的算法的名,PRIORITY 為優(yōu)先數(shù)算法,ROUNDROBIN為循環(huán)輪轉法,在程序運行時輸入其中的一個。3主要算法 算法 PRISCH while (當前運行進程不為空) 進程占用CPU 時間加1 進程到完成還要的CPU時間減1 進程優(yōu)先數(shù)減3 if(進程到完成還要的CPU時間為0) 將該進程插入到完成隊列中 修改該進程狀態(tài) 當前運行進程指針為空 if(就緒隊列不為空) FIRSTIN函數(shù) else if (就緒隊列不為空且當前進程優(yōu)先數(shù)小于就緒隊列中第一 個
6、進程的優(yōu)先數(shù)) 修改當前進程狀態(tài)為W INSERT1函數(shù) FIRSTIN函數(shù) PRINT函數(shù) 算法 ROUNDSCH while (當前運行進程不為空) 進程占用CPU 時間加1 進程到完成還要的CPU時間減1 進程計數(shù)器加1 if(進程到完成還要的CPU時間為0) 將該進程插入到完成隊列中 修改該進程狀態(tài) 當前運行進程指針為空 if(就緒隊列不為空) FIRSTIN過程 else if (進程計數(shù)器等于進程輪轉時間片) 修改當前進程計數(shù)器為0 if(就緒隊列不為空) 修改當前進程狀態(tài)為W INSERT2過程 FIRSTIN過程 PRINT過程 六. 實驗報告1 實驗題目。2 采用的數(shù)據(jù)結構及
7、符號說明。3 打印一份源程序清單,并附加流程圖與注釋。4 打印出兩種算法的執(zhí)行結果。5 比較兩種算法的優(yōu)缺點并分析實驗過程中遇到的問題,談談實驗后的體會。實驗三 進入VI編輯器格式:vi 文件名例 :vi sy.cVi編輯器三種工作方式:1 編輯方式:進入VI 處于編輯方式2 文本輸入方式:在編輯方式下輸入a ,進入追加方式,輸入i,進入插入方式3 命令方式:在輸入方式下,按Esc 鍵,由文本輸入轉向編輯方式,輸入冒號:進入命令方式4 退出vi : wq寫文件退出:w wenjianming 寫文件: q! 不寫退出:wq! 寫退出編譯c文件Gcc -o wenjianming.out wen
8、jianming.c運行文件:./wenjianming.out1 實驗內(nèi)容和目的用vi編輯器編輯下列文件,使用gcc編譯器和gdb調(diào)試器,對下列程序編譯運行,分析運行結果。要求至少完成3個程序。2程序示例(1) /* 父子進程之間的同步之例 */#include <stdio.h> Main( ) Int pid1;If(pid1=fork() /*create child1 */ if (fork() /*create the child2*/ printf (“parents context.n”); Printf(“parent is waiting the child1
9、terminate.n); Wait(0);Printf(“parent is waiting the child2 terminate.n”);Wait(0);Printf(“parent terminate.n”);Exit(0); Else /* child2*/ Printf(“child2s context.n”); Sleep(5); Printf(“ child2 terminate.n”); Exit(0); Else if(pid1=0)/* child1 */ printf(“child1s context.n”); Sleep(10); Printf(“child1 te
10、rminate.n”); Exit(0); 分析: 上述程序是父進程首先創(chuàng)建一個子進程,若成功,再創(chuàng)建另一個子進程,之后三個進程并發(fā)執(zhí)行。究竟誰先執(zhí)行,是隨機的,可根據(jù)執(zhí)行結果判斷。試分析該程序的所有運行結果。注釋: fork( ) 調(diào)用正確完成時,給父進程返回地是被創(chuàng)建子進程的標識,給子進程返回的是0;創(chuàng)建失敗時,返回給父進程的時1;Exit(0) 進程終止自己Wait(0) 父進程同步等待子進程結束,即無子進程結束,父進程等待。(2)管道通信機制通過使用管道實現(xiàn)兩個和多個進程之間的通信。所謂管道,就是將一個進程的標準輸出與另一個進程的標準輸入聯(lián)系在一起,進行通信的一種方法。同組進程之間可用
11、無名管道進行通信,不同組進程可通過有名管道通信。使用無名管道進行父子進程之間的通信 include <sys/types.h>#include<ctype.h>#include<unistd.h>Int pipe( int filedes2);Char parent=”A message to pipe communication.n”;Main() int pid,chan12; Char buf100; Pipe(chan1); Pid=fork();If(pid<0) printf(“to create child errorn”); Exit(
12、1);If(pid>0) close(chan10); /*父進程關閉讀通道*/ Printf(“parent process sends a message to child.n”); Write(chan11,parent,sizeof(parent); Close(chan11); Printf(“parent process waits the child to terminate.n”); Wait(0);Printf(“parent process terminates.n”);Else Close(chan11);/*子進程關閉寫通道*/ Read(chan10,buf,1
13、00); Printf(“the message read by child process form parent is %s.n”,buf); Close (chan10); Printf(“child process terminatesn”);觀察運行結果。注釋:pipe( int filedes2):創(chuàng)建一個無名管道,filedes0為讀通道,filedes1為寫通道。(3)Linux中的多線程編程threads.c#include <pthread.h>#include <stdio.h>#include <sys/time.h>#include
14、 <string.h>#define MAX 10pthread_t thread2;pthread_mutex_t mut;int number=0, i;void *thread1() printf ("thread1 : I'm thread 1n"); for (i = 0; i < MAX; i+) printf("thread1 : number = %dn",number); pthread_mutex_lock(&mut); number+; pthread_mutex_unlock(&mut);
15、 sleep(2); printf("thread1 :主函數(shù)在等我完成任務嗎?n"); pthread_exit(NULL);void *thread2() printf("thread2 : I'm thread 2n"); for (i = 0; i < MAX; i+) printf("thread2 : number = %dn",number); pthread_mutex_lock(&mut); number+; pthread_mutex_unlock(&mut); sleep(3); p
16、rintf("thread2 :主函數(shù)在等我完成任務嗎?n"); pthread_exit(NULL);void thread_create(void) int temp; memset(&thread, 0, sizeof(thread); /comment1 /*創(chuàng)建線程*/ if(temp = pthread_create(&thread0, NULL, thread1, NULL) != 0) /comment2 printf("線程1創(chuàng)建失敗!n"); else printf("線程1被創(chuàng)建n"); if(t
17、emp = pthread_create(&thread1, NULL, thread2, NULL) != 0) /comment3 printf("線程2創(chuàng)建失敗"); else printf("線程2被創(chuàng)建n");void thread_wait(void) /*等待線程結束*/ if(thread0 !=0) /comment4 pthread_join(thread0,NULL); printf("線程1已經(jīng)結束n"); if(thread1 !=0) /comment5 pthread_join(thread1,N
18、ULL); printf("線程2已經(jīng)結束n"); int main() /*用默認屬性初始化互斥鎖*/ pthread_mutex_init(&mut,NULL); printf("我是主函數(shù)哦,我正在創(chuàng)建線程,呵呵n"); thread_create(); printf("我是主函數(shù)哦,我正在等待線程完成任務阿,呵呵n"); thread_wait(); return 0;注意:Gcc lpthread o thread.out thread.c線程相關操作1) pthread_tpthread_t在頭文件/usr/inc
19、lude/bits/pthreadtypes.h中定義: typedef unsigned long int pthread_t; 它是一個線程的標識符。2)pthread_create函數(shù)pthread_create用來創(chuàng)建一個線程,它的原型為: extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t *_attr, void *(*_start_routine) (void *), void *_arg); 第一個參數(shù)為指向線程標識符的指針,第二個參數(shù)用來設置線程屬性,第三個參數(shù)是線程運行函數(shù)的起始地址
20、,最后一個參數(shù)是運行函數(shù)的參數(shù)。這里,我們的函數(shù)thread不需要參數(shù),所以最后一個參數(shù)設為空指針。第二個參數(shù)我們也設為空指針,這樣將生成默認屬性的線程。對線程屬性的設定和修改我們將在下一節(jié)闡述。當創(chuàng)建線程成功時,函數(shù)返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了;后者表示第二個參數(shù)代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則繼續(xù)運行下一行代碼。3)pthread_join pthread_exit函數(shù)pthread_join用來等待一個線程的結束。函數(shù)原型為
21、:extern int pthread_join _P (pthread_t _th, void *_thread_return);第一個參數(shù)為被等待的線程標識符,第二個參數(shù)為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。這個函數(shù)是一個線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結束為止,當函數(shù)返回時,被等待線程的資源被收回。一個線程的結束有兩種途徑,一種是象我們上面的例子一樣,函數(shù)結束了,調(diào)用它的線程也就結束了;另一種方式是通過函數(shù)pthread_exit來實現(xiàn)。它的函數(shù)原型為:extern void pthread_exit _P (void *_retval) _attr
22、ibute_ (_noreturn_);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個參數(shù)thread_return不是NULL,這個值將被傳遞給 thread_return。最后要說明的是,一個線程不能被多個線程等待,否則第一個接收到信號的線程成功返回,其余調(diào)用pthread_join的線程則返回錯誤代碼ESRCH。在這一節(jié)里,我們編寫了一個最簡單的線程,并掌握了最常用的三個函數(shù)pthread_create,pthread_join和pthread_exit。下面,我們來了解線程的一些常用屬性以及如何設置這些屬性?;コ怄i相關互斥鎖用來保證一段時間內(nèi)只有一個線程在執(zhí)行一段代
23、碼。1) pthread_mutex_init 函數(shù)pthread_mutex_init用來生成一個互斥鎖。NULL參數(shù)表明使用默認屬性。如果需要聲明特定屬性的互斥鎖,須調(diào)用函數(shù) pthread_mutexattr_init。函數(shù)pthread_mutexattr_setpshared和函數(shù) pthread_mutexattr_settype用來設置互斥鎖屬性。前一個函數(shù)設置屬性pshared,它有兩個取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用來不同進程中的線程同步,后者用于同步本進程的不同線程。在上面的例子中,我們使用的是默認
24、屬性PTHREAD_PROCESS_ PRIVATE。后者用來設置互斥鎖類型,可選的類型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它們分別定義了不同的上鎖、解鎖機制,一般情況下,選用最后一個默認屬性。2) pthread_mutex_lock pthread_mutex_unlock pthread_delay_np pthread_mutex_lock聲明開始用互斥鎖上鎖,此后的代碼直至調(diào)用pthread_mutex_unlock為止,均被上鎖,
25、即同一時間只能被一個線程調(diào)用執(zhí)行。當一個線程執(zhí)行到pthread_mutex_lock處時,如果該鎖此時被另一個線程使用,那此線程被阻塞,即程序將等待到另一個線程釋放此互斥鎖。注意:1)需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓線程睡眠一段時間,讓線程釋放互斥鎖,等待另一個線程使用此鎖。下面的參考資料1里頭說明了該問題。但是在linux下好像沒有pthread_delay_np那個函數(shù)(我試了一下,提示沒有定義該函數(shù)的引用),所以我用了sleep來代替,不過參考資料2中給出另一種方法,好像是通過pthread_cond_timedwait來代替,里頭給出了一種實現(xiàn)的辦法
26、。2)請千萬要注意里頭的注釋comment1-5,如果沒有comment1和comment4,comment5,將導致在pthread_join的時候出現(xiàn)段錯誤,另外,上面的comment2和comment3是根源所在,所以千萬要記得寫全代碼。因為上面的線程可能沒有創(chuàng)建成功,導致下面不可能等到那個線程結束,而在用pthread_join的時候出現(xiàn)段錯誤(訪問了未知的內(nèi)存區(qū))。另外,在使用memset的時候,需要包含string.h頭文件。實驗四 1實驗內(nèi)容與目的 熟悉有關文件的系統(tǒng)調(diào)用,學習文件系統(tǒng)的系統(tǒng)調(diào)用命令,提高對文件系統(tǒng)實現(xiàn)功能的理解和掌握。使用creat open read writ
27、e 等系統(tǒng)調(diào)用用C語言編程實現(xiàn)復制文件。2注釋(1) Int creat(const char *pathname, mode_t mode);返回值:如果正確創(chuàng)建,返回文件的描述符;否則返回1;Pathname是要創(chuàng)建文件的路徑名。創(chuàng)建文件時,文件只能以只寫方式打開Mode 用來規(guī)定該文件的擁有者,小組用戶和其他用戶的訪問權限,要求用按位邏輯加對下列符號常量進行所需的組合(同open函數(shù))。(2) int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);i
28、nt close(int fd);open函數(shù)有兩個形式.其中pathname是我們要打開的文件名(包含路徑名稱,缺省是認為在當前路徑下面).flags可以去下面的一個值或者是幾個值的組合.O_RDONLY:以只讀的方式打開文件.O_WRONLY:以只寫的方式打開文件.O_RDWR:以讀寫的方式打開文件.O_APPEND:以追加的方式打開文件.O_CREAT:創(chuàng)建一個文件.O_EXEC:如果使用了O_CREAT而且文件已經(jīng)存在,就會發(fā)生一個錯誤.O_NOBLOCK:以非阻塞的方式打開一個文件.O_TRUNC:如果文件已經(jīng)存在,則刪除文件的內(nèi)容.前面三個標志只能使用任意的一個.如果使用了O_CR
29、EATE標志,那么我們要使用open的第二種形式.還要指定mode標志,用來表示文件的訪問權限.mode可以是以下情況的組合.-S_IRUSR 用戶可以讀 S_IWUSR 用戶可以寫S_IXUSR 用戶可以執(zhí)行 S_IRWXU 用戶可以讀寫執(zhí)行-S_IRGRP 組可以讀 S_IWGRP 組可以寫S_IXGRP 組可以執(zhí)行 S_IRWXG 組可以讀寫執(zhí)行-S_IROTH 其他人可以讀 S_IWOTH 其他人可以寫S_IXOTH 其他人可以執(zhí)行 S_IRWXO 其他人可以讀寫執(zhí)行-S_ISUID 設置用戶執(zhí)行ID S_ISGID 設置組的執(zhí)行ID- 我們也可以用數(shù)字來代表各個位的標志.Linux總共用5個數(shù)字來表示文件的各種權限
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國熒光藍行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國糟方腐乳行業(yè)投資前景及策略咨詢研究報告
- 蚌埠學院《舞蹈表演專業(yè)訓練》2023-2024學年第二學期期末試卷
- 2025至2031年中國環(huán)罩行業(yè)投資前景及策略咨詢研究報告
- 《生成式人工智能技術與應用》課件 第5章 AI高效生活
- 2025年中國AI+辦公軟件行業(yè)市場運行態(tài)勢、產(chǎn)業(yè)鏈全景及發(fā)展趨勢報告
- 工業(yè)機器人(1)復習測試卷
- DB13T 5141-2019 現(xiàn)代農(nóng)業(yè)莊園評價規(guī)范
- DB13T 2862-2018 家用燃氣報警器安裝與使用規(guī)范
- DB13T 5158-2019 外賣送餐包使用技術規(guī)范
- 稀土買賣協(xié)議書
- 太原日用陶瓷項目商業(yè)計劃書范文
- 2025年可再生能源在建筑能源供應中的占比提升策略研究報告
- 2025中國鐵路鄭州局集團招聘614人(河南)筆試參考題庫附帶答案詳解
- 薪酬福利體系優(yōu)化方案
- SA8000-社會責任程序文件(完整版)
- 畢業(yè):結束與開始
- 2024年臨沂市技師學院招聘真題
- 華北電力大學《云計算概論》2023-2024學年第二學期期末試卷
- 云南省云南大學附屬中學2025屆七年級生物第二學期期末考試試題含解析
- 浙江卷-2025屆高考化學4月模擬預測卷
評論
0/150
提交評論