操作系统课程设计完整版内含代码

合集下载

《操作系统》课程设计

《操作系统》课程设计

《操作系统》课程设计一、课程目标知识目标:1. 让学生掌握操作系统的基本概念,包括进程、线程、内存管理、文件系统等核心知识;2. 了解操作系统的历史发展,掌握不同类型操作系统的特点及使用场景;3. 掌握操作系统的性能评价方法和常用的调度算法。

技能目标:1. 培养学生运用操作系统知识解决实际问题的能力,如分析系统性能瓶颈、优化系统资源分配等;2. 培养学生具备基本的操作系统编程能力,如进程创建、线程同步、文件操作等;3. 提高学生的团队协作能力和沟通能力,通过小组讨论和项目实践,学会共同解决问题。

情感态度价值观目标:1. 培养学生对操作系统学科的兴趣,激发学生的学习热情,使其形成积极向上的学习态度;2. 培养学生具备良好的信息素养,尊重知识产权,遵循法律法规;3. 培养学生的创新精神和批判性思维,敢于质疑、勇于探索,形成独立思考的能力。

课程性质:本课程为计算机科学与技术专业的核心课程,旨在让学生掌握操作系统的基本原理和实现方法,提高学生的系统分析和编程能力。

学生特点:学生具备一定的编程基础和计算机系统知识,具有较强的逻辑思维能力和动手实践能力。

教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和项目实践,帮助学生将所学知识内化为具体的学习成果。

在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。

二、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、功能、类型及特点,对应教材第一章内容。

- 操作系统的起源与发展- 操作系统的功能与类型- 操作系统的主要特点2. 进程与线程:讲解进程与线程的概念、状态、调度算法,对应教材第二章内容。

- 进程与线程的定义与区别- 进程状态与转换- 进程调度算法3. 内存管理:分析内存管理的基本原理、策略和技术,对应教材第三章内容。

- 内存分配与回收策略- 虚拟内存技术- 页面置换算法4. 文件系统:介绍文件系统的基本概念、结构、存储原理,对应教材第四章内容。

计算机操作系统课程设计源代码《生产者---消费者问题源代码》

计算机操作系统课程设计源代码《生产者---消费者问题源代码》

