操作系统作业调度算法C代码实现

简介: 操作系统作业调度算法C代码实现

前言


去年学的操作系统,现在有学妹问调度算法实现发现自己没有复习竟然忘了很多,借此机会把原来的知识捡回来。本文是原来通过C实现作业调度算法的集合


一、进程入队与出队模拟

20210304175250582.png

入队代码:

#include <malloc.h>
    #include <stdio.h>
    #include <string.h>
    #define NULL 0
    typedef struct processpcb
    {
        int id;/*进程控制块编号*/
        struct processpcb *next;
    }node;
    int n;
    node *creat(void)   /*建立进程控制块队列表*/
    {
        node *head,*p1,*p2;
        n=0;
        printf("Input processpcb table:ID\n");
        p1=p2=(node *)malloc(sizeof(node));
        scanf("%d",&p1->id);
        head=NULL;
        while (p1->id>0)
        {
            n=n+1;
            if (n==1) head=p1;
            else p2->next=p1;
        p2=p1;
        p1=(node *) malloc (sizeof(node));
        scanf("%d",&p1->id);
        }
        p2->next=NULL;
        return(head);
    }
    node *append(node *head,node *q)  /*增加一个进程进入队列*/
    {
        node *p=head;
        if(!p)
            return q;
        else
        {
        while(p->next)
           p=p->next;
        p->next=q;
        q->next=NULL;
        return head;
        }
    }
    void print (node *head)  /*输出链表*/
    {
        node *p;
        p=head;
        if(!p)   printf("链表为空!");
        else
        {
            printf("元素为:");
            while(p)
            {
                printf("%5d",p->id);
                p=p->next;
            }
        }
    }
    int main()
    {
        node *p,*q;
        int pcbid;
        p=creat();
        printf("\nappend a processpcb\n");
        scanf("%d",&pcbid);
        q=(node *)malloc(sizeof(node));
        q->id=pcbid;
        q->next=NULL;
        printf("\ninit_processpcb queue is:\n");
        print(p);
        p=append(p,q);
        printf("\nappend_processpcb queue is:\n");
        print(p);
    }


出队代码:

#include <malloc.h>
    #include <stdio.h>
    #include <string.h>
    #define NULL 0
    typedef struct processpcb
    {
        int id;/*进程控制块编号*/
        struct processpcb *next;
    }node;
    int n;
    node *creat(void)   /*建立进程控制块队列表*/
    {
        node *head,*p1,*p2;
        n=0;
        printf("Input processpcb table:ID\n");
        p1=p2=(node *)malloc(sizeof(node));
        scanf("%d",&p1->id);
        head=NULL;
        while (p1->id>0)
        {
            n=n+1;
            if (n==1) head=p1;
            else p2->next=p1;
            p2=p1;
            p1=(node *) malloc (sizeof(node));
            scanf("%d",&p1->id);
        }
        p2->next=NULL;
        return(head);
    }
    node *find(node *head,int x)
    {
        node *p=head->next;
        while(p&&p->id!=x)
            p=p->next;
        if(!p)
            return 0;
        else
            return p;
    }
    node *del(node *head,int pcb)
    {
        node *p=head,*q;
        q=p->next;
        if(p->id==pcb)
            return q;
        while(q&&q->id!=pcb)
        {
            p=q;
            q=q->next;
        }
        if(p->id=pcb)
        p->next=q->next;
        return head;
    }
    void print (node *head)  /*输出链表*/
    {
        node *p;
        p=head;
        if(!p)   printf("链表为空!");
        else
        {
            printf("元素为:");
            while(p)
            {
                printf("%5d",p->id);
                p=p->next;
            }
        }
    }
    int main()
    {
        node *p,*q;
        int pcbid;
        p=creat();
        printf("\nappend a processpcb\n");
        scanf("%d",&pcbid);
        q=(node *)malloc(sizeof(node));
        q->id=pcbid;
        q->next=NULL;
        printf("\ninit_processpcb queue is:\n");
        print(p);
        p=del(p,pcbid);
        printf("\nappend_processpcb queue is:\n");
        print(p);
    }


二、FCFS调度算法

20210304180008807.png


代码:

#include <malloc.h>
#include <stdio.h>
#include <string.h>
typedef struct table
{ 
  int key;        /*进程ID号*/
  int sequence;     /*进程进入队列顺序号*/
  char message[10];   /*进程说明信息*/
  struct table *next;
}node;
/*
  定义函数,建立进程链表
*/
node *creat(void) 
{
  node *head;
  node *p1, *p2;
  int n = 0;
  p1 = p2 =(node *)malloc(sizeof(node));
  scanf("%d%d", &p1->key, &p1->sequence);
  gets(p1->message);
  head = NULL;
  while (p1->key != 0) {  //输入0表示结束
    ++n;
    if (n == 1)
      head = p1;
    else 
      p2->next = p1;
    p2 = p1;
    p1 = (node *)malloc(sizeof(node));
    scanf("%d%d", &p1->key, &p1->sequence);
    gets(p1->message);
  }
  p2->next = NULL;
  return head;
}
/*
  模拟当前就绪进程队列中最先进入进程出队并输出的调用过程
*/
node *fcfs(node *head)  
{
  node *p, *q;
  p = head;
  printf("key=%d,sequence=%d,message=%s\n",p->key,p->sequence,p->message);
  q = p;
  p = p->next;
  free(q);
  return p;
}
void print(node *head)  //输出链表
{
  node *p;
  printf("\n The table is : \n");
  p = head;
  while (p) {
    printf("%d, %d, %s\n", p->key, p->sequence, p->message);
    p = p->next;
  }
}
int main(void)
{
  int count = 0;
  node *p, *q;
  printf("新建的进程控制表为:\nkey sequence message\n");
  p = creat();    //输入进程控制表
  print(p);
  while (p) {
    ++count;
    printf("\n第%d次被调度的就绪进程为:\n",count);
    q = fcfs(p);
    p = q;
  }
  return 0;
}

