太原理工大小操作系統(tǒng)實驗報告_第1頁
太原理工大小操作系統(tǒng)實驗報告_第2頁
太原理工大小操作系統(tǒng)實驗報告_第3頁
太原理工大小操作系統(tǒng)實驗報告_第4頁
太原理工大小操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗一幾種操作系統(tǒng)的界面實驗?zāi)康暮鸵竽康谋緦嶒灥哪康氖鞘箤W(xué)生熟悉1—2種操作系統(tǒng)的界面,在熟練使用機器的根底上,能了解各種操作命令和系統(tǒng)調(diào)用在系統(tǒng)中的大致工作過程。也就是通過操作系統(tǒng)的外部特征,逐步深入到操作系統(tǒng)的內(nèi)部實質(zhì)內(nèi)容中去。要求能熟練的在1—2種操作系統(tǒng)的環(huán)境下工作,學(xué)會使用各種命令,熟悉系統(tǒng)提供的各種功能,主動而有效地使用計算機。熟悉系統(tǒng)實用程序的調(diào)用方法和各種系統(tǒng)調(diào)用模塊的功能和作用實驗內(nèi)容和原理在某種操作系統(tǒng)的環(huán)境下建立、修改、運行、打印源程序和結(jié)果,最后撤消一個完整的程序。提示:可按下述步驟進行編寫一個完整的源程序,通過編輯命令送入機器,建立源程序文件;編譯該源文件,建立相應(yīng)的目標(biāo)文件;編譯有錯時,再用編輯命令修改源文件,消除全部詞法和語法錯誤;連接目標(biāo)文件,形成可執(zhí)行文件;執(zhí)行該文件,得到結(jié)果;打印輸出源程序和運行結(jié)果;撤消本次實驗中形成的所有文件。主要儀器設(shè)備筆記本電腦,Linux操作方法與實驗步驟安裝虛擬機軟件并在虛擬機上安裝Linux;1確保Linux已裝好gcc,可用$gcc–v命令查看;2熟悉以下常用Linux命令:ls,cd,cp,mv,rm,chmod,chown,df,ps,kill,cat,vi3在主目錄〔~〕創(chuàng)立lab01xxxx.c文件,xxxx為本人學(xué)號后4位;4按下頁內(nèi)容編輯上述文件;保存、退出vi;#include<stdio.h>#include<errno.h>#include<semaphore.h>#include<fcntl.h>#defineSEM_NAME"mysem"#defineOPEN_FLAGO_RDWR|O_CREAT#defineOPEN_MODE00777#defineINIT_V0staticsem_t*sem=NULL;staticvoidmysem(char*str){inti=0;while('\0'!=str[i]){printf("%c\n",str[i++]);sleep(1);}}intmain(void){pid_tpid=-1;intret=-1;intstatus=-1;//創(chuàng)立一個命名信號量sem=sem_open(SEM_NAME,OPEN_FLAG,OPEN_MODE,INIT_V);//創(chuàng)立子進程pid=fork();if(-1==(ret=pid)){perror("forkfailed:");goto_OUT;}if(0==pid){mysem("abcd");//V操作sem_post(sem);}if(0<pid){//P操作sem_wait(sem);mysem("1234");//等待子進程結(jié)束wait(&status);//刪掉在系統(tǒng)創(chuàng)立的信號量sem_unlink(SEM_NAME);//徹底銷毀翻開的信號量sem_close(sem);}_OUT:returnret;}實驗結(jié)果與分析六、討論、心得通過這次實驗,我熟悉了LINUX系統(tǒng)的使用方法,要編譯程序,首先要通過vi命令創(chuàng)立一個文件,而在進入文件后,也分為文本輸入模式與命令模式,編譯時要分清這兩種模式。實驗二進程調(diào)度程序設(shè)計實驗?zāi)康暮鸵竽康倪M程是操作系統(tǒng)最重要的概念之一,進程調(diào)度是操作系統(tǒng)的主要內(nèi)容,本實驗要求學(xué)生獨立地用高級語言編寫一個進程調(diào)度程序,調(diào)度算法可任意選擇或自行設(shè)計,本實驗可使學(xué)生加深對進程調(diào)度和各種調(diào)度算法的理解。要求設(shè)計一個有幾個進程并發(fā)執(zhí)行的進程調(diào)度程序,每個進程由一個進程控制塊(PCB)表示,進程控制塊通常應(yīng)包括下述信息:進程名,進程優(yōu)先數(shù),進程需要運行的時間,占用CPU的時間以及進程的狀態(tài)等,且可按照調(diào)度算法的不同而增刪。調(diào)度程序應(yīng)包含2—3種不同的調(diào)度算法,運行時可以任選一種,以利于各種方法的分析和比擬。系統(tǒng)應(yīng)能顯示或打印各進程狀態(tài)和參數(shù)的變化情況,便于觀察。實驗內(nèi)容和原理題目本程序可選用優(yōu)先數(shù)法或簡單輪轉(zhuǎn)法對五個進程進行調(diào)度。每個進程處于運行R(run)、就緒W(wait)和完成F(finish)三種狀態(tài)之一,并假定起始狀態(tài)都是就緒狀態(tài)W。為了便于處理,程序中進程的運行時間以時間片為單位計算。各進程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù)、以及進程需要運行的時間片數(shù),均由偽隨機數(shù)發(fā)生器產(chǎn)生。進程控制塊結(jié)構(gòu)如表2-1所示:表2-1PCB進程標(biāo)識符鏈指針優(yōu)先數(shù)/輪轉(zhuǎn)時間片數(shù)占用CPU時間片數(shù)進程所需時間片數(shù)進程狀態(tài)進程控制塊鏈結(jié)構(gòu)如圖2-1所示:RUNHEADTAIL1┇1┇R3┇W5┇WW0┇2…圖2-1進程控制塊鏈結(jié)構(gòu)其中:RUN—當(dāng)前運行進程指針;HEAD—進程就緒鏈鏈?zhǔn)字羔?;TAIL—進程就緒鏈鏈尾指針。2.算法與框圖程序框圖如圖2-2所示。prioritypriority是輸入調(diào)度算法alog開始alog=priority/roundrobin?生成并按優(yōu)先數(shù)大小排列進程控制塊鏈進程時間片數(shù)為0?從鏈?zhǔn)兹∫粋€進程投入運行生成并按進入次序排列進程控制塊鏈鏈?zhǔn)走M程投入運行時間片到,進程時間片數(shù)減1,優(yōu)先數(shù)減3運行進程退出,排到進程鏈尾部撤消該進程鏈?zhǔn)走M程投入運行時間片到,進程時間片數(shù)減1,占用CPU時間加1優(yōu)先數(shù)大于鏈?zhǔn)走M程?進程時間片數(shù)為0?撤消該進程運行進程退出,按優(yōu)先數(shù)插入進程鏈從鏈?zhǔn)兹∫粋€進程投入運行結(jié)束結(jié)束進程隊列空?進程隊列空?是是是否否否否否是roundrobin占用處理機時間片到?否是圖2-2進程調(diào)度框圖(1)優(yōu)先數(shù)法。進程就緒鏈按優(yōu)先數(shù)大小從大到小排列,鏈?zhǔn)走M程首先投入運行。每過一個時間片,運行進程所需運行的時間片數(shù)減1,說明它已運行了一個時間片,優(yōu)先數(shù)也減3。理由是該進程如果在一個時間片中完成不了,優(yōu)先級應(yīng)降低一級。接著比擬現(xiàn)行進程和就緒鏈鏈?zhǔn)走M程的優(yōu)先數(shù),如果仍是現(xiàn)行進程高或者相同,就讓現(xiàn)行進程繼續(xù)運行,否那么,調(diào)度就緒鏈鏈?zhǔn)走M程投入運行。原運行進程再按其優(yōu)先數(shù)大小插入就緒鏈,且改變它們對應(yīng)的進程狀態(tài),直至所有進程都運行完各自的時間片數(shù)。(2)簡單輪轉(zhuǎn)法。進程就緒鏈按各進程進入的先后次序排列,鏈?zhǔn)走M程首先投入運行。進程每次占用處理機的輪轉(zhuǎn)時間按其重要程度登入進程控制塊中的輪轉(zhuǎn)時間片數(shù)記錄項〔相應(yīng)于優(yōu)先數(shù)法的優(yōu)先數(shù)記錄項位置〕。每過一個時間片,運行進程占用處理機的時間片數(shù)加1,然后比擬占用處理機的時間片數(shù)是否與該進程的輪轉(zhuǎn)時間片數(shù)相等,假設(shè)相等說明已到達輪轉(zhuǎn)時間,應(yīng)將現(xiàn)運行進程排到就緒鏈末尾,調(diào)度鏈?zhǔn)走M程占用處理機,且改變它們的進程狀態(tài),直至所有進程完成各自的時間片。主要儀器設(shè)備筆記本電腦四實驗數(shù)據(jù)記錄和處理#include<stdio.h>#include<stdlib.h>#definefurthest5structprocess/*PCBSTRUCTURE*/{intid;intpriority;intcputime;intalltime;charstate;intnext;}prochain[furthest-1];intprocnum;intrand();intalgo;intrun,head,tail,j;main()/*MAINPROGRAM*/{agan:printf(“typethealgorithmis(1:RR,2:PRIO):〞);scanf(“%d〞,&algo);if(algo==2){printf(“outputofpriority.\n〞);init();prisch();}else{if(algo==1){printf(“outputofroundrobin.\n〞);init();timesch();}else{printf(“tryagain,please\n〞);gotoagan;}}for(j=1;j<=40;j++){printf(“=〞);}printf(“\n\n〞);for(j=1;j<=40;j++){printf(“=〞);}printf(“\n\n〞);printf(“systemfinished\n);}print()/*PRINTTHERUNNINGPROCESS,WAITINGQUEUEANDPCBSEQUENCELIST*/{intk,p;for(k=1;k<=40;k++)printf(“=〞);printf(“\nrunningproc.〞);printf(“waitingqueue.〞);printf(“\n%d〞,prochain[run].id);p=head;while(p!=0){printf(“%5d〞,p);p=prochain[p].next;}printf(“\n〞);for(k=1;k<=40;k++)printf(“=〞);printf(“\n〞);printf(“id“);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].id);printf(“\n〞);printf(“priority〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].priority);printf(“\n〞);printf(“cputime〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].cputime);printf(“\n〞);printf(“alltime〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].alltime);printf(“\n〞);printf(“state〞);for(k=1;k<furthest+1;k++)printf(“%5c〞,prochain[k].state);printf(“\n〞);printf(“next〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].next);printf(“\n〞);}insert(intq)/*INSERTAPROCESS*/{intp,s;p=head;s=prochain[head].nextwhile((prochain[q].priority<prochain[s].priority)&&(s!=0)){p=s;s=prochain[s].next;}prochain[p].next=q;prochain[q].next=s;}insert2()/*PUTAPROCESSONTOTHETAILOFTHEQUEUE*/{prochain[tail].next=run;tail=run;prochain[run].next=0;}init()/*CREATEAWAITINGQUEUE*/{inti;head=0;if(alog==2){for(i=1;i<furthest+1;i++){prochain[i].id=i;prochain[i].priority=(rand()+11)%41;prochain[i].cputime=0;prochain[i].alltime=(rand()+1)%7;prochain[i].state=’W’;prochain[i].next=0;if(prochain[i].priority<prochain[head].priority)&&(head!=0))insert(prochain[i].id);else{prochain[i].next=head;head=prochain[i].id;}}}else{for(i=1;i<furthest+1;i++){prochain[i].id=i;prochain[i].priority=(rand()+1)%3+1;prochain[i].cputime=0;prochain[i].alltime=(rand()+1)%7;prochain[i].state=’W’;prochain[i].next=(i+1)%(furthest+1);}head=1;tail=furthest;prochain[furthest].next=0;}run=head;prochain[run].state=’R’;head=prochain[head].next;prochain[run].next=0;print();}prisch()/*THEPROCESSWITHPRIOALGORITHM*/{while(run!=0){prochain[run].cputime+=1;prochain[run].priority-=3;prochain[run].alltime-=1;if(prochain[run].alltime==0){prochain[run].state=’F’;prochain[run].next=0;if(head!=0){run=head;prochain[run].state=’R’;head=prochain[head].next;}else{prochain[0].id=prochain[run].id;run=0;}}else{if((prochain[run].priority<prochain[head].priority)&&(head!=0)){prochain[run].state=’W’;insert(run);run=head;prochain[run].state=’R’;head=prochain[head].next;}}print();}}timesch()/*THEPROCESSWITHRRALRORITHM*/{ while(run!=0){prochain[run].alltime-=1;prochain[run].cputime+=1;if(prochain[run].alltime==0){prochain[run].state=’F’;prochain[run].next=0;if(head!=0){run=head;prochain[run].state=’R’;head=prochain[head].next;}else{prochain[0].id=prochain[run].id;run=0;}}else{if((prochain[run].cputime==prochain[run].priority)&&(head!=0)){prochain[run].state=’W’;prochain[run].cputime=0;insert2();run=head;prochain[run].state=’R’;head=prochain[head].next;}}print();}}實驗結(jié)果與分析六、討論、心得此實驗輸入代碼較長,編輯文件輸入代碼出錯時,刪除打錯的代碼時要記得先返回命令模式才能刪除。實驗三存儲管理程序設(shè)計實驗?zāi)康暮鸵竽康拇鎯芾淼闹饕δ苤皇呛侠淼胤峙渲鞔婵臻g。請求頁式管理是一種常用的虛擬存儲管理技術(shù)。本實驗的目的是通過請求頁式存儲管理中頁面置換算法的模擬設(shè)計,來了解虛擬存儲技術(shù)的特點,掌握請求頁式存儲管理的頁面置換算法。要求模擬頁式虛擬存儲管理中硬件的地址轉(zhuǎn)換和缺頁中斷的處理過程,并用先進先出調(diào)度算法〔FIFO〕處理缺頁中斷。實驗內(nèi)容和原理為了裝入一個頁面而必須調(diào)出一頁時,如果被選中調(diào)出的頁面在執(zhí)行中沒有修改正,那么不必把該頁重新寫到磁盤上〔因磁盤上已有副本〕。因此,在頁表中可以增加是否修改正的標(biāo)志,當(dāng)執(zhí)行“存〞指令、“寫〞指令時把對應(yīng)頁的修改標(biāo)志置成“1〞,表示該頁修改正,否那么為“0〞,表示該頁未修改正。頁表格式如表3-1所示。表3-1頁表格式頁號標(biāo)志主存塊號修改標(biāo)志磁盤上的位置設(shè)計一個地址轉(zhuǎn)換程序來模擬硬件的地址轉(zhuǎn)換和缺頁中斷處理過程。當(dāng)訪問的頁在主存時那么形成絕對地址,但不去模擬指令的執(zhí)行,可用輸出轉(zhuǎn)換后的絕對地址來表示一條指令已完成。當(dāng)訪問的頁不在主存時那么輸出“*該頁頁號〞來表示硬件產(chǎn)生了一次缺頁中斷。模擬地址轉(zhuǎn)換的程序流程如圖3-1所示。編制一個FIFO頁面調(diào)度程序。FIFO頁面調(diào)度算法總是先調(diào)出作業(yè)中最先進入主存的那一頁,因此,可以用一個數(shù)組來構(gòu)成頁號隊列。數(shù)組中每個元素是該作業(yè)已在主存的頁面號,假定分配給作業(yè)的主存塊數(shù)為m,且該作業(yè)開始的m頁已裝入主存,那么數(shù)組可由m個元素組成:P[0],P[1],…,P[m-1]它們的初值為P[0]∶=0,P[1]∶=1,…,P[m-1]∶=m-1用一指針k指示當(dāng)要裝入新頁時應(yīng)調(diào)出的頁在數(shù)組的位置,k的初值為“0〞。jj∶=P[k]j頁的修改標(biāo)志=1?輸出“OUTj〞P[k]∶=Lk∶=(k+1)modm修改頁表輸出“INL〞取一條指令開始頁標(biāo)志=1?輸出絕對地址取一條指令輸出“﹡頁號〞取指令中訪問的頁號=>L查頁表形成絕對地址置L頁修改標(biāo)志〞1〞結(jié)束是〞存〞指令?有后繼指令?否(產(chǎn)生缺頁中斷)是否否否是是模擬硬件地址轉(zhuǎn)換模擬FIFO頁面調(diào)度是圖3-1地址轉(zhuǎn)換和FIFO頁面調(diào)度流程當(dāng)產(chǎn)生缺頁中斷后,操作系統(tǒng)總是選擇P[k]所指出的頁面調(diào)出,然后執(zhí)行P[k]∶=要裝入的新頁頁號k∶=〔k+1〕modm在實驗中不必實際地啟動磁盤執(zhí)行調(diào)出一頁和裝入一頁的工作,而用輸出“OUT調(diào)出的頁號〞和“IN要裝入的新頁頁號〞來模擬一次調(diào)出和裝入的過程。模擬程序的流程見圖3-1。假定主存的每塊長度為1024個字節(jié),現(xiàn)有一個共7頁的作業(yè),其副本已在磁盤上。系統(tǒng)為該作業(yè)分配了4塊主存塊,且該作業(yè)的第0頁至第3頁已經(jīng)裝入主存,其余3頁尚未裝入主存,該作業(yè)的頁表見表3-2所示。表3-2作業(yè)的頁表頁號標(biāo)志主存塊號修改標(biāo)志在磁盤上的位置0150011118001221900133110021400022500023600121如果該作業(yè)依次執(zhí)行的指令序列如表3-3所示。表3-3作業(yè)依次執(zhí)行的指令序列操作頁號頁內(nèi)地址操作頁號頁內(nèi)地址+0070移位4053+1050+5023×2015存1037存3021取2078取0056+4001-6040存6084依次執(zhí)行上述的指令序列來調(diào)試你所設(shè)計的程序〔僅模擬指令的執(zhí)行,不必考慮指令序列中具體操作的執(zhí)行〕為了檢查程序的正確性,可自行確定假設(shè)干組指令序列,運行設(shè)計的程序,核對執(zhí)行結(jié)果。主要儀器設(shè)備筆記本電腦實驗數(shù)據(jù)記錄和處理#include<stdio.h>#include<stdlib.h>#definefurthest5structprocess/*PCBSTRUCTURE*/{intid;intpriority;intcputime;intalltime;charstate;intnext;}prochain[furthest-1];intprocnum;intrand();intalgo;intrun,head,tail,j;main()/*MAINPROGRAM*/{agan:printf(“typethealgorithmis(1:RR,2:PRIO):〞);scanf(“%d〞,&algo);if(algo==2){printf(“outputofpriority.\n〞);init();prisch();}else{if(algo==1){printf(“outputofroundrobin.\n〞);init();timesch();}else{printf(“tryagain,please\n〞);gotoagan;}}for(j=1;j<=40;j++){printf(“=〞);}printf(“\n\n〞);for(j=1;j<=40;j++){printf(“=〞);}printf(“\n\n〞);printf(“systemfinished\n);}print()/*PRINTTHERUNNINGPROCESS,WAITINGQUEUEANDPCBSEQUENCELIST*/{intk,p;for(k=1;k<=40;k++)printf(“=〞);printf(“\nrunningproc.〞);printf(“waitingqueue.〞);printf(“\n%d〞,prochain[run].id);p=head;while(p!=0){printf(“%5d〞,p);p=prochain[p].next;}printf(“\n〞);for(k=1;k<=40;k++)printf(“=〞);printf(“\n〞);printf(“id“);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].id);printf(“\n〞);printf(“priority〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].priority);printf(“\n〞);printf(“cputime〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].cputime);printf(“\n〞);printf(“alltime〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].alltime);printf(“\n〞);printf(“state〞);for(k=1;k<furthest+1;k++)printf(“%5c〞,prochain[k].state);printf(“\n〞);printf(“next〞);for(k=1;k<furthest+1;k++)printf(“%5d〞,prochain[k].next);printf(“\n〞);}insert(intq)/*INSERTAPROCESS*/{intp,s;p=head;s=prochain[head].nextwhile((prochain[q].priority<prochain[s].priority)&&(s!=0)){p=s;s=prochain[s].next;}prochain[p].next=q;prochain[q].next=s;}insert2()/*PUTAPROCESSONTOTHETAILOFTHEQUEUE*/{prochain[tail].next=run;tail=run;prochain[run].next=0;}init()/*CREATEAWAITINGQUEUE*/{inti;head=0;if(alog==2){for(i=1;i<furthest+1;i++){prochain[i].id=i;prochain[i].priority=(rand()+11)%41;prochain[i].cputime=0;prochain[i].alltime=(rand()+1)%7;prochain[i].state=’W’;prochain[i].next=0;if(prochain[i].priority<prochain[head].priority)&&(head!=0))insert(prochain[i].id);else{prochain[i].next=head;head=prochain[i].id;}}}else{for(i=1;i<furthest+1;i++){prochain[i].id=i;prochain[i].priority=(rand()+1)%3+1;prochain[i].cputime=0;prochain[i].alltime=(rand()+1)%7;prochain[i].state=’W’;prochain[i].next=(i+1)%(fu

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論