內容要求:
(1)用c語言完成執行緒的建立和撤銷,並按先來先服務方式對多個執行緒進行排程。
(2)將執行緒排程演算法修改為時間輪轉演算法,實現時間片輪轉排程。
(3)改變時間片的大小,觀察結果的變化。
(4)假設兩個執行緒共用一軟體資源(如某一變數,或某一資料結構),請用記錄型訊號量來實現對它的互斥訪問。
(5)假設有兩個執行緒共享乙個可存放5個整數的緩衝,其中乙個執行緒不停地計算1至50的平方,並將結果放入緩衝,另乙個執行緒不斷地從緩衝中取出結果,並將它們列印出來,請用記錄型訊號量來實現這一生產者和消費者的同步問題。
(6)實現訊息緩衝通訊。
**執行環境:turbo c
#include #include #include #include #include /* 狀態碼常量定義 */
#define finished 0 /* 表示執行緒處於終止態或者tcb是空白狀態 */
#define running 1 /* 表示執行緒處於執行態 */
#define ready 2 /* 表示執行緒處於就緒態 */
#define blocked 3 /* 表示執行緒處於阻塞態 */
#define ntcb 10 /* ntcb是系統允許的最多工數 */
#define ntext 20 /* 文字大小 */
#define nbuf 5 /* 緩衝區大小 */
#define nstack 1024 /* 私有棧大小 */
#define get_indos 0x34
#define get_crit_err 0x5d06
char far *indos_ptr = 0; /* 該指標變數存放indos標誌的位址 */
char far *crit_err_ptr = 0; /* 該指標變數存放嚴重錯誤標誌的位址 */
int timecount = 0;
int tl; /* time slice時間片 */
int current = -1; /* 當前程序的tcb下標 */
int n = 0;
typedef int (far *codeptr)(void); /* 定義乙個函式指標型別 */
void interrupt(*old_int8)(void);
/* 記錄型訊號量 */
typedef structsemaphore;
semaphore mutex = ;
semaphore mutexfb = ; /* 緩衝區互斥訊號量 */
semaphore sfb = ; /* 計算訊號量 */
semaphore empty = ;
semaphore full = ;
/* 訊息緩衝區 */
struct bufferbuf[nbuf], *freebuf;
struct tcb tcb[ntcb];
struct int_regs;
int intbuf[nbuf], buftemp;
int in = 0, out = 0;
void over();
void destroy(int id);
void wait(semaphore *sem);
void signal(semaphore *sem);
void block(struct tcb **qp);
void wakeupfirst(struct tcb **qp);
void send(char *receiver, char *a, int size);
int receive(char *sender, char *b);
void initdos(void)
}/* dosbusy(): 函式功能是獲得indos標誌及嚴重錯誤標誌的值,判斷是否dos忙; */
/* 如果返回值是1,表示dos忙; */
/* 如果返回值是0,表示dos不忙; */
/* 如果返回值是-1,表示還沒有呼叫initdos() */
int dosbusy(void)
/* 初始化tcb */
void inittcb()
}void f1(void)
}void f2(void)
}void f3(void)
}void f4()
}void f5()
}void prdc()
}void cnsm()
}void sender(void)
receive("receiver",a);
if (strcmp(a,"ok")!=0)else
printf("committed,communication is finished!\n");/*傳送者得到接收者的確認,通訊結束*/
}void receiver(void)
void interrupt swtch()
void destroy(int id)
void over()
int finished()
void free_all(void)
enable();
}void signal(semaphore *sem)
enable();
}void block(struct tcb **qp)
tcb[id].next = null;
swtch();
}void wakeupfirst(struct tcb **qp)
void initbuf()
buf[i].next = null;
freebuf = &buf[0];
}struct buffer *getbuf()
void insert(struct buffer **mq, struct buffer *buff)
}void send(char *receiver, char *a, int size)
} if(id == -1)
wait(&sfb);
wait(&mutexfb);
buff = getbuf();
signal(&mutexfb);
buff->id = current;
buff->size = size;
buff->next = null;
strcpy(buff->text, a);
wait(&tcb[id].mutex);
insert(&tcb[id].mq, buff);
signal(&tcb[id].mutex);
signal(&tcb[id].sm);
enable();
}struct buffer *remov(struct buffer **mq, int sender)
if(p->id == sender)
else
return null;
}int receive(char *sender, char *b)
} if(id == -1)
wait(&tcb[current].sm);
wait(&tcb[current].mutex);
buff = remov(&(tcb[current].mq), id);
signal(&tcb[current].mutex);
if(buff == null)
strcpy(b, buff->text);
wait(&mutexfb);
insert(&freebuf, buff);
signal(&mutexfb);
signal(&sfb);
enable();
return buff->size;
}void main()
while(select < 0 || select > 7);
switch(select)
while(!finished())
;setvect(8, old_int8); }
free_all();
tcb[0].name[0] = '\0';
tcb[0].state = finished;
printf("\nmulti task system terminated.\n");
getch();
}
作業系統課程設計
實驗 一 程序管理與程序同步 實驗目的 了解程序管理的實現方法,理解和掌握處理程序同步問題的方法並完成程式設計。實驗內容 實現銀行家演算法 程序排程的過程模擬。實驗步驟 理解銀行家演算法的核心機制 設計相應資料結構 程式設計實現 測試。理解程序的三狀態排程過程 設計排程演算法 程式設計實現 測試。實...
作業系統課程設計
1 實驗內容 學習程序管理的設計與實現,學習和運用作業系統原理,設計乙個作業系統子系統的模擬系統。通過該系統的設計除錯可增加對作業系統實現的感知性。設計乙個允許n個程序併發執行的程序管理的模擬系統。該系統包括簡單的程序控制 同步及通訊機構,其程序排程演算法可任意選擇。分析系統所需的資料結構 演算法的...
作業系統課程設計 模擬作業系統
程序管理主要包括程序排程,程序的建立和撤銷 程序的阻塞和喚醒,中斷作用的實現。用全域性變數模擬重要暫存器,如cpu重要暫存器,程式狀態暫存器psw 指令暫存器ir,程式計數器pc,資料緩衝暫存器dr等。中斷的發現應該是硬體的工作,這裡在函式cpu中加檢測psw的方式來模擬。在cpu 函式中,每執行一...