亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? duoxiancheng.c

?? 基于線程的多任務系統的實現
?? C
字號:
# include "stdio.h"
# include "malloc.h"
# include "stdlib.h"
# include "dos.h"
# include "time.h"

# define GET_INDOS 0x34
# define GET_CRIT_ERR 0x5d06
# define INT_MIN  -32768
# define START -1
# define FINISHED 0
# define RUNNING 1
# define READY 2
# define BLOCKED 3
# define NTCB 10
# define NTEXT 100

int timecount = 0;  /*時間片的初始值*/
int TLE = 2;  /*時間片的最大值*/
int current=-1; /*目前的線程標識*/

char far *indos_ptr = 0;
char far *crit_err_ptr = 0;


/*記錄型信號量的數據結構*/
typedef struct
{
    int value;
    struct TCB *wq;
}semaphore;

struct TCB
{
    unsigned char *stack;/*堆棧的起始地址*/
    unsigned ss;/*堆棧段址*/
    unsigned sp;/*堆棧指針*/
    char state ;/*進程狀態*/
    char name[10];/*線程的外部表示符*/
    int value;
    struct buffer *mq;
    semaphore mutex;
    semaphore sm;
    struct TCB* next;
}tcb [NTCB];

struct buffer
{
    int sender ;/* 消息發送者的標識數*/
    int size;   /*消息長度<= NEXT個字節*/
    char text[NTEXT];/*消息正文*/
    struct buffer *next; /*指向下個消息緩沖區的指針*/
};

/*定義一個空閑指針*/
struct buffer *freebuf;

/*現場保護和恢復的堆棧*/
struct int_regs  
{
    unsigned BP;
    unsigned DI;
    unsigned SI;
    unsigned DS;
    unsigned ES;
    unsigned DX;
    unsigned CX;
    unsigned BX;
    unsigned AX;
    unsigned IP;
    unsigned CS;
    unsigned Flags;
    unsigned off;
    unsigned seg;
    
};

/*定義一個互斥信號量*/
semaphore mutexfb ={1,NULL};

/*定義一個同步信號量*/
semaphore sfb = {NTCB,NULL};

void over();
typedef int (far * codeptr)(void);
int create (char *name,codeptr code,int stacklen,int value);
void interrupt (*old_int8)(void);
void interrupt swtch(void);
int DosBusy(void);
void InitInDos(void);
void tcb_state(void);
void send(char * receicer,char *a,int size);
void receive(char *sender,char *a);
void return_buff(struct buffer *buffer);
void p(semaphore *sem);
void v(semaphore *sem);
void f1(void);
void f1(void);
void f3(void);
void f4(void);
int find();
void InitTcb();
int all_finished();
void return_buff(struct buffer *buffer);
void block(struct TCB **qp);
void wakeup_first(struct TCB **qp);
/*InitInDos
*Function to get the address of INDOS and CRIT_ERR flags
*/

void InitInDos(void)
{
    union REGS regs;
    struct SREGS segregs;
    
    /*get the address of INDOS flag*/
    regs.h.ah =  GET_INDOS;
    intdosx(&regs,&regs,&segregs);
    indos_ptr = MK_FP(segregs.es,regs.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(&regs,&regs,&segregs);
        crit_err_ptr = MK_FP(segregs.ds,regs.x.si);
    }
}

/*DosBusy
*Function return non_zero if DOS is busy
*/
int DosBusy(void)
{
    if(indos_ptr && crit_err_ptr)
        return (*indos_ptr || *crit_err_ptr);
    else
        return (-1);/*InitDos()hasn't been called*/
}

void f1(void)
{
    long  i,j,k;
    for(i = 0;i < 10;i++)
    {
        printf("a");
        for(j = 0;j < 5000;j++)     /*用于延時操作*/
            for(k = 0;k < 5000; k++) ;
    }
    printf("\n");
}

void f2(void)
{
    long i,j,k;
    for(i=0; i<15; i++)
    {
        printf("b");
        for(j = 0;j <6000;j++)  /*用于延時操作*/
            for(k = 0;k < 6000;k++)  ;
    }
    printf("\n");
}

