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

2021-06-16 08:05:39 字數 4171 閱讀 9520

內容要求:

(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 函式中,每執行一...