实验一-处理机调度实验报告.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
实验一 处理机调度 一、实验内容 选择一个调度算法,实现处理机调度。 二、实验目的 多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。 三、实验题目 1、设计一个按优先权调度算法实现处理机调度的程序; 2、设计按时间片轮转实现处理机调度的程序。 PCB内容要求 : 进程名/PID; 要求运行时间(单位时间); 优先权; 状态: PCB指针; 1、可随机输入若干进程,并按优先权排序; 2、从就绪队首选进程运行:优先权-1 要求运行时间-1 要求运行时间=0时,撤销该进程 3、重新排序,进行下轮调度; 源代码: #include <stdio.h> #include <stdlib.h> 实验一-处理机调度实验报告全文共9页,当前为第1页。#include <string.h> 实验一-处理机调度实验报告全文共9页,当前为第1页。 #include <windows.h> typedef struct pcb { char PID[50]; int needTime;//需要运行时间 int priority;//优先权 char state[20];//进程状态 struct pcb *next; }PCB; typedef struct { PCB* front; PCB* rear; }ProcessQueue; void SelectAlgorithm(); void CreateQProcess(ProcessQueue &Q,char*,int time,int pri,char*); void ProcessSchedule(); void InitQueue(ProcessQueue &Q); void visitQueue(ProcessQueue &Q); bool RunProcess(PCB* rp,ProcessQueue &Q); bool NonPreemptivePriority(ProcessQueue &Q);//非抢占式优先权调度 void delProcess(PCB* delp); bool RunProcessPreem(PCB* rp,ProcessQueue &Q);//抢占式优先执行进程 bool PreemptivePriority(ProcessQueue &Q); void RR(ProcessQueue &Q); int main() { int iSel; int i = 0; SelectAlgorithm(); ProcessQueue readyQ;//就绪进程队列 PCB newpcb; InitQueue(readyQ); printf("请选择调度算法:"); do { scanf("%d",&iSel); } while (!(iSel == 1 "" iSel == 2 "" iSel == 3)); while(i < 3) { 实验一-处理机调度实验报告全文共9页,当前为第2页。 printf("请输入要创建的进程:\n"); 实验一-处理机调度实验报告全文共9页,当前为第2页。 fflush(stdin); gets(newpcb.PID);fflush(stdin); scanf("%d",&newpcb.needTime);fflush(stdin); scanf("%d",&newpcb.priority);fflush(stdin); gets(newpcb.state);fflush(stdin); CreateQProcess(readyQ,newpcb.PID,newpcb.needTime,newpcb.priority,newpcb.state); printf("创建了一个进程\n"); ++i; } visitQueue(readyQ);//显示的是各个进程的优先权 switch(iSel) { case 1: while(NonPreemptivePriority(readyQ));//非抢占优先权调度 break; case 2: PreemptivePriority(readyQ);//抢占式优先权调度 break; case 3: RR(readyQ); break; } return 0; } void SelectAlgorithm() { printf("1.非抢占式优先权调度\n"); printf("2.抢占式优先权调度\n"); printf("3.时间片轮转调度\n"); } void InitQueue(ProcessQueue &Q)//初始化进程队列 { Q.front = Q.rear = (PCB*)mallo 实验一的处理机调度实验主要关注操作系统中的进程调度机制,它是多道程序系统中核心的管理功能之一。实验目标在于让参与者通过模拟实现不同的调度算法,深入理解处理机调度的工作原理。 1. **非抢占式优先权调度**: 在这种调度算法中,一旦进程获得了处理器,就会一直执行直到完成或自愿放弃处理器。在实验中,`NonPreemptivePriority` 函数实现了这个算法。进程根据其优先级进行排序,高优先级的进程先获得执行机会。当所有进程的优先级相同时,可以通过比较它们的运行时间来决定哪个进程先执行。当进程运行时间耗尽或主动完成,进程将被移出就绪队列。 2. **抢占式优先权调度**: 与非抢占式不同,抢占式调度允许高优先级的进程中断正在执行的低优先级进程。在实验中,`PreemptivePriority` 函数负责实现这个机制。当有更高优先级的进程进入就绪队列时,它会检查当前运行的进程,如果新的进程优先级更高,则会抢占当前进程,让新进程立即执行。 3. **时间片轮转调度**: 时间片轮转是一种常见的调度算法,尤其适用于交互式系统。在 `RR` 函数中,所有进程被分配一个固定的时间片,如量子,轮流执行。当一个进程的时间片用完,它会被暂停并放回就绪队列,然后下一个进程开始执行。如果进程在时间片结束前完成,它会释放处理器,让其他进程有机会运行。 在实验中,首先通过 `CreateQProcess` 函数创建带有进程信息(如进程名/PID、运行时间、优先权和状态)的 PCB(进程控制块)。接着,用户可以选择调度算法,程序将根据所选算法运行相应的调度循环,如 `NonPreemptivePriority` 或 `PreemptivePriority`。 为了便于观察调度过程,`visitQueue` 函数用于显示当前就绪队列中各进程的优先权。在主函数 `main` 中,用户可以创建多个进程,并选择调度算法进行模拟。初始化进程队列 `InitQueue` 使用动态内存分配创建一个空队列,而 `delProcess` 函数用于删除指定的进程。 实验过程中,用户需要理解以下概念: - **就绪队列**:等待处理机的进程集合。 - **进程状态**:进程可能处于就绪、运行或阻塞状态。 - **优先权**:决定进程调度顺序的重要指标。 - **抢占**:高优先级进程中断低优先级进程的能力。 - **时间片**:在轮转调度中,每个进程分配到的连续处理机时间。 通过这个实验,参与者不仅学习了不同调度算法的原理,还能实际操作,从而加深对处理机调度策略的理解。
- 粉丝: 193
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页