首页 > 其他分享 >操作系统

操作系统

时间:2024-06-11 23:43:40浏览次数:19  
标签:run 操作系统 System ready 进程 null chose

一、实验目的

进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制块、进程队列等概念,并体会和了解优先数算法(包括抢占式和非抢占式)和时间片轮转算法的具体实施办法。

二、实验内容和要求

  1. 设计进程控制块PCB的结构,通常应包括如下信息:

进程名、进程优先数(时间片轮转算法中本次轮转需要的剩余时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。

  1. 编写两种调度算法程序:

优先数调度算法程序(包括抢占式和非抢占式)

循环轮转调度算法程序

  1. 将程序源代码和运行截图写入实验报告并提交。

、实验步骤

  1. 实验准备

(1) 查阅相关资料;

(2) 初步编写程序;

(3) 准备测试数据; 

  1. 源代码

package caozuoxitong;

 

import java.util.Scanner;

 

class PCB {

String name; // 进程的名字

int prio; // 进程的优先级

int round; // 分配 CPU 的时间片

int cputime; // CPU 执行时间

int needtime; // 进程执行所需要的时间

char state; // 进程的状态, W——就绪, R——执行, F——完成

int count; // 记录执行的次数

PCB next; // 链表指针

 

PCB(String name, int needtime) {

this.name = name;

this.needtime = needtime;

this.cputime = 0;

this.state = 'W';

this.count = 0;

this.round = 2;

this.prio = 50 - needtime; // 设置进程优先值初值

}

}

 

public class test {

static PCB ready = null, run = null, finish = null, tail = null; // 定义三个队列,就绪队列头,执行队列头和完成队列头,就绪队列尾

static int N;

 

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

char chose = ' ';

while (chose != 'q' && chose != 'Q') {

System.out.println("选择进程优先级算法(抢占式)请输入P,选择循环轮转算法请输入R,选择循环轮转算法(非抢占式)请输入I,退出请输入Q");

System.out.print("请输入你的选择:");

chose = scanner.next().charAt(0);

if (chose != 'q' && chose != 'Q') {

if (chose == 'P' || chose == 'p') {

priorInit(chose);

priority(chose);

} else if (chose == 'r' || chose == 'R') {

roundrunInit(chose);

roundrun(chose);

}

else if (chose == 'I' || chose == 'i') {

priorInit2(chose);

priority2(chose);

}

}

}

System.out.println("谢谢使用!");

scanner.close();

}

 

static void firstin() { // 调度就绪队列的第一个进程投入运行

if (ready != null) {

run = ready;

ready = ready.next;

run.state = 'R';

run.next = null;

} else {

run = null;

}

}

 

static void print1(char a) { // 打印表头行信息

if (Character.toUpperCase(a) == 'P') {

System.out.println("name cputime needtime prio state");

} else {

System.out.println("name cputime needtime count round state");

}

}

 

static void print2(char chose, PCB p) { // 打印每一行的状态信息

if (Character.toUpperCase(chose) == 'P') {

System.out.printf("%s\t%d\t%d\t%d\t%c\n", p.name, p.cputime, p.needtime, p.prio, p.state);

} else {

System.out.printf("%s\t%d\t%d\t%d\t%d\t%c\n", p.name, p.cputime, p.needtime, p.count, p.round, p.state);

}

}

 

static void print(char chose) { // 打印每执行一次算法后所有的进程的状态信息

PCB p;

print1(chose);

if (run != null) {

print2(chose, run);

}

p = ready;

while (p != null) {

print2(chose, p);

p = p.next;

}

p = finish;

while (p != null) {

print2(chose, p);

p = p.next;

}

}

 

static void insertPrio(PCB q) { // 在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中

PCB p = ready, r = null;

if (q.prio > ready.prio) { // 要插入的进程的优先级大于ready 的优先级

q.next = ready;

ready = q;

} else { // 要插入的进程的优先级不大于ready 的优先级

while (p != null && p.prio >= q.prio) {

r = p;

p = p.next;

}

q.next = p;

if (r != null) {

r.next = q;

}

}

}

 

static void priorInit(char chose) { // 进程优先级法初始化将进程按优先级插入到就绪队列里

Scanner scanner = new Scanner(System.in);

System.out.println("输入进程的个数N:");

N = scanner.nextInt();

for (int i = 0; i < N; i++) {

System.out.printf("输入第%d个进程名\n", i + 1);

String na = scanner.next();

System.out.println("完成进程需要的时间片数");

int time = scanner.nextInt();

PCB p = new PCB(na, time);

if (ready == null) {

ready = p;

ready.next = null;

} else {

insertPrio(p);

}

System.out.println("当前就绪队列的进程的信息");

print(chose);

}

System.out.printf("%d个进程已按优先级从高到低进到就绪队列中\n", N);

System.out.println("按回车键开始模拟优先级算法....");

scanner.nextLine();

scanner.nextLine();

firstin();

}

 

static void priority(char chose) { // 进程优先级算法总函数

while (run != null) {

run.cputime += 1;

run.needtime -= 1;

run.prio -= 1;

if (run.needtime == 0) {

run.next = finish;

finish = run;

run.state = 'F';

run.prio = 0;

run = null;

firstin();

} else {

if (ready != null && run.prio < ready.prio) {

run.state = 'W';

insertPrio(run);

run = null;

firstin();

}

}

print(chose);

}

}

static void priorInit2(char chose) { // 进程优先级法初始化将进程按优先级插入到就绪队列里

Scanner scanner = new Scanner(System.in);

System.out.println("输入进程的个数N:");

N = scanner.nextInt();

for (int i = 0; i < N; i++) {

System.out.printf("输入第%d个进程名\n", i + 1);

String na = scanner.next();

System.out.println("完成进程需要的时间片数");

int time = scanner.nextInt();

PCB p = new PCB(na, time);

if (ready == null) {

ready = p;

ready.next = null;

} else {

insertPrio(p);

}

System.out.println("当前就绪队列的进程的信息");

print(chose);

}

System.out.printf("%d个进程已按优先级从高到低进到就绪队列中\n", N);

System.out.println("按回车键开始模拟优先级算法....");

scanner.nextLine();

scanner.nextLine();

firstin();

}

 

static void priority2(char chose) { // 进程优先级算法总函数

{

while (run != null) {

run.cputime += 1;

run.needtime -= 1;

run.prio -= 1;

if (run.needtime == 0) {

run.next = finish;

finish = run;

run.state = 'F';

run.prio = 0;

run = null;

firstin();

}

print(chose);

}

}

 

}

 

static void insertRr(PCB q) { // 在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾

tail.next = q;

tail = q;

q.next = null;

}

 

static void roundrunInit(char chose) { // 循环轮转法初始化将就绪队列保存为FIFO队列

Scanner scanner = new Scanner(System.in);

System.out.println("\t\t循环轮转算法模拟全过程\n\n");

System.out.println("输入进程的个数N:");

N = scanner.nextInt();

for (int i = 0; i < N; i++) {

System.out.printf("输入第%d个进程名\n", i + 1);

String na = scanner.next();

System.out.println("完成进程需要的时间片数");

int time = scanner.nextInt();

PCB p = new PCB(na, time);

if (ready != null) {

insertRr(p);

} else {

ready = p;

tail = p;

}

System.out.println("当前就绪队列的进程的信息");

print(chose);

}

System.out.printf("%d 个进程已按FIFO进到就绪队列中\n", N);

System.out.println("按回车键开始模循环轮转算法......");

scanner.nextLine();

scanner.nextLine();

run = ready;

ready = ready.next;

run.state = 'R';

}

 

static void roundrun(char chose) { // 循环轮转法总算法

while (run != null) {

run.cputime += 1;

run.needtime -= 1;

run.count += 1;

if (run.needtime == 0) {

run.next = finish;

finish = run;

run.state = 'F';

run.prio = 0;

run = null;

if (ready != null) {

firstin();

}

} else {

if (run.count == run.round) {

run.count = 0;

if (ready != null) {

run.state = 'W';

insertRr(run);

firstin();

}

}

}

print(chose);

}

}

}

 

 

 

 

 

  1. 测试数据

