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

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

?? 操作系統——pcb模擬.txt

?? 該程序使用tc2.0編譯
?? TXT
?? 第 1 頁 / 共 2 頁
字號:



操作系統--PCB模擬(動態優先調用與動態內存分配) 
#include <time.h>
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>


#define ESC  0x1b
#define ENTER 0x0d
#define BACKSPACE 8
#define TRUE 1
#define FALSE 0
typedef unsigned UINT;
/*每隔TIME秒就變換一次優先級*/
#define TIME 5
/*系統的總內存容量(BYTE),暫定為32KB*/
#define TOTALMEM (UINT)((UINT)1024*(UINT)32)
/*系統本身占用內存大小(BYTE),暫定為2KB*/
#define SYSMEM  (UINT)(2048)
/*系統后備空閑進程占用內存大小(BYTE),暫定為1KB*/
#define IDLEMEM  (UINT)(1024)

 

/*多道系統數據結構*/
/****************************************************************/
enum _ProcStatus/*進程狀態枚舉*/
{
 READY =0,/*就緒*/
 RUN,/*執行中*/
 SUSPEND,/*掛起*/
};
typedef enum _ProcStatus ProcStatus;
/****************************************************************/
enum _MemStatus/*內存分區塊狀態枚舉*/
{
 IDLE =0,/*空閑中*/
 INUSE,/*使用中*/
};
typedef enum _MemStatus MemStatus;
/****************************************************************/
struct _MemBlock/*內存分區塊結構*/
{
 UINT Offset;/*起始地址*/
 UINT Size;/*內存塊大小(以BYTE為單位)*/
 MemStatus Sts;/*內存分區塊使用狀態*/
 struct _MemBlock *Next;/*內存塊列表中下一個內存塊*/
};
typedef struct _MemBlock MemBlock;
/****************************************************************/
struct _Pcb/*進程結構*/
{
 int  PID;/*進程ID,ID為負數的進程為系統后備隊列的作業*/
 int  Time;/*進程運行需要的時間*/
 int  Prior;/*進程的優先級,越大越優先*/
 ProcStatus  Sts;/*狀態*/
 MemBlock  *Mem;/*所使用的內存塊*/
 struct _Pcb *Next;/*指向本進程隊列中下個進程的PCB*/
};
typedef struct _Pcb PCB;
/****************************************************************/
struct _Batch/*多道處理中的道結構*/
{
 PCB  *pcb;/*該道當前正在處理的進程*/
 struct _Batch *Next;/*下一道*/
};
typedef struct _Batch Batch;
/****************************************************************/
/*系統相關全局變量*/
PCB *ProcQueue = NULL;/*進程鏈表,按優先級從大到小排列*/
MemBlock *MemTable = NULL;/*內存分區表,按起始地址從小到大排序*/
MemBlock *SysMem = NULL;/*系統本身占用的內存分區*/
Batch *BatchQueue = NULL;/*系統多道鏈表*/
/****************************************************************/

 


/*動態優先權搶占式調度算法及相關函數聲明*/
/****************************************************************/
int InitBatchs(int n);/*初始化多道系統,n為道數*/
int InsertProc(int prior, int time, UINT size);/*向進程鏈表中按優先級大小插入一個新進程*/
int InsertIDLE();/*向進程隊列中加入后備進程,當系統空閑時將被調入*/
int SortProcQueue();/*將進程鏈表按優先級從大到小排列*/
int AddBatch();/*增加系統道數*/
int DeleteBatch();/*減少系統道數*/
int UnSuspendProc(int id);/*解除ID為id的進程的掛起狀態*/
int UpdateBatchs();/*多道系統根據進程鏈表進行更新,并將執行完畢的進程刪除*/
int PassSeconds(int n);/*系統經過n秒后計算數據并進行優先級調度*/
/****************************************************************/
/*可變大小內存分區算法及相關函數聲明*/
/****************************************************************/
int InitMem();/*初始化內存分區表,sysmemsize是系統占據的內存大小*/
MemBlock* ApplyMem(UINT size);/*進程向系統申請內存*/
int ReleaseMem(MemBlock* mem);/*進程pcb結束要求釋放內存*/
int MergeMem();/*整理內存表,相鄰的空閑分區將歸并為一份*/
/****************************************************************/

 