3.优先级调度算法

20210304192212954.png


20210304194718430.png


这个好像没有找到,回头再补吧。


4.时间片轮转调度算法

20210304194802814.png


#include <malloc.h>
#include <stdio.h>
#include <string.h>
#define NULL 0
typedef struct table
 {
   int key;               /*进程ID号*/
   int run_time;         /*进程运行时间*/
   char message[10];     /*进程说明信息*/
   struct table *next;
 }node;
node *creat(void)      /*定义函数,输入ID号和顺序号,按照输入次序建立进程链表*/
{
   node *head,*p1,*p2;
   int n=0;
   p1=p2=(node *)malloc(sizeof(node));
   scanf("%d %d %s",&p1->key,&p1->run_time,&p1->message);
   head=NULL;
   while (p1->run_time>0)
    {
     n=n+1;
         if (n==1) head=p1;
     else p2->next=p1;
     p2=p1;
     p1=(node *) malloc (sizeof(node));
   scanf("%d %d %s",&p1->key,&p1->run_time,&p1->message);
    }
   p2->next=NULL;
   return(head);
}
void print (node *head)  /*输出链表*/
  {
    node *p;
    p=head;
   if(!p)
   {
       printf("该链表为空!");
   }
   else
   {
       while(p)
       {
           printf("%d , ",p->key);
           printf("%d , ",p->run_time);
           printf("%s",p->message);
           p=p->next;
           printf("\n");
       }
   }
 }
node *insert(node *head,node *news)   /*将进程news插入到队列尾部*/
  {
    node *t;
    t=head;
    while(t->next)
    {
        t=t->next;
    }
    t->next=news;
    news->next=NULL;
     return head;
 }
node *timeslice(node *head,int cpu_base_time)
          /*模拟时间片轮转调度过程:队列首进程使用一个时间片的CPU*/
{
    node *r,*q;
    r=head;
    q=(node *)malloc(sizeof(node));
    if(r->run_time>cpu_base_time)
    {
       q->run_time=r->run_time-cpu_base_time;
       q->key=r->key;
       strcpy(q->message,r->message);
       insert(r,q);
    }
    return head;
}
void main()
  {
       int count=0,cpu_base_time;
       node *p;
       printf("新建的进程控制表为:\nkey run_time message\n");
       p=creat();     /*输入进程控制表*/
       printf("所建的进程控制表为:\n");
       print(p);      /*输出原始进程控制表*/
       printf("CPU运行的单位时间片cpu_base_time为:\n");
       scanf("%d",&cpu_base_time);
       while(p)      /*模拟按单位时间片进程逐个被调度并进入CPU运行的过程*/
       {  
           p=timeslice(p,cpu_base_time);
           printf("第%d次被调度的就绪进程:\n",count+1);
           printf("key=%d,run_time=%d,message=%s\n",p->key,p->run_time,p->message);
           printf("recent table is:\n");
           print(p->next);
           printf("\n");
           count++;
           p=p->next;
       }
   printf("distribute is over!\n");
  }


目录
相关文章
|
20天前
|
算法 调度 Python
深入理解操作系统中的进程调度算法
在操作系统中,进程调度是核心任务之一,它决定了哪个进程将获得CPU的使用权。本文通过浅显易懂的语言和生动的比喻,带领读者了解进程调度算法的重要性及其工作原理,同时提供代码示例帮助理解。
|
15天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
13天前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
24天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度
操作系统是计算机系统的核心,负责管理和控制硬件资源、提供用户接口以及执行程序。其中,进程管理是操作系统的重要组成部分,它涉及到进程的创建、调度、同步和通信等方面。本文将深入探讨进程管理的基本概念、进程调度算法以及进程间的同步和通信机制。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程管理的基本技能。
41 11
|
16天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
43 1
|
19天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
18天前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。
|
20天前
|
调度 开发者
深入理解操作系统之进程调度
在计算机科学领域,操作系统是核心的一环,它管理着计算机硬件资源,并提供接口供上层软件运行。本文将通过深入浅出的方式,探讨操作系统中至关重要的一个概念——进程调度。我们将从基础理论出发,逐步展开讲解进程调度的原理和实现,并配以实际代码示例,旨在帮助读者更好地理解和掌握这一主题。文章不仅适合初学者建立基础,也适合有一定基础的开发者深化理解。
|
25天前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。