版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
PAGEPAGE17《操作系統(tǒng)》實驗總結(jié)學(xué)號:學(xué)生姓名:專業(yè)班級:1.1進程創(chuàng)建UNIX中,進程既是一個獨立擁有資源的基本單位,又是一個獨立調(diào)度的基本單位。一個進程實體由若干個區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲區(qū)等。每個區(qū)又分為若干頁,每個進程配置有唯一的進程控制塊PCB,用于控制和管理進程。在Linux中主要提供了fork、vfork、clone三個進程創(chuàng)建方法。在linux源碼中這三個調(diào)用的執(zhí)行過程是執(zhí)行fork(),vfork(),clone()時,通過一個系統(tǒng)調(diào)用表映射到sys_fork(),sys_vfork(),sys_clone(),再在這三個函數(shù)中去調(diào)用do_fork()去做具體的創(chuàng)建進程工作。本次實驗我們只使用fork。
fork創(chuàng)建一個進程時,子進程只是完全復(fù)制父進程的資源,復(fù)制出來的子進程有自己的task_struct結(jié)構(gòu)和pid,但卻復(fù)制父進程其它所有的資源。新舊進程使用同一代碼段,復(fù)制數(shù)據(jù)段和堆棧段,這里的復(fù)制采用了注明的copy_on_write技術(shù),即一旦子進程開始運行,則新舊進程的地址空間已經(jīng)分開,兩者運行獨立。fork()函數(shù)不需要參數(shù),返回一個進程ID。返回值有三種情況:(1)對于父進程,fork函數(shù)返回新的子進程的ID。(2)對于子進程,fork函數(shù)返回0。(3)如果出錯,fork函數(shù)返回-1。1.2進程控制進程控制主要有:1.exec()系統(tǒng)調(diào)用exec()系列,也可用于新程序的運行。exec()系列可以將一個可執(zhí)行的二進制文件覆蓋在新進程的用戶級上下文的存儲空間上,以更改新進程的用戶級上下文。exec()系列中的系統(tǒng)調(diào)用都完成相同的功能,它們把一個新程序裝入內(nèi)存,來改變調(diào)用進程的執(zhí)行代碼,從而形成新進程。如果exec()調(diào)用成功,調(diào)用進程將被覆蓋,然后從新程序的入口開始執(zhí)行,這樣就產(chǎn)生了一個新進程,新進程的進程標識符id與調(diào)用進程相同。2.wait()進程一旦調(diào)用了wait,就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經(jīng)退出,如果讓它找到了這樣一個已經(jīng)變成僵尸的子進程,wait就會收集這個子進程的信息,并把它徹底銷毀后返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這里,直到有一個出現(xiàn)為止。3.exit()這個系統(tǒng)調(diào)用是用來終止一個進程的。無論在程序中的什么位置,只要執(zhí)行到exit系統(tǒng)調(diào)用,進程就會停止剩下的所有操作,清除包括PCB在內(nèi)的各種數(shù)據(jù)結(jié)構(gòu),并終止本進程的運行。4.getpid()getpid的作用很簡單,就是返回當前進程的進程ID。#include<stdio.h>#include<unistd.h>main(){intpid;pid=fork();/*創(chuàng)建子進程*/switch(pid){case-1:/*創(chuàng)建失敗*/printf("forkfail!\n");exit(1);case0:/*子進程*/execl("/bin/ls","ls","-1","-color",NULL);printf("execfail!\n");exit(1);default:/*父進程*/wait(NULL);/*同步*/printf("lscompleted!\n");exit(0);}}進程同步是指對多個相關(guān)進程在執(zhí)行次序上進行協(xié)調(diào),以使并發(fā)執(zhí)行的主進程之間有效地共享資源和相互合作,從而使程序的執(zhí)行具有可在現(xiàn)行。首先程序在調(diào)用fork()機那里了一個子進程后,馬上調(diào)用wait(),使父進程在子進程調(diào)用之前一直處于睡眠狀態(tài),這樣就使子進程先運行,子進程運行exec()裝入命令后,然后調(diào)用wait(0),使子進程和父進程并發(fā)執(zhí)行,實現(xiàn)進程同步。1.3進程互斥#include<stdio.h>#include<unistd.h>main(){intp1,p2,i;while((p1=fork())==-1);/*創(chuàng)建子進程p1*/if(p1==0){lockf(1,1,0);/*加鎖,這里第一個參數(shù)為stdout(標準輸出設(shè)備的描述符)*/for(i=0;i<10;i++)printf("daughter%d\n",i);lockf(1,0,0);/*解鎖*/}else{while((p2=fork())==-1);/*創(chuàng)建子進程p2*/if(p2==0){lockf(1,1,0);/*加鎖*/for(i=0;i<10;i++)printf("son%d\n",i);lockf(1,0,0);/*解鎖*/}else{lockf(1,1,0);/*加鎖*/for(i=0;i<10;i++)printf("parent%d\n",i);lockf(1,0,0);/*解鎖*/}}}上述程序執(zhí)行時,不同進程之間不存在共享臨界資源(其中打印機的互斥性已由操作系統(tǒng)保證)問題,所以加鎖與不加鎖效果相同。1.4總結(jié)進程管理相關(guān)命令:Ps:ps命令是用來顯示系統(tǒng)瞬間的進程信息,它可以顯示出在用戶輸入ps命令時系統(tǒng)的進程及進程的相關(guān)信息。Kill:kill命令不但能殺死進程,同時也會殺死該進程的所有子進程。Nice:指定程序的運行優(yōu)先級。Renice:改變一個正在運行的進程的優(yōu)先級。2.進程間通信2.1信號機制每個信號都對應(yīng)一個正整數(shù)常量(稱為signalnumber,即信號編號。定義在系統(tǒng)頭文件<signal.h>中),代表同一用戶的諸進程之間傳送事先約定的信息的類型,用于通知某進程發(fā)生了某異常事件。每個進程在運行時,都要通過信號機制來檢查是否有信號到達。若有,便中斷正在執(zhí)行的程序,轉(zhuǎn)向與該信號相對應(yīng)的處理程序,以完成對該事件的處理;處理結(jié)束后再返回到原來的斷點繼續(xù)執(zhí)行。實質(zhì)上,信號機制是對中斷機制的一種模擬,故在早期的UNIX版本中又把它稱為軟中斷。#include<stdio.h>#include<signal.h>#include<unistd.h>voidwaiting(),stop();intwait_mark;main(){intp1,p2,stdout;while((p1=fork())==-1);/*創(chuàng)建子進程p1*/if(p1>0){while((p2=fork())==-1);/*創(chuàng)建子進程p2*/if(p2>0){wait_mark=1;signal(SIGINT,stop);/*接收到^c信號,轉(zhuǎn)stop*/waiting();kill(p1,16);/*向p1發(fā)軟中斷信號16*/kill(p2,17);/*向p2發(fā)軟中斷信號17*/wait(0);/*同步*/wait(0);printf("Parentprocessiskilled!\n");exit(0);}else{wait_mark=1;signal(17,stop);/*接收到軟中斷信號17,轉(zhuǎn)stop*/waiting();lockf(stdout,1,0);printf("Childprocess2iskilledbyparent!\n");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);/*接收到軟中斷信號16,轉(zhuǎn)stop*/waiting();lockf(stdout,1,0);printf("Childprocess1iskilledbyparent!\n");lockf(stdout,0,0);exit(0);}
}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}Wait(0)作用就是把調(diào)用它的進程掛起,直到有別的進程終止它再開始執(zhí)行。每個進程退出時都用了語句exit(0),一方面要結(jié)束進程,另外向父進程返回結(jié)束標志0
。2.2進程管道通信常用的進程間通信方式有這幾種A.傳統(tǒng)的進程間通信方式無名管道(pipe)、有名管道(fifo)和信號(signal)B.SystemvIPC對象共享內(nèi)存(sharememory)、消息隊列(messagequeue)和信號燈(semaphore)C.BSD套接字(socket)本次實驗使用無名管道2.3消息發(fā)送與接收消息(message)是一個格式化的可變長的信息單元。消息機制允許由一個進程給其它任意的進程發(fā)送一個消息。當一個進程收到多個消息時,可將它們排成一個消息隊列。消息使用二種重要的數(shù)據(jù)結(jié)構(gòu):一是消息首部,其中記錄了一些與消息有關(guān)的信息,如消息數(shù)據(jù)的字節(jié)數(shù);二個消息隊列頭表,其每一表項是作為一個消息隊列的消息頭,記錄了消息隊列的有關(guān)信息。1、client.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidclient(){inti;msgqid=msgget(MSGKEY,0777);/*打開75#消息隊列*/for(i=10;i>=1;i--){msg.mtype=i;printf(“(client)sent\n”);msgsnd(msgqid,&msg,1024,0);/*發(fā)送消息*/}exit(0);}main(){client();}2、server.c#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{longmtype;charmtext[1000];}msg;intmsgqid;voidserver(){msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*創(chuàng)建75#消息隊列*/do{msgrcv(msgqid,&msg,1030,0,0);/*接收消息*/printf(“(server)received\n”);}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);/*刪除消息隊列,歸還資源*/exit(0);}main(){server();}message的傳送和控制并不保證完全同步,當一個程序不在激活狀態(tài)的時候,它完全可能繼續(xù)睡眠,造成了上面的現(xiàn)象,在多次sendmessage后才recievemessage。這一點有助于理解消息傳送的實現(xiàn)機理。2.4共享存儲區(qū)通信共享存儲區(qū)(ShareMemory)是UNIX系統(tǒng)中通信速度最高的一種通信機制。該機制可使若干進程共享主存中的某一個區(qū)域,且使該區(qū)域出現(xiàn)(映射)在多個進程的虛地址空間中。另一方面,一個進程的虛地址空間中又可連接多個共享存儲區(qū),每個共享存儲區(qū)都有自己的名字。當進程間欲利用共享存儲區(qū)進行通信時,必須先在主存中建立一共享存儲區(qū),然后將它附接到自己的虛地址空間上。此后,進程對該區(qū)的訪問操作,與對其虛地址空間的其它部分的操作完全相同。進程之間便可通過對共享存儲區(qū)中數(shù)據(jù)的讀、寫來進行直接通信。圖示列出二個進程通過共享一個共享存儲區(qū)來進行通信的例子。其中,進程A將建立的共享存儲區(qū)附接到自己的AA’區(qū)域,進程B將它附接到自己的BB’區(qū)域。#include<sys/types.h>#include<sys/shm.h>#include<sys/ipc.h>#defineSHMKEY75intshmid,i;int*addr;voidclient(){inti;shmid=shmget(SHMKEY,1024,0777);/*打開共享存儲區(qū)*/addr=shmat(shmid,0,0);/*獲得共享存儲區(qū)首地址*/for(i=9;i>=0;i--){while(*addr!=-1);printf("(client)sent\n");*addr=i;}exit(0);}voidserver(){shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);/*創(chuàng)建共享存儲區(qū)*/addr=shmat(shmid,0,0);/*獲取首地址*/do{*addr=-1;while(*addr==-1);printf("(server)received\n");}while(*addr);shmctl(shmid,IPC_RMID,0);/*撤消共享存儲區(qū),歸還資源*/exit(0);}main(){while((i=fork())==-1);if(!i)server();system(“ipcs-m”);while((i=fork())==-1);if(!i)client();wait(0);wait(0);}由于兩種機制實現(xiàn)的機理和用處都不一樣,難以直接進行時間上的比較。如果比較其性能,應(yīng)更加全面的分析。(1)消息隊列的建立比共享區(qū)的設(shè)立消耗的資源少。前者只是一個軟件上設(shè)定的問題,后者需要對硬件的操作,實現(xiàn)內(nèi)存的映像,當然控制起來比前者復(fù)雜。如果每次都重新進行隊列或共享的建立,共享區(qū)的設(shè)立沒有什么優(yōu)勢。(2)當消息隊列和共享區(qū)建立好后,共享區(qū)的數(shù)據(jù)傳輸,受到了系統(tǒng)硬件的支持,不耗費多余的資源;而消息傳遞,由軟件進行控制和實現(xiàn),需要消耗一定的cpu的資源。從這個意義上講,共享區(qū)更適合頻繁和大量的數(shù)據(jù)傳輸。(3)消息的傳遞,自身就帶有同步的控制。當?shù)鹊较⒌臅r候,進程進入睡眠狀態(tài),不再消耗cpu資源。而共享隊列如果不借助其他機制進行同步,接收數(shù)據(jù)的一方必須進行不斷的查詢,白白浪費了大量的cpu資源。可見,消息方式的使用更加靈活。3存儲管理3.1常用頁面置換算法模擬設(shè)計一個虛擬存儲區(qū)和內(nèi)存工作區(qū),并使用下述算法計算訪問命中率。1、最佳淘汰算法(OPT)2、先進先出的算法(FIFO)3、最近最久未使用算法(LRU)4、最不經(jīng)常使用算法(LFU)5、最近未使用算法(NUR)命中率=1-頁面失效次數(shù)/頁地址流長度#defineTRUE1#defineFALSE0#defineINVALID-1#defineNULL0#definetotal_instruction320/*指令流長*/#definetotal_vp32/*虛頁長*/#defineclear_period50/*清0周期*/typedefstruct/*頁面結(jié)構(gòu)*/{ intpn,pfn,counter,time;}pl_type;pl_typepl[total_vp];/*頁面結(jié)構(gòu)數(shù)組*/structpfc_struct{/*頁面控制結(jié)構(gòu)*/ intpn,pfn; structpfc_struct*next;};typedefstructpfc_structpfc_type;pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;intdiseffect,a[total_instruction];intpage[total_instruction],offset[total_instruction];intinitialize(int);intFIFO(int);intLRU(int);intLFU(int);intNUR(int);intOPT(int);intmain(){ints,i,j;srand(10*getpid());/*由于每次運行時進程號不同,故可用來作為初始化隨機數(shù)隊列的“種子”*/s=(float)319*rand()/32767/32767/2+1;//for(i=0;i<total_instruction;i+=4)/*產(chǎn)生指令隊列*/{if(s<0||s>319){printf("Wheni==%d,Error,s==%d\n",i,s);exit(0);}a[i]=s;/*任選一指令訪問點m*/a[i+1]=a[i]+1;/*順序執(zhí)行一條指令*/a[i+2]=(float)a[i]*rand()/32767/32767/2;/*執(zhí)行前地址指令m'*/a[i+3]=a[i+2]+1;/*順序執(zhí)行一條指令*/s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;if((a[i+2]>318)||(s>319))printf("a[%d+2],anumberwhichis:%dands==%d\n",i,a[i+2],s);}for(i=0;i<total_instruction;i++)/*將指令序列變換成頁地址流*/{page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++)/*用戶內(nèi)存工作區(qū)從4個頁面到32個頁面*/{printf("%2dpageframes\n",i);FIFO(i);LRU(i);LFU(i);NUR(i);OPT(i);}return0;}intinitialize(total_pf)/*初始化相關(guān)數(shù)據(jù)結(jié)構(gòu)*/inttotal_pf;/*用戶進程的內(nèi)存頁面數(shù)*/{inti;diseffect=0;for(i=0;i<total_vp;i++){pl[i].pn=i;pl[i].pfn=INVALID;/*置頁面控制結(jié)構(gòu)中的頁號,頁面為空*/pl[i].counter=0;pl[i].time=-1;/*頁面控制結(jié)構(gòu)中的訪問次數(shù)為0,時間為-1*/}for(i=0;i<total_pf-1;i++){pfc[i].next=&pfc[i+1];pfc[i].pfn=i;}/*建立pfc[i-1]和pfc[i]之間的鏈接*/pfc[total_pf-1].next=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0];/*空頁面隊列的頭指針為pfc[0]*/return0;}intFIFO(total_pf)/*先進先出算法*/inttotal_pf;/*用戶進程的內(nèi)存頁面數(shù)*/{inti,j;pfc_type*p;initialize(total_pf);/*初始化相關(guān)頁面控制用數(shù)據(jù)結(jié)構(gòu)*/busypf_head=busypf_tail=NULL;/*忙頁面隊列頭,隊列尾鏈接*/for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID)/*頁面失效*/{diseffect+=1;/*失效次數(shù)*/if(freepf_head==NULL)/*無空閑頁面*/{p=busypf_head->next;pl[busypf_head->pn].pfn=INVALID;freepf_head=busypf_head;/*釋放忙頁面隊列的第一個頁面*/freepf_head->next=NULL;busypf_head=p;}p=freepf_head->next;/*按FIFO方式調(diào)新頁面入內(nèi)存頁面*/freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn; if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head;else{busypf_tail->next=freepf_head;/*free頁面減少一個*/busypf_tail=freepf_head;}freepf_head=p;}}printf("FIFO:%6.4f\n",1-(float)diseffect/320);return0;}intLRU(total_pf)/*最近最久未使用算法*/inttotal_pf;{intmin,minj,i,j,present_time;initialize(total_pf);present_time=0;for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID)/*頁面失效*/{diseffect++;if(freepf_head==NULL)/*無空閑頁面*/{min=32767;for(j=0;j<total_vp;j++)/*找出time的最小值*/if(min>pl[j].time&&pl[j].pfn!=INVALID){ min=pl[j].time; minj=j; }freepf_head=&pfc[pl[minj].pfn];//騰出一個單元pl[minj].pfn=INVALID;pl[minj].time=-1;freepf_head->next=NULL;}pl[page[i]].pfn=freepf_head->pfn;//有空閑頁面,改為有效pl[page[i]].time=present_time; freepf_head=freepf_head->next;//減少一個free頁面}elsepl[page[i]].time=present_time;//命中則增加該單元的訪問次數(shù)present_time++;}printf("LRU:%6.4f\n",1-(float)diseffect/320);return0;}intNUR(total_pf)/*最近未使用算法*/inttotal_pf;{inti,j,dp,cont_flag,old_dp;pfc_type*t;initialize(total_pf);dp=0;for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID)/*頁面失效*/{diseffect++;if(freepf_head==NULL)/*無空閑頁面*/{cont_flag=TRUE;old_dp=dp;while(cont_flag)if(pl[dp].counter==0&&pl[dp].pfn!=INVALID)cont_flag=FALSE;else{ dp++;if(dp==total_vp) dp=0;if(dp==old_dp)for(j=0;j<total_vp;j++) pl[j].counter=0;}freepf_head=&pfc[pl[dp].pfn];pl[dp].pfn=INVALID;freepf_head->next=NULL;}pl[page[i]].pfn=freepf_head->pfn;freepf_head=freepf_head->next;}elsepl[page[i]].counter=1;if(i%clear_period==0)for(j=0;j<total_vp;j++)pl[j].counter=0;}printf("NUR:%6.4f\n",1-(float)diseffect/320);return0;}intOPT(total_pf)/*最佳置換算法*/inttotal_pf;{inti,j,max,maxpage,d,dist[total_vp];pfc_type*t;initialize(total_pf);for(i=0;i<total_instruction;i++){//printf("InOPTfor1,i=%d\n",i);//i=86;i=176;206;250;220,221;192,193,194;258;274,275,276,277,278;if(pl[page[i]].pfn==INVALID)/*頁面失效*/{diseffect++;if(freepf_head==NULL)/*無空閑頁面*/{for(j=0;j<total_vp;j++)if(pl[j].pfn!=INVALID)dist[j]=32767;/*最大"距離"*/ elsedist[j]=0;d=1;for(j=i+1;j<total_instruction;j++){ if(pl[page[j]].pfn!=INVALID)dist[page[j]]=d;d++;
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度離婚協(xié)議書起草與跨國婚姻解除服務(wù)合同3篇
- 2024年船舶照明安裝協(xié)議3篇
- 2024年食品供應(yīng)鏈合作合同標準模板一
- 2024版?zhèn)€人借款協(xié)議含第三方擔保條款版B版
- 2025年度影視基地場地租賃及拍攝制作服務(wù)協(xié)議3篇
- 2024生物醫(yī)藥研發(fā)過程中數(shù)據(jù)共享協(xié)議
- 2024年金融衍生品期貨交易合同規(guī)范文本3篇
- 2024年虛擬展覽開發(fā)合同3篇
- 2024年綠色金融融資居間服務(wù)合同范本3篇
- 2024年集裝箱房屋買賣法律合同書樣本版B版
- 2024年山東省淄博市中考數(shù)學(xué)試卷(附答案)
- 合作社股權(quán)轉(zhuǎn)讓協(xié)議書參考
- 車輛火災(zāi)應(yīng)急處置
- 食品安全與傳染病預(yù)防
- 《濟南聯(lián)通公司成本管理問題及解決策略7000字論文》
- 191118-鋰離子電池專業(yè)術(shù)語英語對照大全
- 2024全新網(wǎng)絡(luò)與數(shù)據(jù)安全培訓(xùn)
- 2023年貴州黔東南州州直機關(guān)遴選公務(wù)員筆試真題
- 心腦血管疾病預(yù)防課件
- DB35T 1036-2023 10kV及以下電力用戶業(yè)擴工程技術(shù)規(guī)范
- 中國移動自智網(wǎng)絡(luò)白皮書(2024) 強化自智網(wǎng)絡(luò)價值引領(lǐng)加速邁進L4級新階段
評論
0/150
提交評論