/*各函數的定義*/
/****************************************************************/
int InitBatchs(int n)
{
 int i;
 for (i=0; i<n; ++i)
 {
  if (!AddBatch()) return FALSE;
 }
 return (UpdateBatchs());
}

int InsertProc(int prior, int time, UINT size)
{
 static int sysid = 0;/*該系統已經加入過多少進程,此值將是新進程的ID*/
 PCB *last,*now,*pcb;
 MemBlock *mem;
 if (prior<=0 || time<=0 || size<=0) return FALSE;
 mem = ApplyMem(size);
 if (mem == NULL) return FALSE;
 pcb = (PCB*)malloc(sizeof(PCB));
 if (pcb == NULL) return FALSE;
 pcb->Prior = prior;
 pcb->Time = time;
 pcb->PID = (++sysid);
 pcb->Sts = READY;
 pcb->Mem = mem;
 if (ProcQueue == NULL)/*如果進程隊列為空*/
 {
  ProcQueue = pcb;
  pcb->Next = NULL;
  return TRUE;
 }
 last = ProcQueue;
 now = last->Next;

 if (pcb->Prior > last->Prior)/*pcb將排在隊頭*/
 {
  pcb->Next = ProcQueue;
  ProcQueue = pcb;
  return TRUE;
 }
 while ((now != NULL) && (pcb->Prior < now->Prior))/*尋找插入位置*/
 {
  last = now;
  now = last->Next;
 }
 last->Next = pcb;
 pcb->Next = now;
 return TRUE;
}

int InsertIDLE()
{
 PCB *now = ProcQueue;
 MemBlock *mem = ApplyMem(IDLEMEM);
 PCB *idle;
 if (mem==NULL)
  return FALSE;
 idle = (PCB*)malloc(sizeof(PCB));
 if (idle==NULL)
  return FALSE;

 idle->PID = -1;
 idle->Prior = -1;
 idle->Sts = SUSPEND;
 idle->Time = -1;
 idle->Next = NULL;
 idle->Mem = mem;
 if (ProcQueue == NULL)
 {
  ProcQueue = idle;
  return TRUE;
 }
 while(now->Next != NULL)
 {
  now = now->Next;
 }
 now->Next = idle;
 return TRUE;
}

int SortProcQueue()
{ /*冒泡排序*/
 PCB *last, *now;
 int b = FALSE;/*上次遍歷是否無交換產生*/
 if (ProcQueue==NULL || ProcQueue->Next==NULL)/*如果鏈表中無進程或只有一個進程*/
  return FALSE;
 while (!b)
 {
  b = TRUE;
  last=ProcQueue;
  now=last->Next;
  if (last->Prior < now->Prior)
  {
   ProcQueue = now;
   last->Next = now->Next;
   now->Next = last;
   b = FALSE;
   last = ProcQueue;
   now = last->Next;
  }
  while (now->Next!=NULL)
  {
   if ((now->Prior)<(now->Next->Prior))
   {
    last->Next = now->Next;
    now->Next = now->Next->Next;
    last->Next->Next = now;
    b = FALSE;
   }
   else
    last = last->Next;
   now = last->Next;
  }
 }
 return TRUE;
}

int AddBatch()
{
 Batch *bt = (Batch*)malloc(sizeof(Batch));
 if (bt==NULL) return FALSE;
 bt->Next = BatchQueue;
 BatchQueue = bt;
 bt->pcb = NULL;
 return (InsertIDLE());
}