《生产者---消费者问题源代码》#include<stdio.h>#include<stdlib.h>#include<string.h>#include<pthread.h>#include<semaphore.h>#include<sys/types.h>#include<errno.h>#include<unistd.h>#include<signal.h>#include<time.h>#define NUM_THREADS_P 5 /*定义数据为生产者*/#define NUM_THREADS_C 5 /*定义数据为消费者*/#define MAX_BUFFER 20 /*定义数据为缓存区*/#define RUN_TIME 20 /*定义运行时间*/int buffer[MAX_BUFFER]; /*定义最大缓存区*/int produce_pointer=0,consume_pointer=0; /*定义指针*/sem_t producer_semaphore,consumer_semaphore,buffer_mutex; /*定义信号量,互斥*/pthread_t threads_p[NUM_THREADS_P]; /*声明生产者线程*/pthread_t threads_c[NUM_THREADS_C]; /*声明消费者线程*/FILE* fd;void *producer_thread(void *tid); /*声明生产者线程*/void *consumer_thread(void *tid); /*声明消费者线程*/void showbuf(); /*声明showbuf方法*/void handler(){int i; /*定义i*/for(i=0;i<NUM_THREADS_P;i++)pthread_cancel(threads_p[i]);/*for循环,如果i<NUM_THREADS_P,则pthread_cancel(threads_p[i]);并且i++*/ for(i=0;i<NUM_THREADS_C;i++)pthread_cancel(threads_c[i]);/*for循环,如果i<NUM_THREADS_C,则pthread_cancel(threads_c[i]);并且i++*/}int main(){int i; /*定义i*/signal(SIGALRM,handler); /*定义信号量*/fd=fopen("output.txt","w"); /*打开一个文件用来保存结果*/sem_init(&producer_semaphore,0,MAX_BUFFER); /*放一个值给信号灯*/sem_init(&consumer_semaphore,0,0);sem_init(&buffer_mutex,0,1);for(i=0;i<MAX_BUFFER;i++)buffer[i]=0; /*引发缓冲*//*创建线程*/for(i=0;i<NUM_THREADS_P;i++)pthread_create(&threads_p[i],NULL,(void*)producer_thread,(void*)(i+1)); /*创建线程*/for(i=0;i<NUM_THREADS_C;i++)pthread_create(&threads_c[i],NULL,(void*)consumer_thread,(void *)(i+1));alarm(RUN_TIME);for(i=0;i<NUM_THREADS_P;i++)pthread_join(threads_p[i],NULL);/*等待线程退出*/for(i=0;i<NUM_THREADS_C;i++)pthread_join(threads_c[i],NULL);/*等待线程退出*/sem_destroy(&producer_semaphore);/*清除信号灯*/sem_destroy(&consumer_semaphore);/*清除信号灯*/sem_destroy(&buffer_mutex);/*清除缓存区*/fclose(fd); /*关闭文件*/return 0;}void *producer_thread(void *tid){pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 设置状态,PTHREAD_CANCEL_ENABLE是正常处理cancel信号*/ while(1){sem_wait(&producer_semaphore); /*等待,需要生存*/srand((int)time(NULL)*(int)tid);sleep(rand()%2+1); /*一个或两个需要生产*/while((produce_pointer+1)%20==consume_pointer); /*指针位置*/sem_wait(&buffer_mutex); /*缓存区*/buffer[produce_pointer]=rand()%20+1; /*指针位置*/produce_pointer=(produce_pointer+1)%20; /*指针位置*//*判断*/if(produce_pointer==0){printf("生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,19,buffer[19]); /*输出生产者,指针,缓存区*/fprintf(fd,"生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,19,buffer[19]); /*输出生产者,指针,缓存区*/}else{printf("生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,produce_pointer-1,buffer[produce_pointer-1]);/*输出生产者,指针,缓存区*/fprintf(fd,"生产者:%d 指针指向:%2d 生产产品号:%2d\n",(int)tid,produce_pointer-1,buffer[produce_pointer-1]);/*输出生产者,指针,缓存区*/}showbuf();sem_post(&buffer_mutex);sem_post(&consumer_semaphore); /*通知消费者缓冲区不是空的*/srand((int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待几秒钟,然后继续生产*/}return ((void*)0);}void *consumer_thread(void *tid){/*可以被其他线程使用*/pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 设置状态,PTHREAD_CANCEL_ENABLE是忽略cancel信号*/while(1){sem_wait(&consumer_semaphore); /*通知消费者消费*/srand((int)time(NULL)*(int)tid);sleep(rand()%2+1); /*一个或两个来消费*/sem_wait(&buffer_mutex);printf("消费者:%d 指针指向:%2d 消费产品号:%2d\n",(int)tid,consume_pointer,buffer[consume_pointer]);/*输出消费者,消费者指针,缓存区*/fprintf(fd,"消费者:%d 指针指向:%2d 消费产品号:%2d\n",(int)tid,consume_pointer,buffer[consume_pointer]);/*输出消费者,消费者指针,缓存区*/buffer[consume_pointer]=0; /*消费者指针指向0*/consume_pointer=(consume_pointer+1)%20;showbuf();sem_post(&buffer_mutex);sem_post(&producer_semaphore); /*通知生产者缓冲区不是空的*/srand((int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待几秒钟,然后继续消费*/}return ((void*)0);}/*查看缓冲区内容*/void showbuf(){int i; /*定义i*/printf("buffer:"); /*输出缓存区*/fprintf(fd,"buffer:"); /*输出缓存区*/for(i=0;i<MAX_BUFFER;i++){printf("%2d ",buffer[i]);/*输出缓存区i*/fprintf(fd,"%2d ",buffer[i]); /*输出缓存区i*/ }printf("\n\n"); /*换行*/fprintf(fd,"\n\n"); /*换行*/}。

