版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈尔滨学院实验报告课程名称:操作系统专业:软件工程班级:11—6学号:11031622姓名:薛滔瀚教务处制实验一进程管理【实验目的与要求】1.加深对进程概念的理解,明确进程与程序的区别。2.掌握Linux进程创建及撤销的方法,进一步认识并发执行的实质。3.掌握Linux系统下守护进程的创建方法。【实验原理】1.Linux进程管理命令(1)进程查看(2)进程终止(3)进程优先级设置2.Linux进程控制函数(1)创建和修改进程(2)设置进程属性(3)获取进程属性(4)进程的退出3.Linux守护进程(1)独立启动守护进程(2)超级守护进程(3)守护进程的编写流程守护进程的编写遵循特定的流程,主要包括五个步骤:Step1.创建子进程,退出父进程Step2.在子进程中创建新会话Step3.改变当前目录为根目录Step4.重设文件权限掩码Step5.关闭文件描述符【实验主要仪器与材料】1.带Linux操作系统的PC机2.GCC编译器【实验内容】1.获取进程信息通过管理命令,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等。2.创建进程编程程序,实现父进程创建一个子进程,返回后父子进程都分别循环输出字符串“Iamparent.”或“Iamchild.”5次,每输出一次延时1秒(sleep(1)),然后进入下一次循环。观察并分析运行结果。然后将程序改为父子进程同步执行:子进程循环输出字符串“Iamchild.”5次,然后父进程再循环输出字符串“Iamparent.”5次。再次观察并分析运行结果。【实验步骤及实验结果分析】实验内容1:获取进程信息FSUIDPIDPPIDCPRINIADDRSZWCHANTTYTIMECMD0S0659765940750-1121waitpts/000:00:00bash4R0782665970770-1042-pts/000:00:00ps实验内容2:创建进程#include<stdio.h>#include<signal.h>#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>intmain(){ inti=0,j=0; intp=fork(); if(p) { while(i++<5) { sleep(1); printf("Iamachild\tPid:%d\n",(int)getpid()); } } else { while(j++<5) { sleep(1); printf("Iamafarther\tPid:%d\n",(int)getpid()); } } return0;}【思考题】程序和进程的区别1.进程是程序的执行,进程属于动态概念,而程序是一组指令的有序集合,是静态概念。2.进程既然是程序的执行,或者说是“一次运行活动”,因而它是有生命过程的。进程的存在是暂时的,而程序的存在是永久的。3.进程是程序的执行。因此进程的组成应包括程序和数据。除此以外,进程还由记录进程状态信息的进程控制块PCB组成。4.一个程序可能对应多个进程。5.一个进程可以包含多个程序。6.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。Linux操作系统下有哪些进程类型交互进程批处理进程守护进程进程创建函数fork和vfork的区别1、fork()用于创建一个新进程。由fork()创建的子进程是父进程的副本。即子进程获取父进程数据空间,堆和栈的副本。父子进程之间不共享这些存储空间的部分。而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit)于是也就不会存放该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间进行。2、vfork()与fork()另一个区别就是:vfork保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。3/vfork和fork之间的还有一个区别是:vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。进程的退出函数有哪些?有何区别?C程序是如何被启动终止的?exit函数、return函数、abort函数和_exit()函数exit和return的区别:exit是一个函数,有参数;而return是函数执行完后的返回。 exit把控制权交给系统,而return将控制权交给调用函数。exit和abort的区别:exit是正常终止进程,而abort是异常终止。exit和_exit()的区别:exit()在头文件stdlib.h中声明,而_exit()声明在头文件unistd.h中。两个函数均能正常终止进程,但_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。实验二进程通信【实验目的与要求】1、了解基于信号的进程通信机制2、熟悉LINUX系统中进程之间软中断通信的基本原理【实验原理】一、信号1、信号的基本概念2、信号的发送3、对信号的处理二、所涉及的中断调用1、kill()2、signal()3、wait()4、waitpid() 5、lockf()【实验主要仪器与材料】1、带Linux操作系统的PC机2、GCC编译器【实验内容】1、编写程序:用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父进程等待两个子进程终止后,输出如下的信息后终止:Parentprocessiskilled!2、分析利用软中断通信实现进程同步的机理【实验步骤及实验结果分析】#include<stdio.h>#include<signal.h>#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>voidwaiting(),stop();intwait_mark;intmain(){ intp1,p2,stdout=1; while((p1=fork())==-1);/*创建子进程p1*/ if(p1>0) { while((p2=fork())==-1);/*创建子进程p2*/ if(p2>0) {wait_mark=1; signal(SIGINT,stop);/*接收到^c信号,转stop*/ waiting(); kill(p1,16);/*向p1发软中断信号16*/ kill(p2,17);/*向p2发软中断信号17*/ wait(0);/*同步*/ wait(0); printf("Parentprocessiskilled!\n"); exit(0); } else { wait_mark=1; signal(SIGINT,SIG_IGN); signal(17,stop);/*接收到软中断信号17,转stop*/ waiting(); lockf(stdout,1,0); printf("Childprocess2iskilledbyparent!\n"); lockf(stdout,0,0); exit(0); } } else { wait_mark=1; signal(SIGINT,SIG_IGN); signal(16,stop);/*接收到软中断信号16,转stop*/ waiting(); lockf(stdout,1,0); printf("Childprocess1iskilledbyparent!\n"); lockf(stdout,0,0); exit(0); } return0;}voidwaiting(){ while(wait_mark!=0);}voidstop(){ wait_mark=0;}运行结果:Childprocess2iskilledbyparent!Childprocess1iskilledbyparent!Parentprocessiskilled!【思考题】实验内容的参考程序如下,请仔细阅读、调试、分析,回答下述问题:#include<stdio.h>#include<signal.h>#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>voidwaiting(),stop();intwait_mark;intmain(){intp1,p2,stdout=1;while((p1=fork())==-1);/*创建子进程p1*/if(p1>0){while((p2=fork())==-1);/*创建子进程p2*/if(p2>0){wait_mark=1;signal(SIGINT,stop);/*接收到^c信号,转stop*/waiting();kill(p1,16);/*向p1发软中断信号16*/kill(p2,17);/*向p2发软中断信号17*/wait(0);/*同步*/wait(0);printf("Parentprocessiskilled!\n");exit(0);}else{wait_mark=1;signal(17,stop);/*接收到软中断信号17,转stop*/waiting();lockf(stdout,1,0);printf("Childprocess2iskilledbyparent!\n");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);/*接收到软中断信号16,转stop*/waiting();lockf(stdout,1,0);printf("Childprocess1iskilledbyparent!\n");lockf(stdout,0,0);exit(0);}return0;}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}1.参考程序段前面部分用了两个wait(0),它们起什么作用?用了两个wait(0)的作用是使p1和p2两个子程序同时发出软中断信号不用等待。2.参考程序段中每个进程退出时都用了语句exit(0),为什么?都用了exit(0)的作用是让子进程自我终止,正常退出,返回操作系统。3、参考程序的运行结果是什么?Parentprocessiskilled!4、参考程序是否符合实验要求?为什么?否、按^C键,直接输出“Parentprocessiskilled!”不符合上面的要求。5、参考程序该如何修改才能得到正确结果?在“signal(16,stop)”和“signal(17,stop)”前加“signal(SIGINT,SIG_IGN)”,就可以运行上面的要求了。实验三内存管理【实验目的与要求】1、了解虚拟存储技术的特点2、掌握请求页式存储管理的页面置换算法3、了解页面大小和内存实际容量对命中率的影响【实验原理】分页存储管理将一个进程的逻辑地址空间分成若干大小相等的片,成为页面或页。在进程运行过程中,若其所要访问的页面不在内存而需要把他们调入内存,但内存已无空闲时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。但应将哪个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法(PageReplacementAlgorithm)。一个好的页面置换算法,应具有较低的页面更换频率。从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。最佳置换算法OPT(Optimal)先进先出页面置换算法FIFO最近最久未使用置换算法LRU【实验主要仪器与材料】1、带Linux操作系统的PC机2、GCC编译器【实验内容】1、通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:50%的指令是顺序执行的25%的指令是均匀分布在前地址部分25%的指令是均匀分布在后地址部分具体的实施方法是:在【0,319】的指令地址之间随机选取一起点m;顺序执行一条指令,即执行地址为m+1的指令;在前地址【0,m+1】中随机选取一条指令并执行,该指令的地址为m’;顺序执行一条指令,其地址为m’+1;在后地址[m’+2,319]中随机选取一条指令并执行;重复上述步骤,直到执行320次指令。2、将指令序列变换成为页地址流设:页面大小为1K;用户内存容量为4页到32页;用户虚拟容量为32K。在用户虚存中,按每K存放10条指令排列虚拟地址,即320条指令在虚存中的存放方式为:第0条~第9条指令为第0页(对应虚存地址为【0,9】);第10条~第19条指令为第1页(对应虚存地址为【10,19】); …第310条~第319条指令为第31页(对应虚存地址为【310,319】)。按以上方式,用户指令可组成32页。3、计算并输出下列各种算法在不同内存容量下的命中率。先进先出的算法(FIFO);最近最少使用算法(LRU);最佳淘汰算法(OPT):先淘汰最不常用的页地址;其中OPT为选作内容。命中率=1–页面时效次数/页地址流长度在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。【实验步骤及实验结果分析】首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#defineOP_SIZE320//指令数#defineME_MIN4//用户可以使用的最少内存页数#defineME_MAX32//用户可以使用的最多内存页数//intop[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};intop[OP_SIZE];intme[ME_MAX];intt_c[ME_MAX];voidDo_op(){srand((unsigned)time(NULL));intm1,m2;inti=0;while(i<OP_SIZE){m1=rand()%OP_SIZE;op[i++]=m1+1;m2=rand()%(m1+2);op[i++]=m2;op[i++]=m2+1;op[i++]=rand()%(OP_SIZE-m2-2)+m2+2;}}//查找内存中是否有需要的页数,找到返回页数地址,否则返回-1intfind(intadd,intn){inti=0;for(i=0;i<n;i++){if((add/10)==me[i]){returni;}}return-1;}//先进先出内存页数分配算法doubleFIFO(intn){memset(me,-1,sizeof(me));inti=0,FIFO_f=0;inttop=0;for(i=0;i<OP_SIZE;i++){if(find(op[i],n)==-1){FIFO_f++;me[top%n]=op[i]/10;top++;}}return(double)FIFO_f/OP_SIZE;}//查找内存中的页数块最近最久未使用的块地址intmax_i(intn){intmax=0,i;for(i=1;i<n;i++){if(t_c[max]<t_c[i]){max=i;}}returnmax;}//最近最久未使用算法doubleLRU(intn){memset(me,-1,sizeof(me));memset(t_c,0,sizeof(t_c));inti=0,LRU_f=0;intf=0,j=0;for(i=0;i<OP_SIZE;i++){f=find(op[i],n);if(f==-1){LRU_f++;f=max_i(n);me[f]=op[i]/10;}for(j=0;j<n;j++){j==f?t_c[j]=0:t_c[j]++;}}return(double)LRU_f/OP_SIZE;}intmain(){inti=0;Do_op();printf("ME:FIFO\tLRU\n");for(i=ME_MIN;i<=ME_MAX;i++){printf("%d:%.5lf\t%.5lf\n",i,1-FIFO(i),1-LRU(i));} return0;}运行结果:【思考题】1、在内存页面较少(4~5个)的情况时,各种页面置换算法的命中率有何差别?FIFO<LRU,但有时LRU还不如FIFO置换算法。2、在内存页面为7~12个页面时,各种页面置换算法的命中率有何差异?LRU>FIFO,差别开始扩大,但也有一定的波动。3、在内存页面为25~32个页面时,各种页面置换算法的命中率有何差异?LRU>FIFO,差别扩大。4、综上实验现象,总结各种页面置换算法命中率的高低。理论上,四种替换算法的命中率由高到底排列应该是OPT>LRU>CLOCK>FIFO推测与指令流的产生方式有关系。因为指令流的产生方式要能体现局部性原理,所以该指令流产生设计为:50%的指令是顺序执的,25%的指令是均匀分布在前地址部分,25%的指令是均匀分布在后地址部分。但是这样的指令流设计方式能否最佳地体现局部性原理,这还有待验证。实验四文件系统【实验目的与要求】1、熟悉Linux文件系统的文件和目录结构,掌握Linux文件系统的基本特征。2、掌握命令行方式下文件操作命令和程序中文件操作函数的使用方法。3.、掌握Linux文件系统的加载和卸载方法。【实验原理】1.文件系统生成和加载在使用文件系统之前,需要对硬盘执行分区、格式化、挂载文件系统等操作。(1)查看硬盘状态(2)硬盘分区和格式化(3)文件系统的挂载和扫描2.文件系统操作命令下面列出常用的文件系统操作命令,具体使用方法和参数的意义请查询该命令的帮助文档。cat:显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件。chgrp:改变文件或目录所属的用户组chown:改变文件的属权clear:清楚终端屏幕cp:将文件或目录复制到其他目录中cut:移除文件的部分内容diff:找出两个文件的不同之处file:显示文件类型find:在目录中搜索文件,并执行指定的操作。head:只查看文件的头几行内容,而不必浏览整个文件。ln:在文件之间创建链接,实际上是给某个文件指定一个访问它的别名。less:查看超过一屏的文件内容,可按空格键向下显示文件,利用方向键滚动显示文件。locate:查找文件,且比find命令的搜索速度快。ls:显示当前目录中的文件和子目录列表mkdir:建立子目录more:显示超过一屏的文件,让文件显示满一屏时暂停,按任意键时显示下一屏内容。rmdir:删除“空”的子目录或无用的目录文件mv:将文件以及目录移到其他位置,或更改文件以及目录的名称。pico:可指定文本的编辑方式pwd:显示用户当前所在的目录rm:删除系统中过时或无用的文件,可删除目录中的文件或目录本身。对于链接文件,原有文件保持不变。sort:将文本文件自动分类stat:显示文件或文件系统的状态strings:显示文件中要打印的字符串tail:输出文件的结尾touch:改变文件的时间戳uniq:移除已分类文件中的重复文本行wc:显示文件中字节、词组合文本行的数目。whereis:查找特定目录下的原始程序,二进制程序或用户手册等文件的位置。man:详细了解某个命令dd:复制一个文件edquoat:设置用户与用户组的磁盘空间限制,即Windows系统中的配额。quota:限制和显示用户可用的磁盘空间quotaon,quotaoff:启用或取消quota限制3.文件操作函数Linux系统对文件操作有系统调用(systemcall)和库函数调用(Libraryfunctions)两种方式。系统调用系统调用通常用于底层文件访问(low-levelfileaccess),例如在驱动程序中对设备文件的直接访问,包括open、close、read、write、ioctl等,需包含头文件unistd.h。(1)write系统调用size_twrite(intfiledes,constvoid*buf,size_tnbytes);(2)read系统调用size_tread(intfiledes,void*buf,size_tnbytes)(3)open系统调用intopen(constchar*path,intoflags);intopen(constchar*path,intoflags,mode_tmode);(4)close系统调用intclose(intfiledes);(5)lseek系统调用off_tlseek(intfiledes,off_toffset,intwhence);(6)fstat,stat和lstat系统调用intfstat(intfiledes,structstat*buf);intstat(constchar*path,structstat*buf);intlstat(constchar*path,structstat*buf)fstat;(7)dup和dup2的系统调用intdup(intfiledes); intdup2(intfiledes,intfiledes2);库函数调用标准C库函数提供的文件操作函数如fopen,fread,fwrite,fclose,fflush,fseek等需包含头文件stdio.h。1)fopen函数:FILE*fopen(constchar*filename,constchar*mode);2)fread函数:size_tfread(void*ptr,size_tsize,size_tnitems,FILE*stream);3)fwrite函数:size_tfwrite(constvoid*ptr,size_tsize,size_tnitems,FILE*stream);4)fclose函数:intfclose(FILE*stream);5)fflush函数:intfflush(FILE*stream);6)fseek函数。intfseek(FILE*stream,longintoffset,intwhence);7)fgetc,getc,getchar函数:8)fputc,putc,putchar函数intputc(intc,FILE*stream);——相当于fputc,但可以实现为一个宏。intputchar(intc);——相当putc(stdout)。9)fgets,gets函数char*fgets(char*s,intn,FILE*stream); char*gets(char*s); 【实验主要仪器与材料】1、带Linux操作系统的PC机2、GCC编译器【实验内容】1.熟悉Linux下的文件操作命令,如查看文件系统的分区和设备文件、查看文件系统目录结构、创建文件夹、复制文件、更改文件权限等,观察Linux文件系统的特点。2.对比实验一的文件拷贝代码,利用不同的文件操作函数实现文件的输出和拷贝。3.实现对光盘的加载和访问,然后卸载设备。4.加载Windows文件系统,实现对Windows数据的访问和共享。【【实验步骤及实验结果分析】1.查看文件系统的分区和设备文件[root@bogon~]#df-a文件系统1K-块已用可用已用%挂载点/dev/mapper/VolGroup00-LogVol003853376033051603323958410%/proc000-/procsysfs000-/sysdevpts000-/dev/pts/dev/sda1101086109078496012%/boottmpfs51770005177000%/dev/shmnone000-/proc/sys/fs/binfmt_miscsunrpc000-/var/lib/nfs/rpc_pipefsnone000-/proc/fs/vmblock/mountPoint查看文件系统目录结构[root@bogon~]#du327528./vmware-tools-distrib/lib600./vmware-tools-distrib/bin8./vmware-tools-distrib/etc/vmware-tools144./vmware-tools-distrib/etc48./vmware-tools-distrib/installer40./vmware-tools-distrib/doc/vmware-vmci/samples48./vmware-tools-distrib/doc/vmware-vmci232./vmware-tools-distrib/doc329028./vmware-tools-distrib创建文件夹[root@bogonymy]#mkdirhcl[root@bogonymy]#lshclhclqq复制文件[root@bogonymy]#cpt>>q[root@bogonymy]#lsqt更改文件权限[root@bogonh]#ls-l总计8-rw-r--r--1rootroot1907-0118:28a.txt[root@bogonh]#chmod777a.txt[root@bogonh]#ls-l总计8-rwxrwxrwx1rootroot1907-0118:28a.txt[root@bogonh]#2.intmain(){FILE*in,*out;if((in=fopen("a.txt","r"))==NULL){printf("Error!!!\n");
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工礼券活动方案策划(3篇)
- 地面瓷砖营销方案(3篇)
- 外墙-粉刷-施工方案(3篇)
- 夹层快速施工方案(3篇)
- 宜君全网营销方案(3篇)
- 小型公寓营销方案(3篇)
- 2026年云南曲靖市高职单招语文真题及参考答案
- 2026年黑龙江佳木斯市高职单招语文考试题库(附含答案)
- 卓越品质的秘诀企业质量管理实践
- 体育训练中数字技术辅助训练的案例
- 《中医辩证施护》课件
- 幕墙技术标(暗标)
- 管理会计学 第10版 课件 第6章 存货决策
- 高等代数试卷
- 三方协议解约函电子
- 三对三篮球赛记录表
- 电气自动化社会实践报告
- 【关于某公司销售人员招聘情况的调查报告】
- 拉肚子的故事知乎拉黄稀水
- JJF 1083-2002光学倾斜仪校准规范
- GB/T 2504-1989船用铸钢法兰(四进位)
评论
0/150
提交评论