int DeleteBatch()
{
 Batch *bt = BatchQueue;
 PCB *last, *now;
 if (BatchQueue==NULL || BatchQueue->Next==NULL)/*如果只剩最后一道則不刪除*/
  return FALSE;
 if (ProcQueue==NULL || ProcQueue->Next==NULL)/*如果只有最后一個后備空閑進程*/
  return FALSE;/**/
 last = ProcQueue;
 now = last->Next;
 while (now->Next != NULL)/*查找到最后一個進程,該進程必定是后備空閑進程*/
 {
  last = now;
  now = last->Next;
 }
 if (now==NULL || now->PID>=0)/*未查找到后備進程*/
  return FALSE;/**/
 ReleaseMem(now->Mem);/*釋放進程的內存*/
 free(now);
 last->Next = NULL;
 BatchQueue = BatchQueue->Next;
 free(bt);
 return TRUE;
}

int UnSuspendProc(int id)
{
 PCB *now = ProcQueue;
 if (id<=0) return FALSE;
 if (ProcQueue==NULL) return FALSE;
 while (now != NULL)
 {
  if (now->PID == id)
  {
   now->Sts = READY;
   return TRUE;
  }
  now = now->Next;
 }
 return FALSE;
}

int UpdateBatchs()
{
 Batch *bt = BatchQueue;
 PCB *last = ProcQueue, *now;
 while (bt != NULL)
 {
  bt->pcb = NULL;
  bt = bt->Next;
 }
 if (ProcQueue == NULL) return TRUE;
 while (last->Sts==RUN && last->PID>=0 && last->Time<=0)
 {
  ProcQueue = ProcQueue->Next;
  ReleaseMem(last->Mem);
  free(last);
  last = ProcQueue;
 }
 now = last->Next;
 while (now != NULL)
 {
  if (now->Sts==RUN && now->PID>=0 && now->Time<=0)/*如果該進程是運行中的一般進程并已執行完畢*/
  {
   last->Next = now->Next;
   ReleaseMem(now->Mem);
   free(now);
  }
  else
   last = last->Next;
  now = last->Next;
 }
 bt = BatchQueue;
 now = ProcQueue;
 while (bt != NULL && now != NULL)
 {
  bt->pcb = now;
  now->Sts = RUN;
  bt = bt->Next;
  now = now->Next;
 }
 while (now != NULL)
 {
  if (now->Sts == RUN)
  {
   now->Sts = SUSPEND;
  }
  now = now->Next;
 }
 return TRUE;
}

int PassSeconds(int n)
{
 static int time = 0;
 int i=0, ProcEnd = FALSE;
 PCB *pcb = ProcQueue;
 Batch *bt = BatchQueue;
 if (bt == NULL) return FALSE;
 time += n;
 if (time>=TIME)
 {
  i = time/TIME;/*經過多少時間段*/
  time = time%TIME;
 }
 while (bt != NULL)/*更新進程運行時間*/
 {
  if (bt->pcb->PID>=0)
  {
   bt->pcb->Time -= n;
   if (bt->pcb->Time <= 0)/*進程結束*/
   {
    ProcEnd = TRUE;
   }
  }
  bt = bt->Next;
 }
 if (i > 0)
 {
  while (pcb != NULL)/*更新進程優先權(動態優先權)*/
  {
   if (pcb->Sts == RUN && pcb->PID>=0)/*運行的進程優先權降低*/
   {
    pcb->Prior -= i;
    if (pcb->Prior < 0)
     pcb->Prior = 0;
   }
   else if (pcb->Sts == SUSPEND && pcb->PID>=0)/*掛起的進程優先權升高*/
    pcb->Prior += i;
   pcb = pcb->Next;
  }
 }
 if (i>0)
  SortProcQueue();/*如果優先級有變動則重新排序*/
 if (ProcEnd || i>0)
 {
  UpdateBatchs();/*更新多道進程*/
 }
 return TRUE;
}
/****************************************************************/
int InitMem()
{
 MemTable = (MemBlock*)malloc(sizeof(MemBlock));/*初始化為只有一個分區*/
 if (MemTable==NULL)
  return FALSE;
 MemTable->Offset = 0;
 MemTable->Size = TOTALMEM;
 MemTable->Sts = IDLE;
 MemTable->Next = NULL;
 SysMem = ApplyMem(SYSMEM);/*申請系統本身占用的內存*/
 if (SysMem == NULL)
 {
  free(MemTable);
  return FALSE;
 }
 return TRUE;
}