操作系统课程设计文档及代码

操作系统课程设计文档及代码

1 设计目的与内容1.1 设计目的通过课程设计, 加深对操作系统对程序执行的理解,掌握操作系统的多程序运行原理,能模拟操作系统设计相应的进程调度算法,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。

1.2 设计内容1、设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。

2、建立进程就绪队列。

对两种不同算法编制入链子程序。

3、编制两种进程调度算法:1)可强占的优先进程调度;2)循环时间片轮转调度4、设计操作系统运行的指令。

2 设计说明2.1 需求分析设计虚拟内核实现进程的调度,实现多道程序的调度。

设计调度算法计算各个进程的优先权限来确定进程执行的次序。

进程调度程序选择一个就绪状态的进程,使之在处理器上运行。

进程的调度采用最高优先数优先的调度算法和先来先服务调度算法相结合的算法,并且采用动态优先数策略,选择进程占用处理器后该进程仅能使用一个时间片,运行完后优先数减1。

2.2 设计思路本程序用两种算法对多个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。

为了便于处理,程序中的某进程运行时间以时间片为单位计算。

各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

在优先数算法中,优先数的值为31与运行时间的差值。

进程每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。

在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。

设计程序指令,MOV n //把整数n赋给累加器ASAV m //把累加器A的值存入地址MADD n //从累加器A的值减去整数n,结果送到累加器A。

SUB n //从累加器A的值减去整数n,结果送到累加器A。

MUL n //从累加器A的值乘以整数n,结果送到累加器A。

操作系统课程设计(完整规范版)

操作系统课程设计(完整规范版)

操作系统课程设计(完整规范版)一、设计目的操作系统课程设计旨在让学生深入了解操作系统的基本原理,掌握操作系统的设计与实现方法,培养学生在实际操作系统中分析和解决问题的能力。

通过本次课程设计,学生将能够:1. 加深对操作系统理论知识的理解与应用;2. 提高动手实践能力,培养创新精神和团队协作意识;3. 为今后从事操作系统相关领域的研究和工作奠定基础。

二、设计要求(1)进程管理:包括进程的创建、撤销、调度等;(2)内存管理:实现内存分配、回收、页面置换等;(3)文件系统:实现文件的创建、删除、读写等操作;(4)设备管理:实现设备的分配、回收、驱动等功能。

(1)代码规范:编写清晰、易读、易维护的代码;(3)团队协作:合理分工,确保团队成员共同参与、共同进步。

三、设计步骤1. 需求分析:分析课程设计所需实现的功能,明确各个模块的具体要求;2. 概要设计:根据需求分析,制定总体设计方案,划分模块,确定模块间接口;3. 详细设计:针对每个模块,进行具体实现方案的设计;4. 编码实现:按照设计文档,编写代码,实现各个功能模块;5. 测试与调试:对实现的功能进行测试,发现问题并进行调试;6. 优化与改进:根据测试结果,对代码进行优化,提高系统性能;四、预期成果1. 完成一套具有基本功能的模拟操作系统,能够演示进程管理、内存管理、文件系统和设备管理的主要操作;2. 提供完整的,包括注释,以便他人理解和学习;3. 形成一份详尽的课程设计报告,记录设计过程中的思考、遇到的问题及解决方案;4. 通过课程设计,提升个人在操作系统领域的理论知识和实践能力。

五、评价标准1. 功能完整性:各功能模块是否按照要求实现,系统是否能正常运行;3. 创新性:设计过程中是否有独特的想法,是否对现有技术有所改进;4. 团队协作:团队成员之间沟通是否顺畅,分工是否合理,协作是否高效;5. 文档质量:课程设计报告是否详细、准确,是否能够完整反映设计过程和成果。

操作系统教程课程设计

操作系统教程课程设计

