基於DOS的多工系統的實現 杭電 2014

2021-06-21 17:08:10 字數 2628 閱讀 6612

一共演示了兩個例子,乙個利用pv操作實現讀者寫者問題,還有乙個是執行緒通訊。

用的編譯器是tc,就是實驗室的,用其他編譯器會報錯。執行一段時間會停止,按任意鍵即可繼續執行。

#include#include#include#define ntcb  10 /* 系統允許執行的最大執行緒數*/

/* 狀態碼常量定義*/

#define finished 0 /* 表示執行緒處於終止態或tcb是空白狀態 */

#define running 1 /* 表示執行緒牌執行態 */

#define ready 2 /* 表示執行緒處於就緒 */

#define blocked 3 /* 表示執行緒處於阻塞態 */

#define clock_num 5 /* 每個執行緒所執行的時鐘數 */

#define ntext 1000 /* 訊息長度 */

#define nbuff 5 /* 空閒緩衝區最大數量 */

#define get_indos 0x34

#define get_crit_err 0x5d06

char far *indos_ptr =0;

char far *crit_err_ptr=0;

int current; /* 當前程序tcb的下標 */

int timecount; /* 時鐘中斷次數 */

typedef structsemaphore;

struct buffer;

struct buffer *freebuf;/* 空閒緩衝區 */

semaphore mutexfb;

semaphore sfb;/*空閒緩衝區的訊號量*/

semaphore full,empty,mutex; /* 用於讀者寫者問題 */

int pro=0;/* 產品數量 */

struct tcbtcb[ntcb];

struct int_regs;

int dobusy(void);

typedef int(far *codeptr)(void);

void interrupt swtch();

void initdos(void);

int dobusy(void);

void interrupt (*old_int8)(void);/*原來的時間中斷程式,需要先宣告*/

void tcbstate();

void mysleep();

void interrupt new_int8()

int isfinished()

void interrupt swtch()

} void block(struct tcb **pptcb)

tmp->next=&tcb[current];

}swtch();

enable();

} void wakeup(struct tcb **pptcb)

void p(semaphore *sem)

enable();

} void v(semaphore *sem)

struct buffer *getbuf(void)

void insert(struct buffer **mq,struct buffer *buff)

} void send(char *receiver,char *a,int size)

struct buffer* remo(struct buffer **mq,int sender)

if(front==*mq)

*mq=(*mq)->next;

else

rear->next=rear->next->next;

return front;

}int receive (char *sender,char *str)

tmp->next=buff;

}v(&sfb);

enable();

}int fun1(void)

} int fun2(void)

}int main()

setvect(8,old_int8);

printf("all threads is finished\n");

getch();

}void tcbstate()

}void initdos(void)

}int dobusy(void)

void mysleep()

執行結果

將fun1,fun2改下就可以了,功能都已經在上面的**實現了,fun1,fun2只是乙個演示。

int fun1(void)

printf("thread1 send meesage over\n");

}int fun2(void)

}

執行結果

作業系統課程設計 基於DOS的多工系統的實現

內容要求 1 用c語言完成執行緒的建立和撤銷,並按先來先服務方式對多個執行緒進行排程。2 將執行緒排程演算法修改為時間輪轉演算法,實現時間片輪轉排程。3 改變時間片的大小,觀察結果的變化。4 假設兩個執行緒共用一軟體資源 如某一變數,或某一資料結構 請用記錄型訊號量來實現對它的互斥訪問。5 假設有兩...

多工作業系統的任務切換

在學習os時,對於多工作業系統的任務切換,一直不能理解 控制權是怎麼麼回到排程程式上的?記得在描述任務切換時,一般都是這麼描述的 在每乙個時鐘滴答,都將檢查當前程序是否是乙個運 行超過100毫秒的使用者程序。如果是,則呼叫排程程式來檢視是否有另乙個使用者程序在等待cpu,我這裡舉個例子 我用 寫了乙...

對多工程式設計的一些實現 基於Python

以下內容如有錯誤請指出 什麼是程序?程序 程式在計算機中的一次執行,程式是靜態的,程序是動態的過程,具有一定的生命週期 程序的狀態 孤兒程序 父程序先於子程序退出,子程序成為了孤兒 殭屍程序 子程序先於父程序退出,但是父程序未處理子程序的退出狀態,子程序成為了殭屍 殭屍程序的3種解決辦法 1.使用o...