实验报告课程名称操作系统实验项目进程管理实验仪器台式电脑系别计算机科学与技术系专业计算机科学与技术班级/学号*学生姓名*实验日期2018年12月26日成绩指导教师*实验一进程管理实验时数:4学时实验类别:设计型实验批次:1批,1人/组实验地点:健翔校区计算中心一、实验目的1.掌握进程的概念,理解进程创建过程,能够使用系统调用完成进程创建,形成多个进程并发的环境。2.掌握进程控制方法。通过调用相关的系统调用,对进程实现睡眠、同步、撤销等控制。3.进一步认识并发执行的实质,分析进程竞争资源的现象,学习避免死锁的方法。二、实验环境操作系统:任何Unix/Linux及SunSolaris或windows系列应用系统:gcc编译器。若OS为windows系列,则还需相应的模拟环境三、实验内容哲学家进餐问题。问题描述:五位哲学家围坐在一个圆桌周围,每人面前有一只碗,各碗之间分别有一根筷子,餐桌如下图。哲学家的生活包括两种活动:吃面条和思考。当哲学家感到饥饿时,他就分两次去取他左边和右边的筷子,每次拿一根(不能强行从邻座手中抢过筷子),如果成功,他就开始吃面条,吃完后把筷子放回原处继续思考。采用C语言编写Linux控制台程序,对并发环境中的5个哲学家进程进行演示。问题分析:这是一个典型的避免死锁的问题,涉及操作系统中的互斥和同步、死锁和饥饿。可以采用以下方法避免死锁发生:最多只允许4个哲学家同时进餐,以保证有一人能够进餐。四、实验代码:#includemysemop.h#includestdlib.h#includestdio.h#includesignal.hintroom_sem_id=0;intchopsticks_sem_id[5];intmain(intargc,charargv[]){pid_tpid;//pid_t为int型、进程号类型pid_tchldpid[5];inti=0;charch;//创建一个信号量room_sem_id=CreateSem(4);for(i=0;i5;i++){chopsticks_sem_id[i]=CreateSem(1);}for(i=0;i5;i++){pid=fork();//fork()函数返回一个进程号if(pid0){fprintf(stderr,Whenforphilosopher%dFailed!\n,i);exit(-1);}if(pid==0){chldpid[i]=getpid();while(1){printf(哲学家%d思考ing\n,i+1);sleep(1);Psem(room_sem_id);printf(哲学家%dhungry,进入房间准备eating\n,i+1);Psem(chopsticks_sem_id[i]);printf(哲学家%d拿起左边的筷子\n,i+1);Psem(chopsticks_sem_id[(i+1)%5]);printf(哲学家%d拿起右边的筷子\n,i+1);printf(哲学家%deating\n,i+1);sleep(5-i);Vsem(chopsticks_sem_id[(i+1)%5]);printf(哲学家%d放下右边的筷子\n,i+1);Vsem(chopsticks_sem_id[i]);printf(哲学家%d放下左边的筷子\n,i+1);Vsem(room_sem_id);printf(哲学家%d离开房间并继续思考\n,i+1);sleep(1);}}else{chldpid[i]=pid;}}ch=getchar();do{ch=getchar();}while(ch!='q');for(i=0;i5;i++){kill(chldpid[i],SIGTERM);DeleteSem(chopsticks_sem_id);}DeleteSem(room_sem_id);return0;}五、实验截图:六、实验总结通过本次实验,掌握了进程的概念,理解了进程创建过程,能够使用系统调用完成进程创建,形成多个进程并发的环境;掌握了进程控制方法,通过调用相关的系统调用,对进程实现睡眠、同步、撤销等控制;进一步认识并发执行的实质,分析进程竞争资源的现象,学会了避免死锁的方法。在老师和同学的帮助下,我成功解决了我的一些问题和困惑,使我对操作系统更加感兴趣,也为今后的学习生活奠定了基础。七、课后问答题1:分析哲学家进餐问题,什么情况下会发生死锁?答:当所有哲学家都拿起左手或右手边筷子的时候就会产生死锁。2:本实验所采用方法可以避免死锁,试问:是否还有其他对抗死锁发生的方法,比较它们的优缺点。答:(1)最多只允许4个哲学家同时拿起筷子,从而保证一人可以进餐(2)仅当某哲学家面前的左、右两只筷子均可以用时候,才允许拿起筷子(3)奇数号拿左边的筷子,偶数号拿右边的筷子(1)最简单,(2)最保险实用但等待时间较长