操作系统教程课程设计简介本课程设计旨在通过实践,加深对操作系统的理解。

本文将介绍本课程设计的具体内容和步骤。

环境搭建在开始课程设计之前,需要先搭建相应的实验环境。

这里以Linux系统为例,介绍环境搭建步骤。

1.安装虚拟机软件,如VirtualBox。

2.下载相应的Linux操作系统镜像,如Ubuntu。

3.在虚拟机中创建虚拟机实例,并将Linux镜像作为虚拟机的安装介质。

4.安装完成后,进行系统初始化及相关软件的安装。

实验内容本课程设计包含以下实验内容:实验1 - 进程管理在Linux系统中,进程是操作系统的基本组成单位之一,进程管理是操作系统的核心内容之一。

本实验旨在通过模拟进程的创建、运行、调度和销毁过程,深入理解进程管理的原理。

实验步骤:•编写一个简单的程序,用于创建子进程。

•利用系统调用fork()创建子进程。

•利用系统调用wt()等待子进程执行完成。

•在父进程中打印运行结果。

实验2 - 线程管理在多核CPU环境下,线程可以利用多核资源,进行并发运算。

线程管理也是操作系统的核心内容之一。

本实验旨在通过模拟线程的创建、运行和销毁过程,深入理解线程管理的原理。

实验步骤:•编写一个简单的程序,用于创建线程。

•利用系统调用pthread_create()创建线程。

•利用系统调用pthread_join()等待线程执行完成。

•在主线程中打印运行结果。

实验3 - 文件系统管理文件系统管理是操作系统的另一个核心内容。

本实验旨在通过模拟文件的创建、读取、写入等操作,深入理解文件系统管理的原理。

实验步骤:•利用系统调用open()创建文件。

•利用系统调用read()、write()读取、写入文件内容。

•利用系统调用close()关闭文件。

实验报告完成实验后,需要撰写一份实验报告,介绍实验的步骤和结果,总结实验中遇到的问题与解决方案,以及对操作系统的理解和感受。

报告应该包括以下内容:•实验目的•实验环境•实验步骤•实验结果•遇到的问题及解决方式•心得体会总结本课程设计通过模拟进程、线程和文件系统的相关操作,深入理解了操作系统的实现原理。

操作系统课程设计

操作系统课程设计

任务一、进程创建、控制与撤消一、目的:通过进程的创建和控制的设计来达到如下目的:1、加深对进程概念的理解,明确进程和程序的区别;2、进一步认识并发执行的概念,区别顺序执行和并发执行;3、分析进程争用临界资源的现象,学习解决进程互斥的方法;二、内容:在WINDOWS环境下模拟实验:1、编写一程序,来模拟进程的创建和撤消,要求通过终端键盘输入三、四作业的名称、大小、优先级等。

系统为它创建进程,并把进程控制块PCB的内容送到终端显示器上输出。

2、同时模拟内存空间为作业分配内存空间,并把结果用图形形象地表示出来,同样通过终端输出。