优先级算法(抢占式)

 

 

选择循环轮转算法

 

 

 

选择循环轮转算法(非抢占式)

 

 

 

  1. 运行结果

优先级算法(抢占式)

 

选择循环轮转算法

 

选择循环轮转算法(非抢占式)

 

四、遇到的主要问题和解决方法

问题:队列是先进先出的 , 在优先级算法中怎么来向插入新的进程 , 使其能够按优先级排序 。

解决方法: 使用链表可以完美解决。

问题: 低优先级的进程始终被高优先级的进程抢占,那么低优先级进程可能会长时间等待而无法执行,产生进程饥饿问题。

解决方法:

优先级衰减: 可以尝试提高他的优先级,知道可以执行。

 

五、实验总结

通过本次实验,学习了优先数调度算法程序(包括抢占式和非抢占式),循环轮转调度算法程序,对进程的调度有了更深的了解。优先级调度算法可以根据进程的优先级来确定执行顺序。在非抢占式算法中,进程一旦开始执行,将一直运行,而在抢占式算法中,更高优先级的进程可以随时抢占CPU。循环轮转调度算法中,每个进程被分配一个时间片来运行。时间片结束后,进程被放入就绪队列的末尾,调度器选择队列中的下一个进程来运行。在实际中,选择合适的算法,可以提高性能和用户的体验。

