操作系统实验三进程管理实验报告Word格式.docx

上传人:b****3 文档编号:16003104 上传时间:2022-11-17 格式:DOCX 页数:11 大小:17.63KB
下载 相关 举报
操作系统实验三进程管理实验报告Word格式.docx_第1页
第1页 / 共11页
操作系统实验三进程管理实验报告Word格式.docx_第2页
第2页 / 共11页
操作系统实验三进程管理实验报告Word格式.docx_第3页
第3页 / 共11页
操作系统实验三进程管理实验报告Word格式.docx_第4页
第4页 / 共11页
操作系统实验三进程管理实验报告Word格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

操作系统实验三进程管理实验报告Word格式.docx

《操作系统实验三进程管理实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验三进程管理实验报告Word格式.docx(11页珍藏版)》请在冰豆网上搜索。

操作系统实验三进程管理实验报告Word格式.docx

  实验题目

  进程管理

  实验目的

  加深对进程概念的理解,明确进程和程序的区别;

  进一步认识并发执行的实质;

  了解父进程和子进程之间的关系;

  查看进程管理命令。

  实验环境(硬件和软件)

  硬件PC机软件OracleVMVirtualboxLinux

  一、实验内容

  练习在shell环境下编译执行程序

  (注意①在vi编辑器中编写名为sample.c的c语言源程序

  ②用linux自带的编译器gcc编译程序,例如gcc–otestsample.c

  ③编译后生成名为test.out的可执行文件;

  ④最后执行分析结果;

命令为

  注意linux自带的编译程序gcc的语法是gcc–o目标程序名源程序名,例如gcc–osample1samplec,然后利用命令来执行。

如果仅用“gcc源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。

  进程的创建

  仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。

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

让每一个进程在屏幕上显示一个字符父进程显示“a”,子进程分别显示字符“b”和“c”。

观察记录屏幕上的显示结果,并分析原因。

  分析程序

  实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。

二、实验步骤

  利用fork()创建一个小程序

  编写程序

  #include<

sys/types.h>

  main()

  {

  inti=5;

  pid_tpid;

  pid=fork();

  for(;

i>

;

i--)

  if(pid<

  printf("

errorinfork!

"

);

  elseif(pid==)

iamthechildprocess,myprocessidis%dandi=%d\n"

getpid(),i);

  else

iamtheparentprocess,myprocessidis%dandi=%d\n"

  }

  for(i=5;

thechildprocess,myprocessidis%dandi=%d\n"

theparentprocess,myprocessidis%dandi=%d\n"

  运行程序

  (3)分析程序

  在这里,主程序先运行,在屏幕上输出一个a,之后两个子程序分别运行而输出c和b。

  2子进程对存取空间的复制

  

(2)运行程序

  通过scanf(“%d”,&

i);

语句读取一个整数存在i,之后创建两个子程序,输入1后,子程序运行,之后经过一些读取赋值操作,输出i的值。

  3父子进程执行进程分析

  程序分析

  三次结果不同是因为printf(“Inwhichprocess\n”);

所处位置经过变换,处于父子程序之后,父子程序之前和父程序之中。

  4修改程序验证父子进程关系

  文本代码

unistd.h>

signal.h>

stdio.h>

string.h>

sys/ipc.h>

sys/shm.h>

sys/sem.h>

stdlib.h>

  #defineMY_SHMKEY//needtochange

  #defineMY_SEMKEY//needtochange

  voidsigend(int);

  intshmid,semid;

  intmain(void)

  int*shmptr,semval,local;

  structsembufsemopbuf;

  if((shmid=shmget(MY_SHMKEY,sizeof(int),IPC_CREAT|IPC_EXCL|666))<

  shmid=shmget(MY_SHMKEY,sizeof(int),666);

  semid=semget(MY_SEMKEY,2,666);

  shmptr=(int*)shmat(shmid,,);

Actasproducer.Toend,inputwhenprompted.\n\n"

Inputanumber:

\n"

  scanf("

%d"

&

local);

  while(local)

  semopbuf.sem_num=;

  semopbuf.sem_op=-1;

  semopbuf.sem_flg=SEM_UNDO;

  semop(semid,&

semopbuf,1);

  *shmptr=local;

  semopbuf.sem_num=1;

  semopbuf.sem_op=1;

  semid=semget(MY_SEMKEY,2,IPC_CREAT|666);

  semval=1;

  semctl(semid,,SETVAL,semval);

  semval=;

  semctl(semid,1,SETVAL,semval);

  signal(SIGINT,sigend);

  signal(SIGTERM,sigend);

ACTCONSUMER!

!

Toend,tryCtrl+Corusekill.\n\n"

  while

(1)

Sharedmemorysetto%d\n"

*shmptr);

  voidsigend(intsig)

  shmctl(shmid,IPC_RMID,);

  semctl(semid,IPC_RMID,);

  exit();

  本示例主要体现进程间的直接制约关系,由于使用共享存储区,也存在间接制约关系。

进程分为服务进程和客户进程,服务进程只有一个,作为消费者,在每次客户进程改变共享存储区内容时显示其数值。

各客户进程作为生产者,如果共享存储区内容已经显示(被消费),可以接收用户从键盘输入的整数,放在共享存储区。

  编译后执行,第一个进程实例将作为服务进程,提示

  ACTCONSUMER!

Toend,tryCtrl+Corusekill.

  服务进程一直循环执行,直到用户按Ctrl+C终止执行,或使用kill命令杀死服务进程。

  其他进程实例作为客户进程,提示

  Actasproducer.Toend,inputwhenprompted.

  客户进程一直循环执行,直到用户输入。

  5模拟临界资源访问的示例程序

  #defineMAX_BLOCK124

  #defineMAX_CMD8

  structshmbuf{

  inttop;

  intstack[MAX_BLOCK];

  }*shmptr,local;

  charcmdbuf[MAX_CMD];

  voidrelblock(void);

  intgetblock(void);

  voidshowhelp(void);

  voidshowlist(void);

  voidgetcmdline(void);

  if((shmid=shmget(MY_SHMKEY,sizeof(structshmbuf),IPC_CREAT|IPC_EXCL|666))<

  shmid=shmget(MY_SHMKEY,sizeof(structshmbuf),666);

  shmptr=(structshmbuf*)shmat(shmid,,);

  local.top=-1;

  showhelp();

  getcmdline();

  while(strcmp(cmdbuf,"

end\n"

))

  if(!

strcmp(cmdbuf,"

get\n"

  getblock();

  elseif(!

rel\n"

  relblock();

list\n"

  showlist();

help\n"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1