操作系统实验报告
操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
操作系统实验二实验报告

操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
操作系统安全实验1实验报告

操作系统安全实验1实验报告一、实验目的本次操作系统安全实验的主要目的是让我们深入了解操作系统的安全机制,通过实际操作和观察,掌握一些常见的操作系统安全配置和防护方法,提高对操作系统安全的认识和应对能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 2004),实验设备为个人计算机。
三、实验内容与步骤(一)Windows 10 操作系统安全配置1、账户管理创建新用户账户,并设置不同的权限级别,如管理员、标准用户等。
更改账户密码策略,包括密码长度、复杂性要求、密码有效期等。
启用账户锁定策略,设置锁定阈值和锁定时间,以防止暴力破解密码。
2、防火墙配置打开 Windows 防火墙,并设置入站和出站规则。
允许或阻止特定的应用程序通过防火墙进行网络通信。
3、系统更新与补丁管理检查系统更新,安装最新的 Windows 安全补丁和功能更新。
配置自动更新选项,确保系统能够及时获取并安装更新。
4、恶意软件防护安装并启用 Windows Defender 防病毒软件。
进行全盘扫描,检测和清除可能存在的恶意软件。
(二)Linux(Ubuntu 2004)操作系统安全配置1、用户和组管理创建新用户和组,并设置相应的权限和归属。
修改用户密码策略,如密码强度要求等。
2、文件系统权限管理了解文件和目录的权限设置,如读、写、执行权限。
设置特定文件和目录的权限,限制普通用户的访问。
3、 SSH 服务安全配置安装和配置 SSH 服务。
更改 SSH 服务的默认端口号,增强安全性。
禁止 root 用户通过 SSH 登录。
4、防火墙配置(UFW)启用 UFW 防火墙。
添加允许或拒绝的规则,控制网络访问。
四、实验结果与分析(一)Windows 10 操作系统1、账户管理成功创建了具有不同权限的用户账户,并能够根据需求灵活调整权限设置。
严格的密码策略有效地增加了密码的安全性,减少了被破解的风险。
账户锁定策略在一定程度上能够阻止暴力破解攻击。
操作系统实验报告

篇一:操作系统实验报告完全版《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解windows 2000的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解windows 2000中进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:windows 2000 professional、visual c++6.0企业版。
三、实验内容和步骤第一部分:程序1-1windows 2000 的gui 应用程序windows 2000 professional下的gui应用程序,使用visual c++编译器创建一个gui应用程序,代码中包括了winmain()方法,该方法gui类型的应用程序的标准入口点。
:: messagebox( null, “hello, windows 2000” , “greetings”,mb_ok) ;/* hinstance */ , /* hprevinstance */, /* lpcmdline */, /* ncmdshow */ )return(0) ; }在程序1-1的gui应用程序中,首先需要windows.h头文件,以便获得传送给winmain() 和messagebox() api函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到user32.lib库文件并将其与产生的exe文件连接起来。
这样就可以运行简单的命令行命令cl msgbox.cpp来创建这一应用程序,如果没有pragma指令,则messagebox() api函数就成为未定义的了。
这一指令是visual studio c++ 编译器特有的。
接下来是winmain() 方法。
其中有四个由实际的低级入口点传递来的参数。
操作系统实验报告6