void f3(void)
{
    int j,k;
    int size = 11;
    char *a = "xiaobenniao";
    char *receiver = "receiver";
    send(receiver,a, size);
    for(j=0; j<7000; j++)  /*用于延時操作*/
            for(k=0; k<7000; k++)
            {}  ;
}

void f4(void)
{
    int j,k;
    char a[88];
    receive("sender",a);
    printf("%s",a);
    for(j=0; j<8000; j++)  /*用于延時操作*/
            for(k=0; k<8000; k++)
            {}  ;
}
/*typedef int (far * codeptr)(void); */
int create (char *name,codeptr code,int stacklen,int value)
{
    int i;
    struct int_regs * tmp;
    for(i=1; i<NTCB ; i++)
    {
        if(tcb[i].state == START || tcb[i].state == FINISHED)
            break;
        else if (tcb[i].state == READY ||tcb[i].state == BLOCKED)
            continue;
        else printf("no available\n");
    }
    strcpy (tcb[i].name,name);
    tcb[i].stack = (unsigned char*)malloc(stacklen);
    /*tcb[num].stack += stacklen;*/
    tcb[i].value = value;
    tmp=(struct int_regs *)(tcb[i].stack+stacklen)-1;
    
    tmp->DS=_DS;
    tmp->ES=_ES; 
    tmp->Flags=0x200;
    tmp->CS=FP_SEG(code);
    tmp->IP=FP_OFF(code);
    tmp->off=FP_OFF(over);
    tmp->seg=FP_SEG(over);
    
    tcb[i].ss=FP_SEG(tmp);
    tcb[i].sp=FP_OFF(tmp);
    tcb[i].state=READY;
    tcb[i].value= value;
    return;
    
};

void over()
{
    if(tcb[current].state==RUNNING)
    {
        disable();
        tcb[current].state=FINISHED;
        free(tcb[current].stack);
        enable();
    }
    swtch();
}

int find()
{  int i,j = 0;
int v = INT_MIN;
for(i = 1;i < NTCB;i++)
{
    if(i == current )   continue ;
    if(tcb[i].state == READY )
    {
        if(v < tcb[i].value)
        {
            v = tcb[i].value;
            j = i;
        }
    }
}
for(i=1; i<j; i++)
   tcb[i].value = tcb[i].value+5;
for(i=j+1; i<NTCB; i++)
  tcb[i].value = tcb[i].value+5;
  tcb[j].value = tcb[j].value-5;

return j;
/*  if(current == 0) return 2;
if(current == 1) return 2;
if(current == 2) return 1;
return 0;
*/
}

/*中斷函數*/
void interrupt swtch(void)
{
    
    disable();
    /*保存現行堆棧的段址和棧頂供下次切換時用*/
    tcb[current].ss=_SS;
    tcb[current].sp=_SP;
    if(tcb[current].state==RUNNING) tcb[current].state=READY;
    /*切換堆棧*/
    current=find();
    /* printf("%d",current);     */
    _SS=tcb[current].ss;
    _SP=tcb[current].sp;
    tcb[current].state=RUNNING;
    enable();
};
/*時間片的調度*/
void interrupt new_int8(void)
{
    (*old_int8)();
    timecount++;
   
    if(timecount >= TLE)
    {
        if(!DosBusy())
        {
            disable();
            
            tcb[current].ss = _SS;
            tcb[current].sp = _SP;
            if(tcb[current].state == RUNNING) tcb[current].state = READY;
            current = find();
            /*printf("%d",current);  */
            _SS = tcb[current].ss;
            _SP = tcb[current].sp;
            tcb[current].state = RUNNING;
            timecount = 0;
            
            enable();
        }
    }
    return;
}
/*初始化TCB*/
void InitTcb()
{int i;
for(i =0;i < NTCB ;i++ )
{
    tcb[i].state = START;
    tcb[i].mq=NULL;
    tcb[i].mutex.value=1;
    tcb[i].mutex.wq=NULL;
    tcb[i].sm.value=0;
    tcb[i].sm.wq=NULL;
}
}
/*TCB的狀態函數*/
void tcb_state(void)
{int i;
for(i = 1;i <= (NTCB-1);i++)
{
    if(tcb[i].state == START ) printf("The %dst thread hasnot been created!\n",i);
    else if (tcb[i].state == READY) printf("The %dst thread has been created!\n",i);
    else if (tcb[i].state == BLOCKED) printf("The %dst thread has been blocked!\n",i);
    else if (tcb[i].state == FINISHED) printf("The %dst thread has been finished!\n",i);
    
}
}
/*檢查所有的線程是否都已經結束*/
int all_finished()
{
    int i;
    for(i = 1;i < NTCB; i++)
    {
        if(tcb[i].state != FINISHED&&tcb[i].state != START  )
            return 0;
    }
    
    return 1;
}

