# 操作系统课程设计
## 一、课程设计目的
操作系统是计算机系统配置的基本软件之一。它在整个计算机系统软件中占有中心地位。其作用是对计算机系统进行统一的调度和管理,提供各种强有力的系统服务,为用户创造既灵活又方便的使用环境。本课程是计算机及应用专业的一门专业主干课和必修课。
通过课程设计,使学生掌握操作系统的基本概念、设计原理及实施技术,具有分析操作系统和设计、实现、开发实际操作系统的能力。
## 二、课程设计内容和要求
提交一批作业(>=10),按先来先服选择一部分作业(最多 5 个)进入内存
为每个作业创建一个进程,并分配内存(用户内存:0—1024K,采用可变连续分配方式)
进程调度功能(时间片轮转)
随机阻塞进程,并在一段时间后唤醒进程(选做)
显示相关信息:后备作业队列、内存分配情况、进程信息、完成作业情况
这些功能要有机地连接起来
## 三、软、硬件环境
软件:Windows 10, JDK1.8,IntelliJ IDEA
硬件:Intel(R) Core(TM) i5-8300H , 2.30GHz, RAM: 8.00GB
## 四、设计步骤
1. 题目分析
本次课程设计是将作业调度,内存管理、进程调度、进程阻塞等功能有机结合起来的一道题目。首先,需要使用随机数初始化 10 个作业,放入后备队列中,然后使用先来先服务(FCFS)进行作业调度,使用时间片轮转算法进行进程调度。其中,最多只能有五个作业能同时进入内存,本实验假设阻塞状态的进程依然在内存中。也就是说,处于就绪、运行、阻塞三种状态的进程数目之和最多为 5 个,即并发进程数最多为 5 个,在进程结束后,就会被调出内存,使用 FCFS 算法从后备队列中调入新的作业。在内存中的几个非阻塞状态的进程使用时间片轮转(RR)算法进行调度。而作业在进入内存之前,是要申请内存的,这时使用首次适应(FF)算法申请内存,从空闲分区链中找到合适的空闲分区并分配给该进程。在进程结束时,要回收其占用的内存,并进行相应的空闲分区合并。如此,便可以将作业调度、内存管理、进程调度和进程阻塞与唤醒这几个功能有机地连接起来了。
2.算法流程图:
![](https://www.writebug.com/myres/static/uploads/2021/10/27/4e1dee1096686b07782631681c466734.writebug)
3.项目工程截图:
![](https://www.writebug.com/myres/static/uploads/2021/10/27/abd7d3253c241ad3e3e7f9dda4fb2a01.writebug)
4.主要的数据结构:
```java
// PCB类
public class PCB {
// 进程名
String name;
// 所需内存
int needMemory;
// 主存起始位置
int address;
// 到达时间
double arriveTime;
// 需要运行时间
double needTime;
// 已用时间
double hasUsedTime;
// 进程状态:运行中、就绪、阻塞(Running、 Waiting、 Blocking)
String status;
}
// 内存块类
public class MemoryBlock {
int address = 0;
int length = 0;
// Busy或 Free
String status = "Free";
public MemoryBlock(int address, int length) {
this.address = address;
this.length = length;
}
}
```
5.主要算法和代码:
```java
// 快速排序,先来先服务中用快速排序算法对作业进行排序
public void quickSortByArriTime(int low, int high) {
//开始默认基准为 low
if (low < high) {
//分段位置下标
int standard = getStandard( low, high);
//递归调用排序
//左边排序
quickSortByArriTime( low, standard - 1);
//右边排序
quickSortByArriTime(standard + 1, high);
}
}
/
* 申请内存的方法
* @param curr 进程的索引(下标)
* @return
*/
public int applyMemory(int curr) {
if (pcb[curr].status != "U") {
return -2;
}
MemoryBlock target = null;
int needMemoryry = pcb[curr].needMemory;
for (MemoryBlock memoryBlock : memoryBlockList) {
if (memoryBlock.status.equals("Free")
&& memoryBlock.length >= needMemoryry) {
target = memoryBlock;
break;
}
}
if (target == null) {//找不到合适的内存块用于分配
return -2;
} else if (target.length == needMemoryry) {
// 申请的内存和内存分区刚好相等,直接将整块分区分给该进程
target.status = "Busy";
return target.address;
} else {
target.status = "Busy";
MemoryBlock block = new MemoryBlock(target.address + needMemoryry,
target.length - needMemoryry);
target.length -= block.length;
// 将新建的空闲分区插入到分区连中
memoryBlockList.add(memoryBlockList.indexOf(target) + 1, block);
return target.address;
}
}
// 释放内存分方法
public void releaseMemory(int address) {
MemoryBlock target = null;
for (MemoryBlock memoryBlock : memoryBlockList) {
if (memoryBlock.address == address) {
target = memoryBlock;
break;
}
}
if (target == null){
return;
}
if(memoryBlockList.size()==1){
target.status = "Free";
return;
}
int index = memoryBlockList.indexOf(target);
if (index == 0) {
MemoryBlock memoryBlock = memoryBlockList.get(1);
if (memoryBlock.status.equals( "Free")) {
target.length += memoryBlock.length;
memoryBlockList.remove(memoryBlock);
}
target.status = "Free";
} else if (index == memoryBlockList.size() - 1) {
MemoryBlock m = memoryBlockList.get(index - 1);
if (m.status.equals("Free") ) {
m.length += target.length;
memoryBlockList.remove(target);
}
target.status = "Free";
} else {
MemoryBlock preMemoryBlock= memoryBlockList.get(index - 1);
MemoryBlock nextMemoryBlock = memoryBlockList.get(index + 1);
if (preMemoryBlock.status.equals("Free")
&& nextMemoryBlock.status.equals( "Free")) {
preMemoryBlock.length += target.length;
preMemoryBlock.length += nextMemoryBlock.length;
memoryBlockList.remove(target);
memoryBlockList.remove(nextMemoryBlock);
} else if (preMemoryBlock.status.equals("Free")
&& nextMemoryBlock.status.equals("Busy") ) {
preMemoryBlock.length += target.length;
memoryBlockList.remove(target);
} else if (preMemoryBlock.status.equals("Busy")
&& nextMemoryBlock.status.equals("Free") ) {
target.length += nextMemoryBlock.length;
target.status = "Free";
memoryBlockList.remove(nextMemoryBlock);
} else {
target.status = "Free";
}
}
}
// 从后备队列中选择作业并申请内存
public void getNextOnDisk(double allTime) {
int memoryProcessNum = 0;//在内存中的进程个数
for (int i = 0; i < pcb.length; i++) {
if (pcb[i].status.equals("Waiting")
|| pcb[i].status.equals("Running")
|| pcb[i].status.equals("Blocking")) {
memoryProcessNum++;
}
}
if (memoryProcessNum < MAX_OCCURS) {
// 如果内存中程序数少于最大并发数,从后备队列找到最先到达的进 程调入内存
for (int p = 0; p < pcb.length
&& memoryProcessNum < MAX_OCCURS; p++) {
if (pcb[p].status.equals("U") && allTime >= pcb[p].arriveTim
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程报告word+项目源码 本次课程设计是将作业调度,内存管理、进程调度、进程阻塞等功能有机结合起来的一道题目。首先,需要使用随机数初始化 10 个作业,放入后备队列中,然后使用先来先服务(FCFS)进行作业调度,使用时间片轮转算法进行进程调度。其中,最多只能有五个作业能同时进入内存,本实验假设阻塞状态的进程依然在内存中。也就是说,处于就绪、运行、阻塞三种状态的进程数目之和最多为 5 个,即并发进程数最多为 5 个,在进程结束后,就会被调出内存,使用 FCFS 算法从后备队列中调入新的作业。在内存中的几个非阻塞状态的进程使用时间片轮转(RR)算法进行调度。而作业在进入内存之前,是要申请内存的,这时使用首次适应(FF)算法申请内存,从空闲分区链中找到合适的空闲分区并分配给该进程。在进程结束时,要回收其占用的内存,并进行相应的空闲分区合并。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125645016
资源推荐
资源详情
资源评论
收起资源包目录
基于Java的操作系统课程设计(作业调度,内存管理、进程调度、进程阻塞等功能).zip (7个子文件)
源程序
process-scheduling
src
com
chenchichao
www
PCB.java 487B
MemoryBlock.java 352B
ProcessMemoryScheduling.java 13KB
Main.java 260B
LICENSE 1KB
README.md 13KB
操作系统课设.doc 653KB
共 7 条
- 1
shejizuopin
- 粉丝: 9627
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于串口通信的光通信上位机,包括运动控制和通信协议
- 串口与以太网文件传送协议(或自定义控制协议)
- Qt开发windows系统安装教程与代码实例.txt
- QT6实现的附带文件传输协议的串口终端
- 一个串口通讯类和调用Demo 通过设置串口、设置串口自定义协议,可方便对串口发送数据与接收数据
- 华为OD模拟题及参考答案.仅供学习和模拟考试使用
- stm32f103c8t6基于modbus协议和使用串口读取温湿度
- 英雄联盟LOL金克斯4K电脑壁纸
- Microbrain道闸产品上位机,以MahApps库为基础搭建界面,集成了串口(UART)、CAN、WIFI通信,十六进制协议
- Android串口通讯, 支持发送数据回调, 支持并发处理, 自定义协议, CRC校验, 自动粘包, 自动去除冗余的干扰数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页