進程創(chuàng)建模擬實現(xiàn)_第1頁
進程創(chuàng)建模擬實現(xiàn)_第2頁
進程創(chuàng)建模擬實現(xiàn)_第3頁
進程創(chuàng)建模擬實現(xiàn)_第4頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、題目 1進程創(chuàng)建模擬實現(xiàn)1.1 題目的主要研究內容及預期達到的目標(1)至少創(chuàng)建 10 個進程;(2)創(chuàng)建進程樹中 4 層以上的樹型結構。(3)理解進程創(chuàng)建相關理論;(4)掌握進程創(chuàng)建方法;(5)掌握進程相關數(shù)據(jù)結構。1.2 題目研究的工作基礎或實驗條件(1)硬件環(huán)境:裝有Linux 操作系統(tǒng)(虛擬機)的計算機一臺。(2)軟件環(huán)境: vim 編輯器、 Visual C+。1.3 設計思想(1)進程樹進程的創(chuàng)建過程是操作系統(tǒng)重要的處理過程之一。在系統(tǒng)中運行的進程都是由進程創(chuàng)建出來的, 創(chuàng)建進程的進程與被創(chuàng)建的進程之間構成父子關系,子進程還可以再創(chuàng)建它的子進程,由此可以構成一顆進程樹,如圖1-1

2、所示。根進程進程進程子進程子進程子進程子進程子進程孫進程孫進程孫進程孫進程圖 1-1進程樹(2)根進程子進程的創(chuàng)建是基于父進程的,因此一直追溯上去,總有一個進程是原始的,是沒有父進程的,這個進程是根進程。根進程沒有可復制和參考的對象,它所擁有的所有信息和資源都是強制設置的,不可復制的,這個過程稱為手工設置,也就是說根進程是“純手工打造”的,它是操作系統(tǒng)中“最原始”的一個進程,它是個模子,后面的任何進程都是基于根進程生成的。在 Linux 系統(tǒng)中的這個根進程的進程號是0,也把它叫做 0 號進程。創(chuàng)造 0號進程主要包括兩部分: 一是創(chuàng)建進程 0 運行時所需的所有信息, 即填充 0 號進程;二是調度

3、 0 號進程的執(zhí)行,即讓它“動”起來,只有動起來,才是真正意義上的進程,符合進程動態(tài)的概念。(3)進程的創(chuàng)建過程一但操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建進程的事件后,便調用進程創(chuàng)建原語按下述步驟創(chuàng)建一個新進程。A、申請空白 PCB為新進程申請獲得唯一的數(shù)字標識符, 并從 PCB 集合中索取一個空白PCB。如果無空白 PCB,可以創(chuàng)建一個新的PCB。在本實驗中,每次動態(tài)創(chuàng)建PCB。B、為新進程分配資源為新進程分配內存空間和??臻g。C、初始化進程控制塊a) 初始化標識信息;b) 初始化處理機狀態(tài)信息;c) 初始化處理機控制信息。D、將新進程插入就緒隊列1.4 流程圖開始輸入指令NNexit?showdetail

4、 ?Y退出Y結束顯示進程信息createpc?Y創(chuàng)建新進程圖 1-2進程創(chuàng)建流程圖1.5 主要程序代碼( 1) 主程序源代碼:#include "basic.h"pnode *proot;/ 系統(tǒng)進程樹的樹根pnode *plink;/ 系統(tǒng)進程樹的連接頭int createpc(int *para)pnode *p,*p1,*pp;/ 定義進程節(jié)點int pflag;/ 標識pflag=0;for(p=plink;p;p=p ->next)if(p ->node->pid = para0) / 檢查進程是否已經存在printf(" 進程%d 已

5、經存在 !n",para0);return -1;if(p ->node->pid = para1) / 查找父進程pflag=1;pp = p;if(!pflag)printf(" 父進程%d 不存在 n",para1);return -2;/初始化一個新的進程控制塊p1 = new pnode;/ 為 p1 創(chuàng)建一個新的節(jié)點p1->node=new pcb;/ 為 p1 節(jié)點創(chuàng)建一個新的進程控制塊p1->node->pid = para0;/ 對 p1 進程 id 進行賦值p1->node->ppid = para1;

