进程调度程序设计

合集下载

进程调度程序实验报告

进程调度程序实验报告

一、实验目的通过本次实验,加深对进程调度原理和算法的理解,掌握进程调度程序的设计与实现方法。

实验要求我们使用高级编程语言编写一个简单的进程调度程序,实现不同调度算法的模拟,并通过实验验证算法的性能。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:IntelliJ IDEA三、实验内容本次实验主要实现以下调度算法:1. 先来先服务(FCFS)2. 最短作业优先(SJF)3. 时间片轮转(RR)四、实验步骤1. 定义进程类(Process):```javapublic class Process {private String processName; // 进程名称private int arrivalTime; // 到达时间private int burstTime; // 运行时间private int waitingTime; // 等待时间private int turnaroundTime; // 周转时间// 构造函数public Process(String processName, int arrivalTime, int burstTime) {this.processName = processName;this.arrivalTime = arrivalTime;this.burstTime = burstTime;}// 省略getter和setter方法}```2. 定义调度器类(Scheduler):```javapublic class Scheduler {private List<Process> processes; // 进程列表private int currentTime; // 当前时间// 构造函数public Scheduler(List<Process> processes) {this.processes = processes;this.currentTime = 0;}// FCFS调度算法public void fcfs() {for (Process process : processes) {process.setWaitingTime(currentTime -process.getArrivalTime());currentTime += process.getBurstTime();process.setTurnaroundTime(currentTime -process.getArrivalTime());}}// SJF调度算法public void sjf() {processes.sort((p1, p2) -> p1.getBurstTime() -p2.getBurstTime());for (Process process : processes) {process.setWaitingTime(currentTime -process.getArrivalTime());currentTime += process.getBurstTime();process.setTurnaroundTime(currentTime -process.getArrivalTime());}}// RR调度算法public void rr(int quantum) {List<Process> sortedProcesses = new ArrayList<>(processes);sortedProcesses.sort((p1, p2) -> p1.getArrivalTime() -p2.getArrivalTime());int timeSlice = quantum;for (Process process : sortedProcesses) {if (process.getBurstTime() > timeSlice) {process.setWaitingTime(currentTime - process.getArrivalTime());currentTime += timeSlice;process.setTurnaroundTime(currentTime - process.getArrivalTime());process.setBurstTime(process.getBurstTime() - timeSlice);} else {process.setWaitingTime(currentTime - process.getArrivalTime());currentTime += process.getBurstTime();process.setTurnaroundTime(currentTime - process.getArrivalTime());process.setBurstTime(0);}}}}```3. 测试调度程序:```javapublic class Main {public static void main(String[] args) {List<Process> processes = new ArrayList<>();processes.add(new Process("P1", 0, 5));processes.add(new Process("P3", 4, 2));processes.add(new Process("P4", 6, 4));Scheduler scheduler = new Scheduler(processes); System.out.println("FCFS调度结果:");scheduler.fcfs();for (Process process : processes) {System.out.println(process);}processes = new ArrayList<>();processes.add(new Process("P1", 0, 5));processes.add(new Process("P2", 1, 3));processes.add(new Process("P3", 4, 2));processes.add(new Process("P4", 6, 4));System.out.println("SJF调度结果:");scheduler.sjf();for (Process process : processes) {System.out.println(process);}processes = new ArrayList<>();processes.add(new Process("P1", 0, 5));processes.add(new Process("P2", 1, 3));processes.add(new Process("P3", 4, 2));System.out.println("RR调度结果(时间片为2):");scheduler.rr(2);for (Process process : processes) {System.out.println(process);}}}```五、实验结果与分析通过实验,我们可以观察到以下结果:1. FCFS调度算法简单,但可能导致长作业等待时间过长。

进程调度模拟程序设计

进程调度模拟程序设计

进程调度模拟程序设计进程调度模拟程序设计进程调度是操作系统中的重要组成部分。

一个好的进程调度算法可以提高操作系统的性能和响应速度。

因此,设计一个可以模拟进程调度的程序十分有必要。

本文主要介绍进程调度模拟程序的设计思路和实现方法。

一、模拟进程首先,我们需要模拟进程。

一个进程通常包括进程ID,进程状态、优先级、时间片等信息。

我们可以使用结构体来存储这些信息。

例如:```Cstruct process {int pid; // 进程IDint status; // 进程状态, 1表示就绪,0表示不就绪int priority; // 进程优先级,越小表示优先级越高int runtime; // 进程已经运行的时间片int timeslice; // 进程需要的时间片数};```二、设计进程调度算法接着,我们需要设计进程调度算法。

常见的调度算法包括FIFO、SJF、优先级调度、时间片轮转调度等等。

在本文中,我们以时间片轮转调度算法为例。

时间片轮转调度是将CPU的使用权轮流分配给就绪队列中的每一个进程的一种调度算法。

我们需要设置一个时间片长度,每个进程最多运行一个时间片,如果时间片耗尽就切换到下一个进程。

一个简单的时间片轮转调度算法可以采用双向链表来维护就绪队列。

使用队列的好处是可以快速地添加进程、删除进程,同时可以保持进程的顺序。

