实验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
int pid1,pid2;
printf(\
pid1=fork(); if(pid1 < 0 ) {
printf(\ return 1; }
else if (pid1 == 0 ) {
printf(\ return ; }
int r=kill( pid1, SIGKILL); if( r ) {
printf(\ } else {
printf(\ }
pid2=fork(); if( pid2<0 ) {
printf(\ return 1; }
else if(pid2==0)
1
{
printf(\ return 0 ; }
if(execlp(\ {
printf(\ return 1; } else
printf(\ return ; }
【实验结果】
运行结果如下:
分析:如图,调用了fork()函数后,程序先创建了子进程,然后调用kill函数杀死进程1,再创建进程2,然后调用execp函数切换当前进程为ls命令,列出当前文件。
2.采用写者优先重写P94的读者-写者问题,并通过一个读写序列,将算法与读者优先算法进行比较。 代码如下:
#include \
2
#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(\ data = rd; }
void read() {
printf(\ }
void * writer(void * in) {
while(1) {
pthread_mutex_lock(&accessWriterCnt);
{//临界区,希望修改 writerCnt,独占 writerCnt writerCnt++;
if(writerCnt == 1){
//阻止后续的读者加入待读队列 pthread_mutex_lock(&readerLock); }
3
}
pthread_mutex_unlock(&accessWriterCnt);
pthread_mutex_lock(&writeLock);
{//临界区,限制只有一个写者修改数据 write(); }
pthread_mutex_unlock(&writeLock);
pthread_mutex_lock(&accessWriterCnt);
{//临界区,希望修改 writerCnt,独占 writerCnt writerCnt--;
if(writerCnt == 0){
//阻止后续的读者加入待读队列 pthread_mutex_unlock(&readerLock); } }
pthread_mutex_unlock(&accessWriterCnt); sleep(W_SLEEP); }
pthread_exit((void *) 0); }
void * reader (void * in) {
while(1) {
//假如写者锁定了readerLock,那么成千上万的读者被锁在这里 pthread_mutex_lock(&outerLock); {//临界区
pthread_mutex_lock(&readerLock);//只被一个读者占有 {//临界区
pthread_mutex_lock(&accessReaderCnt);//代码段 1 {//临界区
readerCnt++;
if(readerCnt == 1){
pthread_mutex_lock(&writeLock); } }
pthread_mutex_unlock(&accessReaderCnt);
4
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库操作系统—进程管理在线全文阅读。
相关推荐: