实验一:进程调度模拟算法
一、实验目的
通过进程调度模拟算法
理解进程调度的基本概念和调度算法原理
掌握优先级调度和时间片轮转算法的实现方法
通过模拟实验比较不同调度算法的特点
提高C语言编程能力和系统程序设计能力
二、实验要求
设计包含6个字段的PCB结构体
实现两种调度算法程序
规范显示每次调度后的进程状态(R/W/F)
按要求处理就绪队列和完成队列
三、实验过程
1. 准备
A. 查阅《操作系统原理》中进程调度相关章节
B. 设计PCB结构体(代码片段):
struct PCB {
char name[10];
int prio;
int round;
int cputime;
int needtime;
char state;
struct PCB *next;
};
- 上机调试
进程数量:3
进程1(P1)NeedTime=5
进程2(P2)NeedTime=3
进程3(P3)NeedTime=4
3. 主要流程
- 关键实现
优先级调度核心逻辑:
void prisch() {
// 遍历就绪队列找出最高优先级进程
if(p->prio > max_prio) {
max_prio = p->prio;
max_prio_p = p;
}
// 从队列移除并设置为运行状态
}
5. 问题解决
A. 问题:进程状态未及时更新
解决:在priority_run()中增加run->state = 'R'
B. 问题:轮转法时间片计算错误
解决:修正round_run()中needtime -= 2的逻辑
四、实验结果
五、实验总结
通过本实验,我深入理解了进程调度的实现机制。优先级算法能快速响应高优先级任务但可能导致饥饿现象,而轮转算法公平但上下文切换开销大。在调试过程中,通过解决队列管理问题,提升了我的指针操作和调试能力。
实验二:存储管理动态分区分配及回收算法
一、实验目的
通过存储管理动态分区分配及回收算法的实验
掌握动态分区管理的内存分配原理
理解首次适应和最佳适应算法的区别
实现内存回收时的相邻区合并功能
培养系统内存管理模块的设计能力
二、实验要求
实现分区描述器结构
编写两种分配算法及回收算法
规范输出空闲区队列信息
验证算法正确性
三、实验过程
1. 准备
A. 研究内存分配算法相关文献
B. 设计分区结构体(代码片段):
struct Node {
int addr;
int size;
Node* next;
};
- 测试案例
初始内存:32767KB
操作序列:
First Fit分配2000KB
Best Fit分配5000KB
释放2000KB
分配3000KB
- 算法对比
|
操作 |
First Fit耗时 |
Best Fit耗时 |
|
分配2000KB |
0.1ms |
0.2ms |
|
分配5000KB |
0.1ms |
0.3ms |
4. 关键实现
Best Fit算法核心:
Node* bestFitAssignment(FreeList& freeList, int size) {
while(p != NULL) {
if(p->size >= size && (bestFit == NULL || p->size < bestFit->size)) {
bestFit = p; // 寻找最小足够块
}
p = p->next;
}
}
5. 问题解决
A. 问题:回收时合并判断错误
解决:修正边界条件(*pp)->addr + (*pp)->size == node->addr
B. 问题:内存泄漏
解决:在main函数退出前添加链表释放代码
四、实验结果
五、实验总结
本实验让我认识到First Fit算法效率高但容易产生外部碎片,Best Fit减少浪费但会增加搜索时间。通过实现回收合并功能,深入理解了内存紧凑化的实现原理。在调试过程中,指针操作的精确定位是关键难点。
浙公网安备 33010602011771号