例如:```Cstruct node {struct process p; // 进程信息struct node *next; // 后继节点struct node *prev; // 前驱节点};struct queue {struct node *head; // 队首节点struct node *tail; // 队尾节点int size; // 队列大小};三、实现进程调度有了进程和调度算法的数据结构,我们就可以实现进程调度程序了。

我们可以先生成一些随机的进程,然后将它们添加到就绪队列中。

操作系统课程设计进程调度

操作系统课程设计进程调度
每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F (Finish)三种状态之一。
静态最高优先数调度算法的流程图如下:
开始
创建PCB
将PCB挂入就绪队 列中,优先级高的
放在队首
是 就绪队列空
否 从队首取下最高优
先级进程运行
结束
进程运行完成,撤 销
时间片轮转调度算法 就绪进程获得 CPU后都只能运行一个时间片。 如果运行一个时间片后,进程的已占用 CPU时间已达到所
课程实验的目的和意义
培养程序设计的方法和技巧 掌握操作系统的原理和功能
进程调度实验
目的要求
用高级语言编写和调试一个进程调度程序, 以加深对进程的概念及进程调度算法的理解。 (注意:这里只是模拟的进程调度程序,用 一个链表结点模拟一个进程,而不用我们之 前用过的createprocess函数创建进程)
进程调度实验
用三个队列,就绪、运行、完成来表示进程 的不同状态。当新来一个进程时,若采用静 态优先级,则根据优先级插入就绪队列中不 同位置(若队列为空,则直接插入)。若采 用时间片,则直接插入就绪队列队尾。
实验例题
设计一个有 N个进程共行的进程调度程序
链表中每一个结点包括两部分:
(1)用户需要用的实际数据;( name[10]; int prio; int round; int cputime; int needtime; 需自己输入)
需要的运行时间,则撤消该进程; 如果进程在所分的时间片内没有运行完成,则把它重新插
入就绪队列等待CPU。
时间片轮转调度算法的流程图如下:
开始
创建PCB
将PCB挂入就绪队 列中,先来的放在 队首,后来的放队

进程的调度实验报告(3篇)

进程的调度实验报告(3篇)

第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。

二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。

2. 实现三种调度算法:FCFS、RR和DP。

3. 创建一个进程队列,用于存储所有进程。

4. 实现调度函数,根据所选算法选择下一个执行的进程。

5. 模拟进程执行过程,打印进程执行状态和就绪队列。

四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。

C语言课程设计报告--进程调度

C语言课程设计报告--进程调度

C语言程序设计课程设计题目:进程调度院(系):专业班级:学号:学生姓名:指导教师:教师职称:起止时间:课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1程序功能介绍 (2)2.2程序整体设计说明 (2)2.2.1设计思路 (2)2.2.2数据结构设计及用法说明 (3)2.2.3程序结构(流程图) (4)2.2.4各模块的功能及程序说明 (4)2.2.5程序结果 (5)2.3程序源代码及注释 (6)第3章课程设计总结 (13)参考资料 (14)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。

本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。

C语言程序设计及相应的开发环境。

1.3 课程设计的预备知识熟悉C语言及C语言开发工具。

1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍在多道程序环境下,进程数目往往多于处理机数目,致使他们争用处理机。

这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行。

分配处理机的任务是由进程调度程序完成的。

一个进程被建立后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同点进程队列。

设计n个进程并发的进程调度程序

设计n个进程并发的进程调度程序

设计n个进程并发的进程调度程序(时间⽚轮转算法)⼀、实验⽬的⽤⾼级语⾔编写和调试⼀个进程调度程序,以加深对进程的概念及继承调度算法的理解。

⼆、实验内容和要求设计⼀个有N个进程并发的进程调度程序,采⽤时间⽚轮转算法。

Ø 每⼀个进程⽤⼀个进程控制块PCB表⽰。

PCB包含信息有:进程名name,进程号id,进程状态state,进程所需运⾏时间need_time,进程运⾏时间run_time。

Ø 进程所需的运⾏时间⼈为指定。

进程运⾏时间以时间⽚为单位进⾏计算。

(程序中以按任意键表⽰运⾏⼀次CPU时间⽚)Ø 每个进程的状态有就绪W,运⾏R,和完成F(撤销进程)。

Ø 就绪的进程获得CPU后只能运⾏⼀个时间⽚,运⾏完运⾏时间run_time+1。

Ø 如果运⾏⼀个时间⽚后,进程的run_time等于need_time(即已经达到所需运⾏时间),则撤销该进程并提⽰,如果还未达到,则将其放到队尾,进⼊就绪状态等待下⼀次时间⽚分配。

每⼀次调度程序都打印⼀次运⾏情况,包括:运⾏的进程,就绪队列的进程,已经所有进程的PCB(不包括已经撤销的进程)。

三、实验主要仪器设备和材料硬件环境:Window XP软件环境:Microsoft Visual C++ 2010 Express四、实验原理及⽅案1、实验原理本进程调度算法采⽤时间⽚轮转算法,具体是:每个进程被分配⼀个时间⽚,即该进程允许运⾏的时间。

就绪的进程都存放在⼀个就绪链表中,队⾸的进程将获得时间⽚。

如果在时间⽚结束时进程还在运⾏,则CPU将剥夺并分配给下⼀个进程。

调度程序所要做的就是维护⼀张就绪进程列表,当进程⽤完它的时间⽚后,它被移到队列的末尾。

2、设计⽅案程序设计三个主要模块来进⾏模拟进程的调度。

⼀是main()函数,⽤来按步操作模拟CPU分配执⾏每⼀个时间⽚,并循环判断程序是否结束。

⼆是newPCB()函数,⽤来接收⽤户输⼊的进程信息(进程数⽬,PCB变量值)来创建⼀个就绪进程链表。

进程调度算法模拟程序设计

进程调度算法模拟程序设计

进程调度算法模拟程序设计引言进程调度算法是操作系统中的重要组成部分,它决定了进程在系统中的执行顺序和分配时间片的策略。

为了更好地理解和研究不同的进程调度算法,我们可以设计一个模拟程序来模拟进程的调度过程。

本文将介绍进程调度算法的基本概念和常见的调度算法,并详细讨论如何设计一个进程调度算法模拟程序。

什么是进程调度算法进程调度算法是操作系统中的一种策略,用于决定在多个进程同时请求执行时,系统按照什么样的顺序来选择并分配CPU资源。

进程调度算法的目标是尽可能地提高系统的吞吐量、响应时间和公平性。

常见的进程调度算法先来先服务(FCFS)先来先服务是最简单的进程调度算法,它按照进程到达的先后顺序进行调度。

当一个进程到达系统后,它会被放入就绪队列中,然后按照先后顺序执行。

这种算法的优点是简单易懂,但是存在”饥饿”问题,即长作业会占用CPU资源,导致其他短作业等待时间过长。

短作业优先(SJF)短作业优先算法是根据进程的执行时间来进行调度的。

当一个进程到达系统后,系统会根据其执行时间将其放入适当的位置,执行时间短的进程优先执行。

这种算法可以最大限度地减少平均等待时间,但是对于长作业来说可能会饥饿。

时间片轮转(RR)时间片轮转算法是一种分时调度算法,它将CPU的执行时间划分为多个时间片,每个进程在一个时间片内执行一定的时间,然后切换到下一个进程。

这种算法可以保证所有进程都有机会执行,并且对于响应时间要求较高的任务比较合适。

多级反馈队列(MFQ)多级反馈队列算法是一种综合了FCFS和RR的调度算法。

系统将进程根据优先级划分为多个队列,每个队列都有不同的时间片大小。

当一个进程到达系统后,它被放入第一个队列中,如果在时间片内没有执行完,则被移到下一个队列中。

这种算法可以根据进程的优先级和执行时间动态调整调度策略,提高系统的响应性能。

进程调度算法模拟程序设计程序结构为了设计一个进程调度算法模拟程序,我们需要考虑以下几个方面的内容:1.进程的数据结构:我们可以使用一个进程控制块(PCB)来表示一个进程,PCB包含了进程的状态、优先级、执行时间等信息。

进程调度程序设计

进程调度程序设计

return; }
/*显示时间片耗尽,进程转为低优先级就绪状态*/ printf("Time slices for process %d exhausted.\n",running->pname); InsertIntoQueueTail(&Lready,running); sig=0; return; }
示显示器) #define MAX_PID 10 //系统并发运行的进程数的最大值 //定义PCB结构类型
struct PCB{
int A;
//累加器A
int PC;
//程序计数器PC
char *addr; //程序加载起始地址
int length; //程序大小
int runtime;
int waittime;
4、设计程序指令, MOV n //把整数n赋给累加器A
SAV m //把累加器A的值存入地址M ADD n //从累加器A的值减去整数n,结果送到累加器A。 SUB n //从累加器A的值减去整数n,结果送到累加器A。 MUL n //从累加器A的值乘以整数n,结果送到累加器A。 DIV n //从累加器A的值除以整数n,结果送到累加器A。 JEQ m //F为0跳转到m JLG m //F大于0跳转到m JLE m //F大于等于0跳转到m JMP m //无条件跳转到m OUT port //累加器的内容输出到端口port。port为0,指显示器
struct PCB *wait;
int sig=0;
int cur_pid; //当前_进程号
int readyNum=MAX_PID;
/**************************以下是函数说

进程调度模拟程序实验实验报告

进程调度模拟程序实验实验报告

进程调度模拟程序实验实验报告一、实验目的进程调度是操作系统的核心功能之一,它负责合理地分配 CPU 资源给各个进程,以提高系统的性能和效率。

本次实验的目的是通过编写和模拟进程调度程序,深入理解不同的进程调度算法的原理和特点,并比较它们在不同情况下的性能表现。

二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。

操作系统为 Windows 10。

三、实验原理1、先来先服务(FCFS)调度算法先来先服务调度算法按照进程到达的先后顺序进行调度,先到达的进程先获得 CPU 资源。

2、短作业优先(SJF)调度算法短作业优先调度算法优先调度执行时间短的进程。

3、时间片轮转(RR)调度算法时间片轮转调度算法将 CPU 时间划分为固定大小的时间片,每个进程轮流获得一个时间片的 CPU 资源。

四、实验设计1、进程类的设计创建一个进程类,包含进程 ID、到达时间、服务时间、剩余服务时间等属性,以及用于更新剩余服务时间和判断进程是否完成的方法。

2、调度算法实现分别实现先来先服务、短作业优先和时间片轮转三种调度算法。

3、模拟流程(1)初始化进程列表。

(2)按照选定的调度算法进行进程调度。

(3)计算每个进程的等待时间、周转时间等性能指标。

五、实验步骤1、定义进程类```pythonclass Process:def __init__(self, pid, arrival_time, service_time):selfpid = pidselfarrival_time = arrival_timeselfservice_time = service_timeselfremaining_service_time = service_time```2、先来先服务调度算法实现```pythondef fcfs_scheduling(process_list):current_time = 0total_waiting_time = 0total_turnaround_time = 0for process in process_list:if current_time < processarrival_time:current_time = processarrival_timewaiting_time = current_time processarrival_timetotal_waiting_time += waiting_timecurrent_time += processservice_timeturnaround_time = current_time processarrival_timetotal_turnaround_time += turnaround_timeaverage_waiting_time = total_waiting_time / len(process_list)average_turnaround_time = total_turnaround_time / len(process_list) print("先来先服务调度算法的平均等待时间:",average_waiting_time)print("先来先服务调度算法的平均周转时间:",average_turnaround_time)```3、短作业优先调度算法实现```pythondef sjf_scheduling(process_list):current_time = 0total_waiting_time = 0total_turnaround_time = 0sorted_process_list = sorted(process_list, key=lambda x: xservice_time) for process in sorted_process_list:if current_time < processarrival_time:current_time = processarrival_timewaiting_time = current_time processarrival_timetotal_waiting_time += waiting_timecurrent_time += processservice_timeturnaround_time = current_time processarrival_timetotal_turnaround_time += turnaround_timeaverage_waiting_time = total_waiting_time / len(process_list)average_turnaround_time = total_turnaround_time / len(process_list) print("短作业优先调度算法的平均等待时间:",average_waiting_time)print("短作业优先调度算法的平均周转时间:",average_turnaround_time)```4、时间片轮转调度算法实现```pythondef rr_scheduling(process_list, time_slice):current_time = 0total_waiting_time = 0total_turnaround_time = 0ready_queue =while len(process_list) > 0 or len(ready_queue) > 0:for process in process_list:if processarrival_time <= current_time:ready_queueappend(process)process_listremove(process)if len(ready_queue) == 0:current_time += 1continueprocess = ready_queuepop(0)if processremaining_service_time <= time_slice: waiting_time = current_time processarrival_time total_waiting_time += waiting_timecurrent_time += processremaining_service_time turnaround_time = current_time processarrival_time total_turnaround_time += turnaround_time processremaining_service_time = 0else:waiting_time = current_time processarrival_time total_waiting_time += waiting_timecurrent_time += time_sliceprocessremaining_service_time = time_sliceready_queueappend(process)average_waiting_time = total_waiting_time / len(process_list)average_turnaround_time = total_turnaround_time / len(process_list) print("时间片轮转调度算法(时间片大小为", time_slice, ")的平均等待时间:", average_waiting_time)print("时间片轮转调度算法(时间片大小为", time_slice, ")的平均周转时间:", average_turnaround_time)```5、主函数```pythonif __name__ =="__main__":process_list =Process(1, 0, 5),Process(2, 1, 3),Process(3, 2, 8),Process(4, 3, 6)print("先来先服务调度算法:")fcfs_scheduling(process_list)print("短作业优先调度算法:")sjf_scheduling(process_list)time_slice = 2print("时间片轮转调度算法(时间片大小为",time_slice, "):")rr_scheduling(process_list, time_slice)```六、实验结果与分析1、先来先服务调度算法平均等待时间为 575,平均周转时间为 1275。

进程调度算法模拟程序设计

进程调度算法模拟程序设计

进程调度算法模拟程序设计一、背景介绍进程调度算法是操作系统中的一个重要概念,它决定了操作系统如何分配CPU时间片给不同的进程。

不同的调度算法有不同的优缺点,需要根据具体情况进行选择。

为了更好地理解和掌握进程调度算法,我们可以设计一个模拟程序来模拟不同的调度算法。

二、程序设计思路1. 定义进程结构体首先需要定义一个进程结构体,包含进程ID、到达时间、服务时间、开始时间、完成时间等信息。

这些信息是模拟程序中需要用到的基本信息。

2. 选择调度算法接下来需要选择要模拟的调度算法,常见的有先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)等。

不同的算法对应着不同的实现方法和数据结构。

3. 实现调度算法对于每种调度算法,都需要实现相应的函数来进行模拟。

比如对于FCFS算法,可以按照到达时间从小到大排序,然后依次执行每个进程;对于SJF算法,则需要按照服务时间从小到大排序,在每个时刻选择服务时间最短的进程执行;对于RR算法,则需要使用队列来保存就绪队列中的所有进程,并按照时间片轮转的方式依次执行。

4. 输出结果最后需要输出每个进程的开始时间、完成时间、周转时间、带权周转时间等信息,以便进行比较和分析。

三、程序设计实现1. 定义进程结构体```c++struct Process {int pid; // 进程IDint arriveTime; // 到达时间int serviceTime; // 服务时间int startTime; // 开始时间int finishTime; // 完成时间};```2. 选择调度算法这里我们选择实现FCFS算法。

FCFS算法的实现比较简单,只需要按照到达时间从小到大排序,然后依次执行每个进程即可。

3. 实现调度算法```c++void fcfs(vector<Process>& processes) {sort(processes.begin(), processes.end(), [](const Process& a, const Process& b) {return a.arriveTime < b.arriveTime;});int currentTime = 0;for (int i = 0; i < processes.size(); i++) {if (currentTime < processes[i].arriveTime) {currentTime = processes[i].arriveTime;}processes[i].startTime = currentTime;processes[i].finishTime = currentTime +processes[i].serviceTime;currentTime = processes[i].finishTime;}}```4. 输出结果```c++void printResult(const vector<Process>& processes) {double totalTurnaroundTime = 0, totalWeightedTurnaroundTime = 0;cout << "进程ID\t到达时间\t服务时间\t开始时间\t完成时间\t 周转时间\t带权周转时间" << endl;for (const auto& p : processes) {int turnaroundTime = p.finishTime - p.arriveTime;double weightedTurnaroundTime =(double)turnaroundTime / p.serviceTime;totalTurnaroundTime += turnaroundTime;totalWeightedTurnaroundTime += weightedTurnaroundTime;printf("%d\t%d\t%d\t%d\t%d\t%d\t%.2f\n", p.pid,p.arriveTime, p.serviceTime, p.startTime,p.finishTime, turnaroundTime, weightedTurnaroundTime);}int n = processes.size();printf("平均周转时间:%.2f\n", (double)totalTurnaroundTime / n);printf("平均带权周转时间:%.2f\n", totalWeightedTurnaroundTime / n);}```四、总结通过以上程序设计实现,我们可以更好地理解和掌握进程调度算法。

进程调度算法设计与实现

进程调度算法设计与实现

进程调度算法设计与实现进程调度算法是操作系统中的重要组成部分,负责决定在多个进程同时运行时,如何合理地分配时间片和资源。

下面是一个简单的进程调度算法的设计与实现过程。

算法设计:1. 需要确定调度算法的目标和原则。

常见的调度目标包括提高系统吞吐量、提高响应速度、公平分配资源等。

根据实际需求确定目标和原则。

2. 确定进程调度的触发时机。

进程调度可以由多种事件触发,例如进程创建、进程结束、时间片用完、阻塞等。

根据具体需求确定触发时机。

3. 设计调度算法。

常见的调度算法有先来先服务(FIFO)、最短作业优先(SJF)、时间片轮转(RR)、多级反馈队列等。

选择适合的调度算法,并根据具体需求进行调整和优化。

算法实现:1. 需要设计数据结构来表示进程和调度队列。

进程可以用PCB(Process Control Block)来表示,调度队列可以使用队列或链表来表示。

2. 实现进程创建和调度。

当一个新的进程创建时,将其加入调度队列中。

根据调度触发时机,在合适的时机选择下一个要执行的进程。

3. 实现时间片轮转算法。

时间片轮转算法是一种常见的调度算法,可以简单实现如下:- 设置一个固定的时间片大小。

- 每次调度时,选择队列头部的进程执行,并将其放到队列尾部。

- 当进程用完时间片后,将其放到队列尾部继续执行。

4. 实现其他调度算法。

根据选择的调度算法,实现相应的算法逻辑。

例如,FIFO算法可以简单地选择队列头部的进程执行;SJF算法可以根据进程的剩余执行时间选择优先级最高的进程执行。

5. 根据实际需求进行优化。

通过调整时间片大小、队列优先级、进程优先级等参数,可以优化调度算法的性能和效果。

以上是进程调度算法设计与实现的一般过程,具体实现时可以根据实际需求进行调整和优化。

操作系统实验进程调度程序设计

操作系统实验进程调度程序设计

操作系统实验进程调度程序设计实验目的:1.了解进程调度的原理和实现方式;2.掌握操作系统中进程调度算法的设计和实现方法;3.实现一个简单的进程调度程序,模拟不同的调度算法。

实验内容:在操作系统中,进程调度是一项重要的任务。

它负责决定哪些进程可以运行,以及在什么时间运行。

进程调度的主要目标是提高计算机系统的资源利用率和吞吐量,以及减少用户的响应时间。

本次实验的目标是设计一个简单的进程调度程序,并实现不同的调度算法。

你需要完成以下任务:1. 了解调度算法的基本概念和原理,如先来先服务(FCFS)、最短进程优先(SJF)、优先级调度(Priority Scheduling)、时间片轮转(Round Robin)等;2. 设计一个进程控制块(Process Control Block, PCB),用于存储进程的相关信息,包括进程的标识符、优先级、到达时间、执行时间等;3.实现以上调度算法中的任意一种。

你可以选择自己感兴趣或熟悉的调度算法进行实现。

如果你不确定,可以选择先来先服务(FCFS)算法,这是最简单的调度算法之一;4.编写测试程序,模拟多个进程的到达和执行过程。

你可以根据需要设置不同的进程到达时间和执行时间,并观察不同调度算法下的执行效果。

实验步骤:1.了解调度算法的原理和实现方式。

可以通过查阅相关教材、资料或网络资源来获得更多信息;2. 设计进程控制块(Process Control Block, PCB),其中包括进程的标识符、优先级、到达时间、执行时间等信息;3.根据选择的调度算法,编写相应的调度程序。

你可以选择使用C、C++或其他编程语言来实现;4.编写测试程序,模拟多个进程的到达和执行过程。

可以通过使用随机数生成器来模拟进程到达时间和执行时间;5.运行测试程序,观察不同调度算法下的执行效果。

可以比较各个算法的平均周转时间、平均等待时间等指标,并分析结果;6.根据需要进行调整和优化,再次运行测试程序,并观察结果;7.总结实验过程和结果,撰写实验报告。

进程调度实验报告源码

进程调度实验报告源码

一、实验目的本次实验旨在通过模拟进程调度过程,加深对进程调度算法的理解,并掌握进程调度程序的设计与实现方法。

实验内容主要包括:创建进程、进程调度、进程执行、进程结束等。

二、实验环境操作系统:Linux编程语言:C/C++三、实验内容1. 进程调度算法本实验采用三种进程调度算法:FIFO(先进先出)、时间片轮转法、多级反馈队列调度算法。

2. 进程调度程序设计进程调度程序主要由以下部分组成:(1)进程控制块(PCB)PCB用于描述进程的基本信息,包括进程名、到达时间、需要运行时间、已运行时间、进程状态等。

(2)就绪队列就绪队列用于存储处于就绪状态的进程,按照进程的优先级或到达时间进行排序。

(3)进程调度函数进程调度函数负责从就绪队列中选择一个进程进行执行,并将CPU分配给该进程。

(4)进程执行函数进程执行函数负责模拟进程的执行过程,包括进程的创建、执行、结束等。

四、实验源码```c#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX_PROCESSES 10typedef struct PCB {int pid;int arrival_time;int need_time;int used_time;int priority;int state; // 0: 等待 1: 运行 2: 完成} PCB;PCB processes[MAX_PROCESSES];int process_count = 0;typedef struct Queue {PCB queue;int front;int rear;int size;} Queue;Queue ready_queue;void init_queue(Queue q) {q->queue = (PCB )malloc(sizeof(PCB) MAX_PROCESSES); q->front = q->rear = 0;q->size = 0;}void enqueue(Queue q, PCB p) {if (q->size == MAX_PROCESSES) {printf("Queue is full.\n");return;}q->queue[q->rear] = p;q->rear = (q->rear + 1) % MAX_PROCESSES; q->size++;}PCB dequeue(Queue q) {if (q->size == 0) {printf("Queue is empty.\n");return NULL;}PCB p = &q->queue[q->front];q->front = (q->front + 1) % MAX_PROCESSES; q->size--;return p;}int is_empty(Queue q) {return q->size == 0;}void print_queue(Queue q) {printf("Queue: ");for (int i = 0; i < q->size; i++) {PCB p = &q->queue[(q->front + i) % MAX_PROCESSES];printf("PID: %d, Arrival Time: %d, Need Time: %d, Used Time: %d, Priority: %d, State: %d\n",p->pid, p->arrival_time, p->need_time, p->used_time, p->priority, p->state);}}void init_processes() {for (int i = 0; i < MAX_PROCESSES; i++) {processes[i].pid = i;processes[i].arrival_time = rand() % 10;processes[i].need_time = rand() % 10 + 1;processes[i].used_time = 0;processes[i].priority = rand() % 3;processes[i].state = 0;}}void schedule() {int time = 0;while (process_count > 0) {for (int i = 0; i < process_count; i++) {PCB p = &processes[i];if (p->arrival_time == time) {enqueue(&ready_queue, p);p->state = 1;}}if (!is_empty(&ready_queue)) {PCB p = dequeue(&ready_queue);p->used_time++;printf("Process %d is running.\n", p->pid);if (p->used_time == p->need_time) {p->state = 2;printf("Process %d is finished.\n", p->pid); }}time++;}}int main() {srand(time(NULL));init_queue(&ready_queue);init_processes();process_count = rand() % MAX_PROCESSES + 1;schedule();print_queue(&ready_queue);return 0;}```五、实验结果与分析1. FIFO调度算法实验结果表明,FIFO调度算法按照进程的到达时间进行调度,可能导致短作业等待时间长,效率较低。

进程调度程序设计

进程调度程序设计

长沙学院课程设计说明书题目进程调度程序设计系(部) 计算机科学与技术系专业(班级) 2009级数据库二班姓名学号指导教师黄彩霞起止日期2012.6.4-2012.6.15课程设计任务书课程名称:操作系统课程设计设计题目:进程调度程序设计已知技术参数和设计要求:1. 设计任务设计一个虚拟内核,该内核能支持多任务管理。

提供创建进程、终止进程、进程状态转换,进程调度,上下文切换等功能。

2. 问题描述2.1 系统组成系统由虚拟内核(VKernel)、命令解释程序(Commander)、用户程序(Application)、编译器(Compiler)四部分组成。

VKernel首先运行,并常驻内存。

Kernel启动后,创建Commander进程。

根据用户请求创建多个Application进程。

Kernel负责维护6个数据结构,包括时间 (Time), 处理器状态(CPUstate),进程表(PCBTable), 就绪队列(ReadyState),等待队列(BlockedState),运行进程(RunningState)。

Time是系统时间片。

CPUstate应包括程序计数器PC,累加器A、B,状态寄存器F的值。

PCBTable的每一项是一个进程的进程控制块(PCB)。

Commander程序、Application程序是用下列CPU虚拟指令书写的程序:①CPU虚拟指令(以下指令仅供参考, 设计者可以自行设计)MOV n //把整数n赋给累加器ASAV m //把累加器A的值存入地址MADD n //从累加器A的值减去整数n,结果送到累加器A。

SUB n //从累加器A的值减去整数n,结果送到累加器A。

MUL n //从累加器A的值乘以整数n,结果送到累加器A。

DIV n //从累加器A的值除以整数n,结果送到累加器A。

JEQ m //F为0跳转到mJLG m //F大于0跳转到mJLE m //F大于等于0跳转到mJMP m //无条件跳转到mOUT port //累加器的内容输出到端口port。

进程的调度策略和流程

进程的调度策略和流程

进程的调度策略和流程
进程的调度策略主要有以下几种:
1. 先来先服务(FCFS):按照进程到达的顺序进行调度,先到达的进程优先级高。

2. 最短作业优先(SJF):选择估计运行时间最短的进程进行调度。

3. 最短剩余时间优先(SRF):选择当前剩余时间最短的进程进行调度。

4. 最高响应比优先(HRRN):选择响应比最高的进程进行调度,响应比 = (等待时间 + 执行时间)/ 执行时间。

5. 循环轮转法(RR):将所有进程按照到达时间顺序排列,每次调度一个进程,让其执行一定时间,然后将其放回就绪队列末尾,再选择下一个进程执行。

以上内容仅供参考,具体进程调度策略可能会根据实际情况进行选择。

建议咨询计算机领域业内人士,获取更准确的信息。

(完整word版)进程调度模拟程序设计

(完整word版)进程调度模拟程序设计

进程调度模拟程序设计一、实验目的按优先数调度算法或时间片轮转法模拟处理器调度,从而进一步理解处理器调度的原理。

二、实验内容1.设计思路(1)数据结构定义(a)对于不同的调度算法,定义不同的PCB结构体typedef struct PCB_type1 {char name[10]; //进程名char state;//进程状态R—-就绪状态E——结束状态int need_time; //运行需要的CPU时间(需运行的时间片个数)int priority;}PCB_P; //按优先数调度算法的PCB结构体typedef struct PCB_type2 {char name[10];//进程名int state; //进程状态R-—就绪状态E——结束状态int need_time; //运行需要的CPU时间(需运行的时间片个数)int used_time; //}PCB_T;//按时间片轮转算法的PCB结构体(b)用全局变量choice来指明当前应用的调度算法int choice;(c)为了模拟调度,可以利用STL定义队列deque<PCB_P> q1;queue〈PCB_T〉q2;(2)程序主要模块一共有三个自定义函数,分别是:start_state() 提示用户选择调度算法,初始化进程信息。

dispatch()模拟调度(a)对于优先数调度算法,每次调度前对队列里的进程按优先数从大到小排序,然后调度选中队首的进程,将其出队列,并将进程优先数和需要运行时间减1。

如果此进程的需要运行时间不为0,则继续将此进程入队;如果此进程的需要运行时间为0了,则将其状态置为结束状态。

重复上述过程直至队列为空.(b)对于时间片轮转算法,调度选中队首的进程,将其出队列,并将进程已用时间加1。

如果此进程要求运行时间已运行时间,则尚未执行结束,继续将此进程入队;如果此进程的要求运行时间=已运行时间,则已经执行结束,将其状态置为结束状态。

设计一个有N个进程共行的进程调度程序

设计一个有N个进程共行的进程调度程序

一、目的要求用高级语言‎编写和调试‎一个进程调‎度程序,以加深对进‎程的概念及‎进程调度算‎法的理解.二、实验题:设计一个有‎N个进程共‎行的进程调‎度程序。

进程调度算‎法:采用最高优‎先数优先的‎调度算法(即把处理机‎分配给优先‎数最高的进‎程)和先来先服‎务算法。

每个进程有‎一个进程控‎制块( PCB)表示。

进程控制块‎可以包含如‎下信息:进程名、优先数、到达时间、需要运行时‎间、已用CPU‎时间、进程状态等‎等。

进程的优先‎数及需要的‎运行时间可‎以事先人为‎地指定(也可以由随‎机数产生)。

进程的到达‎时间为进程‎输入的时间‎。

进程的运行‎时间以时间‎片为单位进‎行计算。

每个进程的‎状态可以是‎就绪 W(Wait)、运行R(Run)、或完成F(Finis‎h)三种状态之‎一。

就绪进程获‎得 CPU后都‎只能运行一‎个时间片。

用已占用C‎P U时间加‎1来表示。

如果运行一‎个时间片后‎,进程的已占‎用 CPU时间‎已达到所需‎要的运行时‎间,则撤消该进‎程,如果运行一‎个时间片后‎进程的已占‎用CPU时‎间还未达所‎需要的运行‎时间,也就是进程‎还需要继续‎运行,此时应将进‎程的优先数‎减1(即降低一级‎),然后把它插‎入就绪队列‎等待CPU‎。

每进行一次‎调度程序都‎打印一次运‎行进程、就绪队列、以及各个进‎程的 PCB,以便进行检‎查。

重复以上过‎程,直到所要进‎程都完成为‎止。

三、实验参考:调度算法的‎流程图如下‎:进程调度源‎程序如下:jingc‎h endi‎a odu.cpp#inclu‎d e "stdio‎.h"#inclu‎d e <stdli‎b.h>#inclu‎d e <conio‎.h>#defin‎e getpc‎h(type) (type*)mallo‎c(sizeo‎f(type)) #defin‎e NULL 0struc‎t pcb { /* 定义进程控‎制块PCB‎*/char name[10];char state‎;int super‎;int ntime‎;int rtime‎;struc‎t pcb* link;}*ready‎=NULL,*p;typed‎e f struc‎t pcb PCB;sort() /* 建立对进程‎进行优先级‎排列函数*/{PCB *first‎, *secon‎d;int inser‎t=0;if((ready‎==NULL)||((p->super‎)>(ready‎->super‎))) /*优先级最大‎者,插入队首*/{p->link=ready‎;ready‎=p;}else /* 进程比较优‎先级,插入适当的‎位置中*/{first‎=ready‎;secon‎d=first‎->link;while‎(secon‎d!=NULL){if((p->super‎)>(secon‎d->super‎)) /*若插入进程‎比当前进程‎优先数大,*/ { /*插入到当前‎进程前面*/p->link=secon‎d;first‎->link=p;secon‎d=NULL;inser‎t=1;}else /* 插入进程优‎先数最低,则插入到队‎尾*/{first‎=first‎->link;secon‎d=secon‎d->link;}}if(inser‎t==0) first‎->link=p;}}input‎() /* 建立进程控‎制块函数*/{int i,num;clrsc‎r(); /*清屏*/print‎f("\n 请输入进程‎号?");scanf‎("%d",&num);for(i=0;i<num;i++){print‎f("\n 进程号No‎.%d:\n",i);p=getpc‎h(PCB);print‎f("\n 输入进程名‎:");scanf‎("%s",p->name);print‎f("\n 输入进程优‎先数:");scanf‎("%d",&p->super‎);print‎f("\n 输入进程运‎行时间:");scanf‎("%d",&p->ntime‎);print‎f("\n");p->rtime‎=0;p->state‎='w';p->link=NULL;sort(); /* 调用sor‎t函数*/}}int space‎(){int l=0; PCB* pr=ready‎;while‎(pr!=NULL){l++;pr=pr->link;}retur‎n(l);}disp(PCB * pr) /*建立进程显‎示函数,用于显示当‎前进程*/{print‎f("\n qname‎\t state‎\t super‎\t ndtim‎e \t runti‎m e \n"); print‎f("|%s\t",pr->name);print‎f("|%c\t",pr->state‎);print‎f("|%d\t",pr->super‎);print‎f("|%d\t",pr->ntime‎);print‎f("|%d\t",pr->rtime‎);print‎f("\n");}check‎() /* 建立进程查‎看函数 */{PCB* pr;print‎f("\n **** 当前正在运‎行的进程是‎:%s",p->name); /*显示当前运‎行进程*/disp(p);pr=ready‎;print‎f("\n ****当前就绪队‎列状态为:\n"); /*显示就绪队‎列状态*/ while‎(pr!=NULL){disp(pr);pr=pr->link;}}destr‎o y() /*建立进程撤‎消函数(进程运行结‎束,撤消进程)*/ {print‎f("\n 进程 [%s] 已完成.\n",p->name);free(p);}runni‎n g() /* 建立进程就‎绪函数(进程运行时‎间到,置就绪状态‎*/ {(p->rtime‎)++;if(p->rtime‎==p->ntime‎)destr‎o y(); /* 调用des‎t roy函‎数*/else{(p->super‎)--;p->state‎='w';sort(); /*调用sor‎t函数*/}}main() /*主函数*/{int len,h=0;char ch;input‎();len=space‎();while‎((len!=0)&&(ready‎!=NULL)){ch=getch‎a r();h++;print‎f("\n The execu‎t e numbe‎r:%d \n",h);p=ready‎;ready‎=p->link;p->link=NULL;p->state‎='R';check‎();runni‎n g();print‎f("\n 按任一键继‎续......");ch=getch‎a r();}print‎f("\n\n 进程已经完‎成.\n");ch=getch‎a r();}四.选做题:.编写并调试‎一个模拟的‎进程调度程‎序,采用“最高优先数‎优先”调度算法对‎五个进程进‎行调度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

长沙学院课程设计说明书题目进程调度程序设计系(部) 计算机科学与技术系专业(班级) 2009级数据库二班姓名学号指导教师黄彩霞起止日期2012.6.4-2012.6.15课程设计任务书课程名称:操作系统课程设计设计题目:进程调度程序设计已知技术参数和设计要求:1. 设计任务设计一个虚拟内核,该内核能支持多任务管理。

提供创建进程、终止进程、进程状态转换,进程调度,上下文切换等功能。

2. 问题描述2.1 系统组成系统由虚拟内核(VKernel)、命令解释程序(Commander)、用户程序(Application)、编译器(Compiler)四部分组成。

VKernel首先运行,并常驻内存。

Kernel启动后,创建Commander进程。

根据用户请求创建多个Application进程。

Kernel负责维护6个数据结构,包括时间 (Time), 处理器状态(CPUstate),进程表(PCBTable), 就绪队列(ReadyState),等待队列(BlockedState),运行进程(RunningState)。

Time是系统时间片。

CPUstate应包括程序计数器PC,累加器A、B,状态寄存器F的值。

PCBTable的每一项是一个进程的进程控制块(PCB)。

Commander程序、Application程序是用下列CPU虚拟指令书写的程序:①CPU虚拟指令(以下指令仅供参考, 设计者可以自行设计)MOV n //把整数n赋给累加器ASAV m //把累加器A的值存入地址MADD n //从累加器A的值减去整数n,结果送到累加器A。

SUB n //从累加器A的值减去整数n,结果送到累加器A。

MUL n //从累加器A的值乘以整数n,结果送到累加器A。

DIV n //从累加器A的值除以整数n,结果送到累加器A。

JEQ m //F为0跳转到mJLG m //F大于0跳转到mJLE m //F大于等于0跳转到mJMP m //无条件跳转到mOUT port //累加器的内容输出到端口port。

port为0,指显示器;为1,指扬声器。

②虚拟系统调用(以下系统调用仅供参考, 设计者可自行设计)exec() //执行程序并创建子进程exit() //进程终止block() //进程等待printk() //在屏幕上打印系统信息scanf() //从键盘输入一字符串msg() //向内核发送消息为了简化设计,复杂的系统调用当作广义指令处理。

2.2命令解释程序命令解释程序从标准输入重复读入用户命令,然后以消息形式发送给内核。

命令解释程序处理的命令由设计者定义并实现。

2.3 编译器编译器把虚拟指令和虚拟系统调用编译为可执行字节码。

可执行字节码由内核解释执行。

3. 功能要求应实现的功能有:(1)能接收用户提交的命令并执行该命令。

(2)执行用户程序:创建进程、终止进程、调度进程、管理进程状态转换4. 技术要求采用时间轮转和优先级调度混合算法。

优先级以优先数表示,优先数越大则优先级越高。

调度时,就绪队列中优先数最大的进程优先运行,相同优先数进程按FIFO方式调度。

进程运行一个时间片以后,其优先数数减1(即降低一级);进程在就绪队列中等待3个时间片以后,其优先数加1。

优先数范围0~31。

5. 界面要求用户界面设计不做统一规定,但应做到界面友好,易于操作。

6. 其他要求编程语言和操作系统不限。

4. 课程设计时间:2周(2012.06.04~2012.6.15)5. 课程设计的考核方式及评分方法(1) 考核方式■课程设计结束时,在机房当场验收。

■教师提供测试数据,检查运行结果是否正确。

■回答教师提出的问题。

■学生提交课程设计文档(A4打印件),教师评阅。

(2) 评分方法上机检查:书面报告:答辩=6:3:1,没有通过上机检查的或不提交课程设计报告的,其成绩直接记为不及格。

指导教师签名:日期:系主任签名:日期:长沙学院课程设计鉴定表摘要进程调度程序设计,主要是用于教学的一个程序设计。

通过本程序完成达到一个对进程调度的核心原理及实现的深度理解的目的,同时也更加深入的了解计算机。

该程序的虚拟内核支持多进程。

可以实现进程的创建,及进程的优先级调度等等功能。

其中,这个蓄力内核上并发执行是允许的,优先级调度是是键盘轮转算法和优先级调度算法的混合实现。

进程运行一个时间片优先数降1;等待进程等待3个时间片后优先数加1。

本次设计选择的是C语言,C语言一直是做底层开发的首先,所以这也是我本次设计选择该语言的原因。

关键词:进程,并发,调度,优先级目录1 设计内容与要求 (1)1.1 设计内容: (1)1.2 设计要求: (1)2 设计说明 (2)2.1 需求分析 (2)2.2 方案设计 (2)2.2.1 总体解决方案 (2)2.2.2 基本内核 (3)2.2.3 内核扩展 (3)2.2.4 系统设计架构 (4)3 基本编码 (5)3.1 CPU虚拟指令设计 (5)3.2 PCB和CPU设计 (5)4 测试 (6)5 总结 (8)参考文献 (9)附录程序源代码 (10)1设计内容与要求1.1 设计内容:通过对操作系统课程的学习,利用所学的知识原理.设计一个虚拟内核,该内核能够实现先到先服务与时间轮转片算法的合理利用。

能够支持多任务管理。

提供创建进程、终止进程、进程状态转换,进程调度,上下文切换。

1.2 设计要求:1)功能要求:预期实现的功能:(1)能够接收用户提交的命令并执行该命令。

(2)执行用户程序:创建进程、终止进程(3)能够按照优先级和时间片实现调度进程、管理进程状态转换。

2)技术要求:(采用时间轮转和优先级调度混合算法。

优先级以优先数表示,优先数越大则优先级越高。

调度时,就绪队列中优先数最大的进程优先运行,相同优先数进程按FIFO方式调度。

进程运行一个时间片以后,其优先数数减1(即降低一级);进程在就绪队列中等待3个时间片以后,其优先数加1。

优先数范围0~31。

流程如如图所示3)界面要求:用户界面简洁。

