南京邮电大学操作系统实验报告

合集下载

南邮操作系统实验三

南邮操作系统实验三

南邮操作系统实验三实验报告( 2014/ 2015 学年第一学期)课程名称操作系统教程实验名称页面调度算法的模拟实现实验时间2014 年12 月 3 日指导单位计算机软件学院指导教师徐鹤学生姓名楚灵翔班级学号B12040731 学院(系) 计算机学院专业软件工程实验报告实验名称页面调度算法的模拟实现指导教师徐鹤实验类型上机实验学时 2 实验时间2014.12.3一、实验目的和要求1、模拟实现页面调度算法中的FIFO、LRU和OPT算法2、进程的页面请求序列,即一系列页面号(页面号用整数表示,用空格作为分隔符),用来模拟待换入的页面;3、输出要求:显示缺页的总次数和缺页中断率二、实验环境(实验设备)VMware Workstation,Ubuntu三、实验过程描述#define n 12#define m 3int page[n]; //保存需要访问的页面int i,j,q,mem[m]={0},List[m][n],sum;char flag,f[n];void Init();void FIFO();void LRU();void main(){cout<<"*********************实验***********************"<<endl;< bdsfid="127" p=""></endl;<> cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;< bdsfid="129" p=""></endl;<>cout<<" ┃页面调度算法的模拟实现┃"<<endl;< bdsfid="131" p=""></endl;<>cout<<" ┠───────────────────────┨"<<endl;< bdsfid="133" p=""></endl;<>cout<<" ┃先进先出算法FIFO ┃"<<endl;< bdsfid="135" p=""></endl;<>cout<<" ┃最近追少使用算法LRU ┃"<<endl;< bdsfid="137" p=""></endl;<>cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;< bdsfid="139" p=""></endl;<>cout<<" 请输入页面访问序列:\n"<<" ";for(i=0;i<n;i++)< bdsfid="142" p=""></n;i++)<>cin>>page[i];cout<<endl;< bdsfid="145" p=""></endl;<>FIFO();Init();LRU();}void Init() //初始化函数{sum=0; //初始化计算缺页次数的变量for(int i=0;i<m;i++)< bdsfid="153" p=""></m;i++)<>mem[i]=0;for(i=0;i<m;i++)< bdsfid="156" p=""></m;i++)<>for(j=0;j<n;j++)< bdsfid="158" p=""></n;j++)<>List[i][j]=0;}void FIFO(){for(i=0;i<="">{q=0;while((page[i]!=mem[q])&&(q!=m))q++;if(q==m)flag='*'; //缺页,则置标志flag为'*' elseflag=' ';if(flag=='*'){for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的mem[j]=mem[j-1];mem[0]=page[i];}for(j=0;j<m;j++)< bdsfid="178" p=""></m;j++)<>List[j][i]=mem[j];f[i]=flag;}cout<<" 0代表为空,*代表有缺页:\n";cout<<endl;< bdsfid="184" p=""></endl;<>cout<<"-----------FIFO算法结果------------"<<endl;< bdsfid="186" p=""></endl;<>for(i=0;i<m;i++)< bdsfid="188" p=""></m;i++)<>{for(j=0;j<n;j++)< bdsfid="191" p=""></n;j++)<>cout<<list[i][j]<<" ";<="" bdsfid="193" p=""></list[i][j]<<"> cout<<endl;}< bdsfid="195" p=""></endl;}<>for(i=0;i<n;i++)< bdsfid="197" p=""></n;i++)<>{if(f[i]=='*')sum++;cout<<f[i]<<" ";<="" bdsfid="202" p=""></f[i]<<">}cout<<"\n-----------------------------------"<<endl;<bdsfid="205" p=""></endl;<>cout<<"缺页次数是:"<<sum<<"缺页率是:"<<<endl;<="" bdsfid="207" p=""></sum<<"缺页率是:"<}void LRU(){for(i=0;i<="">{q=0;while((page[i]!=mem[q])&&(q!=m))q++;if(q==m)flag='*'; //缺页,则置标志flag为'*'elseflag=' ';for(j=q;j>0;j--)mem[j]=mem[j-1];mem[0]=page[i];for(j=0;j<m;j++)< bdsfid="225" p=""></m;j++)<>List[j][i]=mem[j];f[i]=flag;}cout<<endl;< bdsfid="229" p=""></endl;<>cout<<"------------LRU算法结果------------"<<endl;< bdsfid="231" p=""></endl;<>for(i=0;i<m;i++)< bdsfid="233" p=""></m;i++)<>{for(j=0;j<n;j++)< bdsfid="236" p=""></n;j++)<>cout<<list[i][j]<<" ";<="" bdsfid="238" p=""></list[i][j]<<"> cout<<endl;< bdsfid="240" p=""></endl;<>}for(i=0;i<n;i++)< bdsfid="243" p=""></n;i++)<>{if(f[i]=='*')sum++;cout<<f[i]<<" ";}<="" bdsfid="248" p=""></f[i]<<">cout<<endl;< bdsfid="250" p=""></endl;<>cout<<"-----------------------------------"<<endl;<bdsfid="252" p=""></endl;<>cout<<"缺页次数是:"<<sum<<"缺页率是:"<<<=""></sum<<"缺页率是:"<实验结果:四、实验小结(包括问题和解决方法、心得体会、意见与建议等)通过本次实验,我对于页面调度算法有了更加深刻的认识。

操作系统原理 实验报告

操作系统原理 实验报告

操作系统原理实验报告操作系统原理实验报告一、引言操作系统是计算机系统中的核心软件,它负责管理和协调计算机硬件资源,提供用户与计算机硬件之间的接口,使得用户可以方便地使用计算机。

在本次实验中,我们通过实际操作和观察,深入理解了操作系统的原理和工作机制。

二、实验目的本次实验的主要目的是通过模拟操作系统的运行过程,加深对操作系统原理的理解。

具体目标包括:1. 掌握操作系统的启动过程和内存管理机制;2. 理解进程调度算法的原理和实现;3. 学习文件系统的组织和管理方式;4. 了解操作系统与硬件之间的交互方式。

三、实验过程1. 启动过程在计算机启动时,操作系统首先加载到内存中,并开始执行。

我们通过模拟实验,深入了解了操作系统的启动过程。

我们观察到操作系统通过读取硬盘中的引导扇区来进行启动,并且在启动过程中会进行一系列的初始化操作,如初始化内存管理、进程管理和设备驱动等。