/*從空閑消息緩沖對列列頭*/
struct buffer *getbuf(void)
{
    struct buffer *buff;
    buff = freebuf;
    freebuf = freebuf->next;
    return(buff);
}

void insert(struct buffer **mq,struct buffer *buff)
{
    struct buffer * temp;
    
    if(buff == NULL) return;
    buff->next = NULL;
    if(*mq == NULL)
        *mq = buff;
    else
    {
        temp = *mq;
        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=1; i<NTCB; i++)
    {
        if(strcmp(receiver,tcb[i].name) == 0)
        {
            id = i;
            break;
        }
    }
    if(id == -1)
    {
        printf("Error:Receiver not exist\n");
        enable();
        return;
    }
    
    p(&sfb);
    p(&mutexfb);
    buff = getbuf();
    v(&mutexfb);
    
    buff->sender = current;
    buff->size = size;
    buff->next = NULL;
    for(i=0; i<buff->size; i++,a++)
        buff->text[i] = *a;
    
    p(&tcb[id].mutex);
    insert(&(tcb[id].mq),buff);
    v(&tcb[id].mutex);
    v(&tcb[id].sm);
    
    enable();
}

void receive(char *sender,char *a)
{
    struct buffer *buff, *q;
    int i,id = -1;
    p(&tcb[current].sm);
    
    disable();
    for(i=0; i<NTCB; i++)
        if(strcmp(sender,tcb[i].name) == 0)
        {
            id = i;
            break;
        }
        if(id == -1)
        {
            printf("\nThe %s is not exist!",sender);
            enable();
            return;
        }
        p(&tcb[current].mutex);
        for(buff=tcb[current].mq; buff!=NULL; q=buff,buff=buff->next)
            if(buff->sender == id)
                break;
            for(i=0; i<buff->size; i++,a++)
                *a = buff->text[i];
            *a='\0';
            q->next = buff->next;
            v(&tcb[current].mutex);
            p(&mutexfb);
            return_buff(buff);/*還沒有寫這個函數*/
            v(&mutexfb);
            v(&sfb);
            
            enable();   
}

void p(semaphore *sem)
{
    struct TCB **qp;
    
    disable();
    
    sem->value = sem->value-1;
    if(sem->value < 0)
    {
        qp = &(sem->wq);
        block(qp);
    }
    
    enable();
}

void v(semaphore *sem)
{
    struct TCB **qp;
    
    disable();
    
    qp = &(sem->wq);
    sem->value = sem->value+1;
    if(sem->value <= 0)
        wakeup_first(qp);
    
    enable();
}

/*申請空的緩沖區*/
void apply_for()
{
    int i;
    struct buffer *temp,*p;
    freebuf = (struct buffer *)malloc(sizeof(struct buffer ));
    temp = freebuf;
    for(i=1; i<NTCB; i++)
    {
        p = (struct buffer *)malloc(sizeof(struct buffer ));
        temp->next = p;
        temp = p;
    }
}

void return_buff(struct buffer *buffer)
{
    buffer->next = freebuf->next;
    freebuf->next = buffer;
    
}

