操作系统实验(进程调度)

实验一  进程调度

一、 实验目的

在采用多道程序设计的系统中,有若干个进程同时处于就绪状态。当就绪进程个数大于处理机数时,就必须依照某种调度策略决定哪些进程可以分到处理机,本实验模拟在单处理机情况下的处理机调度。

二、实验要求

1、 设计一个进程控制块PCB

包括:进程名、进程优先数、进程所占CPU时间、还需要CPU时间、进程状态、下一列指针

2、 建立进程就绪队列:要求按照不同调度算法建立就绪队列

3、 编制两个调度算法,进程数由用户从键盘输入

(1)时间片轮转法(时间片为2)

(2)优先数算法 (优先数高优先级高)

          初始优先数 = 50 - 运行时间

          每运行一次优先数减3。

三、程序的数据结构设计(变量的定义和定义的含义注释)

N 50  //最大进程数+1
char name[10]; //进程名
int cputime;   //CPU已运行的时间单位数
int needtime; //进程还需要运行的时间单位数
int count;     //已经进行的轮数
int round;     //被分配的时间片数量
char state;   //状态
int pri;       //优先级
int sum = 0;  //完成的进程数
int num;     //进程数
int T;     //时间片长度

四、程序按测试文档运行后的结果截图

4.1时间片轮转法

4.1.1

 

 

 

 

 4.1.2

 

 

 

4.2优先数算法

4.2.1

 

 

4.2.2 

 

 

 

 

 

五、源程序

1、时间片轮转法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50  //最大进程数+1
struct PCB
{
	char name[10]; //进程名
    int cputime;   //CPU已运行的时间单位数
	int needtime;  //进程还需要运行的时间单位数
	int count;   //已经进行的轮数
    int round;  //被分配的时间片数量
	char state;  //状态
    int pri;
}process[N];

void in(int num,int T) //信息录入
{
    int i;
    printf("input name and needtime:\n");
	for(i=0;i<num;i++)
	{
		scanf("%s %d",&process[i].name,&process[i].needtime);
		process[i].cputime=0;
		process[i].count=0;
		process[i].round=T;
		process[i].state='W';
		process[i].pri=0;
	}
	process[0].state='R';
}

void out(int num)//输出
{
    int i;
    printf("name  cputime   needtime  count   pri   round   state\n");
    for(i=0;i<num;i++)
        printf("%s \t  %d   \t   %d\t   %d  \t   %d   \t  %d   \t   %c\n",process[i].name,process[i].cputime,process[i].needtime,process[i].count,process[i].pri,process[i].round,process[i].state);
    printf("就绪队列:");
    for(i=0;i<num;i++)
    {
        if(process[i].state=='W')
            printf("%s\t",process[i].name);
    }
    printf("\n");
    printf("完成队列:");
    for(i=0;i<num;i++)
    {
        if(process[i].state=='F')
            printf("%s\t",process[i].name);
    }
    printf("\n");
}

void change1(int num)
{
    int i;
    process[num]=process[0];
    for(i=1;i<=num;i++)
        process[i-1]=process[i];
}

void change2(int num,int sum)
{
    int i,s;
    s=num-sum;
    process[num]=process[0];
    for(i=1;i<s;i++)
        process[i-1]=process[i];
    process[s-1]=process[num];
}

void run(int num,int T)
{
    int sum = 0;  //完成的进程数
    int i,j;
    out(num);
    while(sum < num)
    {
        if( process[0].state == 'R')
        {
            if(process[0].needtime<=T)
            {
                process[0].cputime+=process[i].needtime ;
                process[0].needtime = 0;
                process[0].state = 'F';
                sum++;
                process[0].count++;
                change1(num);
                if(process[0].state == 'W')
                    process[0].state = 'R';
            }
            else
            {
                process[0].cputime+=T ;
                process[0].needtime-=T;
                process[0].state = 'W';
                process[0].count++;
                change2(num,sum);
                if(process[0].state == 'W')
                    process[0].state = 'R';
            }
        }
        out(num);

    }
}

main()
{
    int num,T;
    printf("input the number of customers:\n");
	scanf("%d",&num);
	printf("input the round:\n");
	scanf("%d",&T);
    in(num,T);
    run(num,T);
}

2、优先数算法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50  //最大进程数+1
struct PCB
{
	char name[10]; //进程名
    int cputime;   //CPU已运行的时间单位数
int needtime;  //进程还需要运行的时间单位数
	int count;   //已经进行的轮数
    int round;  //被分配的时间片数量
	char state;  //状态
    int pri;//进程优先数
}process[N];

void range0(int num)//初始排序
{
    int i,j;
    for(i = 0; i<num-1; i++)
	{
		for(j= num-2; j>=i; j--)
		{
			if (process[j].pri < process[j+1].pri)
			{
				process[num] = process[j];
				process[j] = process[j+1];
				process[j+1] = process[num];
			}
		}
	}
}