操作系统实验报告6一、实验目的本次操作系统实验的主要目的是深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关技术,通过实际操作和观察,增强对操作系统工作原理的理解,并提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,实验工具包括 Visual Studio 2019 等。
三、实验内容(一)进程管理实验1、创建多个进程,并观察它们的运行状态和资源占用情况。
通过编写简单的C++程序,使用Windows API 函数创建多个进程。
在程序中,设置不同的进程优先级和执行时间,观察操作系统如何调度这些进程,以及它们对 CPU 使用率和内存的影响。
2、进程间通信实现了进程间的管道通信和消息传递。
通过创建管道,让两个进程能够相互交换数据。
同时,还使用了 Windows 的消息机制,使进程之间能够发送和接收特定的消息。
(二)内存管理实验1、内存分配与释放使用 C++的动态内存分配函数(如`malloc` 和`free`),在程序运行时动态申请和释放内存。
观察内存使用情况,了解内存碎片的产生和处理。
2、虚拟内存管理研究了 Windows 操作系统的虚拟内存机制,通过查看系统的性能监视器,观察虚拟内存的使用情况,包括页面文件的大小和读写次数。
(三)文件系统实验1、文件操作进行了文件的创建、读取、写入、删除等基本操作。
通过编写程序,对不同类型的文件(如文本文件、二进制文件)进行处理,了解文件系统的工作原理。
2、目录操作实现了目录的创建、删除、遍历等功能。
了解了目录结构在文件系统中的组织方式和管理方法。
四、实验步骤(一)进程管理实验步骤1、打开 Visual Studio 2019,创建一个新的 C++控制台项目。
2、在项目中编写代码,使用`CreateProcess` 函数创建多个进程,并设置它们的优先级和执行时间。
3、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。
计算机操作系统实验报告

计算机操作系统实验报告一、实验目的本次计算机操作系统实验的主要目的是深入了解操作系统的工作原理和功能,通过实际操作和观察,增强对操作系统概念的理解,提高解决实际问题的能力。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio 20193、编程语言:C++三、实验内容1、进程管理实验创建多个进程,并观察它们的执行顺序和资源占用情况。
使用进程控制块(PCB)来跟踪进程的状态变化,如就绪、运行、阻塞等。
2、内存管理实验模拟内存分配和回收算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察不同算法在内存利用率和分配效率方面的表现。
3、文件系统实验创建、读取、写入和删除文件,了解文件的操作流程。
研究文件的存储结构和目录管理方式。
4、线程同步与互斥实验使用互斥锁和信号量来实现线程之间的同步和互斥操作。
观察在多线程环境下资源竞争和同步的效果。
四、实验步骤1、进程管理实验步骤编写 C++程序,使用系统调用创建多个进程。
在每个进程中输出进程的标识符和当前执行时间。
通过观察控制台输出,分析进程的执行顺序和资源占用情况。
2、内存管理实验步骤实现不同的内存分配算法,并在程序中模拟内存请求和释放的过程。
记录每次内存分配和回收的结果,计算内存利用率和分配时间。
3、文件系统实验步骤使用文件操作函数创建文件,并写入一些数据。
读取文件中的数据,并将其输出到控制台。
删除文件,观察文件系统的变化。
4、线程同步与互斥实验步骤创建多个线程,共享一些公共资源。
在访问公共资源的代码段前使用互斥锁或信号量进行同步控制。
观察线程的执行结果,确保资源的正确访问和修改。
五、实验结果与分析1、进程管理实验结果与分析实验结果显示,进程的执行顺序是不确定的,取决于操作系统的调度策略和进程的优先级。
资源占用情况也因进程的不同而有所差异,一些进程可能占用较多的 CPU 时间和内存,而另一些则相对较少。
2、内存管理实验结果与分析首次适应算法在分配速度上较快,但容易产生内存碎片。
操作系统课程实验报告

一、实验概述实验名称:操作系统课程实验实验目的:1. 理解操作系统基本概念、原理及功能;2. 掌握操作系统的基本操作和应用;3. 提高实际操作能力和分析问题、解决问题的能力。
实验内容:1. 操作系统基本概念及原理的学习;2. 操作系统基本操作的应用;3. 实验项目:文件读写、多进程、多线程。
二、实验环境操作系统:Windows 10编译器:Visual Studio语言:C/C++实验平台:Windows 10系统下的虚拟机三、实验过程1. 操作系统基本概念及原理的学习操作系统是计算机系统中最基本的系统软件,负责管理计算机硬件资源、提供用户接口以及执行各种应用程序。
在实验过程中,我们学习了以下基本概念及原理:(1)进程管理:进程是操作系统能够进行运算处理的独立单位,具有动态性、并发性、异步性和独立性等特点。
进程管理主要包括进程的创建、调度、同步、通信和终止等。
(2)内存管理:内存管理是操作系统核心功能之一,主要负责分配、回收、保护和管理内存资源。
内存管理方式有分页、分段、段页式等。
(3)文件系统:文件系统是操作系统用于存储、检索和管理文件的机制。
文件系统主要包括目录结构、文件属性、文件操作等。
(4)设备管理:设备管理负责管理计算机系统中的各种外部设备,包括输入、输出和存储设备。
设备管理主要包括设备分配、设备驱动程序、缓冲区管理等。
2. 操作系统基本操作的应用在实验过程中,我们应用以下基本操作:(1)进程管理:创建、调度、同步、通信和终止进程。
(2)内存管理:分配、回收、保护和管理内存资源。
(3)文件系统:创建、删除、读写文件,实现目录结构的管理。
(4)设备管理:分配、回收、控制和管理设备。
3. 实验项目:文件读写、多进程、多线程(1)文件读写实验实验目的:掌握文件的基本操作,实现文件的创建、打开、读取、写入和关闭。
实验步骤:① 创建一个文件,命名为“test.txt”。
② 打开文件,以读写模式。
操作系统实验报告九