对程序输出速度做一定控制。

输出字段简洁易于理解4)其他要求在设计中须使用make工具建立工程。

2设计说明2.1 需求分析在多道程序系统中,一个进程(作业)被提交后必须经过处理机调度后,方能获得处理机执行。

在较完善的操作系统中,进程调度程序按照一定的策略,动态的把处理机分配给处于就绪队列中的某一个进程,以使之执行。

对于不同的调度都有都可以采用不同的调度方式和调度算法。

在本程序设计中模拟进程调度中:根据所有的设计要求和内容分析把整个设计分为三个部分:一个是伪指令的解释执行程序,二是伪调度算法、系统调用和文件输入,三是进程的创建及mian()函数的总体实现。

系统由虚拟内核(VKernel)、命令解释程序(Commander)、用户程序(Application)、编译器(Compiler)四部分组成。

命令解释程序从标准输入重复读入用户命令,然后以消息形式发送给内核。

命令解释程序处理的命令由设计者定义并实现。

编译器把虚拟指令和虚拟系统调用编译为可执行字节码。

可执行字节码由内核解释执行。

最高优先数优先调度算法的基本思想是:将CPU分配给就绪队列中优先数最高的进程。

采用动态优先数,即优先数在创定时由系统给定一个初始值,当进程获得一次CPU后其优先数就减1,然后把它插入就绪等待队列等待CPU2.2 方案设计2.2.1总体解决方案实验过程中遇到的问题及解决方案1)动态优先调度算法与时间片轮转法调度算法的调度过程2)链队列的相关3)动态优先权调度算法设计思想:a)先按优先数大小对就绪队列结点进行排序b)队首元素为即将运行进程,恢复现场,把相应数据加载到程序计数器和累加器c)运行队首进程d)保护现场,把程序计数器和累加器的数据保存到PCBe)查看其他进程的等待数,如果等待3个时间片,优先级数就增加1,同时把该进程等待数清0,取出运行的元素优先级减1,同时也把该进程的等待数清0.f)进程若在一个时间片内运行完,则停止该元素的运行,输出结果,同时把它从队列中清除,再按优先级大小排序。

