实验二 Linux进程通信_第1页
实验二 Linux进程通信_第2页
实验二 Linux进程通信_第3页
实验二 Linux进程通信_第4页
实验二 Linux进程通信_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二 Linux进程通信一、实验目的1)了解有关Linux系统调用;2)学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。二、实验内容在Linux环境下,用C/C+语言编程,使用系统调用fork创建进程多个子进程。(1) 调试并完成下列程序,完成实验要求:#include "stdio.h" #include "sys/types.h" #include "unistd.h" int main() pid_t pid1; pid_t pid2; pid1 = fork(); pid2 = fork(); printf(

2、"pid1:%d, pid2:%dn", pid1, pid2); 要求:A.请说出执行这个程序后,将一共运行几个进程。B.观察运行结果,并给出分析与解释。答:A.执行这个程序后,将一共运行4个进程。A.运行结果如下:分析与解释:fork()函数能够建立子进程,且使得子进程得到父进程地址空的一个复制;而且,当创建成功时,如果是父进程则返回0,子进程则返回子进程的ID,但是,fork()创建的进程并不是从该程序开头开始执行,它只是和父进程一样继续执行后续代码,因此在之后的语句中,父子进程同时创建一个进程,就形成了四个进程,如图上所示。 所以,在上面的截图中,第一次fork()

3、函数时成功产生了父子进程pid分别为2775和0,第二次使用fork()函数时父子进程又各产生了一对父子进程父进程产生的父子进程的pid分别为2776和0,子进程产生的父子进程的pid分别为0和2777。因为进程是并发的,他的调度我们无法干预,所以出现的结果并非都是一成不变的,执行多次后,输出的顺序有可能不一样。(2)参考下面的相关程序实例,编写一个管道实验程序,实现两个进程之间的数据通信。要求:父进程顺序写入若干个字符串,子进程顺序读出内容,并写入文件piple.txt,并显示出来。(写出设计步骤、数据结构、关键代码、实验结果及其分析说明)答:设计步骤:用pipe()创建一个管道fd,用fo

4、rk调用产生两个进程(父进程和子进程);将父进程将要传输给子进程的信息写在readbuffer;然后使子进程通过读端用write函数从缓存中读取父进程传输的消息。数据结构:定义一个字符数组string用于存放父进程将要传输给子进程的消息,使用read函数和write函数配对实现管道的运行。关键代码:#include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> int main(void) i

5、nt fd2, out; pid_t childpid; char string="abcdefghijklmnopqrstuvwxyz" char readbuffer27; pipe(fd); childpid=fork(); 实验三 动态分区管理方法一、实验目的本实验主要对操作系统中内存管理方法及其应用中的一些关键算法进行模拟。学生通过设计与实现相关算法,能够加强对相应理论的理解,并对了解操作系统内存管理子系统的相关处理原理与过程。二、实验要求基本要求:编码实现动态分区管理的三种分配算法和回收算法(相邻空闲区要合并)。1)初始化:输入若干个空闲分区和已占用分区信息,建

6、立空闲区表和已分配表。2)分配功能:输入一个作业请求,可选最先、最佳和最坏算法实现该作业的内存分配;3)回收功能:输入进入完成态的作业,回收其占用的分区,并进行检查合并相邻空闲分区。4)显示当前分区情况:显示已占用分区、空闲区表的内容。3、 实验内容基本原理(1)动态分区时的分配方法有三种:最先适应法(first fit algorithm)最佳适应法(best fit algorithm)最坏适应法(worst fit algoriathm)1) 最先适应法 该法一般空闲区按起始地址递增排列。 该算法的最大特点是查找简单快速,但需要按地址排序。 即找到第一个满足要求的低地址空闲区,分割分配。

7、2) 最佳适应算法 通常按照空间从小到大的次序排序。 当用户作业或进程申请一个空闲区时,从表头开始查找,找到第一个满足要求的空闲区时,即停止查找。即找到那个满足大小且是最小的空闲区,分割分配。123) 最坏适应算法通常要求空闲区按其空间大小递减排序。当用户作业或进程申请一个空闲区时,顺序查找到第一个满足要求的空闲区用来分配。即找到那个满足大小且是最大的空闲区,分割并分配。(2)动态分区在去配时,可能遇到4种情况: a) 该空闲区的上下两相邻分区都是空闲区; b) 该空闲区的上相邻区是空闲区; c) 该空闲区的下相邻区是空闲区; d) 两相邻区都不是空闲区。1、 主要函数实现struct dat

