




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗二 進程管理設計一. 目的和要求進程調度是處理機管理的核心內容。本實驗要求用C語言編寫和調試一個簡單的進程調度程序。通過本實驗可以加深理解有關進程控制塊、進程隊列的概念,并體會和了解優(yōu)先數和時間片輪轉調度算法的具體實施辦法。二. 實驗內容1. 設計進程控制塊PCB表結構,分別適用于優(yōu)先數調度算法和循環(huán)輪轉算法。PCB結構通常包括以下信息:進程名、進程優(yōu)先數(或輪轉時間片)、進程所占用的CPU時間、進程的狀態(tài)、當前隊列指針等。根據調度算法的不同,PCB結構的內容可以做適當的刪除。2. 建立進程就緒隊列,對兩種不同算法編制入鏈子程序。3. 編制兩種進程調度算法:1)優(yōu)先數調度;2)循環(huán)輪轉調度
2、。三. 實驗環(huán)境1. IBM 286以上微型計算機及其兼容機。2. DOS系統(tǒng)要求3.3及更高的版本。3. TURBO C 2.0。四. 實驗要求本實驗要求用C 語言編寫,選用優(yōu)先數算法和簡單時間片輪轉法對五個進程進行調度,每個進程可以有三種狀態(tài):運行狀態(tài)(RUN)、就緒狀態(tài)(READY)和完成狀態(tài)(FINISH)。并假定初始狀態(tài)為就緒狀態(tài)。五. 模擬算法提示1 數據結構設計進程控制塊結構如下:PCB:NAMEPRIO/ROUND CPUTIMECOUNTNEEDTIMESTATENEXT其中:NAME進程標識符PRIO進程優(yōu)先數ROUND進程輪轉時間片CPUTIME進程占用CPU時間COUN
3、T計數器NEEDTIME進程完成還要的CPU時間STATE進程的狀態(tài)NEXT鏈指針進程控制塊鏈結構中主要指針如下: RUN當前運行進程指針READY就緒隊列頭指針TAIL就緒隊列尾指針FINISH完成隊列頭指針為了方便處理,程序中進程的運行時間以時間片為單位計算。各進程的優(yōu)先數或輪轉時間片數以及進程需運行的時間片數的初值均由用戶給定。2程序說明1)在優(yōu)先數算法中,進程每執(zhí)行一次,優(yōu)先數減3,CPU時間片數加1,進程還需要的時間片數減1。在輪轉法中,采用固定時間片,時間片數為2,進程每次執(zhí)行一次,CPU時間片加2,進程還需要的時間片數減2,并排列就緒隊列的尾上。2) 程序結構說明如下:整個程序由
4、FIRSTIN,INSERT1,INSERT2,PRINT,CREAT,PRISCH和ROUNDSCH函數組成。其中:INSERT1的功能是把還未完成且優(yōu)先數小于別的進程的進程PCB按進程優(yōu)先數的順序插入到就緒隊列中。INSERT2是輪轉法使用的函數,將執(zhí)行了一個單位時間片數(為2)且還未完成的進程的PCB插到就緒隊列的隊尾。FIRSTIN 的功能是將就緒隊列中的第一個進程投入運行。PRINT打印每執(zhí)行一個時間片后的所有進程的狀態(tài),這里,就緒(等待)用“W”代表。CREATE 的功能是創(chuàng)建新的進程,即創(chuàng)立進程的PCB,并將此PCB鏈入到就緒隊列中去。PRISCH按優(yōu)先數算法調度進程。ROUND
5、SCH按時間片輪轉法調度進程。主程序中定義了PCB 的結構和其它變量:number進程數,algo為10個字符長的字符串,存放要求輸入的算法的名,PRIORITY 為優(yōu)先數算法,ROUNDROBIN為循環(huán)輪轉法,在程序運行時輸入其中的一個。3主要算法 算法 PRISCH while (當前運行進程不為空) 進程占用CPU 時間加1 進程到完成還要的CPU時間減1 進程優(yōu)先數減3 if(進程到完成還要的CPU時間為0) 將該進程插入到完成隊列中 修改該進程狀態(tài) 當前運行進程指針為空 if(就緒隊列不為空) FIRSTIN函數 else if (就緒隊列不為空且當前進程優(yōu)先數小于就緒隊列中第一 個
6、進程的優(yōu)先數) 修改當前進程狀態(tài)為W INSERT1函數 FIRSTIN函數 PRINT函數 算法 ROUNDSCH while (當前運行進程不為空) 進程占用CPU 時間加1 進程到完成還要的CPU時間減1 進程計數器加1 if(進程到完成還要的CPU時間為0) 將該進程插入到完成隊列中 修改該進程狀態(tài) 當前運行進程指針為空 if(就緒隊列不為空) FIRSTIN過程 else if (進程計數器等于進程輪轉時間片) 修改當前進程計數器為0 if(就緒隊列不為空) 修改當前進程狀態(tài)為W INSERT2過程 FIRSTIN過程 PRINT過程 六. 實驗報告1 實驗題目。2 采用的數據結構及
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 實驗內容和目的用vi編輯器編輯下列文件,使用gcc編譯器和gdb調試器,對下列程序編譯運行,分析運行結果。要求至少完成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í)行,是隨機的,可根據執(zhí)行結果判斷。試分析該程序的所有運行結果。注釋: fork( ) 調用正確完成時,給父進程返回地是被創(chuàng)建子進程的標識,給子進程返回的是0;創(chuàng)建失敗時,返回給父進程的時1;Exit(0) 進程終止自己Wait(0) 父進程同步等待子進程結束,即無子進程結束,父進程等待。(2)管道通信機制通過使用管道實現兩個和多個進程之間的通信。所謂管道,就是將一個進程的標準輸出與另一個進程的標準輸入聯系在一起,進行通信的一種方法。同組進程之間可用
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 :主函數在等我完成任務嗎?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 :主函數在等我完成任務嗎?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已經結束n"); if(thread1 !=0) /comment5 pthread_join(thread1,N
18、ULL); printf("線程2已經結束n"); int main() /*用默認屬性初始化互斥鎖*/ pthread_mutex_init(&mut,NULL); printf("我是主函數哦,我正在創(chuàng)建線程,呵呵n"); thread_create(); printf("我是主函數哦,我正在等待線程完成任務阿,呵呵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函數pthread_create用來創(chuàng)建一個線程,它的原型為: extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t *_attr, void *(*_start_routine) (void *), void *_arg); 第一個參數為指向線程標識符的指針,第二個參數用來設置線程屬性,第三個參數是線程運行函數的起始地址
20、,最后一個參數是運行函數的參數。這里,我們的函數thread不需要參數,所以最后一個參數設為空指針。第二個參數我們也設為空指針,這樣將生成默認屬性的線程。對線程屬性的設定和修改我們將在下一節(jié)闡述。當創(chuàng)建線程成功時,函數返回0,若不為0則說明創(chuàng)建線程失敗,常見的錯誤返回代碼為EAGAIN和EINVAL。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數目過多了;后者表示第二個參數代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運行參數三和參數四確定的函數,原來的線程則繼續(xù)運行下一行代碼。3)pthread_join pthread_exit函數pthread_join用來等待一個線程的結束。函數原型為
21、:extern int pthread_join _P (pthread_t _th, void *_thread_return);第一個參數為被等待的線程標識符,第二個參數為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。這個函數是一個線程阻塞的函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。一個線程的結束有兩種途徑,一種是象我們上面的例子一樣,函數結束了,調用它的線程也就結束了;另一種方式是通過函數pthread_exit來實現。它的函數原型為:extern void pthread_exit _P (void *_retval) _attr
22、ibute_ (_noreturn_);唯一的參數是函數的返回代碼,只要pthread_join中的第二個參數thread_return不是NULL,這個值將被傳遞給 thread_return。最后要說明的是,一個線程不能被多個線程等待,否則第一個接收到信號的線程成功返回,其余調用pthread_join的線程則返回錯誤代碼ESRCH。在這一節(jié)里,我們編寫了一個最簡單的線程,并掌握了最常用的三個函數pthread_create,pthread_join和pthread_exit。下面,我們來了解線程的一些常用屬性以及如何設置這些屬性。互斥鎖相關互斥鎖用來保證一段時間內只有一個線程在執(zhí)行一段代
23、碼。1) pthread_mutex_init 函數pthread_mutex_init用來生成一個互斥鎖。NULL參數表明使用默認屬性。如果需要聲明特定屬性的互斥鎖,須調用函數 pthread_mutexattr_init。函數pthread_mutexattr_setpshared和函數 pthread_mutexattr_settype用來設置互斥鎖屬性。前一個函數設置屬性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聲明開始用互斥鎖上鎖,此后的代碼直至調用pthread_mutex_unlock為止,均被上鎖,
25、即同一時間只能被一個線程調用執(zhí)行。當一個線程執(zhí)行到pthread_mutex_lock處時,如果該鎖此時被另一個線程使用,那此線程被阻塞,即程序將等待到另一個線程釋放此互斥鎖。注意:1)需要說明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓線程睡眠一段時間,讓線程釋放互斥鎖,等待另一個線程使用此鎖。下面的參考資料1里頭說明了該問題。但是在linux下好像沒有pthread_delay_np那個函數(我試了一下,提示沒有定義該函數的引用),所以我用了sleep來代替,不過參考資料2中給出另一種方法,好像是通過pthread_cond_timedwait來代替,里頭給出了一種實現的辦法
26、。2)請千萬要注意里頭的注釋comment1-5,如果沒有comment1和comment4,comment5,將導致在pthread_join的時候出現段錯誤,另外,上面的comment2和comment3是根源所在,所以千萬要記得寫全代碼。因為上面的線程可能沒有創(chuàng)建成功,導致下面不可能等到那個線程結束,而在用pthread_join的時候出現段錯誤(訪問了未知的內存區(qū))。另外,在使用memset的時候,需要包含string.h頭文件。實驗四 1實驗內容與目的 熟悉有關文件的系統(tǒng)調用,學習文件系統(tǒng)的系統(tǒng)調用命令,提高對文件系統(tǒng)實現功能的理解和掌握。使用creat open read writ
27、e 等系統(tǒng)調用用C語言編程實現復制文件。2注釋(1) Int creat(const char *pathname, mode_t mode);返回值:如果正確創(chuàng)建,返回文件的描述符;否則返回1;Pathname是要創(chuàng)建文件的路徑名。創(chuàng)建文件時,文件只能以只寫方式打開Mode 用來規(guī)定該文件的擁有者,小組用戶和其他用戶的訪問權限,要求用按位邏輯加對下列符號常量進行所需的組合(同open函數)。(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函數有兩個形式.其中pathname是我們要打開的文件名(包含路徑名稱,缺省是認為在當前路徑下面).flags可以去下面的一個值或者是幾個值的組合.O_RDONLY:以只讀的方式打開文件.O_WRONLY:以只寫的方式打開文件.O_RDWR:以讀寫的方式打開文件.O_APPEND:以追加的方式打開文件.O_CREAT:創(chuàng)建一個文件.O_EXEC:如果使用了O_CREAT而且文件已經存在,就會發(fā)生一個錯誤.O_NOBLOCK:以非阻塞的方式打開一個文件.O_TRUNC:如果文件已經存在,則刪除文件的內容.前面三個標志只能使用任意的一個.如果使用了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- 我們也可以用數字來代表各個位的標志.Linux總共用5個數字來表示文件的各種權限
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國帶箔材市場分析及競爭策略研究報告
- 2025至2030年中國工業(yè)鉑熱電阻行業(yè)投資前景及策略咨詢報告
- 愛國衛(wèi)生安全教育
- 病區(qū)的設置與護理工作
- 高一期末生物試卷及答案
- 高升專的數學試卷及答案
- 企業(yè)監(jiān)理裝修合同樣本
- 產品代銷合同標準文本甲方
- 自然歷史類博物館AI應用行業(yè)跨境出海戰(zhàn)略研究報告
- 基礎設施的擔保行業(yè)跨境出海戰(zhàn)略研究報告
- 住院透析患者操作流程
- 云倉合同標準文本
- 清明節(jié)假期安全教育主題班會 課件
- 倒閘操作考試試題及答案
- 2025年小學生安全知識競賽考試指導題庫300題(含答案)
- 專題5 壓強 2021年和2022年四川省成都市中考物理模擬試題匯編
- 春季預防傳染病課件
- 2025年領導干部任前廉政法規(guī)知識競賽試題庫及答案(130題)
- 康復科制度及職責
- 《心理B證論文:淺談小學生自我監(jiān)控能力的培養(yǎng)》3100字
- 切口引流管非計劃拔管不良事件根本原因RCA分析
評論
0/150
提交評論