操作系统--基于Linux的处理机调度时间片轮转法(超详细/设计/实验/作业/练习)
创始人
2025-05-28 02:29:06
0

目录

  • 课程名:操作系统原理及Linux应用
    • 内容/作用:设计/实验/作业/练习
    • 学习:基于Linux的处理机调度时间片轮转法
    • 一、前言
    • 二、环境与设备
    • 三、原理
    • 四、内容
    • 五、总结与分析

课程名:操作系统原理及Linux应用

内容/作用:设计/实验/作业/练习

学习:基于Linux的处理机调度时间片轮转法

一、前言

  1. 了解Linux下Emacs编辑器的使用方法,掌握各种常用的键盘操作命令;
  2. 理解并掌握处理机调度算法。

二、环境与设备

1.软件:虚拟机VMware
2.环境:Linux系统环境

三、原理

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

1、优先调度算法实现处理机的调度:
设计思路:

   1)每个进程用一个进程控制块PCB来代表,进程控制块包括进程名(进程的标识)、指针(按优先数的大小把进程连成队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针为"0")、要求运行时间、优先数、状态(就绪、结束);
   2)每次运行处理机调度程序前,为每个进程确定它的"优先数"和"要求运行时间";
   3)把给定的进程按优先数的大小连成队列,用一单元指出队首进程;
   4)每模拟执行一次进程,优先数减一,要求运行时间减一;
   5)如果要求运行的时间>=0,再将它加入队列(按优先数的大小插入,重置队首标志);如果要求运行的时间=0,那么把它的状态修改为结束,且退出队列;
   6)若就绪队列不为空,重复上述,直到所有的进程都结束;
   7)程序有显示和打印语句,每次运行后显示变化。

2、按时间片轮转法实现处理机调度:
设计思路:

   1)每个进程用一个进程控制块PCB来代表,进程控制块包括进程名(进程的标识)、指针(把进程连成循环队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址)、已运行时间、状态(就绪、结束);
   2)每次运行处理机调度程序前,为每个进程确定它的"要求运行时间";
   3)用指针把给定的进程按顺序排成循环队列,用另一标志单元记录轮到的进程;
   4)每模拟运行一次进程,已运行时间加一;
   5)进程运行一次后,把该进程控制块的指针值送到标志单元,以指示下一个轮到的进程。若该进程要求运行时间≠已运行时间,未执行结束,待到下一轮再执行;若要求运行时间=已运行时间,状态改为结束,退出队列;
   6)若就绪队列不为空,重复步骤四和五;
   7)程序有显示和打印语句,每次运行后显示变化。

四、内容

1、时间片轮转法:

#include 
#include
#include
#include
#include
#include 
using namespace std;/*进程的数据结构*/
struct PCB
{int ID;//进程IDdouble in_time;//进程的进入时间double res_time;//进程的响应时间double l_time;//进程的剩余时间
};/*进程调度函数                                    */
/*输入:进程队列prs,时间片timeslice                */
/*输出:进程状态表                                */    
void ProcessScheduling(queueprs,double timeslice)
{cout << left;queueex_prs;//就绪队列,该队列中的进程是等待执行的ex_prs.push(prs.front());//第一个进程首先进入就绪队列prs.pop();//将第一个进程退出进程队列double slice_start;//时间片开始时间double slice_end = 0;//时间片结束时间cout << "----------------------------------进程状态表------------------------------------" << endl;cout <slice_start = slice_end;//更新时间片开始与结束时间slice_end += timeslice;//每次增加一个时间片的时间while (!prs.empty())//每次执行一个进程前,将能在此进程占用cpu期间进入就绪队列的进程加入就绪队列{if (prs.front().in_time > slice_end)break;ex_prs.push(prs.front());prs.pop();if (ex_prs.size() == 1){slice_start = slice_end;slice_end += timeslice;}}//如果就绪队列为空则继续while循环if (ex_prs.empty())continue;//如果剩余时间小于或等于时间片if (ex_prs.front().l_time <= timeslice){ex_prs.front().l_time = 0;//将进程的剩余时间置为0(可有可无)cout << setw(15) << ex_prs.front().ID << "|" << setw(15) << ex_prs.front().in_time << "|" << setw(15) << ex_prs.front().res_time << "|" << setw(15) << slice_start<<"|"<< setw(15) << slice_end<<"|"<< endl;ex_prs.pop();}else{ex_prs.front().l_time -= timeslice;//将进程的剩余时间减少一个时间片cout << setw(15) << ex_prs.front().ID << "|" << setw(15) << ex_prs.front().in_time << "|" << setw(15) << ex_prs.front().res_time << "|" << setw(15) << slice_start << "|" << setw(15) << slice_end <<"|"<< endl;//将队首进程置于队尾PCB tmp_pr = ex_prs.front();ex_prs.pop();ex_prs.push(tmp_pr);}}cout << "--------------------------------------------------------------------------------" << endl;
}
int main()
{queueprs;//总响应时间double allres_time = 0;//时间片double timeslice = 0;PCB    pr1, pr2, pr3;pr1 = { 1,0,10,10 };pr2 = { 2,1,5,5 };pr3 = { 3,2,5,5 };allres_time += pr1.res_time + pr2.res_time + pr3.res_time;timeslice = allres_time / 3;prs.push(pr1);prs.push(pr2);prs.push(pr3);cout << "时间片为:" << timeslice << endl;ProcessScheduling(prs, timeslice);cout << "添加进程?(y/n):";char i;cin >> i;while (i-'y'==0){PCB pr;cout << "请输入进程ID:";cin >> pr.ID;cout << "请输入进程到达时间:";cin >> pr.in_time;cout << "请输入进程响应时间:";cin >> pr.res_time;cout << "请输入进程剩余时间:";cin >> pr.l_time;prs.push(pr);allres_time += pr.res_time;timeslice = allres_time / prs.size();cout << "时间片为:" << timeslice << endl;ProcessScheduling(prs, timeslice);cout << "继续添加进程?(y/n):";cin >> i;}return 0;
}

五、总结与分析

   思路:先主函数输入要进行调度的进程数,然后调用函数create(),把进程的信息输入,再调用函数insert(),把输入的函数按照优先数的大小排成链表,然后调用函数prio()实现优先数调度。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...