2. 内存管理内存管理是操作系统中的重要组成部分,它负责分配和回收内存资源,以及管理进程的内存空间。

在实验中,我们学习了内存分页和内存分段两种常见的内存管理方式,并通过实际操作和观察,对其原理和实现有了更深入的了解。

3. 进程调度进程调度是操作系统中的核心功能之一,它决定了哪些进程能够获得CPU的使用权。

在实验中,我们学习了常见的进程调度算法,如先来先服务、短作业优先和时间片轮转等。

通过模拟实验,我们观察到不同的调度算法对进程执行的影响,加深了对进程调度原理的理解。

4. 文件系统文件系统是操作系统中负责管理和组织文件的机制。

在实验中,我们学习了文件系统的组织方式,如目录结构和文件存储方式等。

通过实际操作和观察,我们了解了文件系统的工作原理和实现机制。

5. 硬件交互操作系统与硬件之间的交互是实现计算机功能的关键。

在实验中,我们学习了操作系统与硬件之间的通信方式,如中断和设备驱动等。

通过模拟实验,我们观察到操作系统是如何与硬件进行交互,并掌握了操作系统与硬件之间的配合工作。

操作系统实验实验报告

操作系统实验实验报告

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

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

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

操作系统实验报告6

操作系统实验报告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、编译并运行程序,通过任务管理器观察进程的运行状态和资源占用情况。

南邮操作系统实验4.文件系统模拟实现

南邮操作系统实验4.文件系统模拟实现


关闭文件close close (fd);
实验内容及原理说明——实验4

读文件read




写文件write

nr = read (fd, buf, count); buf 为读出信息所应送入的用户数据区首地址 count 为要求传送字节数 nr 为实际读入字节数 一旦读到文件末尾,系统调用就返回,故nr可能小于 count,甚至为0 nw = write (fd, buf, count); 参数类似 read 其中 buf 是信息传送的源地址,即将buf指向的用户数 据区中的信息写入文件中

具体功能:




#include <unistd.h> #include <stdio.h> #include <fcntl.h>
实验内容及原理说明——实验4

创建文件creat(兼具打开功能)

fd = creat (filenamep, mode);


filenamep指向所要创建的文件路径名
实验4:文件系统的模拟实现

实验基本信息 实验内容说明

实验基本信息

实验名称

文件系统的模拟实现

实验类型:综合 学时:2+2 实验时间:13.5.30(下午3-4节) 地点:教5-501 实验环境:

VMWare + Ubuntu
实验内容及原理说明——实验4

实验目link、open、close、 read、write的使用,编程模拟实现文件系统基本功能 运行终端给出命令提示,请用户选择创建、删除、读、 写、退出等操作(可用数字表示不同命令) 根据用户选择命令,提示用户输入文件名、文件内容 等信息 执行用户命令

南京邮电大学-操作系统实验报告

南京邮电大学-操作系统实验报告

课内实验报告课程名:操作系统任课教师:沈超专业:信息管理与信息系统学号:姓名:二○一六至二○一七年度第一学期南京邮电大学经济与管理学院Process[numberschedul].order=tempcounter;}程序结果截图:二、银行家算法(网上借鉴)银行家算法,当进程提出资源申请时,系统首先检查该进程对资源的申请量是否超过其最大需求量及系统现有的资源能否满足进程需要。

若超过,则报错,若不能满足,则让该进程等待;否则进一步检查把资源分给该进程后系统能否出于安全状态,若安全,则分配,否则置该进程为等待资源状态。

算法实现过程:设进程i 提出请求REQUEST [j] ,则银行家算法按如下规则进行判断。

(1) 如果REQUEST [i] [j]<= NEED[i][j] ,则转(2) ;否则,出错。

(2) 如果REQUEST [i] [j]<= A V AILABLE[i][j] ,则转(3) ;否则,出错。

