操作系统实验_实验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调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

操作系统实验实验报告

操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。

本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。

二、实验环境本次实验使用的操作系统为 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 等进行文件的创建、读取和写入操作。

哈工大《操作系统》实验3

哈工大《操作系统》实验3

向kernel/printk.c中添加日志打印功能,将以下代码添加到原文件中:
在kernel/fork.c、kernel/sched.c和kernel/exit.c中,找到正确的状态转换点,并添加合适的状态信息,把它输出到log文件之中。

fork.c的修改如下:
exit.c的修改如下:
sched.c的修改如下:
在虚拟机上运行ls -l /var”或“ll /var”查看process.log是否建立,及它的属性和长度;
修改时间片
include/linux/sched.h宏INIT_TASK中定义的:
0,15,15, 分别对应state、counter和priority,将priority值修改,即可实现对时间片大小的调整。

0,15,15, 分别对应state、counter和priority,
priority值修改,即可实现对时间片大小的调整。

在修改时间片将priority由15改为150后,Process 9~20 中Turnaround, Waiting, CPU Burst, I/O Burst变化不大,原因可能是程序中I/O操作占用的时间对于总时间影响的权重过大,导致处理时间体现的并不明显。

或者变化不大的原因是,子进程连续占用cpu的时间要比时间片大很多。

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

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

实验三:时间片轮转法完成进程调度一、实验目的:(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

专业:班级:
姓名:学号:实验日期:年月日
实验名称:操作系统实验3 进程同步(5分)
实验目的:以一个教学型操作系统EOS为例,深入理解进程(线程)同步的原理、意义及信号量的含义和实现方法;能对核心源代码进行分析和修改,能运用信号量实现同步问题;训练分析问题、解决问题以及自主学习能力,逐步达到能独立对小型操作系统的功能进行分析、设计和实现。

实验环境:EOS操作系统及其实验环境。

实验内容:
使用EOS的信号量,实现生产者-消费者问题;跟踪EOS信号量的工作过程,分析EOS 信号量实现的源代码,理解并阐述其实现方法;修改EOS信号量的实现代码,使之支持等待超时唤醒和批量释放功能。

实验步骤:
1)使用EOS的信号量实现生产者-消费者问题
(给出使用EOS的信号量解决生产者-消费者问题的实现方法,包括实现方法的简要描述、源代码、测试及结果等)
2)EOS信号量工作过程的跟踪与源代码分析
(分析EOS信号量实现的核心源代码,阐述其实现方法,包括数据结构和算法等;简要说明在本部分实验过程中完成的主要工作,包括对EOS信号量工作过程的跟踪等)
3)支持等待超时唤醒和批量释放功能的信号量实现
(给出实现方法的简要描述、源代码、测试及结果等)
结果分析:
(对本实验所做工作及结果进行分析,包括EOS信号量实现方法的特点、不足及改进意见;结合EOS对信号量实现的相关问题提出自己的思考;分析支持等待超时唤醒和批量释放功能的信号量实现方法的有效性、不足和改进意见,如果同时采用了多种实现方法,则进行对比分析;其他需要说明的问题)。

实验三 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系统不会将输入显示出来。

清华大学操作系统lab3实验报告范文

清华大学操作系统lab3实验报告范文

