⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jobctl.c

📁 作业调度模拟程序,操作系统实验来的.会对你有很大帮助的,哈哈哈哈.
💻 C
字号:
#include <string.h>
#include <stdio.h>

int m,s,l,u;/*全局变量 实现函数间联系*/

struct table{
    int std;
    int length;
    char state;
};

struct table t[6];

struct tab{
    int stl;
    int len;
    char sta;
};

struct tab w[6];  


void input()/*初始化作业表*/
{
    w[0].len=14;
    w[0].stl=0;
    w[0].sta='w';
    w[1].len=6;
    w[1].stl=26;
    w[1].sta='w';
    w[2].sta=w[3].sta=w[4].sta=w[5].sta='e';
}

void disp()/*打印作业分区表的情况*/
{   int i=0;
    printf("\n此时作业分区表的状态是:");
    printf("\n|起址\t|长度\t|状态");
   while(i<6)
  {      
     printf("\n|%d\t",w[i].stl);
     printf("|%d\t",w[i].len);
     printf("|%c\t\n",w[i].sta);
     i++;
  }
}

void defiction(){
  t[0].std=14;
  t[0].length=12;
  t[0].state='w';
  t[1].std=32;
  t[1].length=96;
  t[1].state='w';  
  t[2].state=t[3].state=t[4].state=t[5].state='e';
}

void print()/*打印空闲分区表的情况*/
{   int i=0;
    printf("\n此时空闲分区表的状态是:");
    printf("\n|起址\t|长度\t|状态");
   while(i<6)
  {      
     printf("\n|%d\t",t[i].std);
     printf("|%d\t",t[i].length);
     printf("|%c\t\n",t[i].state);
     i++;
  }
}

void remove(int h)
{
    int a=0;/*设置标志位*/
    int k;
    int i=0;
    while(i<6)
    {
        if(t[i].state=='w'&&t[i].length>=l)
        {
            a=1;/*分配成功*/
            t[i].length=t[i].length-h;
            m=t[i].std;
            if(t[i].length>0)
                t[i].std=t[i].std+h;
            else {
                    for(k=i;k<5;k++)/*该表项撤销,上移内存空区表*/
                    {   t[k].std=t[k+1].std;
                        t[k].length=t[k+1].length;
                        t[k].state=t[k+1].state;
        		}             
                    t[5].state='e';
                } /*else*/
  
            break;
        }/*firstif*/
        else i++;
    }/*while*/
    if(a==1) print();
    else printf("作业不能装入内存!");
}

void movein(int x,int y)/*装入空闲分区表*/
{ int r,j;
  for(j=0;j<5;j++)
  {
    if(x<t[0].std)
    {
        if(t[0].std=(x+y))
    	{
            t[0].std=x;printf("t[1].std=%d\n",t[1].std);
            t[0].length+=y;
            return;
    	}
        else
    	{
            for(j=4;j>0;j--)
    		{
                t[j].std=t[j-1].std;
                t[j].length=t[j-1].length;
                t[j].state=t[j-1].state;
    		}
        t[0].std=x;
        t[0].length=y;
        t[0].state='w';
    	}
        break;
   }/*空区表第一项*/
  
   if(t[j].state=='w'&&t[j+1].state=='w')
   {
        if(x==t[j].std+t[j].length)/*与上相临*/
    	{
            t[j].length+=l;
            printf("%d",t[j].length);
            if(t[j+1].std==(x+y))/*/上下相临,实现下移空区表*/
    		{
                t[j].length+=t[j+1].length;
                printf("%d",t[j].length);
                for(r=j+2;r<6;r++)
        		{
                    t[r-1].length=t[r].length;
                    t[r-1].state=t[r].state;
                    t[r-1].std=t[r].std;
        		} 
                t[5].std='e';t[5].std=0;
                printf("first t[1].length=%d\n",t[1].length);
    		}
            return;
    	}
   
        else/*确定不与上相临*/
    	{
            if(t[j+1].std=x+y)
    		{
                t[j+1].std=x;
                t[j+1].length+=y;
    		}
            else/*上下不相临,实现下移,倒序实现*/
    		{
                for(r=5;r>j+1;r--)
        		{
                    t[r].state=t[r-1].state;
                    t[r].length=t[r-1].length;
                    t[r].std=t[r-1].std;
            	}/*for*/
                t[j+1].std=x;
                t[j+1].length=y;  
    		}
            break;
    	}
  
    }
  } 
    if(t[j].state=='w'&&t[j+1].state=='e')
    {
        if(x==t[j].std+t[j].length)
        t[j].length+=y;
        else
    	{
            t[j+1].length=y;
            t[j+1].std=x;
            t[j+1].state='w';
            printf("second t[1].length=%d\n",t[1].length);
        }  
        printf("third t[1].length=%d\n",t[1].length);
    }
}

void outm(int i)/*作业撤消,传递长度始址*/
{
    int r; 
    if(w[i].sta=='e'||i>6)
        printf("该作业不存在\n");
    else
    {
        /*撤消作业,作业表上移*/
        l=w[i].len;
        s=w[i].stl;
        printf("%d,%d",l,s);
        r=i;
        while(r<5)
    	{
            w[r].len=w[r+1].len;
            w[r].sta=w[r+1].sta;
            w[r].stl=w[r+1].stl;
        	r++;
    	}
        w[5].sta='e';
    }
}

void inm(int x,int y)/*作业进入内存*/
{
    int i=0;
    while(w[i].sta=='w')/*找到第一个空状态*/
    {i++;}
    w[i].len=y;
    w[i].stl=x;
    w[i].sta='w';
    disp();
}

int main()
{
    int i=0;
    int n,z;
    defiction();
    print();
    input();/*初始化作业表*/
    disp();
    while(i<2)
    {
        printf("Choose your action!\n");
        scanf("%d\n",&z);
        switch(z)
    	{
            case 1:
        			{
                        printf("作业进入内存!\n");
                        printf("作业长度\n");
                        scanf("%d\n",&u);
                        remove(u);/*返回该段始址*/
                		inm(m,u);
            			break;
        			}
            case 0:
        			{
                        printf("作业撤离!\n");
                        scanf("%d",&n);
                        printf("选择作业 %d\n",n);
                        outm(n);/*传递作业始址 长度至空区表*/
                		disp();
                    	movein(s,l);
                		print();
            			break;
        			}
        }/*switch*/
        i++;
    }/*while*/
    return 0;
}/*main*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -