进程调度模拟实验报告

时间: 2023-07-06 08:06:44 浏览: 70
一、实验目的 本实验旨在通过模拟实现多种进程调度算法,掌握进程调度的基本概念和操作方法,加深对操作系统的理解。 二、实验内容 1. 实现进程调度程序,并模拟 FCFS、SJF、RR、优先级调度等算法; 2. 分别用不同的实际应用场景,比如 CPU 密集型和 I/O 密集型任务,测试不同调度算法的效率和公平性; 3. 统计每种算法的平均等待时间、平均周转时间和平均响应时间,比较它们的优缺点。 三、实验步骤 1. 设计进程控制块 PCB 的数据结构,包括进程标识符 PID、进程状态 status、进程优先级 priority、进程所需 CPU 时间 need_time、进程已占用 CPU 时间 used_time、进程到达时间 arrival_time、进程等待时间 wait_time、进程周转时间 turnover_time、进程响应时间 response_time 等字段。 2. 实现进程调度程序,包括 FCFS、SJF、RR、优先级调度等算法。其中,FCFS 算法按照进程到达时间的先后顺序依次执行,SJF 算法按照进程所需 CPU 时间的短长顺序执行,RR 算法按照时间片大小分配 CPU 时间,并循环执行所有进程,优先级调度算法按照进程优先级的高低顺序执行。 3. 编写测试程序,模拟不同的实际应用场景,比如 CPU 密集型和 I/O 密集型任务。对于 CPU 密集型任务,需要让进程的 need_time 大于 arrival_time,以便测试 SJF 和优先级调度算法的效果;对于 I/O 密集型任务,需要设置进程的 I/O 操作,以便测试 RR 算法的效果。 4. 运行测试程序,记录每个进程的到达时间、需要 CPU 时间、优先级等信息,并根据不同的调度算法进行模拟,计算出每个进程的等待时间、周转时间和响应时间。 5. 对不同的调度算法进行比较,分析其优缺点,并统计平均等待时间、平均周转时间和平均响应时间。 四、实验结果 1. 设计进程控制块 PCB 的数据结构如下: ```c typedef struct PCB { int pid; // 进程标识符 int status; // 进程状态 int priority; // 进程优先级 int need_time; // 进程所需 CPU 时间 int used_time; // 进程已占用 CPU 时间 int arrival_time; // 进程到达时间 int wait_time; // 进程等待时间 int turnover_time; // 进程周转时间 int response_time; // 进程响应时间 struct PCB *next; // 链表指针 } PCB; ``` 2. 实现进程调度程序,包括 FCFS、SJF、RR、优先级调度等算法。具体代码如下: ```c // FCFS 调度算法 void fcfs(PCB *head) { PCB *p = head->next; int time = p->arrival_time; // 当前时间 while (p != NULL) { // 计算等待时间、周转时间和响应时间 p->wait_time = time - p->arrival_time; p->turnover_time = p->wait_time + p->need_time; p->response_time = p->wait_time; // 更新当前时间 time += p->need_time; // 处理下一个进程 p = p->next; } } // SJF 调度算法 void sjf(PCB *head) { PCB *p = head->next; int time = p->arrival_time; // 当前时间 while (p != NULL) { // 查找需要执行的进程 PCB *q = p->next; while (q != NULL) { if (q->arrival_time > time) { break; } if (q->need_time < p->need_time) { PCB tmp = *p; *p = *q; *q = tmp; } q = q->next; } // 计算等待时间、周转时间和响应时间 p->wait_time = time - p->arrival_time; p->turnover_time = p->wait_time + p->need_time; p->response_time = p->wait_time; // 更新当前时间 time += p->need_time; // 处理下一个进程 p = p->next; } } // RR 调度算法 void rr(PCB *head, int quantum) { PCB *p = head->next; int time = p->arrival_time; // 当前时间 while (p != NULL) { // 计算等待时间、周转时间和响应时间 p->wait_time = time - p->arrival_time; p->response_time = p->wait_time; // 分配时间片 int remain_time = p->need_time; while (remain_time > 0) { if (remain_time <= quantum) { // 进程执行完毕 time += remain_time; p->used_time += remain_time; remain_time = 0; } else { // 时间片用完了 time += quantum; p->used_time += quantum; remain_time -= quantum; // 将进程移到队列尾部 PCB *q = p->next; while (q != NULL) { if (q->arrival_time > time) { break; } q = q->next; } PCB tmp = *p; tmp.next = q; *p = *p->next; p->next = tmp.next; } } // 计算周转时间 p->turnover_time = p->wait_time + p->used_time; // 处理下一个进程 p = p->next; } } // 优先级调度算法 void priority(PCB *head) { PCB *p = head->next; int time = p->arrival_time; // 当前时间 while (p != NULL) { // 查找需要执行的进程 PCB *q = p->next; while (q != NULL) { if (q->arrival_time > time) { break; } if (q->priority < p->priority) { PCB tmp = *p; *p = *q; *q = tmp; } q = q->next; } // 计算等待时间、周转时间和响应时间 p->wait_time = time - p->arrival_time; p->turnover_time = p->wait_time + p->need_time; p->response_time = p->wait_time; // 更新当前时间 time += p->need_time; // 处理下一个进程 p = p->next; } } ``` 3. 编写测试程序,模拟不同的实际应用场景。对于 CPU 密集型任务,设置进程的 need_time 大于 arrival_time;对于 I/O 密集型任务,设置进程的 I/O 操作。具体代码如下: ```c // 生成测试数据 void gen_data(PCB *head, int type) { srand(time(NULL)); int pid = 1; PCB *p = head; while (p->next != NULL) { p = p->next; } for (int i = 0; i < MAX_NUM; i++) { pid++; PCB *q = (PCB*)malloc(sizeof(PCB)); q->pid = pid; q->status = READY; q->priority = rand() % 5 + 1; q->need_time = rand() % 10 + 1; if (type == CPU_INTENSIVE) { q->arrival_time = rand() % MAX_NUM; while (q->need_time <= q->arrival_time) { q->need_time = rand() % 10 + 1; } } else if (type == IO_INTENSIVE) { q->arrival_time = rand() % MAX_NUM; q->need_time = rand() % 5 + 1; if (rand() % 2 == 0) { q->io_time = rand() % q->need_time + 1; } else { q->io_time = 0; } } q->used_time = 0; q->wait_time = 0; q->turnover_time = 0; q->response_time = 0; q->next = NULL; p->next = q; p = p->next; } } // 显示测试数据 void show_data(PCB *head) { PCB *p = head->next; printf("PID\tStatus\tPriority\tNeed Time\tArrival Time\tIO Time\n"); while (p != NULL) { printf("%d\t%d\t%d\t\t%d\t\t%d\t\t%d\n", p->pid, p->status, p->priority, p->need_time, p->arrival_time, p->io_time); p = p->next; } } // 模拟 I/O 操作 int do_io(PCB *head, PCB *p) { if (p->io_time > 0) { p->io_time--; if (p->io_time == 0) { // I/O 完成,将进程移到队列尾部 PCB *q = p->next; while (q != NULL) { if (q->arrival_time > p->arrival_time) { break; } q = q->next; } PCB tmp = *p; tmp.next = q; *p = *p->next; p->next = tmp.next; return 1; } } return 0; } // 测试 FCFS 调度算法 void test_fcfs(PCB *head) { printf("FCFS 调度算法:\n"); fcfs(head); show_result(head); } // 测试 SJF 调度算法 void test_sjf(PCB *head) { printf("SJF 调度算法:\n"); sjf(head); show_result(head); } // 测试 RR 调度算法 void test_rr(PCB *head, int quantum) { printf("RR 调度算法(quantum=%d):\n", quantum); PCB *p = head->next; int time = p->arrival_time; // 当前时间 while (p != NULL) { // 计算等待时间、响应时间和周转时间 p->wait_time = time - p->arrival_time; p->response_time = p->wait_time; // 分配时间片 int remain_time = p->need_time; while (remain_time > 0) { if (remain_time <= quantum) { // 进程执行完毕 time += remain_time; p->used_time += remain_time; remain_time = 0; } else { // 时间片用完了,进行 I/O 操作 time += quantum; p->used_time += quantum; remain_time -= quantum; if (do_io(head, p)) { break; } } } // 计算周转时间 p->turnover_time = p->wait_time + p->used_time; // 处理下一个进程 p = p->next; } show_result(head); } // 测试优先级调度算法 void test_priority(PCB *head) { printf("优先级调度算法:\n"); priority(head); show_result(head); } // 显示测试结果 void show_result(PCB *head) { PCB *p = head->next; double total_wait_time = 0, total_turnover_time = 0, total_response_time = 0; printf("PID\tStatus\tPriority\tNeed Time\tArrival Time\tIO Time\tWait Time\tTurnover Time\tResponse Time\n"); while (p != NULL) { printf("%d\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n", p->pid, p->status, p->priority, p->need_time, p->arrival_time, p->io_time, p->wait_time, p->turnover_time, p->response_time); total_wait_time += p->wait_time; total_turnover_time += p->turnover_time; total_response_time += p->response_time; p = p->next; } double avg_wait_time = total_wait_time / MAX_NUM; double avg_turnover_time = total_turnover_time / MAX_NUM; double avg_response_time = total_response_time / MAX_NUM; printf("平均等待时间:%lf,平均周转时间:%lf,平均响应时间:%lf\n", avg_wait_time, avg_turnover_time, avg_response_time); } ``` 4. 运行测试程序,记录每个进程的到达时间、需要 CPU 时间、优先级等信息,并根据不同的调度算法进行模拟,计算出每个进程的等待时间、周转时间和响应时间。具体代码如下: ```c int main() { // 初始化进程链表 PCB *head = (PCB*)malloc(sizeof(PCB)); head->next = NULL; // 生成测试数据 gen_data(head, CPU_INTENSIVE); // 显示测试数据 show_data(head); // 测试 FCFS 调度算法 test_fcfs(head); // 测试 SJF 调度算法 test_sjf(head); // 测试 RR 调度算法 test_rr(head, 2); // 测试优先级调度算法 test_priority(head); // 释放内存 PCB *p = head; while (p != NULL) { PCB *q = p->next; free(p); p = q; } return 0; } ``` 五、实验分析 本实验模拟了 FCFS、SJF、RR、优先级调度等四种进程调度算法,并通过测试程序模拟了不同的实际应用场景,比如 CPU 密集型和 I/O 密集型任务。根据测试结果,可以分析出每种算法的优缺点。 1. FCFS 调度算法 FCFS 调度算法按照进程到达时间的先后顺序依次执行,适用于 CPU 密集型任务。优点是实现简单,没有额外的开销,但缺点是可能导致长作业等待时间过长,无法满足实时性要求。 2. SJF 调度算法 SJF 调度算法按照进程所需 CPU 时间的短长顺序执行,适用于 CPU 密集型任务。优点是平均等待时间最短,但缺点是难以预测每个进程的需要时间,可能导致长作业饥饿。 3. RR 调度算法 RR 调度算法按照时间片大小分配 CPU 时间,并循环执行所有进程,适用于 CPU 密集型和 I/O 密集型任务。优点是公平性好,长作业不会饥饿,但缺点是时间片过小会增加上下文切换的开销,时间片过大会使得响应时间变长。 4. 优先级调度算法 优先级调度算法按照进程优先级的高低顺序执行,适用于 I/O 密集型任务。优点是可以满足实时性要求,但缺点是可能导致低优先级进程饥饿,需要设置合理的优先级和调整策略。 六、实验总结 本实验通过模拟实现多种进程调度算法,深入理解了操作系统的基本概念和操作方法,加深了对操作系统的理解。实验中还通过测试程序模拟了不同的实际应用场景,比较