清华大学操作系统lab3实验报告范文实验3:虚拟内存管理练习1:给未被映射的地址映射上物理页ptep=get_pet(mm->dir,addr,1);if(ptep==NULL){//页表项不存在cprintf("get_pteindo_pgfaultfailed\n"); gotofailed;}if(某ptep==0){//物理页不在内存之中//判断是否可以分配新页if(pgdir_alloc_page(mm->pgdir,addr,perm)==NULL){ cprintf("pgdir_alloc_pageindo_pgfaultfailed\n"); gotofailed;}}ele{if(wap_init_ok){tructPage某page=NULL;ret=wap_in(mm,addr,&page);if(ret!=0){//判断页面可否换入cprintf("wap_inindo_pgfaultfailed\n");gotofailed;}//建立映射page_inert(mm->pgdir,page,addr,perm);wap_map_wappable(mm,addr,page,1);}ele{cprintf("nowap_init_okbutptepi%某,failed\n",某ptep); gotofailed;}}ret=0;failed:returnret;}练习2:补充完成基于FIFO算法_fifo_map_wappable(tructmm_truct某mm,uintptr_taddr,tructPage某page,intwap_in){lit_entry_t某head=(lit_entry_t某)mm->m_priv;lit_entry_t某entry=&(page->pra_page_link);aert(entry!=NULL&&head!=NULL);lit_add(head,entry);return0;}pra_page_link用来构造按页的第一次访问时间进行排序的一个链表,这个链表的开始表示第一次访问时间最近的页,链表的尾部表示第一次访问时间最远的页。

实验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不是可执行文件。

电脑实践课实验报告(3篇)

电脑实践课实验报告(3篇)

第1篇实验名称:计算机基本操作与常用软件应用实验日期:2023年3月15日实验地点:计算机实验室实验目的:1. 掌握计算机的基本操作,包括开关机、文件管理、系统设置等。

2. 熟悉常用软件的使用,如文字处理软件、电子表格软件、演示文稿软件等。

3. 提高计算机应用能力,为后续课程学习打下基础。

实验内容:一、计算机基本操作1. 开关机操作(1)打开计算机,等待系统启动完成。

(2)使用鼠标点击屏幕左下角的“开始”按钮,选择“关机”选项。

(3)系统提示是否保存更改,根据实际情况选择保存或取消保存。

(4)点击“确定”按钮,等待计算机完全关闭。

2. 文件管理(1)打开文件资源管理器,了解文件结构。

(2)创建文件夹:点击“文件”菜单,选择“新建”->“文件夹”,输入文件夹名称,按“确定”按钮。

(3)重命名文件或文件夹:选中文件或文件夹,右击鼠标,选择“重命名”,输入新名称,按“Enter”键。

(4)删除文件或文件夹:选中文件或文件夹,右击鼠标,选择“删除”,在弹出的对话框中选择“是”。

3. 系统设置(1)打开“控制面板”,了解系统设置。

(2)调整屏幕分辨率:在“控制面板”中找到“显示”选项,调整分辨率。

(3)设置网络连接:在“控制面板”中找到“网络和共享中心”,设置网络连接。

二、常用软件应用1. 文字处理软件(Microsoft Word)(1)创建新文档:点击“开始”按钮,选择“所有程序”->“MicrosoftOffice”->“Microsoft Word”,打开Word软件。

(2)输入文字:在文档中输入文字,可以使用“格式”工具栏进行文字格式设置。

(3)保存文档:点击“文件”菜单,选择“保存”或“另存为”,设置保存路径和文件名,点击“保存”按钮。

2. 电子表格软件(Microsoft Excel)(1)创建新工作簿:点击“开始”按钮,选择“所有程序”->“Microsoft Office”->“Microsoft Excel”,打开Excel软件。

四川大学操作系统课程设计第三次实验报告生产者和消费者

四川大学操作系统课程设计第三次实验报告生产者和消费者

实验报告(学生打印后提交)实验名称: 生产者和消费者问题实验时间: 2023年 5 月 5日●实验人员:●实验目的:掌握基本的同步互斥算法, 理解生产者和消费者模型。

●了解Windows 2023/XP中多线程的并发执行机制, 线程间的同步和互斥。

●学习使用Windows 2023/XP中基本的同步对象, 掌握相应的API●实验环境: WindowsXP + VC++6.0●运用Windows SDK提供的系统接口(API, 应用程序接口)完毕程序的功能。

API是操作系统提供的用来进行应用程序设计的系统功能接口。

使用API, 需要包含对API函数进行说明的SDK头文献, 最常见的就是windows.h实验环节:1.读懂源程序.2.编辑修改源程.......................................实验陈述:1.基础知识:本实验用到几个API函数:CreateThread CreateMutex, WaitForSingleObject, ReleaseMutexCreateSemaphore, WaitForSingleObject, ReleaseSemaphore, ReleaseMutex, nitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection。

这些函数的作用:CreateThread, 功能:创建一个线程, 该线程在调用进程的地址空间中执行。

CreateMutex,功能:产生一个命名的或者匿名的互斥量对象。

WaitForSingleObject(相应p操作)锁上互斥锁, ReleaseMutex(相应v操作)打开互斥锁.。

CreateSemaphore, 创建一个命名的或者匿名的信号量对象。

信号量可以看作是在互斥量上的一个扩展。

WaitForSingleObject, 功能:使程序处在等待状态, 直到信号量(或互斥量)hHandle出现或者超过规定的等待最长时间, 信号量出现指信号量大于或等于1, 互斥量出现指打开互斥锁。

操作系统实验报告三

操作系统实验报告三

操作系统实验报告三一、实验目的本次操作系统实验的目的在于深入了解操作系统的进程管理、内存管理和文件系统等核心功能,通过实际操作和观察,增强对操作系统原理的理解和掌握,提高解决实际问题的能力。

二、实验环境本次实验在 Windows 10 操作系统环境下进行,使用了 Visual Studio 2019 作为编程工具,并借助了相关的操作系统模拟软件和调试工具。

三、实验内容与步骤(一)进程管理实验1、创建多个进程使用 C++语言编写程序,通过调用系统函数创建多个进程。

观察每个进程的运行状态和资源占用情况。

2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。

分析在不同并发情况下程序的执行结果,理解进程同步的重要性。

(二)内存管理实验1、内存分配与回收实现一个简单的内存分配算法,如首次适应算法、最佳适应算法或最坏适应算法。

模拟内存的分配和回收过程,观察内存的使用情况和碎片产生的情况。

2、虚拟内存管理了解 Windows 操作系统的虚拟内存机制,通过查看系统性能监视器观察虚拟内存的使用情况。

编写程序来模拟虚拟内存的页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等。

(三)文件系统实验1、文件操作使用 C++语言对文件进行创建、读写、删除等操作。

观察文件在磁盘上的存储方式和文件目录的结构。

2、文件系统性能测试对不同大小和类型的文件进行读写操作,测量文件系统的读写性能。

分析影响文件系统性能的因素,如磁盘碎片、缓存机制等。

四、实验结果与分析(一)进程管理实验结果1、创建多个进程在创建多个进程的实验中,通过任务管理器可以观察到每个进程都有独立的进程 ID、CPU 使用率、内存占用等信息。

多个进程可以并发执行,提高了系统的资源利用率。

2、进程同步与互斥在生产者消费者问题的实验中,当使用正确的信号量机制时,生产者和消费者能够协调工作,不会出现数据不一致或死锁的情况。

操作系统实验3--请求分页式存储管理

操作系统实验3--请求分页式存储管理

请求分页式存储管理一、问题描述设计一个请求页式存储管理方案,为简单起见。

页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。

而不再判断它是否被改写过,也不将它写回到辅存。

二、基本要求页面尺寸1K,输入进程大小(例如5300bytes),对页表进行初始化页表结构如下:系统为进程分配:任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。

每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满(查空闲块表,找到空闲块),则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况。

存储管理算法的流程图见下页。

三、实验要求完成实验内容并写出实验报告,报告应具有以下内容:1、实验目的。

2、实验内容。

3、程序及运行情况。

4、实验过程中出现的问题及解决方法。

#include<stdio.h>#include<stdlib.h>int PUB[20][3];int ABC[3][2]={{0,1},{1,1},{2,1}};//物理块int key=0;void output(int size){//打印int i,j;printf("页号\t\t物理块号\t\t状态位\n\n");for(i=0;i<size;i++){printf(" %d\t\t%d\t\t\t%d\n\n",PUB[i][0],PUB[i][1],PUB[i][2]);}printf("物理块号\t\t是否空闲\n\n");for(i=0;i<3;i++){printf(" %d\t\t\t%d\n\n",ABC[i][0],ABC[i][1]);}}void main(){int size;int i,j;int address=0;int select=0;printf("请输入进程大小\n");scanf("%d",&size);if(size<=0 || size>20000){printf("进程大小超出范围\n");exit(0);}size%1000==0 ? size=size/1000 : size=size/1000+1;for(i=0;i<size;i++){PUB[i][0]=i; //页号PUB[i][1]=0; //物理块号PUB[i][2]=0; //状态位}output(size);while(1){printf("输入指令地址\n");scanf("%d",&address);if(address<0 || address>20000){printf("地址超出范围\n");exit(0);}address%1000==0 ? address=address/1000 : address=address/1000;if(PUB[address][2]==0) //不在主存{if(ABC[2][1]==0) //满了{printf("满了\n");if(select!=address) key++;for(i=0;i<size;i++){if(PUB[i][1]==key){PUB[i][1]=0;PUB[i][2]=0;}}PUB[address][1]=key;PUB[address][2]=1;key++;if(key>3) key=1;}if(ABC[2][1]==1) //没满{printf("没满\n");for(i=0;i<3;i++){if(ABC[i][1]==1){ABC[i][1]=0;PUB[address][1]=i+1;PUB[address][2]=1;break;}}}output(size);}else{printf("该页已在内存\n");output(size);}select=address;}}。

操作系统实验报告

操作系统实验报告

技术资料常州大学操作系统课程实验报告姓名 xxx专业班级计算机科学与技术学号 xxxxxx指导老师 xxx成绩实验时间2012年4月23日——2012年5月7日实验一 Windows XP 系统管理一实验目的1) 了解和学习Windows系统管理工具及其使用;2) 熟悉Windows系统工具的内容和应用;3)熟悉Windows操作系统的应用环境。