g)重复(2),(3)。

4)轮转法进程调度算法设计思想:a)将所有就绪进程按照到达时间的先后顺序插入队列中。

b)取出队首元素运行一个时间片。

c)时间片到就停止该进程的执行,并将其插入队尾。

d)重复(2),(3)。

2.2.2基本内核设计分两步走,先实现一个简单的虚拟内核,简单虚拟内核运行无误后,再在上面扩展。

简单虚拟内核启动后直接把用户应用程序调入内存运行,它只加载一个用户程序(即单任务)。

应用程序也是最简单的,它计算100个自然数的和。

用户程序的编译和加载过程如图1所示。

图1 进程加载示意图2.2.3内核扩展在上面基本内核基础上扩展,增加10条指令,存放在cpl文件夹中。

在编写一个.cpp程序,具有虚拟内核能并发执行两个以上程序,基于优先数抢占调度(不含等待态),指令10条以上(含跳转指令、系统调用)的功能。

在typedef struct PCB{} PCB中,short A寄存器A ,int PC 程序计数器PC,char *addr 程序加载起始地址,int length程序大小,char name[24]进程名字,int priority;优先级数, 值为0--31,其中31为最高级,int cputime cpu运行时间,int needtime还需运行的时间state process为ready,execute,finish三种状态PCB * next。