标签:run,操作系统,System,ready,进程,null,chose
From: https://www.cnblogs.com/mine-my/p/18243024

相关文章

  • 操作系统 c语言模仿 磁盘文件操作
    1.实验目的深入了解磁盘文件系统的实现。2.实验预备知识文件的操作;文件的逻辑结构和物理结构;磁盘空间的管理;磁盘目录结构。3.实验内容设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:支持多级目录结构,支持文件的绝对读路径;文件的逻辑结构采用流式结构,......
  • 在Windows操作系统上,有一些流量控制工具可以帮助用户监视、管理和控制网络流量。以下
    在Windows操作系统上,有一些流量控制工具可以帮助用户监视、管理和控制网络流量。以下是一些常见的Windows网络流量控制工具:NetBalancer:这是一款功能强大的网络流量控制工具,可以帮助用户监视和调整应用程序的网络活动。用户可以设置上传和下载速度限制,并优化网络性能。NetLim......
  • Windows系统 在VirtualBox虚拟机上安装搭建OpenEuler操作系统 并用Putty验证是否创建
    目录1.配置虚拟化环境步骤1进入BIOS,开启CPU虚拟化技术,不同电脑开启方式有所不同步骤2下载并安装VirtualBox/VMWare。按照学校给的实验指导书,这里我下载的是VirtualBox(我的电脑是我前段时间自己重新配的win11系统)步骤3 下载openeuler操作系统,在网页搜索openeuler下......
  • 在Linux中,如何选择 Linux 操作系统版本?
    选择Linux操作系统版本时,您需要考虑多个因素来确保所选版本能够满足您的特定需求。以下是一些关键的考虑点:目的和经验水平:新手用户:如果刚开始接触Linux,建议选择用户友好的发行版,如Ubuntu、Mint或Kubuntu。这些系统提供了良好的图形界面,丰富的软件库,以及活跃的社区支持,非常适......
  • 【操作系统】页表映射
    页表的一些术语现在Linux内核中支持四级页表的映射,我们先看下内核中关于页表的一些术语:全局目录项,PGD(PageGlobalDirectory)上级目录项,PUD(PageUpperDirectory)中间目录项,PMD(PageMiddleDirectory)页表项,(PageTable)大家在看内核代码时会经常看的以上术语,但在ARM的......
  • 八股篇 | 抢占式操作系统与合作式操作系统
    抢占式操作系统(PreemptiveOperatingSystem)是一种操作系统调度方式,它允许操作系统在任何时间点中断一个正在运行的进程,并将CPU分配给另一个进程。这种调度方式是现代操作系统(如Windows、Linux和macOS)中常见的一种特性。以下是抢占式操作系统的一些关键特点:优先级调度:在......
  • 数学模型:操作系统中FCFS、SJF、HRRN算法的平均周转时间比较 c语言
    摘 要研究目的:比较操作系统中进程调度FCFS、SJF、HRRN算法的平均周转时间和带权周转时间的大小关系。研究方法:在建模分析时,分别举4个进程的例子,1个进程用两个字母分别表示到达时间和执行时间。分两种极端情况,一种是每个进程到达时cpu还在执行之前的进程,这种结果为T(FCFS)>T......
  • 再见安卓,鸿蒙操作系统时代已经来临!
    在今年4月份的华为鸿蒙新品生态春季沟通会上,余承东宣布,今年的华为开发者大会将于6月在东莞举行,届时将开启HarmonyOSNEXT鸿蒙星河版Beta测试。自此,鸿蒙将彻底脱离安卓,正式进入“纯血鸿蒙”时代。鸿蒙生态的迅速崛起,为广大开发者带来了前所未有的机遇和挑战。1.市......
  • 物理机安装Linux操作系统
    1.物理机安装Linux环境这里以Ubuntu系统为例,Centos系统同理,windows同理1.1下载系统镜像官网下载速度慢的话可以直接百度各大学的镜像下载网站去下载,如下以清华镜像网站为例:https://mirrors.tuna.tsinghua.edu.cn/1.2下载工具ventoyVentoy官网:https://www.ven......
  • BUAA操作系统万字笔记-课堂笔记-期末考试-考研必备-北航961系列
    文章目录1概论1.1CPU漏洞攻击1.2操作系统简史1.2.1体系结构1.2.2系统发展1.3操作系统基本实现机制1.3.1异常:陷阱和中断2系统引导3内存管理3.1预备知识-链接与装载3.2存储管理基础3.2.1存储器管理目标3.2.2存储器硬件发展3.2.3存储管理的功能3.2.4存储......