操作系统—进程管理
- 格式:doc
- 大小:208.50 KB
- 文档页数:9
实验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);
}