操作系统实验实验3

合集下载

操作系统实验,实验3, 进程管理 (1)

操作系统实验,实验3, 进程管理 (1)

在图形界面上利用终端通过命令“su - ”切换到超级用户,编辑文件 “job”; 按组合键[Ctrl+Alt+F2]切换到第二个虚拟终端(超级用户); 输入命令“at –f job now+1 minute”,设置1分钟后执行at调度内容; 稍等后观察at调度的执行效果,再切换到第一个虚拟终端观察at调度 的执行效果;
切换到第一个虚拟终端观察at调度的执行效果(5分钟后系统将执行重 启调度任务)。
[操作要求2] 设置一个调度,要求1分钟后执行文件job中的作业。 文件job的内容为: find /home/jkx/ -name “*.c” > /home/jkx/fdresult wall user jkx, all code files have been searched out! Please check out. [操作步骤]
续表
守 护 进 程 innd Usenet新闻服务器 功 能 说 明
linuxconf
lpd named netfs network
允许使用本地WEB服务器作为用户接口来配置机器
打印服务器 DNS服务器 安装NFS、Samba和NetWare网络文件系统 激活已配置网络接口的脚本程序
nfsd
portmap postgresql routed sendmail
事件(例如xinetd和lpd)
启动守护进程有如下几种方法
在引导系统时启动 人工手动从shell提示符启动
系统启动script的执行期间 被启动(/etc/rc.d) 任何具有相应执行 权限的用户
使用crond守护进程启动
执行at命令启动
守护进程一般由系统在开机时通过脚本或root

操作系统实验3-进程控制

操作系统实验3-进程控制
DWORD dwVerReq=::GetProcessVersion(dwIdThis);
WORD wMajorReq=(WORD)(dwVerReq>16);
WORD wMinorReq=(WORD)(dwVerReq&0xffff);
::cout<<"Process ID:"<<dwIdThis<<",requires OS:"<<wMajorReq<<wMinorReq<<::endl;
{
//改变优先级
::SetPriorityClass(
::GetCurrentProcess(), //利用这一进程
HIGH_PRIORITY_CLASS); //改变为high
//报告给用户
::cout<<"Task Manager should indicate this "
"process is high priority."<<::endl;
//设置版本信息的数据结构,以便保存操作系统的版本信息
OSVERSIONINFOEX osvix;
::ZeroMemory(&osvix,sizeof(osvix));
osvix.dwOSVersionInfoSize=sizeof(osvix);
//提取版本信息和报告
::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));
Parent();
}
return 0;
}
分析:程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

操作系统实验三 时间片轮转法完成进程调度

操作系统实验三 时间片轮转法完成进程调度