3、按进程的优先级的顺序撤消进程,同时通过终端显示PCB的撤消过程和内存的释放过程程序流程图:源代码如下:#include<iostream>;using namespace std;struct PCB{int pid;int priority;int size;int detail;int isrun;};PCB running[20], ready[20];int sum = 0, pid_1;void choose();void menu();int create(){if (sum >= 20){cout << "内存已满,请先结束或换出进程" << endl;}else{cout << "请输入第" << sum + 1 << "个进程"<<endl;cout << "请输入进程的pid" << endl;cin >> running[sum + 1].pid;cout << "请输入新的进程的优先级" << endl;cin >> running[sum + 1].priority;cout << " 请输入新的进程的大小" << endl;cin >> running[sum + 1].size;cout << " 请输入新的进程的详情" << endl;cin >> running[sum + 1].detail;running[sum + 1].isrun = 1;sum++;}return running[sum - 1].isrun;choose();}void display(){int pid;cout << "请输入进程的pid" << endl;cin >> pid;if (pid > 0 && pid <= 20 && running[pid].isrun == 1){cout << "进程的pid是:"<< running[pid].pid<<endl;cout << "进程的优先级是:"<< running[pid].priority<<endl;cout << "进程的大小是:"<< running[pid].size<<endl;cout << "进程的相关信息:"<< running[pid].detail<<endl;}else{cout << "所查看运行进程不存在" << endl;}choose();}void replace(){int pid1, pid2;cout << "请输入第一个替换进程的pid" << endl;cin >> pid1;cout << "请输入第二个替换进程的pid" << endl;cin >> pid2;if (pid1 > 0 && pid1 <= 20 && running[pid1].isrun == 1){if (running[pid1].priority > running[pid2].priority) { ready[20].pid = running[pid1].pid;ready[20].priority = running[pid1].priority;ready[20].size = running[pid1].size;ready[20].detail = running[pid1].detail;running[pid1].pid = running[pid2].pid;running[pid1].priority = running[pid2].priority;running[pid1].size = running[pid2].size;running[pid1].detail = running[pid2].detail;running[pid2].pid = ready[20].pid;running[pid2].priority = ready[20].priority;running[pid2].size = ready[20].size;running[pid2].detail = ready[20].detail;cout << "替换完成" << endl;cout << "被替换进程的pid是:"<< ready[20].pid<<endl;cout << "被替换进程的优先级是:", ready[20].priority;cout << "被替换进程的大小是:"<< ready[20].size<<endl;cout << "被替换进程的详情是:"<< ready[20].detail<<endl;}else{cout << "进程优先级不够大"<<endl; } }else{cout << "所查看运行进程不存在"<<endl;}choose();}void kill(){int kpid;cout << "请输入进程的pid:";cin >> kpid;if (kpid > 0 && kpid < 20 && running[kpid].isrun == 1){running[kpid].isrun = 0;}choose();}void choose() {int choose;cout << "是否继续操作?继续,请输入1,退出:按任意键" << endl;cout << "请输入你的选择:";cin >> choose;if (choose = 1) {menu();}else {exit(0);}}void menu() {int n, i;n = 1;while (n == 1){system("cls");cout << " 进程模拟 " << endl;cout << " 1.创建进程 2.查看进程信息 " << endl;cout << " 3.撤销进程 4.终止进程 " << endl;cout << "5. 退出 " << endl;cout << "请输入你的选择:";cin >> i;switch (i){case 1:create();break;case2:display(); break;case3:replace(); break;case 4:kill();break;case 5:exit(0);default:n = 0;}}}int main(){menu();return 0;}运行结果如下:任务三、基本存储器管理一、目的:一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。

(完整word版)操作系统课程设计(采用读写平等策略的读者写者问题)完整版 内含代码(word文档良心出品)

(完整word版)操作系统课程设计(采用读写平等策略的读者写者问题)完整版  内含代码(word文档良心出品)

淮北师范大学课程设计采用读写平等策略的读者写者问题学号:姓名:专业:指导教师:日期:目录第1部分课设简介 (3)1.1 课程设计题目 (3)1.2 课程设计目的................. 错误!未定义书签。

1.3 课程设计内容 (3)1.4 课程设计要求 (4)1.5 时间安排 (4)第2部分实验原理分析 (4)2.1问题描述 (4)2.2算法思想 (5)2.3主要功能模块流程图 (5)第3部分主要的功能模块 (6)3.1数据结构 (6)3.2测试用例及运行结果 (7)第4部分源代码 (7)第5部分总结及参考文献 (22)5.1 总结 (22)5.2 参考文献 (23)第1部分课设简介1.1 课程设计题目采用读写平等策略的读者写者问题1.2课程设计目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

1)进一步巩固和复习操作系统的基础知识。

2)培养学生结构化程序、模块化程序设计的方法和能力。

3)提高学生调试程序的技巧和软件设计的能力。