MemBlock* ApplyMem(UINT size)
{
 MemBlock *mem = NULL, *last,*now;
 if (MemTable == NULL)
  return NULL;
 last = MemTable;
 now = last->Next;
 if (last->Sts == IDLE)/*如果第一分區是空閑的*/
 {
  if (last->Size > size)/*該分區可以分出空間*/
  {
   mem = (MemBlock*)malloc(sizeof(MemBlock));
   if (mem == NULL) return NULL;
   mem->Next = last;
   mem->Offset = last->Offset;
   mem->Size = size;
   mem->Sts = INUSE;
   last->Offset = mem->Offset+mem->Size;
   last->Size = last->Size-size;
   MemTable = mem;
   return mem;
  }
  else if (last->Size == size)
  {
   mem = last;
   mem->Sts = INUSE;
   MemTable = mem;
   return mem;
  }
 }
 while (now != NULL)/*在分區表中查找可分配內存的空閑分區*/
 {
  if (now->Sts == IDLE)
  {
   if (now->Size > size)
   {
    mem = (MemBlock*)malloc(sizeof(MemBlock));
    mem->Offset = now->Offset;
    mem->Size = size;
    mem->Next = now;
    mem->Sts = INUSE;
    last->Next = mem;
    now->Offset = mem->Offset+mem->Size;
    now->Size = now->Size-size;
    return mem;
   }
   else if (now->Size == size)
   {
    mem = last;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩在线一区二区三区视频| 尤物在线观看一区| 亚洲欧美综合另类在线卡通| 亚洲永久精品大片| 男男成人高潮片免费网站| 国产精品888| 欧美丝袜丝交足nylons| 日韩美女一区二区三区四区| 国产精品私房写真福利视频| 亚洲成在线观看| 国产在线精品免费| 在线观看一区日韩| 久久这里只有精品首页| 一区二区三区在线视频观看58| 日本不卡免费在线视频| 成av人片一区二区| 日韩视频免费观看高清完整版| 国产精品毛片无遮挡高清| 日韩精品91亚洲二区在线观看| 国产不卡高清在线观看视频| 欧美日韩精品一区二区在线播放| 国产蜜臀97一区二区三区| 五月婷婷激情综合网| 成人综合婷婷国产精品久久| 7777精品伊人久久久大香线蕉| 中文字幕精品—区二区四季| 免费观看日韩av| 色94色欧美sute亚洲线路二| 久久久久久久精| 日韩电影在线一区二区三区| 91亚洲精品乱码久久久久久蜜桃 | 中文字幕中文乱码欧美一区二区| 午夜精品福利视频网站| 成人精品视频一区| 久久综合国产精品| 首页亚洲欧美制服丝腿| av在线不卡免费看| 精品精品欲导航| 爽爽淫人综合网网站| 色爱区综合激月婷婷| 亚洲国产成人在线| 韩国女主播一区二区三区| 欧美精品一二三区| 又紧又大又爽精品一区二区| 本田岬高潮一区二区三区| 26uuu国产一区二区三区| 图片区日韩欧美亚洲| 91丝袜美女网| 久久精品国产一区二区三| 91年精品国产| 亚洲国产岛国毛片在线| 国产一区二区三区美女| 欧美一二三四区在线| 天堂影院一区二区| 欧美视频完全免费看| 亚洲靠逼com| www.亚洲人| 国产精品欧美久久久久无广告| 国内精品视频666| 欧美成人伊人久久综合网| 日本在线播放一区二区三区| 欧美人牲a欧美精品| 亚洲第一久久影院| 日本电影亚洲天堂一区| 亚洲美女屁股眼交| 99精品视频一区二区| 国产精品乱人伦中文| 不卡视频免费播放| 国产精品理伦片| 91猫先生在线| 一区二区三区国产豹纹内裤在线| 91老司机福利 在线| 国产精品福利在线播放| 91视频xxxx| 亚洲精品五月天| 在线一区二区三区做爰视频网站| 日韩理论片网站| 91官网在线观看| 性久久久久久久久久久久| 欧美日韩激情一区二区三区| 日本一道高清亚洲日美韩| 日韩一二三四区| 激情六月婷婷综合| 久久久精品综合| 成人中文字幕合集| 成人欧美一区二区三区视频网页| 94-欧美-setu| 亚洲一区二区三区视频在线| 欧美久久久久免费| 另类人妖一区二区av| 亚洲精品在线电影| 处破女av一区二区| 一区二区三区美女视频| 欧美人妇做爰xxxⅹ性高电影| 麻豆精品精品国产自在97香蕉| 久久一区二区三区四区| proumb性欧美在线观看| 亚洲一区二区三区中文字幕| 69成人精品免费视频| 美女视频免费一区| 国产精品人人做人人爽人人添 | 亚洲美女免费在线| 欧美日韩在线综合| 韩国女主播成人在线观看| 国产精品国产三级国产普通话99 | 蜜臀久久久久久久| 久久久av毛片精品| 色999日韩国产欧美一区二区| 日韩精彩视频在线观看| 久久午夜色播影院免费高清| 成人不卡免费av| 午夜免费久久看| 久久久一区二区三区捆绑**| 91免费视频观看| 免费精品视频最新在线| 1区2区3区精品视频| 3atv一区二区三区| 成人午夜激情在线| 午夜精品久久久久影视| 国产亚洲欧美日韩日本| 欧美性大战xxxxx久久久| 精品一区二区三区日韩| 亚洲日本电影在线| 欧美大白屁股肥臀xxxxxx| 91麻豆国产精品久久| 久久不见久久见免费视频7| 中文字幕一区二区在线观看| 91精品国产aⅴ一区二区| 99精品国产一区二区三区不卡| 日韩av一级电影| 自拍偷自拍亚洲精品播放| 欧美一区二区三区免费大片| 91蝌蚪国产九色| 国产在线一区二区综合免费视频| 亚洲激情一二三区| 久久精品男人的天堂| 欧美巨大另类极品videosbest| av一区二区三区| 国模套图日韩精品一区二区 | 日韩一级完整毛片| 一本一本大道香蕉久在线精品 | 亚洲蜜臀av乱码久久精品| 久久在线免费观看| 3d成人动漫网站| 日本精品一区二区三区高清 | 国产精品国产成人国产三级| 欧美一区二区三区性视频| 在线精品亚洲一区二区不卡| 成人综合激情网| 国产一区高清在线| 日韩激情在线观看| 亚洲国产日韩精品| 亚洲精品视频在线观看网站| 中文字幕免费不卡在线| 精品福利一区二区三区免费视频| 欧美日韩国产精品自在自线| 91色视频在线| aaa亚洲精品一二三区| 国产一区二区三区免费| 久久精品国产**网站演员| 日韩制服丝袜先锋影音| 亚洲高清免费视频| 一区二区三区在线不卡| 综合久久久久久| 中文字幕永久在线不卡| 国产精品色呦呦| 久久精品夜夜夜夜久久| 久久综合色8888| 精品电影一区二区三区| 欧美草草影院在线视频| 日韩丝袜情趣美女图片| 日韩欧美一区二区免费| 日韩视频不卡中文| 91精品一区二区三区在线观看| 欧美日韩午夜在线视频| 欧美日韩国产综合一区二区 | 日韩高清不卡一区二区三区| 亚洲.国产.中文慕字在线| 亚洲国产精品久久艾草纯爱| 亚洲成人www| 日韩在线一二三区| 视频一区二区中文字幕| 青青草伊人久久| 青椒成人免费视频| 欧美色成人综合| 欧美精品欧美精品系列| 8x福利精品第一导航| 88在线观看91蜜桃国自产| 91麻豆精品国产91久久久久久 | 精品一区二区国语对白| 蜜桃久久久久久| 国内久久精品视频| 风流少妇一区二区| eeuss鲁片一区二区三区在线观看| 99精品偷自拍| 一本到三区不卡视频| 欧美日韩精品三区| 欧美电视剧免费全集观看| 国产亚洲精品免费| 亚洲欧美偷拍另类a∨色屁股|