操作系统实验2进程调度

[cpp]  view plain  copy
  1. #include <stdio.h>    
  2. #include <stdlib.h>    
  3.     
  4. struct node    
  5. {    
  6.     int pid;//进程id号     
  7.     int prio;//进程优先级     
  8.     int runtime;//进程运行的时间     
  9.     int alltime;//进程还需运行的时间     
  10.     char state;//进程的状态 运行r,就绪j,阻塞b。     
  11.     struct node *next;    
  12. };    
  13.     
  14.      
  15. typedef struct node Node;    
  16. typedef Node * Link;    
  17.     
  18. void init(Link *head);    
  19. void create(Link head);    
  20. void menu(Link head);    
  21. void RR(Link head);    
  22. void FCFS(Link head);     
  23. Link gethighprio(Link head);    
  24. void PRIORITY(Link head);    
  25. void error();    
  26. void quit();    
  27. void save();    
  28. int num = 0;//进程的id号     
  29.      
  30.  void create(Link head)    
  31. {    
  32.     Link p = head;    
  33.     Link newnode;    
  34.     //char ch;    
  35.     newnode = (Link)malloc(sizeof(Node));       
  36.         
  37.     newnode->runtime = 0;    
  38.     newnode->state = 'j';    
  39.     newnode->pid = ++num;    
  40.     newnode->prio = 2;    
  41.     newnode->alltime = 2;    
  42.     p = head;     
  43.     while(p->next != NULL)    
  44.     {    
  45.         p = p->next;    
  46.     }    
  47.     newnode->next = p->next;    
  48.     p->next = newnode;    
  49.         
  50.     newnode = (Link)malloc(sizeof(Node));       
  51.         
  52.     newnode->runtime = 0;    
  53.     newnode->state = 'j';    
  54.     newnode->pid = ++num;    
  55.     newnode->prio = 3;    
  56.     newnode->alltime = 3;    
  57.     p = head;     
  58.     while(p->next != NULL)    
  59.     {    
  60.         p = p->next;    
  61.     }    
  62.     newnode->next = p->next;    
  63.     p->next = newnode;    
  64.         
  65.     newnode = (Link)malloc(sizeof(Node));       
  66.         
  67.     newnode->runtime = 0;    
  68.     newnode->state = 'j';    
  69.     newnode->pid = ++num;    
  70.     newnode->prio = 4;    
  71.     newnode->alltime = 4;    
  72.     p = head;     
  73.     while(p->next != NULL)    
  74.     {    
  75.         p = p->next;    
  76.     }    
  77.     newnode->next = p->next;    
  78.     p->next = newnode;    
  79.         
  80.     newnode = (Link)malloc(sizeof(Node));       
  81.         
  82.     newnode->runtime = 0;    
  83.     newnode->state = 'j';    
  84.     newnode->pid = ++num;    
  85.     newnode->prio = 5;    
  86.     newnode->alltime = 5;    
  87.     p = head;     
  88.     while(p->next != NULL)    
  89.     {    
  90.         p = p->next;    
  91.     }    
  92.     newnode->next = p->next;    
  93.     p->next = newnode;    
  94.   //printf("请输入进程的优先级:");    
  95. //  scanf("%d",&(newnode->prio));    
  96. //  printf("请输入进程的总共需要运行的时间:") ;    
  97. //  scanf("%d",&(newnode->alltime));     
  98. //  getchar();    
  99. //  printf("\n");    
  100.     /*  
  101. printf("是否要继续创建进程:");  
  102.     scanf("%c",&ch);  
  103.     if(ch == 'y')  
  104.     {  
  105.         create(head);  
  106.     }  
  107.     else if(ch == 'n')  
  108.     {  
  109.         menu(head);  
  110.     }  
  111.     else  
  112.     {  
  113.         printf("您的输入有误!\n");  
  114.     }*/    
  115. }     
  116.     
  117.     
  118. /*尾插入的形式调度算法*/     
  119. //void create(Link head)    
  120. //{    
  121. //  Link p = head;    
  122. //  Link newnode;    
  123. //  char ch;    
  124. //  newnode = (Link)malloc(sizeof(Node));    
  125. //      
  126. //  printf("请输入进程的优先级:");    
  127. //  scanf("%d",&(newnode->prio));    
  128. //  printf("请输入进程的总共需要运行的时间:") ;    
  129. //  scanf("%d",&(newnode->alltime));    
  130. //      
  131. //  newnode->runtime = 0;    
  132. //  newnode->state = 'j';    
  133. //  newnode->pid = ++num;    
  134. //    
  135. //  while(p->next != NULL)    
  136. //  {    
  137. //      p = p->next;    
  138. //  }    
  139. //  newnode->next = p->next;    
  140. //  p->next = newnode;       
  141. //  getchar();    
  142. //  printf("\n");    
  143. //  printf("是否要继续创建进程:");    
  144. //    scanf("%c",&ch);    
  145. //    if(ch == 'y')    
  146. //    {    
  147. //      create(head);    
  148. //    }    
  149. //    else if(ch == 'n')    
  150. //    {    
  151. //        menu(head);    
  152. //    }    
  153. //    else    
  154. //    {    
  155. //      printf("您的输入有误!\n");    
  156. //    }    
  157. //}     
  158. //    
  159. //void save()    
  160. //{    
  161. //        
  162. //}    
  163.     
  164. /*先来先服务调度算法*/     
  165. void FCFS(Link head)    
  166. {    
  167.     Link old;    
  168.     Link p = head->next;    
  169.     if(p == NULL)    
  170.     {    
  171.         printf("队列里面没有进程,返回啦!\n");    
  172.         menu(head);    
  173.     }    
  174.     
  175.     p->state = 'r';    
  176.         
  177.     while(p != NULL && ((p->alltime) > 0))    
  178.     {    
  179.         p->runtime++;    
  180.         p->alltime--;    
  181.         printf("运行进程id号: %d 优先级:%d  进程运行时间: %d  进程还需运行时间 %d  进程状态:%c\n",p->pid,p->prio,p->runtime,p->alltime,p->state);     
  182.                 
  183.     }    
  184.     old = p;    
  185.     head->next = p->next;    
  186.     p = p->next;    
  187.     free(old);    
  188. }    
  189.     
  190. /*查找获得链表中优先级最高的进程,返回指向该进程的指针*/     
  191. Link gethighprio(Link head)     
  192. {    
  193.     Link p = head->next;    
  194.     Link q = p->next;    
  195.        
  196.     while(q != NULL)    
  197.     {    
  198.         if(p->prio < q->prio)    
  199.         {    
  200.             p = q;      
  201.         }    
  202.         q=q->next;    
  203.     }    
  204.     return p;    
  205. }    
  206.     
  207. /*动态优先级调度算法*/     
  208. void PRIORITY(Link head)    
  209. {    
  210.     Link q = head;    
  211.     Link front = head;    
  212.     Link old;    
  213.     if(q->next == NULL)    
  214.     {    
  215.         printf("队列里面没有进程,返回啦!\n");    
  216.         menu(head);     
  217.     }    
  218.     q = gethighprio(head);    
  219.     q->state = 'r';    
  220.           
  221.     if(q->alltime > 0)    
  222.     {    
  223.         q->runtime++;    
  224.         q->alltime--;    
  225.         q->prio = (q->prio) - 1;    
  226.         printf("运行的进程pid:%d  优先级:%d   进程运行时间: %d  进程还需运行时间 %d  进程状态:%c\n",q->pid,q->prio,q->runtime,q->alltime,q->state);    
  227.         if(q->alltime == 0)    
  228.         {    
  229.             old = q;    
  230.             if(q->next != NULL)    
  231.             {    
  232.                 while(front->next != q)    
  233.                 {    
  234.                     front = front->next;    
  235.                 }    
  236.                 front->next = q->next;    
  237.                 q = NULL;    
  238.                 free(old);    
  239.             }    
  240.             else              /*一开始程序问题出在这里,删除结点末尾没有=NULL,以后要注意*/    
  241.             {    
  242.                 while(front->next != q)    
  243.                 {    
  244.                     front = front->next;    
  245.                 }    
  246.                 front->next = NULL;    
  247.                 q = NULL;    
  248.                 free(old);          
  249.             }       
  250.         }    
  251.         PRIORITY(head);    
  252.     }    
  253. }    
  254.     
  255. /*时间片轮转调度算法*/     
  256. void RR(Link head)    
  257. {    
  258.     Link p = head->next;    
  259.     Link front = head;    
  260.     Link old;    
  261.         
  262.     if(p == NULL)    
  263.     {    
  264.         printf("队列里面没有进程,返回啦!\n");    
  265.         menu(head);     
  266.     }    
  267.     while(head->next != NULL)    
  268.     {    
  269.         front = head;    
  270.         p->runtime++;    
  271.         p->alltime--;    
  272.         p->state = 'r';    
  273.             
  274.         printf("运行的进程pid:%d  优先级:%d   进程运行时间: %d  进程还需运行时间 %d  进程状态:%c\n",p->pid,p->prio,p->runtime,p->alltime,p->state);    
  275.             
  276.         if(p->alltime <= 0)    
  277.         {    
  278.             old = p;    
  279.             if(p->next != NULL)    
  280.             {    
  281.                 while(front->next != p)    
  282.                 {    
  283.                     front = front->next;    
  284.                 }    
  285.                 front->next = p->next;    
  286.                 p = p->next;    
  287.                 free(old);     
  288.             }    
  289.             else{    
  290.                 while(front->next != p)    
  291.                 {    
  292.                     front = front->next;    
  293.                 }    
  294.                 front->next = NULL;    
  295.                 p = NULL;    
  296.                 free(old);    
  297.                 old = NULL;    
  298.             }    
  299.         }    
  300.             
  301.         if((p != NULL) && (p->next != NULL))    
  302.         {    
  303.             p = p->next;    
  304.         }    
  305.         else{    
  306.             p = head->next;    
  307.         }    
  308.             
  309.             
  310.     }    
  311.         
  312. }    
  313.     
  314. /*输入有误*/    
  315. void error()    
  316. {    
  317.     printf("您的输入有误,退出啦!\n");    
  318.     exit(1);     
  319. }    
  320.     
  321. /*退出*/    
  322. void quit()    
  323. {    
  324.     printf("Thank you for your using!\n");    
  325.     printf("        白白             \n");    
  326.     exit(1);    
  327. }    
  328.     
  329. void menu(Link head)    
  330. {    
  331.     int choice;    
  332.     while(1)    
  333.     {    
  334.         printf("\n");    
  335.         printf("********************************************\n");    
  336.         printf("***************进程调度*********************\n");    
  337.         printf("*    1.创建进程       2.先来先服务算法     *\n");    
  338.         printf("*    3.时间片轮转算法 4.优先级调度算法     *\n");    
  339.         printf("*    5.退出                                *\n");    
  340.         
  341.         printf("请输入您的选项(1~6):");    
  342.         scanf("%d",&choice);    
  343.             
  344.         switch(choice)    
  345.         {    
  346.             case 1:{    
  347.                 create(head);    
  348.                 break;    
  349.             }    
  350.                 
  351.             case 2:{    
  352.                 FCFS(head);    
  353.                 break;    
  354.             }    
  355.                 
  356.             case 3:{    
  357.                 RR(head);    
  358.                 break;    
  359.             }    
  360.             case 4:{    
  361.                 PRIORITY(head);    
  362.                 break;    
  363.             }    
  364.             case 5:{    
  365.                 quit();    
  366.                 exit(1);    
  367.             }    
  368.                 
  369.             default:{    
  370.                 error();    
  371.                 break;    
  372.             }    
  373.         }    
  374.             
  375.     }    
  376.          
  377. }    
  378.     
  379. void init(Link *head)    
  380. {    
  381.     *head = (Link)malloc(sizeof(Node));    
  382.     (*head)->next = NULL;    
  383. }    
  384.     
  385. int main()    
  386. {    
  387.     Link head;    
  388.     //Link newnode;    
  389.         
  390.     
  391.         
  392.     init(&head);    
  393.         
  394.     menu(head);    
  395.             
  396. }    
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值