4)提高学生分析问题、解决问题以及综合利用C语言进行课程设计的能力。

1.3课程设计内容用高级语言编写和调试一个采用“读写平等”策略的“读者-- 写者”问题的模拟程序。

1.4课程设计要求1)读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。

2) 读者与写者均有两个以上,可在程序运行期间进行动态增加读者与写者。

3)可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化。

4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。

5) 读写策略:读写互斥、写写互斥、读写平等(严格按照读者与写者到达的顺序进入阅览室,有写着到达,则阻塞后续到达的读者;有读者到达,则阻塞后续到达的写者)。

操作系统课程设计LRU算法完整版内含代码

操作系统课程设计LRU算法完整版内含代码

操作系统课程设计LRU页面调度算法学号:姓名:学院:专业:班级:指导老师:日期:目录一、实验题目 (1)二、课程设计的目的 (1)三、设计内容 (1)四、设计要求 (1)五、设计思想 (1)六、主要数据结构及其说明 (2)七、硬件支持 (3)八、源程序文件 (3)九、程序运行结果 (7)十、实验体会 (8)一实验题目LRU页面调度算法二课程设计的目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。

1.进一步巩固和复习操作系统的基础知识。

2. 培养学生结构化程序、模块化程序设计的方法和能力。

3.提高学生调试程序的技巧和软件设计的能力。

4.提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

三设计内容程序应模拟实现LRU算法思想,对n个页面实现模拟调度。

四设计要求1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。

对程序其它部分也进行必要的注释。

2.对系统进行功能模块分析、画出总流程图和各模块流程图。

3.用户界面要求使用方便、简洁明了、美观大方、格式统一。

所有功能可以反复使用,最好使用菜单。

4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。

5.所有程序需调试通过。

五设计思想最近最久未使用(LRU)页调度算法是选择最近最久未使用的页面予以淘汰。

算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当所要访问的页面在内存块中时,就不淘汰页面,否则,淘汰页面中时间最长的,即淘汰最近最久未使用的页面。

算法流程图六主要数据结构及其说明程序执行是稳定的,高效的。

在LRU算法中,要找出最近最久未使用的页面的话,就必须设置有关的访问记录项,且每一次访问这些记录项,叶面都必须更新这些记录项。

这个记录项在此程序中为:typedef struct page{int num;/*记录页面号*/int time;/*记录调入内存时间*/}Page;//页面逻辑结构,结构为方便算法实现设计如此,显然要花费较大的系统开销(包括时间和空间上的),这也是实际系统中不采用LRU算法的直接原因,但由于其页面置换的优越性,实际系统中常使用LRU的近似算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计LRU页面调度算法
学号:
姓名:
学院:
专业:
班级:
指导老师:
日期:
目录
一、实验题目 (1)
二、课程设计的目的 (1)
三、设计内容 (1)
四、设计要求 (1)
五、设计思想 (1)
六、主要数据结构及其说明 (2)
七、硬件支持 (3)
八、源程序文件 (3)
九、程序运行结果 (7)
十、实验体会 (8)
一实验题目
LRU页面调度算法
二课程设计的目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。

1.进一步巩固和复习操作系统的基础知识。

2. 培养学生结构化程序、模块化程序设计的方法和能力。

3.提高学生调试程序的技巧和软件设计的能力。

4.提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

三设计内容
程序应模拟实现LRU算法思想,对n个页面实现模拟调度。

四设计要求
1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。

对程序其它部分也进行必要的注释。

2.对系统进行功能模块分析、画出总流程图和各模块流程图。

3.用户界面要求使用方便、简洁明了、美观大方、格式统一。

所有功能可以反复使用,最好使用菜单。

4.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。

5.所有程序需调试通过。

五设计思想
最近最久未使用(LRU)页调度算法是选择最近最久未使用的页面予以淘汰。

算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当所要访问的页面在内存块中时,就不淘汰页面,否则,淘汰页面中时间最长的,即淘汰最近最久未使用的页面。

