




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、#include<stdio.h>#include<stdlib.h>#include<dos.h>#include<string.h>/*狀態(tài)碼*/#define NTCB 5/*TCB 的數(shù)量*/#define NTEXT 60/*線程通信緩沖區(qū)文本內容的大小*/#define NBUF 10/*緩沖區(qū)的個數(shù)*/*線程的五種狀態(tài)*/#define START -1#define FINISHED 0#define RUNNING 1#define READY 2#define BLOCKED 3#define timeout 1/*線程時間片
2、輪轉的時間*/typedef int(far *codeptr)(void);/*函數(shù)指針定義*/*DOS的初始化狀態(tài)碼*/#define GET_INDOS 0x34#define GET_CRIT_ERR 0x5d06struct bufferint sender;int size;char textNTEXT;struct buffer *next;*freebuff;/*消息緩沖區(qū)的定義*/typedef struct int value;struct TCB *wq;semaphore ;/*記錄型信號量定義*/struct TCBunsigned char *stack;unsig
3、ned ss;unsigned sp;char state;char name10;struct buffer *mq ;/*消息隊列排隊使用*/semaphore mutex ;/*互斥信號量,用于對TCB消息隊列處理時互斥*/semaphore sm ;/*消息隊列的計數(shù)信號亮*/struct TCB *next; tcbNTCB;/*線程控制塊定義*/struct int_regsunsigned bp;unsigned di;unsigned si;unsigned ds;unsigned es;unsigned dx;unsigned cx;unsigned bx;unsigned
4、ax;unsigned ip;unsigned cs;unsigned flags;unsigned off;unsigned seg;/*線程私有堆棧的數(shù)據(jù)結構的定義*/char far *indos_ptr=0;char far *crit_err_ptr=0;union REGS regs;struct SREGS segregs;int currenttcb=-1;/*初始化TCB的值*/int timecount=0;/*時間計數(shù)初始為0*/semaphore sfb = NBUF, NULL;/*空閑緩沖區(qū)的同步信號量*/semaphore mutexfb = 1, NULL;/*
5、對空閑緩沖區(qū)處理的互斥信號量*/semaphore fmutex=0,NULL;/*F1和F2的同步信號量*/void InitBuff(void);/*初始化消息緩沖區(qū)*/int DosBusy(void); /* DosBusy Function return non_zero if DOS is busy*/void InitInDos(void);/*InitInDosFuntion to get the addresses of INDOS and CRIT_ERR flags */void InitTcb(void);/*初始化TCB*/void interrupt (*old_i
6、nt8)(void);/*舊的時鐘中斷處理程序*/void interrupt new_int8(void);/*新的時鐘中斷處理程序 */int create(char *name,codeptr code,int stacklen);/*創(chuàng)建線程*/void tcb_state(void);/*線程狀態(tài)函數(shù)*/int Seeknext(void);/*尋找下一個就緒線程*/void interrupt cpu_switch(void);/*CPU調度函數(shù)*/int all_finished();/*判斷所有線程是否完成*/void Destroy(int i);/*銷毀一個線程*/void
7、 over(void);/*結束一個線程*/void wait(semaphore *sem);/*P操作*/void signal(semaphore *sem);/*v操作*/void block(struct TCB *qp);/*阻塞函數(shù)*/void wakeup(struct TCB *qp);/*喚醒函數(shù)*/void f1(void);/*函數(shù)F1*/void f2(void);/*函數(shù)F2*/void insert(struct buffer *mq,struct buffer *buff);/*將buff所指的緩沖區(qū)插到*mq所指的緩沖隊列末尾*/void send(char
8、*receiver,char *a,int size);/*發(fā)送一個消息給receiver*/void receive(void);/*接收消息*/void returnTCBbuff(struct buffer *buff);/*歸還已經(jīng)接收信息的消息塊到空閑消息緩沖區(qū)中去*/struct buffer *getbuff(void);/*獲得一個空閑消息塊*/struct buffer *getmessage(struct buffer *qp);/*從消息隊列上獲得消息*/main() InitBuff();InitInDos();InitTcb();old_int8=getvect(8)
9、;/*獲取系統(tǒng)原來的INT 08H 的入口地址并將它保存起來*/*創(chuàng)建0#線程*/strcpy(,"main");tcb0.state=RUNNING;currenttcb=0;create("f1",(codeptr)f1,1024);create("f2",(codeptr)f2,1024);tcb_state();/*啟動多個線程的并發(fā)執(zhí)行*/setvect(8,new_int8);/*調用新的時間片函數(shù) new_int8(void)*/cpu_switch(); while(!all_finished();/
10、*終止多任務系統(tǒng)*/0='0'tcb0.state=FINISHED;setvect(8,old_int8);tcb_state();printf("n Multi_task system terminated.n");getchar();void InitBuff(void)int i;struct buffer *temp1, *temp2 ;/*在堆上分配各個消息塊的空間*/temp1 = (struct buffer *)malloc(sizeof(struct buffer);freebuff = temp1 ; for(i =
11、0 ; i < NBUF ; i +) /*鏈接成一個隊列*/temp2 = (struct buffer *)malloc(sizeof(struct buffer) ;temp1->next = temp2 ;temp1 = temp2 ;temp1->next = NULL ;void InitInDos(void)/* get the address of INDOS flags */regs.h.ah=GET_INDOS;intdosx(®s,®s,&segregs);indos_ptr=MK_FP(segregs.es,regs
12、.x.bx);/* get the address of CRIT_ERR flag */if(_osmajor<3)crit_err_ptr=indos_ptr+1;else if(_osmajor=3&&_osminor=0)crit_err_ptr=indos_ptr-1;else regs.x.ax=GET_CRIT_ERR; intdosx(®s,®s,&segregs); crit_err_ptr=MK_FP(segregs.ds,regs.x.si); int DosBusy(void) if(indos_ptr&
13、&crit_err_ptr)return (*indos_ptr|*crit_err_ptr);else return (-1); /* InitInDos() hasn't been called*/void InitTcb(void)/*TCB的初始化*/ int i; for(i=0;i<NTCB;i+) tcbi.state=START; 0='0' tcbi.next=NULL; tcbi.mq=NULL; tcbi.mutex.value=1; tcbi.mutex.wq=NULL; tcbi.sm.value=0; tcbi
14、.sm.wq=NULL; int create(char *name,codeptr code,int stacklen)int freetcb;struct int_regs *stack;for(freetcb=1;freetcb<NTCB;freetcb+)if(tcbfreetcb.state=START|tcbfreetcb.state=FINISHED)break;if(freetcb=NTCB)printf("nCreate was failed!n");return (-1);tcbfreetcb.state=READY; strcpy(tcbfree
15、,name);tcbfreetcb.stack=(unsigned *)malloc(stacklen);tcbfreetcb.stack=tcbfreetcb.stack+stacklen;stack=(struct int_regs *)tcbfreetcb.stack-1;stack->ds=_DS;stack->es=_ES;stack->flags=0x200;stack->ip=FP_OFF(code);stack->cs=FP_SEG(code);stack->off=FP_OFF(over);stack->seg=FP_
16、SEG(over);tcbfreetcb.ss=FP_SEG(stack);tcbfreetcb.sp=FP_OFF(stack);return freetcb;void tcb_state(void)int i;for(i=0;i<NTCB;i+) switch(tcbi.state) case START: printf("n tcb%d %s's state is starting;",i,); break; case FINISHED: printf("n tcb%d %s's state is finished;&
17、quot;,i,); break; case RUNNING: printf("n tcb%d %s's state is running;",i,); break; case READY: printf("n tcb%d %s's state is ready;",i,); break; case BLOCKED: printf("n tcb%d %s's state is ready;",i,); break; printf("
18、;n");void wait(semaphore *sem)struct TCB *qp;disable();sem->value=sem->value-1;if(sem->value<0)qp=&(sem->wq);block(qp);enable();void signal(semaphore *sem)struct TCB *qp;disable();qp=&(sem->wq);sem->value=sem->value+1;if(sem->value<=0)wakeup(qp); enable();v
19、oid block(struct TCB *qp)struct TCB *temp;temp=(*qp);disable();tcbcurrenttcb.state=BLOCKED;if(*qp)=NULL) (*qp)=&tcbcurrenttcb;elsewhile(temp->next!=NULL)temp=temp->next; temp->next=&tcbcurrenttcb;tcbcurrenttcb.next=NULL; cpu_switch(); enable();void wakeup(struct TCB *qp)struct TCB *
20、 temp;temp=(*qp);if(temp!=NULL)(*qp)=(*qp)->next;temp->state=READY;temp->next=NULL; void insert(struct buffer *mq,struct buffer *buff)struct buffer *temp;if(buff=NULL) return;buff->next=NULL;if(*mq=NULL)*mq=buff;elsetemp=*mq;while(temp->next!=NULL)temp=temp->next; temp->next=buf
21、f;void returnTCBbuff(struct buffer *buff)struct buffer *temp ;temp = freebuff ;while(temp->next != NULL)temp = temp->next ;temp->next = buff ;void send(char *receiver,char *a, int size)struct buffer *buff;int i,id=-1;disable();for(i=0;i<NTCB;i+)if(strcmp(receiver,)=0)id=i; break
22、;if(id=-1)printf("Error: Receiver not exit!n");enable();return; wait(&sfb); wait(&mutexfb); buff=getbuff(); signal(&mutexfb); buff->sender=currenttcb; buff->size=size; buff->next=NULL; strcpy(buff->text,a); wait(&tcbid.mutex); insert(&(tcbid.mq),buff); signa
23、l(&tcbid.mutex); signal(&tcbid.sm); enable();void receive(void) struct buffer *buff = NULL;disable();if(tcbcurrenttcb.mq = NULL)/*當TCB中的消息隊列為空時*/printf("There is no massage in %s 's message buff!n", );return ;wait(&tcbcurrenttcb.sm);/*實現(xiàn)TCB中發(fā)送與接收消息的同步*/sig
24、nal(&tcbcurrenttcb.mutex);/*實現(xiàn)對TCB中取消息的互斥操作*/buff = getmessage(&(tcbcurrenttcb.mq);signal(&tcbcurrenttcb.mutex);printf("%s receive a message from %s: %sn ", , tcbbuff->,buff->text);wait(&mutexfb);/*實現(xiàn)對空閑消息緩沖區(qū)的互斥操作*/returnTCBbuff(buff);sign
25、al(&mutexfb);signal(&sfb);void interrupt cpu_switch(void)disable();tcbcurrenttcb.ss=_SS;tcbcurrenttcb.sp=_SP;if(tcbcurrenttcb.state=RUNNING)tcbcurrenttcb.state=READY; currenttcb=Seeknext();tcbcurrenttcb.state=RUNNING; _SS=tcbcurrenttcb.ss; _SP=tcbcurrenttcb.sp;enable();struct buffer *getbuff
26、(void)struct buffer *buff;buff=freebuff;freebuff=freebuff->next;return(buff);struct buffer *getmessage(struct buffer *qp)struct buffer *temp;temp = (*qp) ;(*qp) = (*qp)->next ;temp->next = NULL ;return(temp);int Seeknext(void)int i,ks;i=currenttcb+1; ks=0;disable();while(ks<NTCB)if(tcbi.state=READY)return i;i+;ks+;i=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房產(chǎn)代持合同協(xié)議書范本
- 汽車內飾配件采購合同
- 離婚后住房分配合同樣本
- 二手施工設備購銷合同
- 家族遺產(chǎn)分配合同
- 借款擔保反擔保合同樣本
- 學校裝修合同案例
- 門面房屋買賣合同
- 太陽能發(fā)電政策考核試卷
- 新材料在新能源領域的應用考核試卷
- 中央2025年中國科協(xié)所屬單位招聘社會在職人員14人筆試歷年參考題庫附帶答案詳解-1
- 殯儀服務員職業(yè)技能鑒定考試題(附答案)
- 電動葫蘆吊裝方案計劃
- 2025年山東電工電氣集團招聘筆試參考題庫含答案解析
- 造價咨詢服務方案進度計劃安排及保證措施
- 2024年認證行業(yè)法律法規(guī)及認證基礎知識 CCAA年度確認 試題與答案
- 2024年濰坊工程職業(yè)學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- JIS C9335-1-2014 家用和類似用途電器.安全性.第1部分:通用要求
- 甲溝炎治療的護理與預防
- 哈工大微電子工藝緒論01單晶硅
- 供養(yǎng)直系親屬有關文件
評論
0/150
提交評論