实验三:时间片轮转法完成进程调度一、实验目的:(1)加深对进程的理解(2)理解进程控制块的结构(3)理解进程运行的并发性(4)掌握时间片轮转法进程调度算法实验内容:(1)建立进程控制块(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。

(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)实验程序:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{char name[10];/*进程标识符*/int prio;/*进程优先数*/int round;/*进程时间轮转时间片*/int cputime; /*进程占用CPU时间*/int needtime; /*进程到完成还要的时间*/int count;/*计数器*/char state; /*进程的状态*/struct node *next; /*链指针*/}PCB;PCB *finish,*ready,*tail,*run; //队列指针int N,t; //进程数,时间片的大小void firstin(){run=ready;//就绪队列头指针赋值给运行头指针run->state='R'; //进程状态变为运行态ready=ready->next; //就绪队列头指针后移到下一进程}void prt1(char a)//输出标题函数{if(toupper(a)=='P')//优先级法printf("进程名占用CPU时间到完成还要的时间轮转时间片状态\n");} void prt2(char a,PCB *q)//进程PCB输出{if(toupper(a)=='P')//优先级法的输出printf("%4s %8d %12d %14d %8c\n",q->name,q->cputime,q->needtime,q->roun d,q->state);}void prt(char algo)//输出函数二、三、{PCB *p;prt1(algo);//输出标题if(run!=NULL)//如果运行指针不空prt2(algo,run);//输出当前正在运行的PCBp=ready;//输出就绪队列PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}p=finish;//输出完成队列的PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}getchar(); //按住任意键继续}void insert(PCB *q)//时间片轮转的插入算法{PCB *p1,*s,*r;s=q;//待插入的PCB指针p1=ready;//就绪队列头指针r=p1;//*r做pl的前驱指针while(p1!=NULL)if(p1->round<=s->round){r=p1;p1=p1->next;}if(r!=p1){r->next=s;s->next=p1;}else{s->next=p1;//否则插入在就绪队列的头ready=s;}}void create(char alg)//时间片轮转法创建链表进程PCB{PCB *p;int i,time;char na[10];ready=NULL;finish=NULL;run=NULL;printf("输入进程名及其需要运行的时间(中间以空格隔开):\n"); for(i=1;i<=N;i++){p=new PCB;scanf("%s %d",&na,&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='W';//进程的状态p->round=0;if(ready!=NULL)insert(p);else{p->next=ready;ready=p;}}printf("*************时间片轮转法进程调度过程*************\n"); prt(alg);run=ready;ready=ready->next;run->state='R';}void timeslicecycle(char alg)//时间片轮转法{while(run!=NULL){run->cputime=run->cputime+t;//处理时间加trun->needtime=run->needtime-t;//完成需要时间减trun->round=run->round+t;//运行完将其变为完成态,插入完成队列if(run->needtime<=0)//当进程完成时{run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)//就绪队列不空,将第一个进程投入进行firstin();}else{run->state='W';//将进程插入到就绪队列中等待轮转insert(run);//将就绪队列的第一个进程投入运行firstin();}prt(alg);}}void main()//主函数{char algo='P';//算法标记printf("输入进程的个数:");scanf("%d",&N);//输入进程数printf("定义时间片大小:");scanf("%d",&t);//输入时间片大小create(algo);//创建进程timeslicecycle(algo);//时间片轮转法调度}//main()四、实验结果:五、实验小结:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。

操作系统实验3进程同步报告

操作系统实验3进程同步报告

实验三进程同步一、实验目的:1.了解进程和线程的同步方法,学会运用进程和线程同步方法来解决实际问题;2.了解windows系统下Win32 API或Pthread信号量机制的使用方法;二、实验预备内容:1.对书上所说基于信号量的有限缓冲的生产者-消费者问题;2.对于信号量的概念有大概的了解,知道如何用信号量的wiat()和signal()函数如何取消应用程序进入临界区的忙等;三、实验环境说明:此实验在Win7(32位) CodeBlocks环境下实现,采用WinAPI的信号量机制。

四、实验内容:设计一个程序解决有限缓冲问题,其中的生产者与消费者进程如下图所示。

在Bounded-Buffer Problem(6.6.1节)中使用了三个信号量:empty (记录有多少空位)、full(记录有多少满位)以及mutex(二进制信号量或互斥信号量,以保护对缓冲区插入与删除的操作)。

对于本项目,empty和full将采用标准计数信号量,而mutex将采用二进制信号量。

生产者与消费者作为独立线程,在empty、full、mutex的同步前提下,对缓冲区进行插入与删除。

本项目可采用Pthread或Win32 API。

(本实验采用Win32 API)五、程序设计说明:1.全局变量:定义缓冲区数组及其环形队列表达方式,定义mutex、empty、full 三个信号量。

empty记录缓冲区有多少个空位;full记录缓冲区有多少个满位;mutex作为互斥信号量,保护对缓冲区插入或删除的操作。

具体定义如下:定义生产者、消费者线程结构和包含的信息:(由于题目中没有要求,因此只定义了编号一个变量)2.缓冲区:缓冲区是一个元数据类型为buffer_item(可通过typedef定义)的固定大小的数组,按环形队列处理。

buffer_item的定义及缓冲区大小可保存在头文件中:A.insert_item():先判断缓冲区是否已满,不满则向缓冲区中插入元素;B.remove_item()先判断缓冲区是否为空,不空则从缓冲区中删除元素;3.生产者线程:生产者线程交替执行如下两个阶段:睡眠一段随机事件,向缓冲中插入一个随机数。

操作系统教学实践(3篇)

操作系统教学实践(3篇)

第1篇一、引言操作系统是计算机科学与技术领域的重要基础课程,它涉及计算机系统的资源管理、进程管理、存储管理、文件系统等多个方面。

为了提高学生对操作系统的理解和掌握程度,本文将从教学实践的角度,探讨如何进行操作系统教学。

二、教学目标1. 使学生掌握操作系统的基本概念、原理和关键技术;2. 培养学生分析和解决实际问题的能力;3. 增强学生的团队协作和创新能力;4. 提高学生的编程能力和动手能力。

三、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、分类和特点;2. 进程管理:讲解进程的概念、进程状态、进程调度算法和进程同步与互斥;3. 存储管理:分析内存分配策略、页面置换算法和虚拟内存技术;4. 文件系统:探讨文件系统的概念、目录结构、文件操作和存储设备管理;5. 设备管理:介绍设备的分类、驱动程序、I/O控制方式和中断处理;6. 网络操作系统:讲解网络操作系统的基本概念、网络协议、网络设备管理和网络安全。

四、教学实践1. 案例教学:通过实际案例,引导学生分析操作系统的原理和应用。

例如,以Linux系统为例,讲解进程调度、内存管理和文件系统等知识点。

2. 实验教学:设计实验项目,让学生动手实践操作系统的相关知识。

实验项目包括:(1)进程调度实验:让学生编写进程调度算法,实现进程的创建、调度和同步。

(2)内存管理实验:让学生实现内存分配、页面置换和虚拟内存等技术。

(3)文件系统实验:让学生实现文件系统的目录结构、文件操作和存储设备管理。

(4)设备管理实验:让学生编写设备驱动程序,实现设备的控制和管理。

3. 项目教学:以实际项目为背景,让学生分组完成项目开发。

项目可以包括:(1)操作系统模拟器:让学生模拟操作系统的运行过程,加深对操作系统原理的理解。

(2)嵌入式操作系统开发:让学生了解嵌入式操作系统的特点,掌握嵌入式开发技能。

(3)分布式操作系统开发:让学生了解分布式系统的原理,掌握分布式操作系统的开发方法。

实验三 Linux操作系统安全实验 (一)

实验三 Linux操作系统安全实验 (一)

实验三Linux操作系统安全一、实验目的及要求(一)实验目的通过实验熟悉Linux环境下的用户管理、进程管理以及文件管理的相关操作命令。

掌握linux操作系统中相关的系统安全配置方法,建立linux操作系统的基本安全框架。

(二)实验要求根据实验中介绍的Linux操作系统的各项安全性实验要求,详细观察记录设置前后系统的变化,给出分析报告。

使用RPM对系统的软件进行管理,验证系统内软件的完整性,并分析结果。

试比较Linux下网了服务安全设置与Windows下安全设置异同。

二、实验环境安装Red hat9.0操作系统的计算机一台三、实验内容1、账户和口令安全2、文件系统管理安全3、查看和更改PAM模块设置4、RPM软件管理5、系统安全配置四、实验步骤任务一账户和口令安全1、查看和添加账户(1)在X_Windows窗口中单击鼠标右键,选择“信件中断”,输入下面的命令行:[root@localhost root]#useradd mylist利用useradd命令新建名为mylist的新账户。

(2)输入命令行:[root@localhost root]#cat/etc/shadow利用cat查看系统中的账户列表。

用su命令切换到新建的账户,重复步骤(2),检查shadow文件的权限设置是否安全。

设置安全时,普通用户mylist应该没有查看该系统文件的权限。

在终端中出现如下的提示:Cat:/etc/shadow:权限不够2、添加和更改密码(1)在终端输入[root@localhost root]#passwd mylist为新建账户添加密码。

注意:系统管理员无需输入原来密码即可以利用passwd命令添加或改变任意用户的密码,但普通用户只能改变自己的密码。

(2)输入后依次出现如下提示:Changjing passwd for user mylist.New passwd:Retype new passwd:Passwd:all authentication tokens updated susscessfully.输入密码,Linux系统不会将输入显示出来。

《操作系统》实验报告三 页式虚拟存储管理中地址转换和缺页中断

《操作系统》实验报告三 页式虚拟存储管理中地址转换和缺页中断

实验项

名称
页式虚拟存储管理中地址转换和缺页中断
实验目的及要求1、深入了解页式存储管理如何实现地址转换。

2、进一步认识页式虚拟存储管理中如何处理缺页中断。

实验内容
编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。

实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。

假定内存64KB,每个内存块1024字节;作业最大支持到64KB,系统中每个作业分得内存块4块。

实验步骤
注:可根据实际情况加页。

实验3 操作系统的程序口

实验3 操作系统的程序口

实验3 操作系统的程序口一、实验目的操作系统管理着计算机系统的所有软件资源和硬件资源。

为了让终端用户方便地使用计算机,一般操作系统都提供了人机界面,让计算机前的人能通过命令接口和图形接口来获取操作系统提供的服务。

另外,为了方便用户通过程序来使用计算机资源、获取操作系统提供的各种服务,操作系统还往往给用户提供了另外一个接口——程序接口,也叫系统调用。

系统调用可以看作是用户程序在程序一级请求操作系统为之服务的一种手段。

在操作系统的管理下,运行中的用户程序通过“程序口”或“系统调用”,使得当前处理机的状态发生改变(从用户态“自陷(陷入)”转变为系统态),从而执行操作系统提供的服务。

一旦系统调用完毕,处理机的状态就又会从系统态返回到用户态。

Linux操作系统的程序口就是它所说的“系统调用”,Windows操作系统则提供了一些API(Application Programming Interface)函数,用户通过这些函数,来引发操作系统的系统调用。

Visual Basic 6.0、Visual C++ 6.0是微软开发的两个十分流行的开发工具,本次实验将在这两个环境下进行。

通过该实验,意在让学生了解操作系统留给用户的程序接口,并在开发环境中体会一下程序口的使用方法。

二、实验内容和要求1.Windows API包括哪些方面的内容?Windows API 就是windows应用程序接口,是针对microsoft windows操作系统家族的系统编程接口,这样的系统包括Windows 7,Windows Vista、Windows XP、Windows Server 2003、Windows 2000、Windows 95、Windows 98、Windows Me(Millennium Editon)和Windows CE等几乎所有版本。

Windows API包括几千个可调用的函数,它们大致可以分为:基本服务、组件服务、用户界面服务、图形多媒体服务、消息和协作、网络、Web服务2.什么是动态链接库?动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。

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

大学学生实验报告一、实验目的通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。

二、实验容实验1:设计一个虚拟存储区和存工作区,并使用下述算法计算访问命中率。

1、最佳淘汰算法(OPT)2、先进先出的算法(FIFO)3、最近最久未使用算法(LRU)4、最不经常使用算法(LFU)5、最近未使用算法(NUR)命中率=1-页面失效次数/页地址流长度实验2:在Linux环境下利用下列系统调用malloc(), free()编写一段程序实现存分配与回收的管理。

要求:1、返回已分配给变量的存地址;2、返回释放后的存地址;3、释放已分配的存空间后,返回释放存后未使用存的大小。

三、实验原理UNIX中,为了提高存利用率,提供了外存进程对换机制;存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入存便可运行;还支持请求调页的存储管理方式。

当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入存。

这种页面调入方式叫请求调页。

为实现请求调页,核心配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。

当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。

该程序通过查找页表,得到该页所在外存的物理块号。

如果此时存未满,能容纳新页,则启动磁盘I/O将所缺之页调入存,然后修改页表。

如果存已满,则须按某种置换算法从存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。

利用修改后的页表,去形成所要访问数据的物理地址,再去访问存数据。

整个页面的调入过程对用户是透明的。

四、实验设备安装了Linux系统的电脑五、实验程序实验1:#include<stdio.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 50typedef 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];int initialize(int);int FIFO(int);int LRU(int);int LFU(int);int NUR(int);int OPT(int);int main( ){int s,i,j;srand(10*getpid());s=(float)319*rand( )/32767/32767/2+1;for(i=0;i<total_instruction;i+=4){if(s<0||s>319){printf("When i==%d,Error,s==%d\n",i,s);exit(0);}a[i]=s;a[i+1]=a[i]+1;a[i+2]=(float)a[i]*rand( )/32767/32767/2;a[i+3]=a[i+2]+1;s=(float)(318-a[i+2])*rand( )/32767/32767/2+a[i+2]+2;if((a[i+2]>318)||(s>319))printf("a[%d+2],a number which is :%d and s==%d\n",i,a[i+2],s); }for (i=0;i<total_instruction;i++){page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++){printf("---%2d page frames---\n",i);FIFO(i);LRU(i);LFU(i);NUR(i);OPT(i);}return 0;}int 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;}for(i=0;i<total_pf-1;i++){pfc[i].next=&pfc[i+1];pfc[i].pfn=i;}pfc[total_pf-1].next=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0];return 0;}int FIFO(total_pf)int total_pf;{int i,j;pfc_type *p;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;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.4f\n",1-(float)diseffect/320); return 0;}int LRU (total_pf)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\n",1-(float)diseffect/320); return 0;}int NUR(total_pf)int total_pf;{int i,j,dp,cont_flag,old_dp;pfc_type *t;initialize(total_pf);dp=0;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\n",1-(float)diseffect/320); return 0;}int OPT(total_pf)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[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\n",1-(float)diseffect/320); return 0;}int LFU(total_pf)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;pl[page[i]].counter++;freepf_head=freepf_head->next;}elsepl[page[i]].counter++;}printf("LFU:%6.4f\n",1-(float)diseffect/320); return 0;}实验2#include<iostream>using namespace std;#include<stdlib.h>#include<stdio.h>#include<malloc.h>//#include<iostream>int main(){int *string;string=(int*) malloc(10);if(string==NULL)printf("Insufficient memory available\n");else{printf("Memory space allocated for path name\n"); cout<<"string="<<string<<endl;free(string);printf("Memory freed\n");}int *stringy;stringy=(int*)malloc(12);if(stringy==NULL)printf("Insufficient memory available\n");else{printf("Memory space allocated for path name\n");cout<<"stringy="<<stringy<<endl;free(stringy);printf("Memory freed\n");}}六、实验结果试验1:从几种算法的命中率看,OPT最高,其次为NUR相对较高,而FIFO与LRU相差无几,最低的是LFU。

相关文档
最新文档