(3) 系统试探分配资源,修改相关数据:A V AILABLE[j]-=REQUEST[i][j];ALLOCATION[i][j]+=REQUEST[i][j];NEED[i][j]-=REQUEST[i][j];(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

Check()关键代码:{int k, f, no=0;int work[M],a[M];char finish[M];anquan=1;for(i=0;i<n; i++) finish[i]='F';for(j=0;j<m; j++) work[j]=available[j]; k=n;do{ for (i=0;i<n; i++){if (finish[i]=='F'){ f=1;for (j=0;j<m; j++)if (need[i][j]>work[j]) printf("处于安全状态.");printf("安全序列号:");for (i=0;i<n;i++) printf ("%d ",a[i]); printf("\n");printf("进程");printf(" ");printf(" Max ");rintf(" ");rintf("allocation");printf(" ");printf("need");printf(" ");f=0;if (f==1)//找到还没完成的且需求数小于可提供进程继续运行的{ finish[i]='T';a[no++]=i;//记录安全序列号for (j=0;j<m; j++)work[j]=work[j]+allocation[i][j];//释放该进程已分配的资源available[j] =work[j];}}}k--; }while(k>0);f=1;for (i=0;i<n; i++)//判断有没有进程没完成{ if (finish[i]=='F'){f=0;break; }} if (f==0) {printf("不安全状态!\n");anquan=0;} else {printf("available");printf("\n");for (i=0;i<n; i++){ printf("%2d",i);printf(" ");for(j=0;j<m; j++)printf("%2d",max[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",allocation[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",need[i][j]);printf(" ");for(j=0;j<m; j++){if(i>0)break;printf("%2d",available[j]);}printf("\n");}}}程序结果截图:三、实验总结:这次上机模拟了进程调度过程和解决了死锁问题,让我对短作业优先调度算法和银行家算法有了比在课堂上更深刻的认识。

南邮操作系统实验报告

南邮操作系统实验报告

操作系统课程实验报告实验题目:Linux进程信号通信、进程消息通信专业软件工程学生姓名班级学号教师陈兴国指导单位计算机学院日期 2016-9-30一、实验目的1.了解Linux的信号,熟悉Linux系统中进程之间软中断通信的基本原理2.学习如何利用消息缓冲队列进行进程间的通信,并加深对消息通信机制的理解。

二、实验指导1.kill(),signal(),lockf()系统调用kill()系统调用系统调用格式:int kill(pid,sig)参数定义: int pid,sid;pid是一个或一组进程的标识符,sig是要发送的软中断信号。

pid>0时,核心将信号发送给进程pid;pid=0时,核心将信号发送给与发送进程同组的所有进程;pid<0时,核心将信号发送给搜有用户标识符真正等于发送进程的有效用户标识号的进程。

signal()系统调用预置对信号的处理方式,允许调用进程控制软中断信号。

系统调用格式:signal (sig,function)参数定义:Signal (sig,function)int sig;void (*func)();sig用于指定信号的类型,sig为0则没有收到任何信号。

function:在该进程中的一个函数地址,在核心态返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGNAL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。

lockf()系统调用用作锁定文件的某些段或者整个文件。

系统调用格式:lockf(files,function,size)参数定义:int lockf(files,function,size)int files,function;long size;2.消息的创建,发送和接收使用系统调用msgget(),msgsnd,msgrec,及msgctl()函数编写消息的发送和接收程序三、实验过程描述与结果分析1.Linux进程信号通信#include <stdio.h>#include <signal.h>#include<unistd.h>#include <stdlib.h>void waiting(),stop();int wait_mark;/*用来避免锁的竞争,保证p1,p2无法在同一时刻获得文件的锁,即lockf(stdout,1,0)*/main(){int p1,p2,stdout;signal(SIGINT,stop);/*if press the ^c or ^break ,jump to stop function*/ while((p1=fork())==-1) ;/* create child process p1*/if(p1>0){while( ( p2=fork() ) ==-1);/* create child process p2*/if(p2>0){wait_mark=1;sleep(5);/* 接收到^c信号,转stop函数*/waiting();kill(p1,16); /*向子进程p1发送软中断信号16*/kill(p2,17);/*向子进程p2发送软中断信号17*/wait(0);/*wait()系统方法,父进程会一直等待,直到子进程因暂停或者终止发来软中断信号为止*/wait(0);printf("Parent process is killed!\n");exit(0);}else{//p2被杀死的逻辑,响应kill(p1,17);wait_mark=1;signal(17,stop);/*接收到父进程发来的软中断信号,然后执行stop函数*、*/waiting();lockf(stdout,1,0);/*锁定输出,使得下面的语句可以正常输出打印*/printf("Child process 2 is killed by parent!\n");lockf(stdout,0,0);/*解锁输出*/exit(0);/*正常终止子进程p2,使得父进程跳出wait(0),得以继续执行*/ }}else{//p1被杀死的逻辑,响应kill(p2,16);wait_mark=1;signal(16,stop);waiting();lockf(stdout,1,0);printf("Child process 1 is killed by parent!\n");lockf(stdout,0,0);exit(0);}}void waiting(){while(wait_mark!=0);}void stop(){wait_mark=0;}按住Ctrl+c,可见执行结果2.Linux进程消息通信1.server.c#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdio.h>#define MSGKEY 75struct msgform{long mtype;char mtext[256];};int main(int argc, char const *argv[]) {struct msgform msg;int msgqid;int j,pid,*pint;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(;;){msgrcv(msgqid,&msg,256,1,0);pint=(int*)msg.mtext;pid=*pint;printf("server:receive from pid %d\n",pid);msg.mtype=pid;*pint=getpid();msgsnd(msgqid,&msg,sizeof(int),0);}return 0;}2.client.c#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdio.h>#define MSGKEY 75struct msgform{long mtype;char mtext[256];};int main(int argc, char const *argv[]){struct msgform msg;int msgqid,pid,*pint;msgqid=msgget(MSGKEY,0777);pid=getpid();pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;msgsnd(msgqid,&msg,sizeof(int),0);msgrcv(msgqid,&msg,256,pid,0);printf("client:receive from pid%d\n",*pint);return 0;}运行结果:四、自我评析与总结1.你认为你完成的实验那些地方做得比较好或比较出色做的相对比较快,一些命令比较熟悉一点2.差距与局限,什么地方做得不太好,或什么地方可以做得更好程序的编写,C语言遗忘的很严重,还是得常用3.从本实验得到的收获。

操作系统实验模板1

操作系统实验模板1
实验结果:
实验代码:
#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
const int MaxNumber=100;
int TrackOrder[MaxNumber];
int MoveDistance[MaxNumber];//移动距离
{
A=abs(TrackOrder[j]-temp);
n=j;
}
else continue;
}
Finished[n]=true;
MoveDistance[i]=A;
temp=TrackOrder[n];
A=M;
FindOrder[i]=TrackOrder[n];
}
}
//SCAN,扫描算法
void SCAN()
}
cout<<setw(20)<<"平均寻道长度:"<<AverageDistance<<endl;
cout<<endl;
}
int main()
{
int y=1;
int s;
Inith();
while(y)
{
cout<<"请选择寻道方式:1--FCFS; 2--SSTF; 3--SCAN;4--CSCSN: ";
}
cout<<"是否继续选择寻道算法?1--是;0--否: ";
int p;
cin>>p;
y=p;
}

南邮微机实验报告

南邮微机实验报告

南邮微机实验报告《南邮微机实验报告》南京邮电大学微机实验室是学生们进行计算机实验和学习的重要场所。

在这里,我们学习了计算机硬件和软件的基本知识,掌握了计算机系统的组成和工作原理,提高了我们的计算机应用能力。

下面是我们在南邮微机实验室进行的一次实验报告。

实验名称:操作系统安装与配置实验目的:通过实际操作,掌握计算机操作系统的安装和配置方法,提高我们的操作系统安装和配置能力。

实验内容:1. 准备工作:备份重要数据,准备操作系统安装光盘或U盘。

2. 操作系统安装:将安装光盘或U盘插入计算机,按照提示进行操作系统安装。

3. 操作系统配置:完成安装后,进行基本的系统配置,包括网络设置、用户账户设置、软件安装等。

实验步骤:1. 准备工作:备份个人重要数据,准备Windows 10安装U盘。

2. 操作系统安装:将U盘插入计算机,重启计算机,按照提示进行Windows10操作系统安装。

3. 操作系统配置:安装完成后,进行基本的系统配置,包括网络设置、用户账户设置、软件安装等。

实验结果:通过实际操作,我们成功地安装和配置了Windows 10操作系统,完成了基本的系统配置,包括网络设置、用户账户设置和软件安装等。

这次实验让我们对操作系统安装和配置有了更深入的理解,提高了我们的操作系统应用能力。