8、a1 /*空闲区表*/int address;int length;int flag;struct data2 /*已分配区表*/int address;int length;char name20;struct data1 emptyMAX;struct data2 busyMAX;void initialize( );int read_data( ); /*从文件中读如数据*/void display_empty_table(int); /*显示空闲区表*/void display_busy_table(int); /*显示已分配区表*/void badest_fit( int *,int

9、 *,char *name,int s );/*最坏适应算法*/void first_fit( int *,int *,char *name,int s ); /*最先适应算法*/void best_fit( int *,int *,char *name,int s ); /*最佳适应算法*/void main( )int num1,num2,size; /*num1用于统计空闲表的,num2用于统计分配区表*/char name20;num2=0;initialize( ); /*初始花空闲区表和分配区表*/num1=read_data( ); if( num1=0 ) /*表示文件中没有数

10、据*/printf("there has no data in empty tablen");printf("the initialial empty table is:n");display_empty_table( num1 ); /*显示空闲区表*/while(1)printf("please input job's name and job's sizen");puts("input exit to exit");scanf("%s",name);if( strcmp(n

11、ame,"exit")=0 )getch( );break;scanf("%d",&size);badest_fit( &num1,&num2,name,size );/*这里可以改为最佳适应和最先适应*/first_fit( &num1,&num2,name,size );/*这里可以改为最佳适应和最先适应*/best_fit( &num1,&num2,name,size );/*这里可以改为最佳适应和最先适应*/puts("the empty table after assigning

12、");display_empty_table( num1 );puts("the busy table:");display_busy_table( num2 );void initialize( )int i;for( i=0;i<MAX;i+ )emptyi.address=0;emptyi.length=0;emptyi.flag=0;busyi.address=0;busyi.length=0;strcpy(,"");int read_data( )FILE *fp;int n=0;fp=fopen("

13、;A.txt","rb");if( fp=NULL )void display_empty_table( int num )int i;printf("addresstlengthtflagn");for( i=0;i<num;i+ )printf("%dt%dt%dn",emptyi.address,emptyi.length,emptyi.flag);printf("n");void display_busy_table( int num )int i;printf("addresst

14、lengthtnamen");for( i=0;i<num;i+ )printf("%dt%dt%sn",busyi.address,busyi.length,);printf("n");void badest_fit( int *n1,int *n2,char *name,int s )int i,temp;temp=0;for( i=0;i<*n1;i+ ) /*寻找最大的空闲区*/if( emptyi.length>emptytemp.length)temp=i;if( s>emptytemp.

15、length) /*申请的空间比最大的空闲区还大*/printf("the size of memory is not enoughn");return;busy*n2.address=emptytemp.address;/*修改分配区表*/busy*n2.length=s;strcpy( busy*,name );(*n2)+;if( s=emptytemp.length ) /*若申请的空间与空闲区恰好相等*/for( i=temp+1;i<*n1;i+ )emptyi-1=emptyi;(*n1)-;elseemptytemp.address+=s

16、;emptytemp.length-=s;/*最先适应算法*/void first_fit( int *n1,int *n2,char *name,int s )int i,temp;temp=0;for( i=0;i<*n1;i+ ) /*寻找第一块空闲区*/if( emptyi.length>=s )temp=i;break;if( i>=*n1)printf("the size of memory is not enoughn");return; /*最佳适应算法*/void best_fit( int *n1,int *n2,char *name,

17、int s )int i,temp;temp=0;for( i=0;i<*n1;i+ ) /*寻找最小的空闲区*/if( emptyi.length<emptytemp.length)temp=i;if( s>emptytemp.length) /*申请的空间比最大的空闲区还大*/printf("the size of memory is not enoughn");return;busy*n2.address=emptytemp.address;/*修改分配区表*/busy*n2.length=s;strcpy( busy*,name );

18、(*n2)+;if( s=emptytemp.length ) /*若申请的空间与空闲区恰好相等*/for( i=temp+1;i<*n1;i+ )emptyi-1=emptyi;(*n1)-;elseemptytemp.address+=s;emptytemp.length-=s;2、 测试数据与结果分析最坏适应法 badest_fit最佳适应法 best_fit 四、实验总结 通过此次实验,我实现了操作系统中内存管理方法及其应用中的一些关键算法进行模拟,完成了实验目标。在设计与实现最先适应法、最佳适应法、最坏适应法算法的过程中,加深了自己对这些算法如何进行内存的分配与回收的机制的相关理论的理解,并体会了操作系统内

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论