操作系统课程设计报告题目及代码
操作系统课程设计(小型的操作系统)

操作系统课程设计报告题目:一个小型的操作系统班级:计122(杏)学号:1213023075姓名:贾苏日期:2014/06/231.实验平台(1)软件平台:开发系统平台:Windows 7 (64)Microsoft visual c++ 6.0测试系统平台:Windows 7 (64)(2)硬件平台:cpu:AMD A6-3420 APU内存:4GB硬盘:500G2.所需实现的功能及相应的阐述:(1)进程调度管理为了贴切现实中的os,采用RR(轮转调度算法),且不提供用户显式的选择调度算法,即对用户是透明的。
现实中的处理器主频为1Ghz~3Ghz,选取中间点为1.5Ghz,得时间片大小为0.7ns ,为方便计算*10,则时间片大小定为7ns。
假设进程之间的调度和切换不耗费cpu时间。
(2)死锁的检测与处理检测当然采用的是银行家算法处理:让用户选择kill一个进程,释放他所占有的所有资源。
(3)虚拟分页调度管理虚拟分页:给出的是逻辑值访问磁盘将那个数据块放入到内存中内存中的地址采用一定的算法相对应于磁盘的地址。
特规定访存采用的是按字节寻址内存的大小128KB外存的大小1MB即整个系统可以提供1MB的逻辑地址空间供进程进行访问(在地址总线足够扫描内存的情况下)。
虚拟地址映射采用:直接映射法规定的8kB为一个页面,故内存有16个页面,外存有128个页面。
如果产生了内存已满,便会产生缺页中断,淘汰采用FIFO算法,利用一个队列来做。
部分内外存的对应表0 0,128,2*128+0.......1 1,129,2*128+1.......2 2,130,2*128+2.......16 127,128+16,2*128+16.........(4)I/O中断处理设中断来自两个方面:1.DMA输送开始和结束时的中断设定一个宏定义为DMA一次传输的数据量的大小->DmaNum 假定为10kb每次DMA开始:耗费1ns cpu时间进行中断处理DMA 结束:耗费2ns cpu 时间进行中断处理由操作系统课程知,DMA 传输数据时不需要CPU 的干预。
Geekos操作系统的研究与实现操作系统课程设计报告书

操作系统课程设计报告题目:Geekos操作系统的研究与实现专业:学号:学生:指导教师:2012年3月16日目录一、实验目的3二、项目设计要求3三、开发环境的建立41.开发环境的介绍42.开发环境的构建4四、项目设计原理5五、项目设计的实现61. Project0项目的具体实现62. Project1项目的具体实现83. Project2项目的具体实现9六、系统编译运行的结果20七、遇到的问题和解决方法23八、课程设计总结24一、实验目的1.Project0:熟悉GeekOS的项目编译、调试和运行环境,掌握GeekOS运行工作过程。
2.Project1:熟悉ELF文件格式,了解GeekOS系统如何将ELF格式的可执行程序装入到存,建立核进程并运行的实现技术。
3.Project2:扩充GeekOS操作系统核,使得系统能够支持用户级进程的动态创建和执行。
二、项目设计要求1.Project0(1)搭建GeekOS的编译和调试平台,掌握GeekOS的核进程工作原理。
(2)熟悉键盘操作函数,编程实现一个核进程。
该进程的功能是:接收键盘输入的字符并显示到屏幕上,当输入ctrl+d时,结束进程的运行。
2.Project1(1)修改/geekos/elf.c文件:在函数Parse_ELF_Executable( )中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头,获取可执行文件长度,代码段、数据段等信息),并填充Exe_Format数据结构中的域值。
(2)在Linux环境下编译系统得到GeekOS镜像文件。
(3)编写一个相应的bochs配置文件。
(4)在bochs中运行GeekOS系统显示结果。
3.Project2:要求用户对以下几个文件进行修改:(1)“src/GeekOS/user.c”文件中的函数Spawn(),其功能是生成一个新的用户级进程;(2)“src/GeekOS/user.c”文件中的函数Switch_To_User_Context(),调度程序在执行一个新的进程前调用该函数以切换用户地址空间;(3)“src/GeekOS/elf.c”文件中的函数Parse_ELF_Executable()。
操作系统课程设计—多进程同步橘子苹果问题源代码