PCB * get_process()用来加载用户程序;界面采用void display()函数,让用户根据自己的需要输入进程名和运行所需的时间;所需时间为0的时候进程结束使用函数int process_finish()判断;void cpuexerun() 函数用来执行指令其中包含新增加的10条指令;void cpuexe()调用void cpuexerun(),并寻找优先级最高的执行;在main()中调用void priority_cal()将程序运行;最后将无误的.cpp文件和cpl文件夹放在同一目录下,执行程序是只需运行.cpp程序。

2.2.4系统设计架构基本编码3.1 CPU虚拟指令设计按照自理定规范设计出一套虚拟指令,编写指令编译器,编译指令,3.2 PCB和CPU设计PCB栈的每一项是一个进程的进程控制块(PCB),它需要定义寄存器、程序计数器、程序加载起始地址、程序大小以及与进程有关的定义,如:进程名、运行所需要的时间、运行状况等等。

而CPU包括程序计数器和累加器PCB具体设计如下:CUP具体设计如下:4测试测试数据如下:A.进程0计算1+2+3+……+8+9+10B.进程1计算10个2相乘然后再除以5个4C.进程2计算1+2+3+4+5-5-4-3-2-1预期结果为A.进程0计算结果55B.进程1计算结果1C.进程2计算结果0三个进程初始化状态:由前面的需求分析可以得到测试要点:1.优先数越大则优先级越高。

相关文档
最新文档