- 相關推薦
操作系統實驗報告(通用5篇)
在生活中,大家逐漸認識到報告的重要性,我們在寫報告的時候要注意語言要準確、簡潔。其實寫報告并沒有想象中那么難,以下是小編精心整理的操作系統實驗報告,僅供參考,希望能夠幫助到大家。
操作系統實驗報告 1
一、實驗目的
用高級語言編寫和調試一個進程調度程序,以加深對進程的概念及進程調度算法的理解。
二、實驗內容和要求
編寫并調試一個模擬的進程調度程序,采用“簡單時間片輪轉法”調度算法對五個進程進行調度。
每個進程有一個進程控制塊( PCB)表示。進程控制塊可以包含如下信息:進程名、到達時間、需要運行時間、已運行時間、進程狀態等等。
進程的到達時間及需要的運行時間可以事先人為地指定(也可以由隨機數產生)。進程的到達時間為進程輸入的時間。 進程的運行時間以時間片為單位進行計算。 每個進程的狀態可以是就緒 W(Wait)、運行R(Run)兩種狀態之一。
就緒進程獲得 CPU后都只能運行一個時間片。用運行時間加1來表示。
如果運行一個時間片后,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續運行,此時應分配時間片給就緒隊列中排在該進程之后的進程,并將它插入就緒隊列隊尾。 每進行一次調度程序都打印一次運行進程、就緒隊列、以及各個進程的 PCB,以便進行檢查。
重復以上過程,直到所要進程都完成為止。
三、實驗主要儀器設備和材料
硬件環境:IBM-PC或兼容機
軟件環境:C語言編程環境
四、實驗原理及設計方案
1、進程調度算法:采用多級反饋隊列調度算法。其基本思想是:當一個新進程進入內在后,首先將它放入第一個隊列的末尾,按FCFS原則排隊等待高度。當輪到該進程執行時,如能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚為完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行,以此類推。
2、實驗步驟:
(1)按先來先服務算法將進程排成就緒隊列。
(2)檢查所有隊列是否為空,若空則退出,否則將隊首進程調入執行。
(3)檢查該運行進程是否運行完畢,若運行完畢,則撤消進程,否則,將該進程插入到下一個邏輯隊列的隊尾。
(4)是否再插入新的進程,若是則把它放到第一邏輯隊列的列尾。
(5)重復步驟(2)、(3)、(4),直到就緒隊列為空。
五、流程圖
六、結果過程及截圖 初始化隊列
按Y鍵繼續運行進程:
按Y鍵繼續運行進程:
運行若干次后的狀態:
添加新的進程:
七、所遇困難的解決以及心得體會
在這個多級反饋的實驗中,我采取了用一條實際上的鏈表隊列來模擬多個邏輯上的隊列,通過維護幾個鏈表的狀態信息來找到每個進程運行完后應該插入的地方,還有一個標志位Fend用來表明新插入的隊列的位置。雖然實驗原理很簡單,但是在編寫代碼的過程中遇到了不少的問題,在兩個小時之內已經完成的大體代碼的編寫,但是之中存在不少的問題,導致了用了差不多四個小時的時間去調試才把它弄好,這主要歸咎于在開始設計代碼的.不太合理,在后期使得代碼結構有些混亂,使得調試更加的麻煩,以及對編程的不熟悉。通過這個實驗不僅使我對進程的調度算法有了更深的認識,使得理論知識得到的實踐,也使我的編程能力得到了進一步提高。
七、思考題
1、 分析不同調度算法的調度策略,比較不同調度算法的優缺點,總結它們的適用范圍。
答:動態有限權算法:動態優先權是指在創建進程時所創建的優先權,會隨進程的推進或者等待時間的增加而改變,以便獲得更好的調度性能。處理機為每個進程分配一定的時間片,在就緒隊列中,優先權高的進程將優先獲得處理機,進程在進去運行完響應的時間片后,如沒完成,優先權減1,從新回到就緒隊列等待分配處理機。
時間片的輪轉法:系統將所有進程排成一個隊列,按照先來先服務的原則,對隊列首的進程進行處理,每個進程在用完自己的時間片后,從新回到隊尾進行排隊。每運行一次,進程的需要時間減1,直到就緒隊列為空!
八、源代碼
#include #include
#include
#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0
#define TIME 2//時間片長度
typedef struct pcb{//進程管理塊 char name[10];//進程名字 char state; //進程狀態
int queue; int ntime; int rtime; int etime;
//進程所在的隊列
//進程需要運行的時間
//進程已經運行的時間
//進程在本隊列可運行的時間片
struct pcb *link;
}PCB;
PCB *ready = NULL, *p = NULL, *pfend = NULL,*p =NULL; 位置的變量
int geti() //使用戶僅能輸入整數 {
char ch; int i = 0; fflush(stdin); ch = get); while(ch == ){
//就緒隊列,進程插入
printf(
fflush(stdin); ch = get); }
while(ch != ){
if(ch > 9 || ch
fflush(stdin); i = 0; ch = get);
}else{ i = i*10 + (ch - 0); }
ch = get);
}
return i;
}
void findpos()//更新狀態量 {
PCB *ps = pfend;
if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1) p = ps; else{ while (ps->link && ps ->link->queue != (pfend ->queue +2)) }
ps = ps->link; p = ps;
}
void ()//插入進程 {
if(!ready ){
ready = p;
pfend = p; p = p;
}else if(ready ->queue == 1){//第一隊列存在
p->link = pfend->link; pfend->link = p; pfend = p; findpos();
}
void input()/*建立進程控制塊函數*/ {
int i,num;
printf(
for(i=0; i
p=getpch(PCB);
printf(
printf(
p->queue =1;
p->etime = TIME; p->link=NULL;
();/*調用函數*/ } else{ p->link = ready; ready = p; }
findpos();
}
void disp(PCB *pr)/*建立進程現實函數,用于顯示當前進程*/ {
printf(
}
void check()/*建立進程查看函數*/
{
}
void sort()//調整進程隊列
{
} if(!ready->link ||ready->queue link->queue) return; p = ready ->link; ready ->link = p ->link; p ->link = ready; p = ready; ready = p; if (ready && ready -> queue == p ->queue){ findpos(); } PCB *pr; printf(
void addnew()//添加新的進程
{
if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state=w; sort();/*調用sort函數*/ input(); } else{ input();
}
}
void destroy()/*建立進程撤銷函數(進程運行結束,撤銷進程)*/
{
}
void running()/*建立進程就緒函數(進程運行時間到,置就緒狀態)*/
{
}
void main()
{
char ch; input(); while(ready != NULL) { printf(
}
ready ->state = R; check(); running(); printf(
操作系統實驗報告 2
一、實驗目的
本實驗要求學生模擬作業調度的實現,用高級語言編寫和調試一個或多個作業調度的模擬程序,了解作業調度在操作系統中的作用,以加深對作業調度算法的理解。
二、實驗內容和要求
1、編寫并調度一個多道程序系統的作業調度模擬程序。
作業調度算法:采用基于先來先服務的調度算法。可以參考課本中的方法進行設計。 對于多道程序系統,要假定系統中具有的各種資源及數量、調度作業時必須考慮到每個作業的資源要求。
三、實驗主要儀器設備和材料
硬件環境:IBM-PC或兼容機
軟件環境:C語言編程環境
四、實驗原理及設計方案
采用多道程序設計方法的操作系統,在系統中要經常保留多個運行的作業,以提高系統效率。作業調度從系統已接納的暫存在輸入井中的一批作業中挑選出若干個可運行的作業,并為這些被選中的作業分配所需的系統資源。對被選中運行的作業必須按照它們各自的作業說明書規定的步驟進行控制。
采用先來先服務算法算法模擬設計作業調度程序。
(1)、作業調度程序負責從輸入井選擇若干個作業進入主存,為它們分配必要的資源,當它們能夠被進程調度選中時,就可占用處理器運行。作業調度選擇一個作業的必要條件是系統中現有的尚未分配的資源可滿足該作業的資源要求。但有時系統中現有的尚未分配的資源既可滿足某個作業的要求也可滿足其它一些作業的'要求,那么,作業調度必須按一定的算法在這些作業中作出選擇。先來先服務算法是按照作業進入輸入井的先后次序來挑選作業,先進入輸入井的作業優先被挑選,當系統中現有的尚未分配的資源不能滿足先進入輸入井的作業時,那么順序挑選后面的作業。
(2) 假定某系統可供用戶使用的主存空間共100k,并有5臺磁帶機。
(3)流程圖:
五、結果過程及截圖
讀取文件jobs.txt來初始化主存,磁帶機的個數,并打印出來。
初始時間是9:00:
按Y運行5分鐘:
按Y運行5分鐘:
按Y運行5分鐘:
多次運行后最后狀態:
六、所遇困難的解決以及心得體會
這個實驗是花的時間最多的一個實驗,第一次做的時候由于理解有些問題,所以做錯了。之后重新做了一遍,收獲還是很多的,遇到了很多的細節問題,例如像是時間化成浮點數和浮點數化成時間等一些問題,從中也暴露了自己的編程能力欠缺,之后要多多的寫程序。
七、思考題
1、 寫出每種算法的調度策略,最后比較各種算法的優缺點。
答:先來先服務算法是根據作業的進入時間來排序,到達時間短的先運行,優點是實現簡單,缺點是運行時間慢。
短作業優先算法是根椐作業的估計運行時間來排序,估計運行時間短的先運行,優點是運行時間快,缺點是實現起來比較復雜。
2、 選擇調度算法的依據是什么?
答:如果作業要求的速度不高,而且作業比較小型,那就最好用先來先服務算法。
如果作業要求的速度高,作業流程復雜,那就最好用短作業優先算法。
八、源代碼
#include
#include
#include
#include
#define getjcb() (JCB*)malloc(sizeof(JCB))
typedef struct {//資源的總量
int memory; int tape;
}RESOURCE;
typedef struct JCB {//作業控制塊
char username[20];//用戶名
char jobname[10];//作業名
char state;//作業狀態 char atime[5];//到達時間 float rtime;//運行時間 RESOURCE resource;//資源數量 struct JCB*link; }JCB;
RESOURCE source = {100,5};
JCB *pjcb =getjcb();//作業鏈表頭
char nowtime[5];//現在時間,初始時間為9:00
FILE* ignore(FILE *fp)//忽略文件中的空白符
{
if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch == || ch == )){ ch = fgetc(fp); } //if(!feof(fp)) return fp; fseek(fp, -1, SEEK_CUR);
return fp;
}
FILE* findFILE *fp,char c)//在文件中找到一個字符的位置(讀取文件時用) {
if(feof(fp)) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch != c)){ } ch = fgetc(fp); fseek(fp, -1, SEEK_CUR); return fp;
}
void destory()//釋放鏈表所占的內存
{
JCB *p = pjcb->link; while(pjcb){ free(pjcb); pjcb = p; if(p) p = p->link;
}
}
float stof(char *time)//把時間轉化為浮點型數
{
float h = 0, m = 0; int i = 0; while(time[i] != :){ h = h*10 + time[i] - 0; } i++; while(time[i] !=