相关推荐

最新推荐

recommend-type

计算机操作系统 进程调度 实验报告

1)本实验目的是通过对进程调度算法的实现和实验模拟,加深对操作系统进程调度操作功能和进程调度算法的完整理解,培养和提高学生对操作系统开发的兴趣,以及进程调度程序的开发与应用能力; 2)理论上必须深刻理解...
recommend-type

《操作系统》进程调度实验报告

编写并调试一个模拟的进程调度程序。采用“轮转法”调度算法对五个进程进行调度。 轮转法可以是简单轮转法,可变时间片轮转法,或多队列轮转法。 简单轮转法的基本思想是:所有就绪进程按FCFS排成一个队列,总是把...
recommend-type

操作系统实验报告 进程调度 作业调度等

操作系统实验报告 1、进程调度 2、作业调度 3、作业调度4、文件系统 一、 实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验内容和要求 编写并调试一个模拟的...
recommend-type

OS实验报告.docx

本实验模拟实现处理机调度及内存分配及回收机制,以对处理机调度的工作原理以及内存管理的工作过程进行更深入的了解。 二、实验内容及要求 1.实验内容 (1)选择一个调度算法,实现处理机调度; (2)结合(1)...
recommend-type

按优先级调度发进行CPU调度实验报告

多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机,以使系统中的歌就绪进程有条不紊的运行。本实验模拟实现处理机调度,以加深对处理机调度的理解
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向

![:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向](https://img-blog.csdnimg.cn/7e3d12895feb4651b9748135c91e0f1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6YaJ77yM5LqO6aOO5Lit,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. YOLO目标检测算法简介 YOLO(You Only Look Once)是一种
recommend-type

def ObjFun(x,y,beta): # 目标函数 """ Logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: loss value """ n = x.shape[0] p = x.shape[1] pred = 1 / (1 + np.exp(-np.dot(x, beta))) pred = np.clip(pred, 1e-15, 1 - 1e-15) # 将预测值限制在一个很小的区间内 ObjVal = -np.sum(y * np.log(pred) + (1 - y) * np.log(1 - pred)) / n return ObjVal

好的,根据上面的目标函数,我们可以推导出其对应的梯度向量函数,如下所示: def gradient(x, y, beta): """ Compute gradient of the logistic regression loss function :param beta: model parameter vector :param x: feature matrix :param y: label vector :return: gradient vector """ n = x.shape[0] pred = 1 /
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。