二实验环境需要准备一台运行Windows XP操作系统的计算机。

三背景知识Windows XP的“管理工具”中集成了许多系统管理工具,利用这些工具,管理员可以方便地实现各种系统维护和管理功能。

这些工具都集中在“控制面板”的“管理工具”选项下,用户和管理员可以很容易地对它们操作和使用。

在默认情况下,只有一些常用工具——如服务、计算机管理、事件查看器、数据源 (ODBC) 、性能和组件服务等——随Windows XP 系统的安装而安装。

四实验内容与步骤为了帮助用户管理和监视系统,Windows XP提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。

步骤1:登录进入Windows XP。

步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。

在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:1) 本地安全策略:查看和修改本地安全策略,如用户权限和审核策略2) Internet信息服务:管理 IIS,Internet 和 Intranet 站点的 WEB服务器3) 服务:启动和停止服务4)计算机管理:管理磁盘以及使用其他系统工具来管理本地或远程的计算机5)事件查看器:显示来自于 Windows 和其他程序的监视与排错消息6)数据源ODBC:添加、删除、以及配置 ODBC 数据源和驱动程序7)性能:显示系统性能图表以及配置数据日志和警报8)组件服务:配置和管理 COM+ 应用程序1. 计算机管理使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows XP管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。

实验3 Windows操作系统

