操作系统实验之单处理机系统的进程调度

操作系统实验之单处理机系统的进程调度


假设某单处理机系统采用“基于动态优先权的时间片轮转”调度算法。进程队列采用单向链表组织进程控制块。

过程:假设进入的进程有3个,轮转时间片为5,每经过一个时间片要么优先级发生变化(在我的实验中加2,也就是优先级降低两个等级),要么该进程结束(删除节点)。
在这里插入图片描述
运行逻辑如下:
初始化:
在这里插入图片描述
根据优先级排序:
在这里插入图片描述
第一个时间片轮转后:
在这里插入图片描述
第二个时间片轮转后:
在这里插入图片描述
第三个时间片轮转后:
在这里插入图片描述
第四个时间片轮转后:
在这里插入图片描述
第五个时间片轮转后所有节点均被删除。
代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct pcb
{
    int name;                 //进程名
    int status;               //进程状态
    int priority;             //进程优先级
    int time;                 //进程所需运行时间
    struct pcb *next;         //指向下一个节点
}pcb;

int M;
pcb *creat(int count, pcb *head)   //count为进程数
{
    pcb *q, *p;
    head = (pcb *)malloc(sizeof(pcb)); //头指针
    p = head;
    int i = 0;
    for(i = 0; i < count; i++)
	{
        q = (pcb *)malloc(sizeof(pcb));
        printf("input %d process name: ", i+1);
        scanf("%d", &q->name);
        printf("input %d process priority: ", i+1);
        scanf("%d", &q->priority);
        printf("input %d process time: ", i+1);
        scanf("%d", &q->time);
        q->status = 1; //默认进程为就绪态
        p->next = q;
        p = q;
    }
    p->next = NULL;
    return head;
}

void Sort1(pcb *head)
{
    pcb * q, *p, *tail, *temp;
    tail = NULL;
    q = head;
    while((head->next) != tail)
	{
        p = head->next;
        q = head;
        while(p->next != tail)
		{
	        if((p->priority) > (p->next->priority)){
	            q->next = p->next;
	            temp = p->next->next;
	            p->next->next = p;
	            p->next = temp;
	            p = q->next;
	        }
	        p = p->next;
	        q = q->next;
    	}
    	tail = p;
    }

}

void Print(pcb *head)
{
	pcb *ptr = head->next;
    while(ptr != NULL){
          printf("name = %d, pro = %d, status = %d, time = %d\n", ptr->name,ptr->priority, ptr->status, ptr->time);
          ptr = ptr->next;
    }
}

pcb *sch(pcb *head){
    pcb * ptr = head->next;
    while(ptr != NULL){ //有进程
        printf("name = %d, pro = %d, status = %d, time = %d\n", ptr->name, ptr->priority, ptr->status, ptr->time);

        ptr->priority = ptr->priority + 2;

        ptr->time = ptr->time - M;
        if(ptr->time > 0) {
            Sort1(head);
        } else {
	    ptr->time = 0;
            ptr->status = 0;
            head->next = ptr->next; //进程结束,删除
        }

	printf("list:\n");
	Print(head);
	printf("\n\n");    

	ptr = head->next;
    }
    return head;
}

int main()
{
    int num;
    pcb *head;
    printf("please enter the size of the time slice:");
    scanf("%d", &M);
    printf("Number of input processes:");
    scanf("%d",&num);

    head = creat(num, head);
    printf("\n");
	Print(head);

    printf("\n\nstart:\n");
    Sort1(head);
    sch(head);
    return 0;
}

结果:
在这里插入图片描述

  • 5
    点赞
  • 0
    评论
  • 21
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

实现了如下四种调度算法的模拟: (1)时间片轮转调度 (2)优先数调度 (3)最短进程优先 (4)最短剩余时间优先 模拟过程使用了JProgressBar作为进程状态条,更为直观地观察到每个进程的执行状态。 程序用户说明: 1、在上图标号1处输入要创建随机进程的个数,仅可输入正数,非正数会有相关提示。然后点击标号2处的“创建进程”按钮,随进创建的进程显示在程序界面的中央窗口,如标号3所示。 2、创建好随机进程后,在标号4的选框选择将要模拟执行的调度算法,然后点击标号5处的“开始模拟”,程序开始执行。标号3的列表会显示相应的调度变化。 3、模拟过程中,可以继续添加新的进程操作同上。 4、 一个算法模拟执行完毕之后,可以点击标号6的“复位”按钮,可以重置列表的内容为程序模拟运行前的内容。复位成功后,可以继续选择其他调度算法进行模拟。 5、标号7显示为程序模拟过程中的时间,从1秒开始累计。 6、点击标号8的“清空”按钮,可以清空类别的进程,以便程序的下次执行。 题目要求: 题目四 处理系统进程调度 一 、 课 程 设 计 目 的 1. 加深对进程概念的理解, 明确进程和程序的区别。 2. 深入了解系统如何组织进程、 创建进程。 3. 进一步认识如何实现处理调度。 二 、 课 程 设 计 内 容 编写程序完成处理系统中的进程调度, 要求实现时间片轮转、 优先数、 最短进程优 先和最短剩余时间优先四种调度算法。 实验具体包括: 首先确定进程控制块的内容, 进程控 制块的组成方式; 然后完成进程创建原语和进程调度原语; 最后编写主函数对所作工作进行 测试。 模拟程序只对你所设置的“ 虚拟 PCB” 进行相应的调度模拟操作, 即每发生“ 调度” 时, 显示出当前运行进程的“ 进程标识符”、“ 优先数”、“ 剩余运行时间” 等, 而不需要对系 统中真正的 PCB 等数据进行修改。
©️2021 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值