void block(struct TCB **p)
{
    struct TCB *q = *p;
    tcb[current].state = BLOCKED;
    if(*p==NULL)
      *p=&tcb[current];
    else
    {
        while(q->next)
          q=q->next;
        q->next=&tcb[current];
    }
    tcb[current].next=NULL;
    swtch();
}

void wakeup_first(struct TCB **p)
{
    if(*p==NULL)return;
    (*p)->state=READY;
    *p=(*p)->next;
}

void main()
{
    InitInDos();
    InitTcb();
    apply_for();
    old_int8 = getvect(8);
    
    /*創建0#線程*/
    strcpy(tcb[0].name,"main");
    tcb[0].state = RUNNING;
    current = 0;
    
    create("f1",(codeptr)f1,1024,5);
    create("f2",(codeptr)f2,1024,10);
    create("sender",(codeptr)f3,1024,15);
    create("receiver",(codeptr)f4,1024,20);
    tcb_state();
    
    /*啟動多個線程的并發運行*/
    setvect(8,new_int8);
    swtch();
    while(!all_finished());
    tcb[0].name[0] = '\0';
    tcb[0].state = FINISHED;
    setvect(8,old_int8);
    
    tcb_state();
    printf("\n Multi_task system terminated.\n")   ;
    getch();
    
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲激情在线播放| 国产精一品亚洲二区在线视频| 秋霞av亚洲一区二区三| 国产福利91精品一区| 欧美日韩黄色一区二区| 亚洲国产精品精华液ab| 日本美女一区二区三区| 91国偷自产一区二区三区成为亚洲经典| xnxx国产精品| 美女一区二区在线观看| 欧美日韩久久一区二区| 亚洲三级理论片| 不卡的av网站| 国产欧美日韩精品a在线观看| 久久精品噜噜噜成人88aⅴ| 欧美喷潮久久久xxxxx| 亚洲美女电影在线| 色综合天天综合狠狠| 国产日韩高清在线| 国产一本一道久久香蕉| 日韩欧美激情四射| 蜜臀精品一区二区三区在线观看| 欧美日韩国产一二三| 午夜精品免费在线| 欧美日韩视频一区二区| 亚洲一区在线观看网站| 色综合视频在线观看| 亚洲欧美国产毛片在线| 91麻豆国产香蕉久久精品| 中文字幕日本不卡| 色呦呦国产精品| 亚洲精品成人悠悠色影视| 91久久精品一区二区二区| 一区二区高清在线| 日本二三区不卡| 亚洲午夜久久久久久久久久久| 欧美丝袜丝nylons| 日韩电影在线免费看| 日韩精品一区二区三区四区| 国产精品资源在线看| 国产精品乱码一区二三区小蝌蚪| hitomi一区二区三区精品| 亚洲最色的网站| 91精品国产高清一区二区三区 | 日韩一区二区中文字幕| 老司机精品视频在线| 337p粉嫩大胆色噜噜噜噜亚洲| 国产尤物一区二区在线| 国产精品丝袜一区| 色久综合一二码| 日韩av不卡一区二区| 26uuu亚洲综合色| 99精品偷自拍| 亚洲国产一二三| 欧美xxxx老人做受| 99精品视频免费在线观看| 亚洲综合色丁香婷婷六月图片| 欧美一区国产二区| 成人午夜视频免费看| 亚洲一区二区三区中文字幕| 日韩欧美的一区| 99在线视频精品| 日本女人一区二区三区| 国产精品美女久久久久久久久久久 | 亚洲男同性视频| 日韩一区二区三区视频在线观看| 成人免费视频视频在线观看免费| 夜夜嗨av一区二区三区四季av| 91精品国产综合久久久久久漫画| 国产成人综合网| 日韩激情在线观看| 成人免费小视频| 精品久久久久一区二区国产| 色综合色狠狠综合色| 国产专区欧美精品| 亚洲福利视频一区| 中文字幕第一区二区| 欧美丰满美乳xxx高潮www| 不卡av在线网| 国产精品一线二线三线精华| 亚洲一区二区3| 欧美国产成人在线| 欧美成人精精品一区二区频| 欧美午夜精品久久久久久孕妇| 国产精品一区二区三区网站| 日韩国产精品大片| 一区二区三区鲁丝不卡| 国产情人综合久久777777| 欧美一级日韩不卡播放免费| 91传媒视频在线播放| 成a人片亚洲日本久久| 经典一区二区三区| 日产国产高清一区二区三区| 一区二区不卡在线播放| 最新国产成人在线观看| 国产午夜精品福利| 精品少妇一区二区三区日产乱码 | 国产日韩欧美制服另类| 日韩欧美一二三四区| 在线观看欧美黄色| 91视频www| 91丨porny丨蝌蚪视频| 国产aⅴ精品一区二区三区色成熟| 久久国产乱子精品免费女| 日本免费新一区视频| 亚洲成av人片一区二区梦乃| 亚洲自拍与偷拍| 一区二区三国产精华液| 亚洲一区二区三区四区在线观看| 亚洲三级小视频| 亚洲一卡二卡三卡四卡| 亚洲最大成人网4388xx| 一区二区三区国产精品| 亚洲一区二区三区四区在线观看| 亚洲一区在线播放| 日韩中文字幕1| 秋霞av亚洲一区二区三| 极品销魂美女一区二区三区| 国产自产2019最新不卡| 成人在线一区二区三区| 99re亚洲国产精品| 在线观看国产一区二区| 中文字幕一区二区三区在线观看| 欧美疯狂做受xxxx富婆| 69堂成人精品免费视频| 精品日韩av一区二区| 精品国产百合女同互慰| 日本一区二区三区视频视频| 国产精品家庭影院| 亚洲激情六月丁香| 日本欧美久久久久免费播放网| 日韩精品视频网| 国产露脸91国语对白| 成人免费视频一区二区| 欧美日韩一区二区三区免费看| 欧美一区二区三区四区高清| 国产亚洲欧美一级| 一区二区视频免费在线观看| 日本vs亚洲vs韩国一区三区| 国产一区二区看久久| 在线亚洲高清视频| 精品国产伦理网| 亚洲欧美日韩久久精品| 青草av.久久免费一区| 粉嫩av亚洲一区二区图片| 欧美伊人精品成人久久综合97| 制服视频三区第一页精品| 国产日韩欧美在线一区| 亚洲福利一区二区| 成人午夜免费视频| 777午夜精品视频在线播放| 欧美国产精品中文字幕| 午夜电影久久久| jlzzjlzz国产精品久久| 日韩精品专区在线| 一区二区日韩电影| 懂色中文一区二区在线播放| 欧美久久久一区| 亚洲色图丝袜美腿| 国产在线看一区| 欧美老肥妇做.爰bbww| 国产精品久久国产精麻豆99网站| 午夜伦欧美伦电影理论片| 成人动漫精品一区二区| 日韩欧美一区二区视频| 亚洲尤物在线视频观看| 成人午夜视频福利| 欧美精品一区二区三区在线播放 | 风间由美一区二区三区在线观看 | 色偷偷88欧美精品久久久| 精品国产凹凸成av人网站| 午夜久久福利影院| 色综合久久久久综合体桃花网| 久久久无码精品亚洲日韩按摩| 亚瑟在线精品视频| 一本色道亚洲精品aⅴ| 国产天堂亚洲国产碰碰| 麻豆成人91精品二区三区| 欧美色国产精品| 一区二区三区鲁丝不卡| 不卡的电视剧免费网站有什么| 久久久精品天堂| 九九视频精品免费| 日韩精品专区在线影院观看| 日韩av电影一区| 欧美一区二区精品在线| 日韩高清欧美激情| 欧美精品少妇一区二区三区 | 亚洲日穴在线视频| 99综合影院在线| 国产精品成人免费| av一区二区三区四区| 日韩毛片精品高清免费| av色综合久久天堂av综合| 国产精品成人免费在线| 91在线精品一区二区| 亚洲精品高清在线观看| 欧美午夜精品一区二区蜜桃 | 久久久青草青青国产亚洲免观| 国产乱妇无码大片在线观看|