操作系统实验报告九一、实验目的本次操作系统实验的目的是深入了解和掌握操作系统中的进程管理、内存管理、文件系统等核心概念和技术,并通过实际的实验操作,提高对操作系统原理的理解和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10,开发工具为 Visual Studio 2019,编程语言为 C++。
三、实验内容及步骤(一)进程管理实验1、创建进程使用 Windows API 函数 CreateProcess 来创建一个新的进程。
观察新进程的创建过程和相关的系统资源分配。
2、进程同步与互斥使用互斥量(Mutex)和信号量(Semaphore)来实现进程之间的同步和互斥操作。
编写多个进程,模拟对共享资源的并发访问,并通过同步机制来保证数据的一致性和正确性。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 来进行内存的动态分配和释放。
观察内存分配和释放过程中的内存状态变化。
2、内存页面置换算法实现简单的内存页面置换算法,如先进先出(FIFO)算法和最近最少使用(LRU)算法。
通过模拟内存访问过程,比较不同算法的性能和效率。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等来进行文件的创建、读取和写入操作。
观察文件操作过程中的系统调用和文件系统的响应。
2、文件目录管理实现对文件目录的创建、删除、遍历等操作。
了解文件目录结构和文件系统的组织方式。
四、实验结果与分析(一)进程管理实验结果1、创建进程成功创建新的进程,并观察到新进程在任务管理器中的出现和相关的资源占用情况。
2、进程同步与互斥通过互斥量和信号量的使用,有效地实现了进程之间的同步和互斥操作,避免了对共享资源的并发访问冲突,保证了数据的正确性。
(二)内存管理实验结果1、内存分配与释放能够成功地进行内存的动态分配和释放,观察到内存地址的变化和内存使用情况的更新。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告一、实验目的1、处理机调度:在多道程序或多任务系统中,系统中同时处于就绪状态有若干,也就是说能运行的进程数远远大于处理机个数。
为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。
2、银行家算法:模拟进程的资源分配算法,了解死锁的产生和避免。
3、页面替换:在分页虚拟存储系统中,当硬件发出缺页中断后转操作系统处理缺页中断。
如果主存中已无空闲块,采用合适算法进行缺页处理。
4、移臂调度:在启动之前按驱动调度策略对访问的请求优化其排序十分必要。
就应该考虑使移动臂的移动时间最短的调度策略。
将上述算法放在一个程序中进行调度,就是本次课程设计的主要内容。
二、实验要求书写实验报告,应该包括以下几项内容:1、实验题目2、程序中使用的数据结构及主要符号说明。
3、程序流程图和带有注释的源程序。
4、执行程序名,并打印程序运行时的初值和运行结果,其中包括:I、各程序进程块的初始状态。
II、选中运行进程的名字、运行后各进程控制块状态以及每次调度时,就绪队列的进程排列顺序。
5、通过实验后的收获和体会及对实验的改进意见和见解。
三、实验内容该程序中包括了处理机调度、页面置换算法、移臂调度算法;这三种算法中各包含了三种调度方式。
最后还有银行家算法。
四、实验结果展示1、初始界面如下2、处理机调度过程3、页面替换调度的界面4、银行家算法界面5、移臂调度界面五、实验收获与体会本次课程设计将平时做的实验综合在一起,通过界面的控制来调度不同的算法,实现不同的目的。
当初单个实验执行没有错误,放在一起就出现了很多问题,比如重定义问题,整个实验中也只能出现一个main( )函数。
通过本次课程设计,收获颇多,当调出没错误时,一种前所未有的成就感油然而生,同时也对各种算法有了更深层次的认识。
附录:源程序:#include<iostream>#include<iomanip>using namespace std;struct PCB1{char name[20]; //进程名int arrivetime; //进程到达时间int runtime; //估计运行时间int grade; //进程的优先级(优先数越低,优先级越高)PCB1 *next; //链表指针};class processes{ PCB1 *head;//指向初始化的进程队列PCB1 *run;//指向就绪进程队列,队首为正在运行的进程PCB1 *run_tail;//指向就绪队列队尾int num;//记录进程个数int current;//记录系统当前时间的变量public:processes(int n);//构造函数processes::~processes();//析构函数void Set_Run();//run为空时初始化或构造run链表void Move1();//run队列队首结点移至队尾void Move2();//head队首元素移至run队首void Move3();//进程运行后优先级改变且未运行完成有序插入就绪队列PCB1* Sort_Insert_arrivetime(PCB1 *head,PCB1 *n);//按到达时间排序void inputprocess(int l);//建立进程的函数void Delete_processes();//构造已完成的进程队列void runprocess_FCFS();//先来先服务算法void runprocess_RR();//时间片轮算法void runprocess_Grade();//按优先级调度};processes::processes(int n)//构造函数{ num=n;current=0;run=head=NULL;}processes::~processes()//析构函数{ delete head,run,run_tail;}void processes::Set_Run(){ run=head;run_tail=head;head=head->next;run->next=NULL;}void processes::Move1(){ PCB1 *just_run=run;run=run->next;run_tail->next=just_run;just_run->next=NULL;run_tail=just_run;}void processes::Move2(){ PCB1 *t=head;head=head->next;t->next=run;run=t;}void processes::Move3(){ PCB1 *just_run=run;run=run->next;PCB1 *r=run,*q=run->next;while(q&&just_run->grade>=q->grade) r=q,q=q->next;r->next=just_run;just_run->next=q;if(!q) run_tail=just_run;}PCB1* processes::Sort_Insert_arrivetime(PCB1 *head,PCB1 *n)//按到达时间排序{ PCB1 *p1,*p2;if(head==NULL){head=n;n->next=NULL;return head;}if(head->arrivetime>=n->arrivetime){n->next=head;head=n;return head;}p1=p2=head;while(p2->next&&p2->arrivetime<n->arrivetime){p1=p2;p2=p2->next;}if(p2->arrivetime<n->arrivetime){p2->next=n;n->next=NULL;}else if(p2->arrivetime>n->arrivetime){n->next=p2;p1->next=n;}else{while(p2->grade<n->grade) {p1=p2,p2=p2->next;}p1->next=n;n->next=p2;}return head;}void processes::inputprocess(int l)//建立进程的函数{ for(int i=0;i<num;i++){PCB1 *n=new PCB1;cout<<"\nInput NO."<<i+1<<" process name:";cin>>n->name;cout<<" arrivetime:";cin>>n->arrivetime;cout<<" runtime:";cin>>n->runtime;if(l==3) cout<<" grade:",cin>>n->grade;else n->grade=0;head=Sort_Insert_arrivetime(head,n);}}void processes::Delete_processes()//构造已完成的进程队列{ PCB1 *p=run;run=run->next;delete p;}void processes::runprocess_FCFS()//先来先服务算法{ int start_time,k=0;while(head){while(current<head->arrivetime) current++;run=head;if(!k){cout<<"Time is "<<current;start_time=head->arrivetime;}else start_time=current;cout<<","<<run->name<<" start"<<endl;while(current<start_time+run->runtime) current++;cout<<"Time is "<<current<<","<<run->name<<" end";run->runtime=0;head=head->next;Delete_processes();if(head&¤t>=head->arrivetime) k=1;else {cout<<'\n';k=0;}}}void processes::runprocess_RR()//时间片轮算法{ for(int k=0;head||run;k=0){if(!run&&head){while(current<head->arrivetime) current++;Set_Run();cout<<"Time is "<<current<<","<<run->name<<" start"<<endl;}run->runtime--,current++;if(run->runtime==0){cout<<"Time is "<<current<<","<<run->name<<" end";Delete_processes();if(head&¤t==head->arrivetime) k=1;else {cout<<'\n';if(!run&&!head) break;}}if(head==NULL||(head&¤t<head->arrivetime))if(run&&run->next) Move1();if(head&¤t==head->arrivetime){if(!k&&run&&run->next) Move1();if(run) Move2();else Set_Run();if(!k) cout<<"Time is "<<current;cout<<","<<run->name<<" start"<<endl;}}}void processes::runprocess_Grade()//按优先级调度{ for(int k=0;head||run;k=0){if(!run&&head){while(current<head->arrivetime) current++;Set_Run();cout<<"Time is "<<current<<","<<run->name<<" start"<<endl;}run->runtime--,current++,run->grade++;if(run->runtime==0){cout<<"Time is "<<current<<","<<run->name<<" end";Delete_processes();if(head&¤t>=head->arrivetime) k=1;else {cout<<'\n';if(!run&&!head) break;}}if(!head||current<head->arrivetime)if(run&&run->next&&run->grade>run->next->grade) Move3();if(head&¤t>=head->arrivetime){if(!run){Set_Run();cout<<","<<run->name<<" start"<<endl;}else{if(run->next&&run->grade>run->next->grade) Move3();if(head->grade>=run->grade){if(k) cout<<'\n';}else{Move2();if(!k) cout<<"Time is "<<current;cout<<","<<run->name<<" start"<<endl;}}}}}int cljdd(){int m,n;while(1){cout<<"*********************************处理器调度方法*********************************\n"<<"1.先来先服务\n\n"<<"2.时间片轮转法\n\n"<<"3.优先级法\n\n"<<"4.退出\n\n"<<"****************************************************************** **************"<<"\n请选择需要的调度方法:";cin>>n;while(n<1||n>3){if(n==4) return 1;cout<<"输入有误!请重新输入:";cin>>n;}cout<<"\n请输入进程的个数:";cin>>m;processes P(m);P.inputprocess(n);if(n==1) P.runprocess_FCFS();else if(n==2) P.runprocess_RR();else P.runprocess_Grade();}}//************************************ 页面替换*************************************class Page{ int pagecount;//记录需要访问的页面次数int blockcount;//记录内存块大小int head;int t;int *page;int **block;public:Page(int m,int n);~Page();void setpage();int seekpage(int i);int isfull();void FIFO(int i);void LRU(int i);void OPT(int i);void queyediaodu(int r);};Page::Page(int m,int n):pagecount(n),blockcount(m){head=t=0;page=new int[pagecount];block=new int*[blockcount];for(int i=0;i<blockcount;i++) block[i]=new int[2];}Page::~Page(){delete page;for(int i=0;i<blockcount;i++) delete block[i];delete block;}void Page::setpage(){cout<<"输入页面走向:";for(int i=0;i<pagecount;i++) cin>>page[i];for(i=0;i<blockcount;i++)block[i][0]=-1,block[i][1]=0;}int Page::seekpage(int i){for(int l=0;l<blockcount;l++)if(block[l][0]==i) return l;return -1;}int Page::isfull(){for(int i=0;i<blockcount;i++)if(block[i][0]==-1) return i;return -1;}void Page::FIFO(int i)//head的下一个页面被替换{head=(head+1)%blockcount;t=head;cout<<"\n页面"<<block[t][0]<<"被替换,"<<page[i]<<"装入\n";if(block[t][1]==1) cout<<"将页面"<<block[t][0]<<"复写入交换区\n"; }void Page::LRU(int i)//head前一个被替换{if(head==0) t=blockcount-1;else t=head-1;cout<<"\n页面"<<block[t][0]<<"被替换,"<<page[i]<<"装入\n";if(block[t][1]==1) cout<<"将页面"<<block[t][0]<<"复写入交换区\n";head=t;}void Page::OPT(int i){int *q,d=-1;q=new int[blockcount];for(int j=0;j<blockcount;j++) q[j]=pagecount;for(int k=0;k<blockcount;k++)for(int l=pagecount-1;l>i;l--)if(block[k][0]==page[l]) q[k]=l;for(int h=0;h<blockcount;h++)if(q[h]>d) d=q[h],t=h;cout<<"\n页面"<<block[t][0]<<"被替换,"<<page[i]<<"装入\n";if(block[t][1]==1) cout<<"将页面"<<block[t][0]<<"复写入交换区\n"; }void Page::queyediaodu(int r){int i,tag=0;char a;for(i=0;i<pagecount;i++,tag=0){if((t=seekpage(page[i]))>=0){cout<<"\n页面"<<page[i]<<"命中!\n";if(r==2) head=t;tag=1;}else{if((t=isfull())>=0){cout<<"\n内存足够大,页面"<<page[i]<<"被写入\n";head=t;}else{if(r==1) FIFO(i);else if(r==2) LRU(i);else if(r==3) OPT(i);}block[t][0]=page[i];}char b=true;while(b){cout<<"是否有数据修改(Y/N)?";cin>>a;if(a=='y'||a=='Y') block[t][1]=1,b=false;else if(a=='n'||a=='N'){if(tag==0) block[t][1]=0;b=false;}else cout<<"输入有误!请重新输入\n";}}}int ymth(){int m,n,s;while(1){cout<<"*********************************页面替换策略***********************************\n"<<"1.先进先出页面替换策略\n\n"<<"2.最近最少使用页面替换策略\n\n"<<"3.最佳页面替换算法\n\n"<<"4.退出\n\n"<<"****************************************************************** **************"<<"\n请选择页面替换策略:";cin>>s;while(s<1||s>3){if(s==4) return 1;cout<<"输入有误,请重新输入:";cin>>s;}cout<<"输入内存块数:";cin>>m;cout<<"输入页面数:";cin>>n;Page P(m,n);P.setpage();P.queyediaodu(s);}}//**********************************银行家算法***********************************const int max_resource=10;//系统拥有最大资源数struct PCB{ char name[21];//记录进程的名字int requirement;//进程所需资源总量int occupy;//进程已占资源量char state;//进程状态标志PCB *next;//用于指向下一个结点};class Banker{ PCB *head;//运行态进程队首PCB *tail;//运行态进程队尾PCB *run;//指向正在运行进程PCB *wait_head;//等待态进程队首PCB *wait_tail;//等待态进程队尾int rest_resource;//系统剩余资源量int num;//系统运行进程的个数public:Banker(int m);//构造函数~Banker();//析构函数void inputprocesses();//建立进程的函数PCB* Get_run(char *n);//寻找与输入名一样的进程void Delete(PCB *n);//删除已完成运行的进程void Sort_processes1(PCB *p1,PCB *p2);//置进程为就绪态 void Sort_processes2(PCB *r);//置进程为等待态bool isSafeState();//安全性测试算法void rand();//随机算法void banker();//银行家算法};Banker::Banker(int m){ num=m;head=wait_head=NULL;rest_resource=max_resource;}Banker::~Banker(){ delete head,tail,run,wait_tail;if(wait_head){ PCB *p=wait_head;wait_head=wait_head->next;delete p;}}void Banker::inputprocesses(){ cout<<"\nEnter the information of processes:\n";for(int i=0;i<num;i++){ PCB *n=new PCB;cout<<"\nEnter the name of process:";cin>>n->name;cout<<"Enter the requested resoures of process:";cin>>n->requirement;if(n->requirement>max_resource){ cout<<"进程申请资源量超过系统拥有总量,重新输入!\n";delete n;i--;}else{ n->occupy=0;n->state=false;if(!head) tail=head=n;else tail->next=n,tail=n;}}if(head) tail->next=NULL;}PCB* Banker::Get_run(char *n){ PCB *t=head;while(t){ if(!strcmp(t->name,n)) return t;t=t->next;}t=wait_head;while(t){ if(!strcmp(t->name,n)){cout<<"This process is waiting\n";return NULL;}t=t->next;}cout<<"The processs_name is wrong!Enter again\n";return t;}void Banker::Delete(PCB *n){ PCB *p1,*p2;if(!strcmp(head->name,n->name)){ p1=head;head=head->next;delete p1;}else{ p1=head,p2=p1->next;while(strcmp(p2->name,n->name)) p1=p2,p2=p2->next;if(!p2->next) tail=p1;p1->next=p2->next;delete p2;}}void Banker::Sort_processes1(PCB *p1,PCB *p2){ if(!p2->next) wait_tail=p1;p1->next=p2->next;if(p1==p2) wait_head=wait_head->next;if(head) tail->next=p2,tail=p2;else head=tail=p2;p2->next=NULL;}void Banker::Sort_processes2(PCB *r){ PCB *q1,*q2;q1=q2=head;while(strcmp(r->name,q2->name)) q1=q2,q2=q2->next;if(q1==q2) head=head->next;if(!q2->next) tail=q1;q1->next=q2->next;if(wait_head) wait_tail->next=q2,wait_tail=q2;else wait_head=wait_tail=q2;q2->next=NULL;}bool Banker::isSafeState(){ int currentavail=rest_resource;bool possible=true;PCB *p1=head,*p2=tail;if(wait_head){ tail->next=wait_head;p2=wait_tail;}while(p1!=p2) p1->state=false,p1=p1->next;p1->state=false;for(p1=head;p1;){ if(p1->state) {p1=p1->next;continue;}if(p1->requirement-p1->occupy>currentavail) {p1=p1->next;continue; }else{ currentavail+=p1->occupy;p1->state=true;p1=head;continue;}}for(p1=head;p1;p1=p1->next){ if(p1->state) continue;else {possible=false;break;}}if(wait_head) tail->next=NULL;return possible;}void Banker::rand(){ cout<<"\nNow start random alogrithm...\n";char n[20];int x;PCB *p1,*p2;while(head||wait_head){ cout<<"\nEnter the name of process:";cin>>n;if(!(run=Get_run(n))) continue;cout<<"Enter the resquest for the process:";cin>>x;if(x>run->requirement-run->occupy){cout<<"beyond the real need!Enter again\n";continue;}if(x<=rest_resource){ rest_resource-=x;run->occupy+=x;cout<<x<<" resources are accepted for "<<run->name<<'\n';if(run->requirement-run->occupy==0){ rest_resource+=run->occupy;cout<<run->name<<" has completed!\n";Delete(run);if(wait_head){ p1=p2=wait_head;while(p2&&p2->requirement-p2->occupy>rest_resource) p1=p2,p2=p2->next;if(p2) {Sort_processes1(p1,p2);continue;}elselp:{if(head) continue;else {cout<<'\n'<<"System locked!\n";break;}}}elseelse continue;}}else continue;}else{ cout<<run->name<<" is waiting\n";Sort_processes2(run);goto lp;}}}void Banker::banker(){ cout<<"\nNow start random alogrithm...\n";char n[20];int x;PCB *p1,*p2;while(head||wait_head){ cout<<"\nEnter the name of process:";cin>>n;if(!(run=Get_run(n))) continue;cout<<"Enter the resquest for the process:";cin>>x;if(x>run->requirement-run->occupy){cout<<"beyond the real need!Enter again\n";continue;}if(x<=rest_resource){ rest_resource-=x;run->occupy+=x;if(isSafeState()){ cout<<x<<" resources are accepted for "<<run->name<<'\n';if(run->requirement-run->occupy==0){ rest_resource+=run->occupy;cout<<run->name<<" has completed!\n";Delete(run);if(wait_head){ p1=p2=wait_head;while(p2&&p2->requirement-p2->occupy>rest_resource) p1=p2,p2=p2->next;if(p2) {Sort_processes1(p1,p2);continue;}else continue;}elseelse continue;}}else continue;}else{ rest_resource+=x;run->occupy-=x;cout<<run->name<<" is waiting\n";Sort_processes2(run);continue;}}else{ cout<<run->name<<" is waiting\n";Sort_processes2(run);continue;}}}void yhjsf(){cout<<"**************************欢迎使用银行家算法****************************\n";cout<<"System's max_resource are 10\n";int m;cout<<"Enter the number of processes:";cin>>m;while(m>10) {cout<<"\nThe number of processes is beyond the system,Enter again!\n";cin>>m;}Banker B(m);B.inputprocesses();char t;while(1){ cout<<"\nPlease select a algorithm:\nRandom(R) or Bnaker(B)\n";cin>>t;if(t=='r'||t=='R') {B.rand();break;}if(t=='b'||t=='B') {B.banker();break;}else cout<<"\nEntering is wrong!Enter again\n";}}//*************************移臂调度算法**********************void BubbleSort(int *a,int size){int t;for(int z=1;z<size;z++)for(int j=0;j<size-z;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}int SearchKez1(int *a,int size,int kez){int z=0;while(kez>a[z])z++;return z;}int SearchKez2(int *a,int size,int now,int z){ int x;for( z=0;z<size;z++)if(a[z]!=-1){if(abs(a[z]-now)<z){z=abs(a[z]-now);x=a[z];z=z;}}a[z]=-1;return x;}int ybdd(){cout<<"******************************欢迎使用移臂算法**********************************\n";char a;cout<<"1、采用先来先服务算法(FCFS)\n";cout<<"2、采用电梯算法(EA)\n";cout<<"3、采用最短查找时间优先算法(SSTF)\n";int m;cout<<"输入选择的调度算法:";cin>>m;do{int size,now;int *p;cout<<"\n请输入请求队列的个数:";cin>>size;p=new int[size];cout<<"\n请输入请求队列:";for(int z=0;z<size;z++)cin>>p[z];cout<<"\n请输入当前磁头位置:";cin>>now;cout<<"\n请输入磁头移动方向(向磁道号减小方向请按N,增加方向请按z):";cin>>a;while(a!='z'&&a!='z'&&a!='N'&&a!='n'){cout<<"\n输入有误,请重新输入:";cin>>a;}if(m==1){cout<<"\n采用先来先服务算法(FCFS)的响应序列是:\n";cout<<now;for( z=0;z<size;z++)cout<<"-->"<<p[z];cout<<'\n';}BubbleSort(p,size);int t=SearchKez1(p,size,now);if(m==2){cout<<"\n采用电梯算法(EA)的响应序列是:\n";cout<<now;if(a=='N'||a=='n'){for(z=t;z>=0;z--)cout<<"-->"<<p[z];for( z=t+1;z<size;z++)cout<<"-->"<<p[z];}if(a=='z'||a=='z'){for( z=t+1;z<size;z++)cout<<"-->"<<p[z];for( z=t;z>=0;z--)cout<<"-->"<<p[z];}cout<<'\n';}if(m==3){cout<<"\n采用最短查找时间优先算法(SSTF)的响应序列是:\n";cout<<now;z=p[size-1]-p[0];for( z=0;z<size;z++){now=SearchKez2(p,size,now,z);cout<<"-->"<<now;}cout<<'\n';}cout<<"是否继续使用?(z/N):";cin>>a;}while(a=='z'||a=='z');return 0;}//***************************************************************** ******int main(void){ cout<<"***********************欢迎使用算法导航**************************\n";cout<<"算法类型:\n";cout<<"一、处理机调度\n";cout<<"二、页面替换\n";cout<<"三、银行家算法\n";cout<<"四、移臂调度\n";int x;cout<<"选择你想执行的算法:";cin>>x;if(x==1){cout<<"一、处理机调度:\n";//*******************处理机调度********************cljdd();}if(x==2){cout<<"二、页面替换:\n";//*******************页面替换***********************ymth();}if(x==3){cout<<"三、银行家算法:\n";//*******************银行家算法*********************yhjsf();}if(x==4){cout<<"四、移臂调度:\n";//*******************移臂调度*********************** ybdd();}return 0;}。