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

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


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

过程:假设进入的进程有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;
}

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

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
处理器系统进程调度 1.实验目的 加深对进程概念的理解,明确进程和程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建; 进程的调度。 3.实验内容 编写程序完成处理机系统进程调度要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。 4.提示与讲解 这个实验主要要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统,无论进程控制块信息量多少,信息都可以大致分为以下四类: ① 标识信息 每个进程都要有一个惟一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序采用编号方式,也就是为每个进程依次分配一个不相同的正整数。 ② 说明信息 用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放位置、进程数据存放位置等等。实验,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。 ③ 现场信息 现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块,当进行进程调度时,从选进程的进程控制块读取现场信息进行现场恢复。现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字寄存器等。在实验,可选取几个寄存器作为代表。用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。 ④ 管理信息 管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。实验,仅包括队列指针。
实现了如下四种调度算法的模拟: (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 等数据进行修改。
本实验旨在通过模拟处理机系统进程调度过程,了解进程调度算法的实现原理及其对系统性能的影响。 实验环境: - 操作系统:Windows/Linux/MacOS - 编程语言:C/C++/Java/Python等 实验步骤: 1.定义进程结构体 定义一个进程结构体,包含进程ID、进程优先级、进程状态、进程所需CPU时间等信息。 2.初始化进程队列 定义一个进程队列,将所有进程按照优先级从高到低排列,并初始化所有进程的状态为就绪态。 3.选择调度算法 选择一种进程调度算法,如先来先服务(FCFS)、短作业优先(SJF)、优先级调度(Priority Scheduling)、时间片轮转(Round-Robin Scheduling)等。 4.模拟进程调度过程 根据所选的进程调度算法,模拟进程调度过程。当一个进程被调度时,将其状态从就绪态改为运行态,并将其所需的CPU时间减去一个时间片(或整个执行时间),如果CPU时间为零,则该进程被终止。如果当前运行的进程执行完毕或被抢占,将其状态从运行态改为就绪态,并将其加入进程队列。 5.计算系统性能指标 根据模拟的进程调度过程,计算系统性能指标,如平均等待时间、平均周转时间、CPU利用率等。 6.输出实验结果 将计算得到的系统性能指标输出到控制台或文件,进行分析和比较。 实验注意事项: 1.进程调度算法的选择应根据实际应用场景和需求进行评估和选择。 2.在进程调度过程,应注意进程状态的变化,避免死锁和饥饿现象的发生。 3.在计算系统性能指标时,应考虑到进程数量、调度算法、时间片大小等因素的影响。 4.实验过程应注意代码的规范性、可读性和可维护性,避免出现不必要的错误和漏洞。 5.在实验结束后,应对实验结果进行分析和总结,提出改进和优化的建议。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泤燃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值