实验3 Windows操作系统
4.单击【浏览】按钮查找保存在“我的文挡”中的“TT.BMP”,并将其设置为墙纸。也可从“背景图片”列表框中选择墙纸,能够作为墙纸的文件的扩展名可以是.bmp、.gif、.jpg、.dib、.htm。
5.在“显示图片”下拉列表框中,可以选择“居中”、“平铺”、“拉伸”之一。“居中”是将图片显示在屏幕中央,“平铺”是将图片重复显示在整个屏幕,“拉伸”则是将图片展开充满整个屏幕。
练习3:打开“计算器”、“我的电脑”、“资源管理器”三个应用程序窗口,练习窗口的各种操作。
三、桌面与任务栏操作
1.桌面操作
添加对象、删除对象、排列图标、图标更名、启动程序或打开文件夹窗口,桌面背景的设置,屏幕保护程序的使用。
练习:(1)添加桌面对象
在桌面上创建一个以Word2003命名的空文件夹。
创建C :\Windows\Explorer.exe应用程序的快捷方式。
操作:右击桌面空白空间,弹出快捷菜单→选择其中的“新建”选项→在级联菜单中选择“快捷方式”选项,弹出“创建快捷方式”向导,在该向导的命令行键入“C :\Windows\Explorer.exe”→然后选择“下一步”按钮,弹出“选择程序的标题”对话框,如果认可对话框中给定的快捷方式名称,单击“完成”按钮,快捷方式图标便出现在桌面上。若不认可最后对话框中给定的快捷方式名称,也可另行改写。
打开级联菜单
打开快捷菜单
撤销菜单
2)选择菜单项操作
直接方式:鼠标直接单击该菜单项;或直接按该菜单项的字母键。
间接方式:用鼠标拖动到该项目(适用下拉菜单和级联菜单);或移动光标到此菜单项,再按Enter键。
练习:下面各种操作
(1)练习开始菜单、级联菜单的使用
打开开始菜单→打开“程序”级联菜单→从中选择“Microsoft Word”项目,弹出此应用程序窗口。

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

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