void range(int s,int num)//排序
{
    int i,j;
    for(i = 0; i<s-1; i++)
	{
		for(j= i; j<s-1; j++)
		{
			if (process[j].pri < process[j+ 1].pri)
			{
				process[num] = process[j];
				process[j] = process[j+1];
				process[j+1] = process[num];
			}
		}
	}
}

void in(int num,int T) //信息录入
{
    int i;
    printf("input name and needtime:\n");
	for(i=0;i<num;i++)
	{
		scanf("%s %d",&process[i].name,&process[i].needtime);
		process[i].cputime=0;
		process[i].count=0;
		process[i].round=T;
		process[i].state='W';
		process[i].pri=50-process[i].needtime;
	}
	range0(num);
	process[0].state='R';
}

void out(int num)//输出
{
    int i;
    printf("name  cputime   needtime  count   pri   round   state\n");
    for(i=0;i<num;i++)
        printf("%s \t  %d   \t   %d\t   %d  \t  %d     %d \t %c\n",process[i].name,process[i].cputime,process[i].needtime,process[i].count,process[i].pri,process[i].round,process[i].state);
    printf("就绪队列:");
    for(i=0;i<num;i++)
    {
        if(process[i].state=='W')
            printf("%s\t",process[i].name);
    }
    printf("\n");
    printf("完成队列:");
    for(i=0;i<num;i++)
    {
        if(process[i].state=='F')
            printf("%s\t",process[i].name);
    }
    printf("\n");
}

void change1(int num,int s)
{
    int i;
    process[num]=process[0];
    for(i=1;i<=num;i++)
        process[i-1]=process[i];
    range(s,num);
}

void change2(int num,int sum)
{
    int i,s;
    s=num-sum;
    process[num]=process[0];
    for(i=1;i<s;i++)
        process[i-1]=process[i];
    process[s-1]=process[num];
    range(s,num);
}

void run(int num,int T)
{
    int sum = 0;  //完成的进程数
    int i,j,s;
    out(num);
    while(sum < num)
    {
        if( process[0].state == 'R')
        {
            if(process[0].needtime<=T)
            {
                process[0].cputime+=process[i].needtime ;
                process[0].needtime = 0;
                process[0].state = 'F';
                sum++;
                s=num-sum;
                process[0].count++;
                process[0].pri-=3;
                change1(num,s);
                if(process[0].state == 'W')
                    process[0].state = 'R';
            }
            else
            {
                process[0].cputime+=T ;
                process[0].needtime-=T;
                process[0].pri-=3;
                process[0].state = 'W';
                process[0].count++;
                change2(num,sum);
                if(process[0].state == 'W')
                    process[0].state = 'R';
            }
        }
        out(num);

    }
}

main()
{
    int num,T;
    printf("input the number of customers:\n");
	scanf("%d",&num);
	printf("input the round:\n");
	scanf("%d",&T);
    in(num,T);
    run(num,T);
}

 

作者想说:

这个进程调度算法用了C语言,但没用到链表部分,直接暴力数组实现了。因此程序看上去较为冗杂。功能都能实现,没有问题。

这程序我真写了挺久。。。debug阶段着实痛苦。

觉得有用赞一个呗~&&有建议欢迎提出

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要了解操作系统进程调度的一些基本概念。进程调度操作系统内核的重要组成部分,它负责在多个进程之间分配 CPU 时间。操作系统会根据一定的策略来选择下一个要执行的进程。 在 Python 中,你可以使用 multiprocessing 模块来创建进程。该模块提供了 Process 类,你可以通过该类创建新的进程。下面是一个简单的示例: ```python import multiprocessing def my_process(): print("This is my process.") if __name__ == '__main__': p = multiprocessing.Process(target=my_process) p.start() p.join() ``` 在这个示例中,我们定义了一个名为 `my_process` 的函数,它会在一个新进程中运行。在 `__name__ == '__main__'` 的条件下,我们创建了一个新的进程 `p` 并启动它。然后我们使用 `p.join()` 等待该进程完成。 接下来,你可以使用 Python 的队列模块 `queue` 来模拟操作系统中的进程队列。该模块提供了 Queue 类,你可以使用它来实现一个简单的进程调度器。下面是一个示例: ```python import multiprocessing import queue def my_process(q): while True: try: task = q.get(block=False) print("Processing task:", task) except queue.Empty: break if __name__ == '__main__': q = multiprocessing.Queue() for i in range(10): q.put(i) processes = [] for i in range(4): p = multiprocessing.Process(target=my_process, args=(q,)) p.start() processes.append(p) for p in processes: p.join() ``` 在这个示例中,我们创建了一个名为 `q` 的队列,并将 10 个任务放入该队列中。然后我们创建了 4 个进程,并每个进程都调用 `my_process` 函数来处理队列中的任务。 在 `my_process` 函数中,我们使用一个无限循环来从队列中取出任务,并进行处理。当队列为空时,我们跳出循环,这样该进程就会自动退出。 最后,我们使用 `p.join()` 等待所有进程完成。这样我们就实现了一个简单的进程调度器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值