操作系统—进程管理

  • 格式:doc
  • 大小:208.50 KB
  • 文档页数:9

下载文档原格式

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

实验3:进程管理

【实验目的】

掌握进程的概念,深入理解进程的含义。认识并理解并发环境中进程执行的实质问题,了解构成并发机制的进程创建过程;

了解在进程创建后通过对进程控制的系统调用,可实现对进程的有效控制。掌握在进程执行中对进程进行睡眠、同步、撤消等控制方法;

分析进程竞争资源的现象,学习解决进程互斥的方法。

【实验内容】

1、创建新的进程;查看运行进程;换出某个进程;杀死运行进程。

2、采用写者优先重写P94的读者-写者问题,并通过一个读写序列,将算法与读者优先算法进行比较。

3、P98的53题的上机作业。

【实验原理】

回答以下问题:

1.简述调用fork创建新进程的过程

Unix系统中,fork属于系统调用,会创建一个与调用相同的副本,在调用了fork之后,这两个进程(父进程和子进程)拥有相同的存储映像,同样的环境字符串和同样的打开文件。通常,子进程接着执行execve或一个类似的系统调用,以修改其存储映像并运行一个新的程序。

2.简述信号量的作用及使用方法

作用:多进程资源共享时,使用信号量,避免死锁。

使用方法:信号量大于或等于0表示可供并发进程使用的资源实体数;小于0代表正在等待使用临界区的进程数;用于互斥的信号量初始值应该大于0;只能通过P ,V 原语操作而改变。

【实验环境】

硬件环境

单核CPU

软件环境

Ubuntu

【实验过程】

1、创建新的进程:使用fork()函数

查看运行进程&换出某个进程:使用execp换出进程,并且用ls来替换以达到查看进程的效果

杀死运行进程:在父进程后使用kill函数

代码:

1.代码如下

#include

#include

#include

#include

int main()

{

int pid1,pid2;

printf("the father process:ppid=%d\n",getppid());

pid1=fork();

if(pid1 < 0 )

{

printf("fail to create child1 ! ; \n");

return 1;

}

else if (pid1 == 0 )

{

printf("child1 process:pid1=%d\n",getpid());

return ;

}

int r=kill( pid1, SIGKILL);

if( r )

{

printf("kill fail\n");

}

else

{

printf("child1(pid=%d) is killed!\n", pid1);

}

pid2=fork();

if( pid2<0 )

{

printf("fail to create child2 \n");

return 1;

}

else if(pid2==0)

{

printf("child2 process:pid2=%d\n",getpid());

return 0 ;

}

if(execlp("/bin/ls","ls","-al",(char*)NULL) == -1)

{

printf("execlp error\n");

return 1;

}

else

printf("execlp succeed\n");

return ;

}

【实验结果】

运行结果如下:

分析:如图,调用了fork()函数后,程序先创建了子进程,然后调用kill函数杀死进程1,再创建进程2,然后调用execp函数切换当前进程为ls命令,列出当前文件。

2.采用写者优先重写P94的读者-写者问题,并通过一个读写序列,将算法

与读者优先算法进行比较。

代码如下:

#include "stdio.h"

#include

#include

#define N_WRITER 2 //写者数目

#define N_READER 10 //读者数目

#define W_SLEEP 10 //控制写频率

#define R_SLEEP 8//控制读频率

pthread_t wid[N_WRITER],rid[N_READER];

const int MAX_RAND = 1000;//产生的最大随机数

int data = 0;

int readerCnt = 0, writerCnt = 0;

pthread_mutex_t accessReaderCnt = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t accessWriterCnt = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t writeLock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t readerLock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t outerLock = PTHREAD_MUTEX_INITIALIZER;

void write()

{

int rd = rand()%MAX_RAND;

printf("write %d\n",rd);

data = rd;

}

void read()

{

printf("read %d\n",data);

}

void * writer(void * in)

{

while(1)

{

pthread_mutex_lock(&accessWriterCnt);

{//临界区,希望修改writerCnt,独占writerCnt

writerCnt++;

if(writerCnt == 1){

//阻止后续的读者加入待读队列

pthread_mutex_lock(&readerLock);

}