操作系统实验报告实验3_1一、实验目的本次实验的主要目的是深入理解操作系统中进程管理的相关概念和原理,通过实际操作和观察,掌握进程的创建、调度、同步与互斥等关键机制,提高对操作系统内核工作原理的认知和实践能力。

二、实验环境本次实验在装有 Windows 10 操作系统的计算机上进行,使用了Visual Studio 2019 作为开发工具,编程语言为 C++。

三、实验内容与步骤(一)进程创建1、编写一个简单的 C++程序,使用系统调用创建一个新的进程。

2、在父进程和子进程中分别输出不同的信息,以区分它们的执行逻辑。

```cppinclude <iostream>include <windowsh>int main(){DWORD pid;HANDLE hProcess = CreateProcess(NULL, "childexe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pid);if (hProcess!= NULL) {std::cout <<"Parent process: Created child process with PID "<< pid << std::endl;WaitForSingleObject(hProcess, INFINITE);CloseHandle(hProcess);} else {std::cerr <<"Failed to create child process" << std::endl;return 1;}return 0;}```(二)进程调度1、设计一个多进程并发执行的程序,通过设置不同的优先级,观察操作系统对进程的调度情况。

2、记录每个进程的执行时间和等待时间,分析调度算法的效果。

```cppinclude <iostream>include <windowsh>DWORD WINAPI ProcessFunction(LPVOID lpParam) {int priority =(int)lpParam;DWORD start = GetTickCount();std::cout <<"Process with priority "<< priority <<"started" << std::endl;for (int i = 0; i < 100000000; i++){//执行一些计算操作}DWORD end = GetTickCount();DWORD executionTime = end start;std::cout <<"Process with priority "<< priority <<" ended Execution time: "<< executionTime <<" ms" << std::endl;return 0;}int main(){HANDLE hThread1, hThread2;int priority1 = 1, priority2 = 2;hThread1 = CreateThread(NULL, 0, ProcessFunction, &priority1, 0, NULL);hThread2 = CreateThread(NULL, 0, ProcessFunction, &priority2, 0, NULL);if (hThread1!= NULL && hThread2!= NULL) {SetThreadPriority(hThread1, THREAD_PRIORITY_LOWEST);SetThreadPriority(hThread2, THREAD_PRIORITY_NORMAL);WaitForSingleObject(hThread1, INFINITE);WaitForSingleObject(hThread2, INFINITE);CloseHandle(hThread1);CloseHandle(hThread2);} else {std::cerr <<"Failed to create threads" << std::endl;return 1;}return 0;}```(三)进程同步与互斥1、实现一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。

