linux進程調度類比

來源:互聯網
上載者:User

/*類比實現LINUX進程調度的靜態優先順序演算法和時間片輪轉演算法引入LINUX調度
*/
#include
#include
#include
#include
#include
#define RUN  1
#define SLEEP  0
#define READY  2
#define DEG_SCHEDULE
#define NUM 6
struct OSPCB
{
int PcbName ; /*進程名字*/
int ReqCount;   /*進程執行計數*/
int RunTime;/*進程執行時間數*/
int Prority;/*進程優先順序*/
int PcbStatus;  /*進程狀態*/
int PcbTime;/*進程時間片*/
struct OSPCB* prev;
struct OSPCB *next;
};
struct ProcessQueue  /*類比CPU調度隊列*/
{
struct OSPCB *PointerHead; /*指向進程鏈表頭*/
int PcbNumber;/*CPU每次調度計數器*/
};
//static struct CriticalResource
//{
// int flag;
// char BufferVoice[2000];
//}
static int flag;
void *Function(int *arg);
void InitPcb(struct OSPCB *pcb);
int Schedule(struct ProcessQueue *queue);
void  InheritSchedule(struct OSPCB *pcb);
int main(void)
{
int i,ret;
struct OSPCB *pNewPcb,*pNew;
struct ProcessQueue *pNewQueue;
int a[4][4] = {{1,1,0,1},{2,2,0,2},{3,3,0,3},{4,4,0,4}};
pNewQueue = (struct ProcessQueue *)malloc(sizeof(struct ProcessQueue));
pNewQueue->PointerHead = NULL;
pNewQueue->PcbNumber = 0;
for(i = 0; i < 4;i++) /*進程初始化*/
{
pNewPcb = (struct  OSPCB *)malloc(sizeof(struct OSPCB));
pNewPcb->PcbName   = a[i][0];
pNewPcb->ReqCount  = a[i][1];
pNewPcb->RunTime   = a[i][2];
pNewPcb->Prority   = a[i][3];
pNewPcb->PcbStatus = READY;
pNewPcb->PcbTime   = 3;
InitPcb(pNewPcb);
if(pNewQueue->PointerHead == NULL)
{
pNewQueue->PointerHead = pNewPcb;
}else{
pNew->next = pNewPcb;
pNewPcb->prev = pNew;
}
pNew =  pNewPcb;
pNewQueue->PcbNumber++;
}
#if 0
for(p = pNewQueue->PointerHead; p != NULL; p = p->next)
{
printf("process name = %d\n",p->PcbName);
}
#endif
Schedule(pNewQueue);/*進入進程調度*/
return 0;
}
void InitPcb(struct OSPCB *pcb)
{
pcb->prev = NULL;
pcb->next = NULL;
}
int Schedule(struct ProcessQueue *queue) /*進程調度*/
{
struct OSPCB *pcb,*CurrRun;
int value,SechNumber = 8;
pthread_t pthread_id[NUM];
int i = 0;
// printf("%s\n",__FUNCTION__);
for(pcb = queue->PointerHead;pcb !=NULL;pcb = pcb->next)
{
if(pcb->PcbTime  == 0)
{
pcb->Prority +=4;
}
pcb->PcbTime = 3;
}
while(queue->PointerHead != NULL)
{
for(pcb = queue->PointerHead;pcb !=NULL;pcb = pcb->next)
{
if(pcb == queue->PointerHead)
{
CurrRun = pcb;
}else{
if(CurrRun->Prority < pcb->Prority)
CurrRun = pcb;
}
CurrRun->PcbStatus = RUN;
}
SechNumber--;
CurrRun->ReqCount--;
CurrRun->PcbTime--;
if(i != (CurrRun->PcbName))
{
i = CurrRun->PcbName;
pthread_create(&pthread_id[i],NULL,(void*)Function,&(CurrRun->PcbName));
}
#ifdef DEG_SCHEDULE
printf("present process  = %d CurrRun->ReqCount = %d\n",CurrRun->PcbName,CurrRun->ReqCount);
#endif
if(CurrRun->PcbTime == 0)
{
CurrRun->Prority -=4; /*進程懲罰性降優先順序處理*/
}
if(CurrRun->ReqCount == 0)
{
if(CurrRun == queue->PointerHead)
{
queue->PointerHead = CurrRun->next;
}else if (CurrRun->next != NULL){
CurrRun->prev->next = CurrRun->next;
CurrRun->next->prev = CurrRun->prev;
}else{
CurrRun->prev->next = NULL;
}
//   printf("Run process name = %d  Reqcount = %d Sechedule count = %d\n",CurrRun->PcbName,CurrRun->ReqCount,SechNumber);
}
if(SechNumber == 0)/*時間片用完重新調度*/
{
Schedule(queue);
}
}
return 0;
}
void SleepProcess(void)
{
}
void DeleteProcess(void)
{
// return 0;
}
void *Function(int *arg) /*進程執行函數*/
{
int i,count = 0;
int PthreadName;
struct OSPCB *pNew;
pNew = (struct OSPCB *)arg;
PthreadName = *(int *)arg;
#ifdef DEG_SCHEDULE
printf("Enter the function process %d\n", PthreadName);
#endif
while(1)
{
if(flag == 0) /*訪問臨界區資源*/
{
flag = 1;
#ifdef DEG_SCHEDULE
printf("get lcok in  process %d\n", PthreadName);
#endif
for(i = 0; i < 10000; i++)
{
pNew->PcbStatus = SLEEP;
sleep(1);
}
flag = 0;/*釋放臨界區資源*/
break;
}else{ /*自旋直到得到可訪問的臨界區資源*/
count++;
if(count == 5000)
{
#ifdef DEG_SCHEDULE
printf("flag = %d can not get lock in process name %d\n",flag,PthreadName);
#endif
}
}
}
#ifdef DEG_SCHEDULE
printf("flag = %d out process %d\n", flag,PthreadName);
#endif
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.