算法流程图
六主要数据结构及其说明
程序执行是稳定的,高效的。

在LRU算法中,要找出最近最久未使用的页
面的话,就必须设置有关的访问记录项,且每一次访问这些记录项,叶面都必须更新这些记录项。

这个记录项在此程序中为:
typedef struct page
{
int num;/*记录页面号*/
int time;/*记录调入内存时间*/
}Page;//页面逻辑结构,结构为方便算法实现设计
如此,显然要花费较大的系统开销(包括时间和空间上的),这也是实际系统中不采用LRU算法的直接原因,但由于其页面置换的优越性,实际系统中常使用LRU的近似算法。

七硬件支持
为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速的知道哪一页是最近最久未使用的页面,须有两类硬件之一的支持:寄存器或栈。

寄存器:为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器。

栈:可利用一个特殊的栈来保存当前使用的各个页面的页面号。

每当进程访问某页面时,便将该页面的页面号从战中移出,将它压入栈顶。

因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。

八源程序文件
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define M 3 //物理块数
#define N 10 //页面数
#define Myprintf1
printf("\t************************\t\t\n\n");//表格控制
#define Myprintf2
printf("******************************\n\n");//表格控制
typedef struct page
{
int num;/*记录页面号*/
int time;/*记录调入内存时间*/
}Page;//页面逻辑结构,结构为方便算法实现设计
Page b[M];//内存单元数
int c[M][N];//暂保存内存当前的状态:缓冲区
int queue[100];//记录调入队列
int K;//调入队列计数变量
//初始化内存单元、缓冲区
void Init(Page *b,int c[M][N])
{
int i,j;
for(i=0;i<N;i++)
{
b[i].num=-1;
b[i].time=N-i-1;
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
c[i][j]=-1;
}
//取得在内存中停留最久的页面,默认状态下为最早调入的页面
int GetMax(Page *b)
{
int i;
int max=-1;
int tag=0;
for(i=0;i<M;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
return tag;
}
//判断页面是否已在内存中
int Equation(int fold,Page *b) {
int i;
for(i=0;i<M;i++)
{
if(fold==b[i].num)
return i;
}
return -1;
}
//LRU核心部分
void Lru(int fold,Page *b)
{
int i;
int val;
val=Equation(fold,b);
if(val>=0)
{
b[val].time=0;
for(i=0;i<M;i++)
if(i!=val)
b[i].time++;
}
else
{
queue[++K]=fold;//记录调入页面
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<M;i++)
if(i!=val)
b[i].time++;
}
//主程序
void main()
{
start:K=-1;
int i,j;
int a[N];
Myprintf1;
printf("\n\t\t\t欢迎使用LRU页面调度算法\n\n"); Myprintf1;
printf("请输入所要访问的各个页面号:\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
Init(b,c); //调用
for(i=0;i<N;i++)
{
Lru(a[i],b);
c[0][i]=a[i];
//记录当前的内存单元中的页面
for(j=0;j<M;j++)
c[j][i]=b[j].num;
}
//结果输出
printf("内存状态为:\n");
Myprintf2;
for(j=0;j<N;j++)
printf("|%2d",a[j]);
printf("|\n");
Myprintf2;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(c[i][j]==-1)
printf("|%2c",32);
else
printf("|%2d",c[i][j]);
}
printf("|\n");
}
Myprintf2;
printf("\n调入队列为:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/N);
printf("\n是否继续!\t y?");
char y;
if(getch()=='y')
{
system("cls");
printf("\n");
goto start;
}
else
printf("\n");
printf("程序结束\n");
}
九程序运行结果
十实验体会
通过本次课程设计,对LRU页面调度算法有了更深入的理解和掌握,进一步的巩固和复习了操作系统中关于LRU页面调度算法的知识,进一步的了
解了结构化、模块化程序设计的方法,提高了编写和调试程序的技巧,谢谢老师的细心指导。

相关文档
最新文档