北理操作系统实验三

北理操作系统实验三

操作系统课程设计实验报告实验名称:生产者消费者问题姓名/学号:一.实验目的1.学习掌握操作系统中进程之间的通信2.理解掌握使用信号量机制来多进程互斥访问共享内存区的控制3.学习进程的创建及控制,共享内存区的创建和删除,信号量的创建使用删除二.实验内容•一个大小为3的缓冲区,初始为空,每个缓冲区能存放一个长度若为10个字符的字符串。

•2个生产者–随机等待一段时间,往缓冲区添加数据,–若缓冲区已满,等待消费者取走数据后再添加–重复6次•3个消费者–随机等待一段时间,从缓冲区读取数据–若缓冲区为空,等待生产者添加数据后再读取–重复4次说明:•显示每次添加和读取数据的时间及缓冲区的状态•生产者和消费者用进程模拟,缓冲区用共享内存来实现三.实验环境VMware Fushion8:Windows和ubuntu14.10四.程序设计与实现1、Windows下:A:主要函数说明1.PROCESS_INFORMATION StartClone(int nCloneID)功能:创建一个克隆的进程并赋于其ID值,并返回进程和线程信息2.CreateProcess:创建进程3.CreateSemaphore():创建信号量4.CreateFileMapping():在当前运行的进程中创建文件映射对象,模拟共享内存区5.MapViewOfFile():在此文件映射基础上创建视图映射到当前应用程序的地址空间B:程序流程图(下图)C:实验结果:2、Linux下:A:主要函数说明1.void(p):申请缓冲区2.void(v):释放缓冲区3.shmget():用来获得共享内存区域的ID,如果不存在这个内存区,就创建这个共享内存区。

4.semget():返回信号量集的Id,如果不存在就创建这个信号量集B:程序流程图C:实验结果五. 实验收获与体会1、进一步熟悉了Windows 、Linux 中进程的创建与管理2、掌握了WINDOWS 和Linux 下进程之间的通信:Windows 主要在于句柄的获取并用于API 函数的调用,并利用文件映射创建共享缓冲区;Linux 主要使用信号量机制和相关API的调用。

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

大学学生实验报告开课学院及实验室:计算机科学与工程实验室 2015年 12月 1日(***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***)一、实验目的通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。

二、实验容实验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 INV ALID -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=INV ALID;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==INV ALID){diseffect+=1;if(freepf_head==NULL){p=busypf_head->next;pl[busypf_head->pn].pfn=INV ALID;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==INV ALID){diseffect++;if(freepf_head==NULL){min=32767;for(j=0;j<total_vp;j++)if(min>pl[j].time&&pl[j].pfn!=INV ALID) {min=pl[j].time;minj=j;}freepf_head=&pfc[pl[minj].pfn];pl[minj].pfn=INV ALID;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==INV ALID){diseffect++;if(freepf_head==NULL){cont_flag=TRUE;old_dp=dp;while(cont_flag)if(pl[dp].counter==0&&pl[dp].pfn!=INV ALID) 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=INV ALID;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==INV ALID){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!=INV ALID)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=INV ALID;}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==INV ALID){diseffect++;if(freepf_head==NULL){min=32767;for(j=0;j<total_vp;j++){if(min>pl[j].counter&&pl[j].pfn!=INV ALID) {min=pl[j].counter;minpage=j;}pl[j].counter=0;}freepf_head=&pfc[pl[minpage].pfn];pl[minpage].pfn=INV ALID;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。

相关文档
最新文档