西電操作系統大作業任務調度_第1頁
西電操作系統大作業任務調度_第2頁
西電操作系統大作業任務調度_第3頁
西電操作系統大作業任務調度_第4頁
西電操作系統大作業任務調度_第5頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、精選優質文檔-傾情為你奉上精選優質文檔-傾情為你奉上專心-專注-專業專心-專注-專業精選優質文檔-傾情為你奉上專心-專注-專業單處理器任務調度1 需求說明1.1 基本需求目標:本次實驗的目標是在Linux環境下實現任務調度仿真,利用多線程實現任務池中的多個任務,支持先來先服務、輪轉和反饋三種調度策略,提高對Linux環境下多進程、多線程和單處理器調度等知識的理解。問題描述:設有任務A、B、C、D、E,分別具有不同的優先級和處理時間,通過一個調度線程對這5個任務進行調度。功能需求:正確輸出三種調度算法下,任務的執行順序、每個任務占用CPU的時間以及優先級隊列(反饋調度)通過一個調度進程實現任務調

2、度有輸出界面,在每個時間點輸出任務狀態、每個任務已經占用CPU時間(TIMECOUNTER)和還需CPU時間,已經執行的任務順序(order2)和時間(time)。非功能需求:程序應有較好的容錯性(即能對用戶輸入的命令進行判斷,并對錯誤的命令進行錯誤處理)過程需求:使用vi進行代碼的編寫使用make工具建立工程將實現不同類別功能的函數寫到不同的.c文件中,并使用makefile鏈接編譯。#include#include#includetypedef struct quenchar pname8;int time1;int time2;char state;struct quen *next;

3、QUEN;float t,d;structint id; float ArriveTime;/到達時間 float ServiceTime;/該進程需要的服務時間float StartTime;/進程真正開始運行時間float EndTime;/進程真正結束時間 float RunTime;/運行的時間float DQRunTime;/相對執行時間實際運行/請求的服務時間int status;/進程狀態,是否被運行過arrayTask4;void GetTask(); int fcfs(); int sjf(); void new_n(int s); void Printresult(int

4、j); void cl();void GetTask() int i; float a; for(i = 0; i = 4; i+) arrayTaski.id = i + 1; printf(input the number); printf(input the ArriveTime of arrayTask%d:,i); scanf(%f,&a); arrayTaski.ArriveTime = a; printf(input the RequestTime of arrayTask%d:,i); scanf(%f, &a); arrayTaski.RequestTime = a; arr

5、ayTaski.StartTime = 0; arrayTaski.EndTime = 0; arrayTaski.RunTime = 0; arrayTaski.status = 0; int fcfs() int i,j,w; for(i = 0; i = 4; i+) if(arrayTaski.status = 0) t = arrayTaski.ArriveTime; w = 1; if(w = 1) break; for(i = 0; i = 4; i+) if(arrayTaski.ArriveTime t & arrayTaski.status = 0) t = arrayTa

6、ski.ArriveTime; for(i = 0; i = 4; i+) if(arrayTaski.ArriveTime = t) return i; /選擇排序,先找到第一個沒有執行的任務,然后再對所有任務遍歷,找到到達時間最小的任務,返回該任務,執行之 /函數目的:用先來先服務策略,找到當前需要執行的任務int sjf() int i,x=0,a=0,b=0; float g; for(i=0;i=4;i+) if(arrayTaski.status = 1) g = arrayTaski.EndTime; x = 1; if (x=0) t = arrayTask0.ArriveTi

7、me; for(i=0;i=4;i+) if(arrayTaski.ArriveTime t) t=arrayTaski.ArriveTime; a=i; return a; else for(i = 0; i g) g = arrayTaski.EndTime; for(i = 0; i = 4; i+) if(arrayTaski.status = 0 & arrayTaski.ArriveTime = g) t = arrayTaski.RequestTime; a = i; b = 1; if(b != 0) for(i = 0; i = 4; i+) if(arrayTaski.st

8、atus = 0 & arrayTaski.ArriveTime = g & arrayTaski.RequestTime t) t = arrayTaski.RequestTime; a = i; return a; else for(i = 0; i = 4; i+) if(arrayTaski.status = 0) t = arrayTaski.ArriveTime; for(i = 0; i = 4; i+) if(arrayTaski.status = 0 & arrayTaski.ArriveTime t) t = arrayTaski.ArriveTime; a = i; re