实验总结:通过这次实验,我们不仅掌握了操作系统安装和配置的基本方法,还提高了我们的实际操作能力。

我们将继续在南邮微机实验室进行更多的实验,不断提升我们的计算机应用能力,为将来的学习和工作做好充分的准备。

南邮微机实验室为我们提供了一个良好的学习环境,让我们能够通过实际操作来深入理解计算机知识。

我们将继续努力,不断提高自己的计算机应用能力,为将来的发展打下坚实的基础。

操作系统实验模板1资料

操作系统实验模板1资料
{
if(SortOrder[i]<BeginNum)
continue;
else
{
n=i;
breaue)
{
for(int i=n;i<N;i++)
{
MoveDistance[i-n]=abs(SortOrder[i]-temp);
temp=SortOrder[i];
{
int m,n,temp;
temp=BeginNum;
Sort();
cout<<"请选择开始方向:1--向外;0---向里: ";
cin>>m;
if(m==1)
direction=true;
else if(m==0)
direction=false;
elsecout<<"输入错误!";
for(int i=0;i<N;i++)
{
for(int i=n-1;i>=0;i--)
{
MoveDistance[N-i-4]=abs(SortOrder[i]-temp);
temp=SortOrder[i];
FindOrder[N-i-4]=SortOrder[i];
}
for(int j=n;j<N;j++)
{
MoveDistance[j]=abs(SortOrder[j]-temp);
int SortOrder[MaxNumber];//排序后的序列
bool Finished[MaxNumber];
void Inith()
{
cout<<"请输入提出磁盘I/O申请的进程数: ";

《操作系统》课程实验报告

《操作系统》课程实验报告

《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。

二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。

同时,实现进程的正常终止和异常终止,并分析其对系统的影响。

2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。

通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。

(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。

观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。

2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。

(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。

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

2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。

四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。

(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。

(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。

2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。

(2)创建多个进程,模拟对共享资源的并发访问。

(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。

(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。

《操作系统》实验二

《操作系统》实验二

《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。

通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。

二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。

b.设计一个简单的进程调度算法,如轮转法或优先级调度法。

c.实现进程间的通信机制,如共享内存或消息队列。

2、线程调度a.实现线程的创建、撤销和调度。

b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。

3、内存管理a.设计一个简单的分页内存管理系统。

b.实现内存的分配和回收。

c.实现一个简单的内存保护机制。

4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。

b.实现文件的存储和检索。

c.实现文件的备份和恢复。

三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。

b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。

可以使用模拟的方法,不需要真实的硬件环境。

c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。

2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。

b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。

同样可以使用模拟的方法。

3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。

b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。

可以使用模拟的方法。

4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。

b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。

操作系统实验报告

操作系统实验报告

操作系统实验报告引言:操作系统是计算机系统中的重要组成部分,它负责管理计算机的硬件资源,控制和协调软件运行。

在操作系统的设计和开发过程中,实验是锻炼学生理论与实践能力的重要方式。

本篇报告将介绍我们在操作系统实验中进行的研究和实践,以及所取得的成果和体会。

一、实验背景在操作系统实验课程中,我们的任务是设计和实现一个简单的操作系统。

通过这个实验,我们能够深入理解操作系统的内部机制,学习操作系统的设计原则和实现技术。

二、实验内容1. 系统引导(Boot)过程在操作系统启动过程中,首先需要进行系统引导。

我们设计了一个引导程序,该程序将在计算机开机时加载到内存中,并负责引导操作系统的加载和初始化。

这个过程需要对计算机硬件的特性有一定的了解,并通过编程来实现。

2. 进程管理操作系统的一个核心功能是管理进程。

我们实现了一个简单的进程管理系统,包括进程的创建、终止、调度等功能。

通过实现这些功能,我们加深了对操作系统进程管理的理解,也锻炼了编程和调试的能力。

3. 内存管理操作系统需要管理计算机的内存资源,以便为进程提供必要的内存空间。

我们设计了一个简单的内存管理系统,能够分配和回收内存空间,并实现了内存保护和虚拟内存等功能。

通过这个实验,我们了解了内存管理的基本原理和技术。

4. 文件系统文件系统是操作系统的另一个重要组成部分。

我们实现了一个简单的文件系统,能够对文件进行读写操作,并支持文件的创建、删除、重命名等功能。

这个实验使我们熟悉了文件系统的组织结构和操作接口。

三、实验成果通过实验,我们成功地设计并实现了一个简单的操作系统。

该系统具有基本的引导过程、进程管理、内存管理和文件系统功能。

我们对系统的稳定性和性能进行了测试,并得到了令人满意的结果。

在实验过程中,我们不仅学到了操作系统的知识,还培养了团队合作和解决问题的能力。

每位成员都充分发挥自己的优势,共同完成了这个实验项目。

四、实验体会通过这个操作系统实验,我们深入了解了操作系统的工作原理和设计方法。

操作系统实验报告

操作系统实验报告

操作系统实验报告一、实验目的本次操作系统实验的主要目的是深入了解操作系统的基本原理和功能,通过实际操作和观察,增强对进程管理、内存管理、文件系统等核心概念的理解和掌握。

同时,培养解决实际问题的能力,提高编程和调试技能,为今后学习和工作中更好地应用操作系统知识打下坚实的基础。

二、实验环境本次实验在_____操作系统环境下进行,使用的编程语言为_____,开发工具为_____。

三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。

同时,实现进程的正常终止和异常终止,了解进程终止时的资源回收机制。

2、进程调度算法模拟模拟实现先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等进程调度算法。

通过对不同调度算法的模拟,分析其性能特点,如平均周转时间、平均等待时间等。

(二)内存管理实验1、分区存储管理实现固定分区和动态分区存储管理方式,观察内存的分配和回收过程,分析不同分区策略下的内存利用率和碎片情况。

2、页面置换算法模拟模拟实现先进先出(FIFO)、最近最少使用(LRU)、最佳置换(OPT)等页面置换算法。

通过对不同页面置换算法的模拟,分析其对缺页率的影响。

(三)文件系统实验1、文件的创建、删除与读写通过编程实现文件的创建、删除操作,并对文件进行读写操作,观察文件系统的工作过程。

2、文件目录结构的实现实现简单的文件目录结构,如单级目录、两级目录和树形目录结构,了解文件目录的组织和管理方式。

四、实验步骤(一)进程管理实验1、进程创建与终止(1)使用系统提供的进程创建函数创建新进程,并在新进程中执行特定的任务。

(2)在父进程中等待子进程的结束,并获取子进程的返回状态。

(3)通过设置不同的条件,实现进程的正常终止和异常终止,并观察操作系统对终止进程的处理。

2、进程调度算法模拟(1)设计数据结构来表示进程的信息,如进程 ID、到达时间、服务时间等。

操作系统实验报告4

操作系统实验报告4

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

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。

三、实验内容与步骤(一)进程管理实验1、进程创建与终止使用 C++语言编写程序,创建多个进程,并在进程中执行不同的任务。

通过进程的标识符(PID)来监控进程的创建和终止过程。

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

观察生产者和消费者进程在不同情况下的执行顺序和结果。

(二)内存管理实验1、内存分配与释放编写程序,使用动态内存分配函数(如`malloc` 和`free`)来分配和释放内存。

观察内存的使用情况和内存泄漏的检测。

2、内存页面置换算法实现几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法和最佳置换(OPT)算法。

通过模拟不同的页面访问序列,比较不同算法的性能。

(三)文件系统实验1、文件创建与读写使用 C++语言的文件操作函数,创建一个新文件,并向文件中写入数据。

从文件中读取数据,并进行数据的处理和显示。

2、文件目录操作实现对文件目录的创建、删除、遍历等操作。

观察文件目录结构的变化和文件的组织方式。

四、实验结果与分析(一)进程管理实验结果与分析1、进程创建与终止在实验中,成功创建了多个进程,并通过控制台输出观察到了每个进程的 PID 和执行状态。

可以看到,进程的创建和终止是按照程序的逻辑顺序进行的,操作系统能够有效地管理进程的生命周期。

2、进程同步与互斥在生产者消费者问题的实验中,通过信号量的控制,生产者和消费者进程能够正确地实现同步与互斥。

当缓冲区为空时,消费者进程等待;当缓冲区已满时,生产者进程等待。

南邮通电实验报告(3篇)

南邮通电实验报告(3篇)

第1篇一、实验目的1. 了解南邮供电系统的基本结构和工作原理。

2. 掌握南邮供电系统的操作和维护方法。

3. 培养实验操作能力和团队合作精神。

二、实验器材1. 交流电源:220V、50Hz2. 电表:电压表、电流表3. 电线:绝缘电线、连接线4. 电容器:0.1μF、0.01μF5. 电感器:100mH、50mH6. 电阻:1Ω、10Ω、100Ω7. 灯泡:40W、60W8. 开关:单刀双掷开关、单刀单掷开关9. 实验板:南邮通电实验板三、实验原理南邮供电系统主要由变压器、配电线路、配电设备、用电设备等组成。

本实验主要研究配电线路和配电设备的工作原理。

1. 变压器:变压器是一种能量传递装置,通过电磁感应原理将高压电能转换为低压电能。

本实验中使用的变压器为单相变压器。

2. 配电线路:配电线路是指从变压器输出端到用电设备之间的输电线路。

本实验中使用的配电线路为单相线路。

3. 配电设备:配电设备包括开关、熔断器、电表等,用于控制、保护和测量电能。

四、实验步骤1. 实验前准备:检查实验器材是否完好,熟悉实验原理和步骤。

2. 组装实验电路:按照实验要求连接电路,包括变压器、配电线路、配电设备、用电设备等。

3. 通电实验:(1)测量变压器输入端电压:使用电压表测量变压器输入端电压,记录数据。

(2)测量配电线路电压:使用电压表测量配电线路电压,记录数据。

(3)测量配电设备电压:使用电压表测量配电设备电压,记录数据。

(4)测量用电设备电压:使用电压表测量用电设备电压,记录数据。

(5)测量电流:使用电流表测量变压器输入端、配电线路、配电设备、用电设备的电流,记录数据。

4. 关闭实验电路:断开开关,切断电源。

5. 实验数据整理:整理实验数据,分析实验结果。

五、实验结果与分析1. 实验数据:(1)变压器输入端电压:220V(2)配电线路电压:220V(3)配电设备电压:220V(4)用电设备电压:220V(5)变压器输入端电流:0.5A(6)配电线路电流:0.5A(7)配电设备电流:0.5A(8)用电设备电流:0.5A2. 实验结果分析:(1)变压器输入端电压与配电线路电压、配电设备电压、用电设备电压相等,说明供电系统电压稳定。

南京邮电大学实验报告模版

南京邮电大学实验报告模版

实验报告( 2014 / 2015 学年第一学期)课程名称计算机操作系统实验名称虚构储存中页面置换算法的模拟实现实验时间2014 年 12 月19 日指导单位南京邮电大学指导教师崔衍学生姓名学院 (系) 物联网院班级学号专业网络工程实验报告实验名称虚构储存中页面置换算法的指导教师崔衍模拟实现实验种类上机实验实验学时4实验时间一、实验目的和要求目的:经过恳求页式储存管理中页面置换算法模拟设计,认识虚构储存技术的技术特色,掌握恳求页式储存管理的页面置换算法要求:(1)设计实现下边算法,并输出下述各样算法的命中率。

①先进先出的算法(FIFO);②近来最少使用算法(LRR) ;③最正确裁减算法(OPT)先裁减最不常用的页地点。

(2)多次频频运转改良后的程序,察看并记录运转结果,并剖析原由。

二、实验环境 (实验设施 )二、实验原理及内容实验三#include <iostream.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>#define Bsize 4typedef struct BLOCK// 申明一种新种类——物理块种类{int pagenum;// 页号int accessed;//接见字段,其值表示多久未被接见}BLOCK;int pc;// 程序计数器,用来记录指令的序号int n;// 缺页计数器,用来记录缺页的次数static int temp[320];// 用来储存320 条随机数BLOCK block[Bsize]; //定义一大小为 4 的物理块数组//*************************************************************void init( );// 程序初始化函数int findExist(int curpage);// 查找物理块中能否有该页面int findSpace( );// 查找能否有安闲物理块int findReplace( );// 查找应予置换的页面void display ( );// 显示void suijishu( );// 产生 320 条随机数 ,显示并储存到 temp[320] void pagestring( );// 显示调用的页面行列void OPT( );//OPT 算法void LRU( );// LRU 算法void FIFO( );//FIFO算法//*************************************************************void init( ){for(int i=0;i<Bsize;i++){block[i].pagenum=-1;block[i].accessed=0;pc=n=0;}}//-------------------------------------------------------------int findExist(int curpage){for(int i=0; i<Bsize; i++){if(block[i].pagenum == curpage )return i;// 检测到内存中有该页面,返回block 中的地点}return -1;}//-------------------------------------------------------------int findSpace( ){for(int i=0; i<Bsize; i++){if(block[i].pagenum == -1)return i;// 找到安闲的block ,返回 block 中的地点}return -1;}//-------------------------------------------------------------int findReplace( ){int pos = 0;for(int i=0; i<Bsize; i++){if(block[i].accessed >block[pos].accessed)pos = i;// 找到应予置换页面,返回BLOCK 中地点}return pos;}//-------------------------------------------------------------void display( ){for(int i=0; i<Bsize; i++){if(block[i].pagenum != -1){ printf(" %02d",block[i].pagenum);}}cout<<endl;}//-------------------------------------------------------------void suijishu( ){int flag=0;cin>>pc;cout<<"****** 依据要求产生的 320 个随机数: *******"<<endl;for(int i=0;i<320;i++){temp[i]=pc;if(flag%2==0) pc=++pc%320;if(flag==1) pc=rand( )% (pc-1);if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)));flag=++flag%4;printf(" %03d",temp[i]);if((i+1)%10==0) cout<<endl;}}//-------------------------------------------------------------void pagestring( ){for(int i=0;i<320;i++){printf(" %02d",temp[i]/10);if((i+1)%10==0) cout<<endl;}}//-------------------------------------------------------------void OPT( ){int exist,space,position ;int curpage;for(int i=0;i<320;i++){if(i%100==0) getch( );pc=temp[i];curpage=pc/10;exist = findExist(curpage);if(exist==-1){space = findSpace ( );if(space != -1){block[space].pagenum = curpage;display( );n=n+1;}else{for(int k=0;k<Bsize;k++){for(int j=i;j<320;j++){if(block[k].pagenum!= temp[j]/10){block[k].accessed = 1000;}// 未来不会用,设置为一个很大数else{block[k].accessed = j;break;}}}position = findReplace( );block[position].pagenum = curpage;display( );n++;}}}cout<<" 缺页次数 :"<<n<<endl;cout<<" 缺页率 :"<<(n/320.0)*100<<"%"<<endl;}//-------------------------------------------------------------void LRU( ){int exist,space,position ;int curpage;for(int i=0;i<320;i++){if(i%100==0) getch( );pc=temp[i];curpage=pc/10;exist = findExist(curpage);if(exist==-1){space = findSpace( );if(space != -1){block[space].pagenum = curpage;display( );n=n+1;}else{position = findReplace( );block[position].pagenum = curpage;display( );n++;}}else block[exist].accessed = -1;// 恢复存在的并刚接见过的BLOCK 中页面accessed为 -1 for(int j=0; j<4; j++)}cout<<" 缺页次数 :"<<n<<endl;cout<<" 缺页率 :"<<(n/320.0)*100<<"%"<<endl;}//-------------------------------------------------------------void FIFO( ){int exist,space,position ;int curpage;for(int i=0;i<320;i++){if(i%100==0) getch( );pc=temp[i];curpage=pc/10;exist = findExist(curpage);if(exist==-1){space = findSpace( );if(space != -1){block[space].pagenum = curpage;display( );n=n+1;}else{position = findReplace( );block[position].pagenum = curpage;display( );n++;block[position].accessed--;}}for(int j=0; j<Bsize; j++)}cout<<" 缺页次数 :"<<n<<endl;cout<<" 缺页率 :"<<(n/320.0)*100<<"%"<<endl;}//*************************************************************void main( ){int select;cout<<" 请输入第一条指令号(0~320) : ";suijishu( );cout<<"***** 对应的调用页面行列*******"<<endl;pagestring( );do{cout<<"****************************************"<<endl;cout<<"------1:OPT2:LRU 3:FIFO4:退出 -----"<<endl;cout<<"****************************************"<<endl;cout<<"请选择一种页面置换算法:";cin>>select;cout<<"****************************************"<<endl;init( );switch(select){case 1:cout<<"最正确置换算法OPT:"<<endl;cout<<"*****************"<<endl;OPT( );break;case 2:cout<<" 近来最久未使用置换算法LRU:"<<endl;cout<<"**************************"<<endl;LRU( );break;case 3:cout<<" 先进先出置换算法FIFO:"<<endl;cout<<"*********************"<<endl;FIFO( );break;default: ;}}while(select!=4); }实验结果:实验四Login 用户登录bool chklogin(char *users, char *pwd){int i;for(i=0; i<8; i++){if( (strcmp(users,usrarray[i].name)==0) && (strcmp(pwd,usrarray[i].pwd)==0)) return true;}return false;}Create创立文件int create(){temp=initfile(" ",0);cin>>temp->filename;cin>>temp->content;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;cout<<"文件成立成功 !"<<endl;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==0) {printf(" 对不起 ,文件已存在 !");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;cout<<"文件成立成功 !"<<endl;}return 1;}int dir(){int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root){cout<<"\ <DIR> "<<".."<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors" <<i<<" files"<< j <<endl;return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<"<DIR>\ "<<temp->filename<<endl;i++;}else{cout<<"<FILE> "<<temp->filename<<endl;j++;}temp=temp->next;}cout<<"Total: "<<" directors" <<i<<"files"<< j <<endl;}Read读取文件int read(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在 !"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {cout<<recent->child->content<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0) {cout<<temp->next->content<<endl;return 1;}}cout<<"文件不存在 !"<<endl;}}Write 写入文件int write(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在 !"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {recent->child->isopen=1;//设置文件标志为翻开cin>>recent->child->content;recent->child->isopen=0;//设置文件标志为封闭cout<<"文件写入成功 !"<<endl;return 1;}elsetemp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0){recent->child->isopen=1;//设置文件标志为翻开cin>>temp->next->content;recent->child->isopen=0;//设置文件标志为封闭cout<<"文件写入成功 !"<<endl;return 1;}}cout<<"文件不存在 !"<<endl;}}Del 删除int del(){char filename[FILENAME_LENGTH];cin>>filename;temp=new fnode;if(recent->child){temp=recent->child;while(temp->next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=0)) temp=temp->next;if(strcmp(temp->filename,filename)!=0){cout<<"不存在该文件! "<<endl;return 0;}}else{cout<<"不存在该文件! "<<endl;return 0;}if(temp->parent==NULL){temp->prev->next=temp->next;if(temp->next)temp->next->prev=temp->prev;temp->prev=temp->next=NULL;else{if(temp->next)temp->next->parent=temp->parent;temp->parent->child=temp->next;}delete temp;cout<<"文件已删除 !"<<endl;}成立目录int mkdir(){temp=initfile(" ",1);cin>>temp->filename;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==1) {printf(" 对不起 ,目录已存在 !");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;}return 1;切换目录int dir(){int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root){cout<<"\ <DIR> "<<".."<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors" <<i<<" files"<< j <<endl; return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<"<DIR>\ "<<temp->filename<<endl;i++;}else{cout<<"<FILE> "<<temp->filename<<endl;j++;} temp=temp->next;}cout<<"Total: "<<" directors" <<i<<"files"<< j <<endl; }四、实验小结(包含问题和解决方法、心得领会、建议与建议等)经过课程设计 ,加深了对操作系统的认识 ,认识了操作系统中各样资源分派算法的实现 ,特别是对虚构储存 ,页面置换有了深入的认识 ,并可以用高级语言进行模拟演示。

南京邮电大学操作系统实验报告

南京邮电大学操作系统实验报告

南京邮电大学操作系统实验报告This manuscript was revised on November 28, 2020通信与信息工程学院2015 / 2016学年第二学期实验报告课程名称:操作系统实验名称:1、LINUX及其使用环境2、进程管理3、进程间通信4、文件的操作和使用班级学号专业电子信息工程学生姓名指导教师赵建立一、实验目的和要求1、了解UNIX的命令及使用格式。

2、熟悉UNIX/LINUX的常用基本命令。

3、练习并掌握UNIX提供的vi编辑器来编译C程序。

4、学会利用gcc、gdb编译、调试C程序。

二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1、熟悉LINUX的常用基本命令。

如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。

(1)显示目录文件 ls例:ls -al 显示当前目录下的所有文件(2)建新目录 mkdir例:mkdir test 新建一个test目录(3)删除目录rmdir(4)改变工作目录位置 cd例:cd test 更改工作目录至test目录下(5)显示当前所在目录pwd(6)查看目录大小du(7)文件属性的设置 chmod(8)命令在线帮助 man2、设计一个实现文件拷贝功能的shell程序。

(1)在文本编辑器里输入shell程序:#!/bin/shecho “please enter source file:”read soucecho please enter destination file:”read destcp $souc $destls $dest将程序保存在主目录下,命名为shell.(2)打开终端,输入ls -l,显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称。

输入 ./shell,运行shell程序。

操作系统实验报告

操作系统实验报告

操作系统实验报告操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。

本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。

一、实验内容本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。

具体内容包括:1. 进程的创建和管理2. 线程的创建和管理3. 进程同步的实现在实验过程中,我们将分别使用C语言和Linux操作系统实现上述功能。

二、实验过程1. 进程的创建和管理在这一部分实验中,我们要创建多个进程,实现进程的调度和管理功能。

我们采用了Linux系统下的fork()函数,用于创建子进程。

在程序运行时,首先创建一个父进程,然后使用fork()函数创建四个子进程,每个子进程都有自己的进程号(pid),并在屏幕上输出该进程号以示区分。

为了实现进程的调度功能,我们在代码中加入了sleep()函数,用于将进程挂起一段时间,然后再轮流执行其他进程。

2. 线程的创建和管理在这一部分实验中,我们使用了C语言的POSIX线程库pthread.h,实现多线程的功能。

同样地,我们采用了Linux系统下的fork()函数来创建线程。

在代码运行时,我们创建了两个线程,并在屏幕上输出线程号(tid)以示区分。

为了实现线程的调度和管理功能,我们在代码中加入了pthread_join()函数,用于等待线程的执行完成。

3. 进程同步的实现在这一部分实验中,我们使用了Linux系统下的进程同步工具——信号量(semaphore)。

在代码中,我们使用sem_init()函数创建信号量,使用sem_wait()函数阻塞进程或线程,使用sem_post()函数释放进程或线程。

为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。

在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。

南京邮电大学操作系统实验报告

南京邮电大学操作系统实验报告

通信与信息工程学院2015 / 2016学年第二学期实验报告课程名称:操作系统实验名称:1、LINUX及其使用环境2、进程管理3、进程间通信4、文件的操作和使用班级学号专业电子信息工程学生姓名指导教师赵建立实验名称试验一 LINUX及其使用环境实验类型验证实验学时1实验时间2016.6.2一、实验目的和要求1、了解UNIX的命令及使用格式。

2、熟悉UNIX/LINUX的常用基本命令。

3、练习并掌握UNIX提供的vi编辑器来编译C程序。

4、学会利用gcc、gdb编译、调试C程序。

二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1、熟悉LINUX的常用基本命令。

如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。

(1)显示目录文件 ls例:ls -al 显示当前目录下的所有文件(2)建新目录 mkdir例:mkdir test 新建一个test目录(3)删除目录rmdir(4)改变工作目录位置 cd例:cd test 更改工作目录至test目录下(5)显示当前所在目录pwd(6)查看目录大小du(7)文件属性的设置 chmod(8)命令在线帮助 man2、设计一个实现文件拷贝功能的shell程序。

(1)在文本编辑器里输入shell程序:#!/bin/shecho “please enter source file:”read soucecho please enter destination file:”read destcp $souc $destls $dest将程序保存在主目录下,命名为shell.(2)打开终端,输入ls -l,显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称。

输入 ./shell,运行shell程序。

输入源文件hello.c,目标文件B13011206.c。

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

通信与信息工程学院2015 / 2016学年第二学期实验报告课程名称:操作系统实验名称:1、LINUX及其使用环境2、进程管理3、进程间通信4、文件的操作和使用班级学号专业电子信息工程学生姓名指导教师赵建立实验名称试验一 LINUX及其使用环境实验类型验证实验学时1实验时间2016.6.2一、实验目的和要求1、了解UNIX的命令及使用格式。

2、熟悉UNIX/LINUX的常用基本命令。

3、练习并掌握UNIX提供的vi编辑器来编译C程序。

4、学会利用gcc、gdb编译、调试C程序。

二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1、熟悉LINUX的常用基本命令。

如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。

(1)显示目录文件 ls例:ls -al 显示当前目录下的所有文件(2)建新目录 mkdir例:mkdir test 新建一个test目录(3)删除目录rmdir(4)改变工作目录位置 cd例:cd test 更改工作目录至test目录下(5)显示当前所在目录pwd(6)查看目录大小du(7)文件属性的设置 chmod(8)命令在线帮助 man2、设计一个实现文件拷贝功能的shell程序。

(1)在文本编辑器里输入shell程序:#!/bin/shecho “please enter source file:”read soucecho please enter destination file:”read destcp $souc $destls $dest将程序保存在主目录下,命名为shell.(2)打开终端,输入ls -l,显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称。

输入 ./shell,运行shell程序。

输入源文件hello.c,目标文件B13011206.c。

(3)输入ls -l ,当前目录中包含B13011206.c目标文件。

即完成从源文件拷贝至目标文件过程。

3、LINUX 下C语言程序的编译与调试实验。

(1)调试编译代码为了使gdb正常工作,必须使程序在编译时包含调试信息。

调试信息里包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。

gdb利用这些信息使源代码和机器码相关联,在编译时用–g 选项打开调试选项。

(2)gdb基本命令命令描述file 装入欲调试的可执行文件kill 终止正在调试的程序list 列出产生执行文件的源代码部分next 执行一行源代码但不进入函数内部step 执行一行源代码并进入函数内部run 执行当前被调试的程序quit 终止gdbwatch 监视一个变量的值而不管它何时被改变break 在代码里设置断点,使程序执行到这里时被挂起make 不退出gdb就可以重新产生可执行文件shell 不离开gdb就执行UNIX shell 命令(3)打开终端,输入gcc hello.c,编译c程序。

(4)编译无错后,输入 ./a.out ,运行程序hello.c,显示运行结果“hello”。

四、实验小结之前没有接触过Linux操作系统,刚开始用有点不习惯。

虽然用起来磕磕绊绊,通过本次实验反而受益匪浅。

通过这个实验我了解了UNIX的命令及使用格式,熟悉了UNIX/LINUX 的常用基本命令,同时也了解了在LINUX系统下运行C语言程序的方法,掌握了C语言程序的编译与调试方法。

实验名称试验二进程管理实验类型验证实验学时1实验时间2016.6.2一、实验目的和要求1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1.实验内容使用系统调用fork( )创建两个子进程。

当此程序运行时,在系统中有两个父进程和两个子进程活动。

每一个进程在屏幕上显示为:父进程1显示“(1)parent pid say:A”,父进程2显示“(2)parent pid say:A”,子进程(1.1)显示(1.1)pid1 say:B,子进程(2.1)显示“(2.1)pid2 say:C”。

2、实验原理fork( ):创建一个新进程。

系统调用格式: pid=fork( )参数定义:int fork( )fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。

>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。

-1:创建失败。

如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。

此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程的副本,称为子进程。

子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。

父进程与子进程并发执行。

核心为fork( )完成以下操作:(1)为新进程分配一进程表项和进程标识符进入fork( )后,核心检查系统是否有足够的资源来建立一个新进程。

若资源不足,则fork( )系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。

(2)检查同时运行的进程数目超过预先规定的最大数目时,fork( )系统调用失败。

(3)拷贝进程表项中的数据将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。

(4)子进程继承父进程的所有文件对父进程当前目录和所有已打开的文件表项中的引用计数加1。

(5)为子进程创建进程上、下文进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。

(6)子进程执行虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC,然后根据pid变量保存的fork( )返回值的不同,执行不同的分支语句。

3.实验步骤(1)在文本编辑器输入程序:#include<stdio.h>#include<unistd.h>int main(){int temp1,temp2;int pid1,pid2;pid1=fork();temp1=pid1;if (pid1>0){printf(“\n(1)parent pid %d say:A”,temp1); }else{printf(“\n(1.1)pid1 say:B”);}pid2=fork();temp2=pid2;if (pid2>0){printf(“\n(2)parent pid %d say:A”,temp2);}else{printf(“\n(2.1)pid2 say:C”);}}将程序保存在主目录下。

(2)打开终端,使用gcc编译程序,如果出错,使用vi编辑器编辑程序。

编辑无错后再次编译。

(3)运行程序,输入./a.out,运行多次后得到下图结果。

四、实验小结通过这次实验,掌握了进程的概念,明确了进程的含义,认识并了解了并发执行的实质。

这次实验学会了用fork()函数创建实验,了解到进程与子进程的创建过程。

另外还掌握了LINUX系统中输出流重定向的使用,将程序的输出结果输出到文件中,而不是直接显示在屏幕上。

实验名称试验三进程间通信实验类型综合实验学时3实验时间2016.6.2,2016.6.9一、实验目的和要求1、掌握进程另外的创建方法。

2、熟悉进程的睡眠、同步、撤消等进程控制方法。

3、了解什么是管道。

4、熟悉UNIX/LINUX支持的管道通信方式。

二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1.实验原理编写程序实现进程的管道通信。

用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。

2.实验步骤(1)在文本编辑器输入程序:#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2;main( ){int fd[2];char outpipe[100],inpipe[100];pipe(fd); /*创建一个管道*/while ((pid1=fork( ))= =-1);if(pid1= =0){lockf(fd[1],1,0);sprintf(outpipe,"child 1 process is sending message!");/*把串放入数组outpipe中*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/sleep(5); /*自我阻塞5秒*/lockf(fd[1],0,0);exit(0);}else{while((pid2=fork( ))= =-1);if(pid2= =0){ lockf(fd[1],1,0); /*互斥*/sprintf(outpipe,"child 2 process is sending message!"); write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{ wait(0); /*同步*/read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf("%s\n",inpipe);wait(0);read(fd[0],inpipe,50);printf("%s\n",inpipe);exit(0);}}}(2)在终端中,编译程序。

(3)输入./a.out执行程序3、实验结果实验输出结果如下延迟5秒后显示child 1 process is sending message!再延迟5秒child 2 process is sending message!四、实验小结(包括问题和解决方法、心得体会、意见与建议等)通过这次实验,熟悉了进程的睡眠、同步、撤消等进程控制方法,了解什么是管道,了解了UNIX/LINUX支持的管道通信方式。

实验名称实验四文件的操作和使用实验类型验证实验学时1实验时间2016.6.9一、实验目的和要求熟悉文件系统的操作和使用方法。

相关文档
最新文档