static int i1 = 0;
static int i2 = 0;
//代表消费者对应线程的数目,d1为苹果,d2为橘子
static int d1 = 0;
static int d2 = 0;
static TextArea textArea1;
import ;
import ;
import ;
import ;
import ;
import ;
import java.awt.*;
import ;
import ;
import ;
import javax.swing.*;
import;
public class Apple
{
/**
*生成一个缓冲池类对应的对象叫myStorage,以后所有的生产者线程和消费者线程都对这个myStorage对象进行操作!
{
char ch = event.getKeyChar();
if (ch < '0' || ch > '9')
{
event.consume();
}
}
});
panel.add(t2);
JButton inorg1 = new JButton("增加");
inorg1.setBounds(190, 550, 60, 25);
*/
static MyStorage myStorage = new MyStorage();
private JFrame window ;
//该数组用来存取生产橘子和苹果的线程,分别20个
python课程设计报告题目

python课程设计报告题目
以下是一些可能的Python课程设计报告题目:
1. Python爬虫设计:使用Python编写一个爬虫程序,从指定的网站抓取
数据,并将其保存到本地文件或数据库中。
2. 数据分析与可视化:使用Python的Pandas和Matplotlib库,对一组
数据进行处理、分析和可视化。
3. 文本处理:使用Python编写一个程序,对给定的文本进行分词、去停用词、关键词提取等操作。
4. 机器学习应用:使用Python编写一个机器学习程序,对一组数据进行分类、回归或聚类等操作。
5. 网站开发:使用Python的Flask或Django框架,开发一个简单的网站,包括用户注册、登录、数据展示等功能。
6. 网络爬虫:编写一个Python程序来爬取特定网站的信息。
7. 基于Web的信息管理系统:使用Python和Django框架开发一个基于Web的信息管理系统。
8. 图像处理:使用Python的OpenCV库,对一组图像进行处理和分析。
9. 自动化测试:使用Python编写自动化测试脚本,对Web应用程序或软
件进行测试。
10. 数据库操作:使用Python的SQLite或MySQL库,对数据库进行操作,包括插入、查询、更新和删除等操作。
以上题目仅供参考,您可以根据自己的兴趣和实际需求进行选择。
在撰写课程设计报告时,请注意遵循学术诚信原则,不要抄袭或剽窃他人的成果。
《操作系统课程设计》报告范本(doc 10页)

《操作系统课程设计》报告学号:姓名:班级:指导教师:报告日期:一、课设目的通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。
二、课设任务要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:①进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;②设计PCB适用于时间片轮转法;③建立进程队列;④实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。
○5总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。
三、实验方法与设计分析每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
据需要设计调查计划调查、收集数据,能按要求整理数据,在统计表进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为输入进程的时间。
,计算机,千千万万中小创业者渴望成功高中语文,语文试卷,计算机摇篮课进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
式,因此上开店成为了一种潮流,并且越来越多高中语文,语文试卷,计算机就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
卷,计算机络购物高中语文,语文试卷,计算机市场潜力还远未被释放课件同如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
语文,语文试卷,计算机,第5代速度达自动软件,不用东奔西走高中语文,语文每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
(完整word版)操作系统课程设计银行家算法

操作系统课程设计报告题目:银行家算法院(系):专业:班级:学生:学号:指导教师:2010年12月操作系统课程设计报告题目:银行家算法院(系):专业:班级:学生:学号:指导教师:2010年12月银行家算法摘要本次的课程设计内容是银行家算法,在操作系统当中,由于竞争非剥夺性资源和进程推进的不当,对系统的安全造成威胁,所以,银行家算法就是为了避免对系统产生死锁而存在的.银行家算法包括对请求资源的试分配和对安全性的考量,当系统的安全性不能够满足的时候,则对系统进行保护。
在编写银行家算法的时候需要定义Need(需求矩阵),Allocation(分配矩阵),Max(最大需求矩阵)以及Available(可利用资源量)。
在实现一系列的功能的时候使用的数组的结构,便于进行矩阵的加减运算,可以提高程序的运行效率.通过编写可以基本上实现银行家算法所要达到的基本目的,在输入正确的情况下能够输出正确的安全序列,在不安全的情况下可以做出提醒,并且恢复原有输入数据。
关键字:银行家算法最大需求矩阵分配矩阵需求矩阵可利用资源量目录摘要 (i)1 绪论 (1)2需求分析.................................................................。
(2)2.1 问题描述.........................................................。
. (2)2.2 产生条件..........................................................。
(2)2.3 运行环境.........................................................。
. (2)2.4 程序功能.........................................................。
操作系统课程设计文档及代码

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。
操作系统课程设计实验报告

湖南科技大学计算机科学与工程学院操作系统课程设计报告学号:姓名:班级:目录实验一.........................................................一、实验题目.............................................二、实验目的.............................................三、总体设计.............................................一、实验题目二、实验目的.............................................三、总体设计.............................................四、详细设计.............................................五、实验结果与分析.......................................六、小结与心得体会.......................................实验四.........................................................一、实验题目.............................................二、实验目的.............................................三、总体设计.............................................四、详细设计.............................................三、总体设计.............................................四、详细设计.............................................五、实验结果与分析.......................................六、小结与心得体会....................................... 实验七.........................................................一、实验题目.............................................二、实验目的.............................................三、总体设计.............................................四、详细设计.............................................五、实验结果与分析.......................................2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows进程的“一生”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目一模拟操作系统设计设计一个模拟操作系统管理程序,实现下列管理功能:1.内存管理功能2.文件管理功能3.磁盘管理功能题目二虚拟存储器各页面置换算法的实现与比较内容:设计一个虚拟存储区和内存工作区,通过产生一个随机数的方法得到一个页面序列,假设内存给定的页面数由键盘输入,分别计算使用下述各方法时的内存命中率:先进先出算法(FIFO)、最近最少使用算法(LRU)、最佳淘汰算法(OPT)、最少访问页面算法(LFU)等。
题目三文件系统设计通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
内容:为Linux系统设计一个简单的二级文件系统,以实现下列功能:1.可以实现下列几条命令(1)login 用户登录(2)dir 文件目录列表(3)creat 创建文件(4)delete 删除文件(5)open 打开文件(6)close 关闭文件(7)read 读文件(8)write 写文件2.实验提示(1)首先确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放在磁盘,这样便于查找和修改。
(2)用户创建的文件,可以编号存储于磁盘上。
如file0、file1、file2……等,并以编号作为物理地址,在目录中进行登记。
[清华大学《操作系统教程》X丽芬编著题目四设计一个按时间片轮转法进程CPU调度的程序。
提示:(1)假设系统有5个进程,每个进程用一个进程控制块PCB来代表,PCB中包含进程名、指针、到达时间、估计运行时间、进程状态表。
其中,进程名即为进程进标识。
(2)为每一个进程设计一个要示运行时间和到达时间。
(3)按照进程到达的先后顺序排成一个循环队列,再设一个队首指针指向第一个到达的进程首址。
(4)执行处理机调度时,开始选择队首的第一个进程运行。
另外再设一个当前运行进程指针,指向当前正运行的进程。
(5)由于本实验是模拟实验,所以对被选中进程并不实际启运运行,只是执行:a.估计驼行时间减1b.输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(6)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的指针所指进程,以指示应运行进程。
同时还尖判断该进程的剩八运行时间是否为零。
若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列。
(7)若就绪队列不空,则重复上述的(%)和(6)步,直到所有进程都运行完为止。
(9)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
题目5 设计一个按先来先服务调度的算法题目5 设计一个按优先级调度的算法题目6 设计一个用银行家算法进程资源分配的程序题目7 模拟内存管理,实现内存块的分配与回收。
内存管理方法可以取以下之一:(1)可变分区(2)页式存储管理内存分配算法可以取以下之一:(1)首次适应算法(2)最佳适应算法题目8 设计一个SPOOLING假脱机输出的模拟程序题目9 模拟设计MS-DOS操作系统中磁盘文件的存储结构题目10 模拟设计Linux操作系统中磁盘文件的存储结构参考资料题目二资料虚拟存储器各页面置换算法的实现与比较1.实验目的存储管理的主要功能之一是合理的分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2.实验内容(1)通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:1)50%的指令是顺序执行的;2)25%的指令是均匀分布在前地址部分;3)25%的指令是均匀分布在后地址部分;具体的实施方法是:1)在[0,319]的指令地址之间随机选取一起点m;2)顺序执行一条指令,即执行地址为m+1的指令;3)在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m';4)顺序执行一条指令,其地址为m'+1;5)在后地址[m'+2,319]中随机选取一条指令并执行;6)重复上述步骤1)-5),直到执行320次指令。
(2)将指令序列变换成为页地址流设:1)页面大小为1k;2)用户内存容量为4页到32页;3)用户虚存容量为32k;在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条- 第9条指令为第0页(对应虚存地址为[0,9]);第10条-第19条指令为第1页(对应虚存地址为[10,19]);...第310条-第319条指令为第31页(对应虚存地址为[310,319]);按以上方式,用户指令可组成为32页。
(3)计算并输出下列各种算法在不同内存容量下的命中率。
1)先进先出的算法(FIFO);2)最近最少使用算法(LRR);3)最佳淘汰算法(OPT):先淘汰最不常用的页地址;4)最少访问页面算法(LF.U);5)最近最不经常使用算法(NUR)。
其中3)和4)为选择内容。
命中率=1-页面失效次数/页地址流长度在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
3.随机数产生办法关于随机数产生办法,Linux或Unix系统提供函数srand( )和rand( ),分别进行初始化和产生随机数。
例如:srand( );语句可初始化一个随机数;a[0]=10*rand( )/32767*319+1;a[1]=10*rand( )/32767*a[0];..语句可用来产生a[0]与a[1]中的随机数。
提示:首先用Srand( )和rand( ) 函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
命中率=1-页面失效次数/页地址流长度1、数据结构(1)页面类型typedef struct{int pn,pfn,counter,time;}pl-type;其中pn为页号,pfn为页面号,count为一个周期内访问该页面的次数,time为访问时间。
(2)页面控制结构pfc_struct{int pn,pfn;struct pfc_struct *next;};typedef struct pfc_struct pfc_type;pfc_type pfc[total_vp],*freepf_head,*busypf_head;pfc_type *busypf_tail;其中,pfc[total_vp]定义用户进程虚页控制结构,*freepf_head为空页面头的指针,*busypf_head为忙页面头的指针,*busyf_tail为忙页面尾的指针。
2、函数定义(1)Void initialize( ):初始化函数,给每个相关的页面赋值。
(2)Void FIFO( ):计算使用FIFO算法时的命中率。
(2)Void LRU():计算使用FIFO算法时的命中率。
(4)VoidOPT():计算使用OPT算法时的命中率。
(5)Void LFU ():计算使用LFU算法时的命中率。
(6)Void NUR():计算使用NUR算法时的命中率。
3、变量定义(1)int a[tatal_instruction] :指令流数据组。
(2) int page[total_instruction]:每条指令所属页号。
(3)int offset[total_instruction]:每页装入不敷出0条指令后取模运算页号偏移量。
(4)int total_pf:用户进程的内存页面数。
(5)int diseffect:页面失效次数。
程序清单程序:程序:#include "stdio.h"#include "process.h"#include "stdlib.h"#define TRUE 1#define FALSE 0#define INVALID -1#define null 0#define total_instruction 320 /*指令流长*/#define total_vp 32 /*虚页长*/#define clear_period 50 /*清0周期*/typedef struct{int pn,pfn,counter,time;}pl_type;pl_type pl[total_vp]; /*页面数据结构*/struct pfc_struct{ /*页面控制结构*/int pn,pfn;struct pfc_struct *next;};typedef struct pfc_struct pfc_type;pfc_type pfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;int diseffect,a[total_instruction];int page[total_instruction],offset[total_instruction];void initialize();void FIFO();void LRU();void OPT();void LFU();void NUR();main(){int S,i,j;srand(getpid()*10); /*由于每次运行时进程号不同,故可用来作为初始化随机数队列的种子*/S=(float)319*rand()/32767+1;for(i=0;i<total_instruction;i+=4) /*产生指令队列*/{a[i]=S; /*任选一指令访问点*/a[i+1]=a[i]+1; /*顺序执行一条指令*/a[i+2]=(float)a[i]*rand()/32767;/*执行前地址指令*/a[i+3]=a[i+2]+1; /*执行后地址指令*/}for(i=0;i<total_instruction;i++) /*将指令序列变换为页地址流*/{page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++) /*用户内存工作区从4个页面到32个页面*/{printf("%2d page frames",i);FIFO(i);LRU(i);OPT(i);LFU(i);NUR(i);printf("\n");getchar();}}void FIFO(total_pf) /*FIFO*/int total_pf; /*用户进程的内存页面数*/{int i,j;pfc_type *p,*t;initialize(total_pf); /*初始化相关页面控制用数据结构*/busypf_head=busypf_tail=null; /*忙页面队列头,队列尾*/for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID) /*页面失效*/{diseffect+=1; /*失效次数*/if(freepf_head==null) /*无空闲页面*/{p=busypf_head->next;pl[busypf_head->pn].pfn=INVALID;freepf_head=busypf_head; /*释放忙页面队列中的第一个页面*/ freepf_head->next=null;busypf_head=p;}p=freepf_head->next; /*按FIFO方式调新页面入内存页面*/freepf_head->next=null;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if (busypf_tail==null)busypf_head=busypf_tail=freepf_head;else{busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;}}printf("FIFO:%6.4",1-(float)diseffect/320);}void LRU(total_pf) /*LRU*/int total_pf;int min,minj,i,j,present_time;initialize(total_pf);present_time=0;for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID) /*页面失效*/ { diseffect++;if(freepf_head==null) /*无空闲页面*/ {min=32767;for(j=0;j<total_vp;j++)if(min>pl[j].time&&pl[j].pfn!=INVALID){min=pl[j].time;minj=j;}freepf_head=&pfc[pl[minj].pfn];pl[minj].pfn=INVALID;pl[minj].time=-1;freepf_head->next=null;}pl[page[i]].pfn=freepf_head->pfn;pl[page[i]].time=present_time;freepf_head=freepf_head->next;}elsepl[page[i]].time=present_time;present_time++;}printf("LRU:%6.4f",1-(float)diseffect/320); }void NUR(total_pf) /*NUR*/int total_pf;{int i,j,dp,cont_flag,old_dp;pfc_type *t;initialize(total_pf);for(i=0;i<total_instruction;i++);{if(pl[page[i]].pfn==INVALID) /*页面失效*/ {diseffect++;if(freepf_head==null) /*无空闲页面*/ {cont_flag=TRUE;old_dp=dp;while(cont_flag)if(pl[dp].counter==0&&pl[dp].pfn!=INVALID) cont_flag=FALSE;else{dp++;if(dp==total_vp) dp=0;if(dp==old_dp)for(j=0;j<total_vp;j++)pl[j].counter=0;}freepf_head=&pfc[pl[dp].pfn];pl[dp].pfn=INVALID;freepf_head->next=null;}pl[page[i]].pfn=freepf_head->pfn;freepf_head=freepf_head->next;}elsepl[page[i]].counter=1;if(i%clear_period==0)for(j=0;j<total_vp;j++)pl[j].counter=0;}printf("NUR:%6.4f",1-(float)diseffect/320);}void OPT (total_pf) /*OPT*/int total_pf;{int i,j,max,maxpage,d,dist[total_vp];pfc_type *t;initialize(total_pf);for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID){diseffect++;if(freepf_head==null){ for(j=0;j<total_vp;j++)if(pl[page[j]].pfn!=INVALID)dist[j]=32767;else dist[j]=0;d=1;for(j=i+1;j<total_instruction;j++){if(pl[page[j]].pfn!=INVALID)dist[page[j]]=d;d++;}max=-1;for(j=0;j<total_vp;j++)if(max<dist[j]){ max=dist[j];maxpage=j;}freepf_head=&pfc[pl[maxpage].pfn];freepf_head->next=null;pl[maxpage].pfn=INVALID;}pl[page[i]].pfn=freepf_head->pfn;freepf_head=freepf_head->next;}}printf("OPT:%6.4f",1-(float)diseffect/320);}void LFU(total_pf) /*LFU*/int total_pf;{int i,j,min,minpage;pfc_type * t;initialize(total_pf);for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID){ diseffect++;if(freepf_head==null){ min=32767;for(j=0;j<total_vp;j++){if(min>pl[j].counter&&pl[j].pfn!=INVALID){ min=pl[j].counter;minpage=j;}pl[j].counter=0;}freepf_head=&pfc[pl[minpage].pfn];pl[minpage].pfn=INVALID;freepf_head->next=null;}pl[page[i]].pfn=freepf_head->pfn;freepf_head=freepf_head->next;}elsepl[page[i]].counter++;}printf("LFU:%6.4f",1-(float)diseffect/320);}void initialize(total_pf) /*初始化相关数据*/int total_pf; /*用户进程的内存页面数*/ {int i;diseffect=0;for(i=0;i<total_vp;i++){pl[i].pn=i;pl[i].pfn=INVALID; /*置页面控制结构中的页号,页面为空*/pl[i].counter=0;pl[i].time=-1; /*页面控制结构中的访问次数为0,时间为-1*/ }for(i=1;i<total_pf;i++){pfc[i-1].next=&pfc[i];pfc[i-1].pfn=i-1;}pfc[total_pf-1].next=null;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0];}1、操作系统实验教程X丽芬编著清华大学2、操作系统原理实验教程(基于Linux)胡峰松编清华大学。