9、turn a; void new_n(int s) int i, g = 0; for(i = 0; i = 4; i+) /查找是否有進程未執行,如果沒有,令g=0,如果有,令g=1;if(arrayTaski.status=0) continue; else g=1; break; if(g=0) /當前進程為最后一個進程 arrayTasks.StartTime=arrayTasks.ArriveTime; arrayTasks.EndTime=arrayTasks.RequestTime+arrayTasks.ArriveTime; arrayTasks.RunTime=arrayTa

10、sks.RequestTime; arrayTasks.status=1; g=2; if(g=1) arrayTasks.status=1; /將該進程執行 for(i=0;i=4;i+) if(arrayTaski.status=1) d=arrayTaski.EndTime;/找到一個進程的結束時間 for(i=0;id&arrayTaski.status=1) d=arrayTaski.EndTime; /找到這幾個進程的最晚結束時間 if(arrayTasks.ArriveTime0) printf(enter the pname:); scanf(%s,str); printf(e

11、nter the need time:); scanf(%d,&t); head=p=(QUEN*)malloc(sizeof(QUEN); strcpy(p-pname,str); p-time1=t; p-time2=0; p-state=R; p-next=NULL; head=p; getchar(); -d; /建立頭結點,并初始化while(d0) printf(enter the pname:); scanf(%s,str); printf(enter need time:); scanf(%d,&t); q=(QUEN *)malloc(sizeof(QUEN); strcpy

12、(q-pname,str); q-time1=t; q-time2=0; q-state=R; q-next=NULL; p-next=q; p=q; -d; p-next=head; q=head; /頭插法建立鏈表printf(process name need time runned staticn); do printf( %s%d %d %cn,q-pname,q-time1,q-time2,q-state); q=q-next; while(q!=head); printf(n); do if(head-time2time1) head-time2+; /基于時間片,一次+操作,就

13、是一次的時間片 if(head-time2=head-time1) head-state=END; q=head; printf(The running process is %sn,q-pname); printf(process name left time runned staticn); doprintf( %s %d %d %cn,q-pname,q-time1,q-time2,q-state); q=q-next; while(q!=head); printf(n);head=head-next; q=head; p-next=head; else printf(The runni

14、ng process is %sn,q-pname); printf(process name left time runned staticn); do printf(%s%d%d%cn,q-pname,q-time1,q-time2,q-state); q=q-next;while(q!=head); printf(n); head=head-next; q=head; p=p-next; printf(Is it needing new process?(y or n)n); getchar(); scanf(%c,&f); if(f=Y|f=y) getchar(); printf(E

15、nter the new pname:); scanf(%s,str); printf(Enter the new neededtime:); scanf(%d,&t); m=(QUEN *)malloc(sizeof(QUEN); strcpy(m-pname,str); m-time1=t; m-time2=0; m-state=R; m-next=NULL; if(q-next-state=E) p=m; head=m;p-next=head; q=head; else p-next=m; m-next=head; p=m; while(q-next-state!=E); printf(

16、The processes are finishedn);int main(void) int i,b,k,c = 0; char a; int d4;/clrscr(); /cls(); printf(t 1. FCFS n); printf(t 2. SFJ n); printf(t 3. EXIT n); printf(t 4. cl n); for(i = 0; ; i+) if(c)break; printf(please input the number a:n); scanf(%d, &a); switch(a) case 3:c = 1;break; case 1:printf

17、(please input the different-Arrive Time of arrayTasksn);GetTask(); printf(*the result of fcfsn); printf(NumbertArrivetServertStarttFinishtTurnovetTake power turnover timen); for(b = 0; b = 4; b+) k = fcfs(); db = k; new_n(k); for(b = 0; b = 4; b+) Printresult(db); continue; case 2:printf(please input the different-RequestTime of arrayTasksn); GetTask(); printf(*th

溫馨提示

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

評論

0/150

提交評論