6、/ 對 p1 父進程 id 進行賦值p1->node->prio = para2;/ 對 p1 的優(yōu)先級進行賦值p1->sub=NULL;/ 初始化p1->next=NULL;/ 初始化p1->brother=NULL;/初始化/添加進程樹if(!pp ->sub)pp->sub=p1;elsefor(p=pp ->sub;p ->brother;p=p ->brother);p->brother=p1;/ 添加進程連接for(p=plink;p ->next;p=p ->next);p->next=p1;re

7、turn 0;/顯示進程信息void showdetail()pnode *p,*p1;p=plink;/ 定位到頭節(jié)點for(;p;) / 打印所有sub 的信息printf("%d( 優(yōu)先級%d):",p ->node->pid,p ->node->prio);p1 = p ->sub;for(;p1;) / 打印出 p1 的控制塊 (sub)信息printf("%d( 優(yōu)先級%d)",p1 ->node->pid,p1 ->node->prio);p1 = p1 ->brother;pri

8、ntf("n");p = p ->next;printf("n");int main()initerror();short cflag,pflag;char cmdstr32;proot = new pnode;proot ->node=new pcb;proot ->node->pid=0;proot ->node->ppid= -1;proot ->node->prio=0;proot ->next=NULL;proot ->sub=NULL;proot ->brother=NULL;

9、plink=proot;for(;)cflag=0;pflag=0;printf("cmd:");scanf("%s",cmdstr);if(!strcmp(cmdstr,"exit")/退出程序 ,strcmp 函數(shù)比較兩個字符串,相同返回 0break;if(!strcmp(cmdstr,"showdetail")/顯示進程信息cflag = 1;pflag = 1;showdetail();else/創(chuàng)建進程int *para;char *s,*s1;s = strstr(cmdstr,"creat

10、epc"); /strstr() 函數(shù)搜索一個字符串在另一個字符串中的第一次出現(xiàn)。找到所搜索的字符串,if(s)/ 則該函數(shù)返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,則返回NULL。cflag=1;para = (int *)malloc(3);s1 = substr(s,instr(s,'(')+1,strlen(s) -2); / 得到參數(shù)字符串para=strtoarray(s1);/ 得到參數(shù)para0,para1,para2createpc(para); /創(chuàng)建進程pflag=1;if(!cflag)geterror(0);else if(!p

11、flag)geterror(1);( 2) basic.h源代碼:#ifndef basic_h#include<stdio.h>#include<string.h>#include<stdlib.h>#define basic_hchar *errormsg256;/進程控制塊struct pcbint pid;/ 進程 idint ppid;/ 父進程 idint prio;/ 優(yōu)先級;/進程節(jié)點struct pnodepcb *node;/ 控制塊節(jié)點pnode *sub;/ 用來存放控制中第一個進入的兄弟節(jié)點pnode *brother;/ 兄弟節(jié)點

12、pnode *next;/ 下一個節(jié)點;/信號量struct semphorechar name5; / 名稱int count;/ 計數(shù)值int curpid;/ 當前進程idpnode *wlist; / 等待鏈表;#define geterror(eno) printf("%sn",errormsgeno)void initerror()errormsg0 = (char *)malloc(20);errormsg0=(char *)" 錯誤的指令 !"errormsg1 = (char *)malloc(20);errormsg1=(char *

13、)" 錯誤的參數(shù) !"/得到字符串的字串char * substr(char *s,int start,int end)char *s1;int i;int len = strlen(s);if(start<0 | end>=len | start>end)return NULL;s1=(char *)malloc(end -start+2);/ 強制轉換for(i=0;i<=end -start;i+)s1i= si+start;/ 從 '('的下一個字符開始以此向s1i 賦值 ,一直到')'的前一個結束s1i=&#

14、39;0'return s1;/查找字符串中的位置int instr(char *s,char c)/ 返回 start 的值unsigned i;for(i=0;i<strlen(s);i+)if(si=c)return i;return - 1;/更改字符串數(shù)組數(shù)據(jù)int * strtoarray(char *s)int *a,count,x1;unsigned int i;char c, *s1,*s2;if(!s)printf(" 字符串不能為空!n");return NULL;count=0;s1=s;for(i=0;i<strlen(s1);i+)if(s1i=',')count+;count+;a = (int *)malloc(count);c=','for(i=0;i<(unsigned int)count;i+)x1 = i

溫馨提示

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

評論

0/150

提交評論