您好,欢迎访问三七文档
第1页院系:计算机科学学院专业:年级:课程名称:操作系统指导教师:组号:学号:姓名:2015年5月20日第2页年级2009专业计算机科学与技术班级1组号6实验室9#205日期2012-5-5实验名称实验二进程控制与通信管理实验内容1Linux系统常用进程管理命令的使用(操作系统观察级)2Linux系统常用进程创建与管理的系统调用(原码阅读与系统编程级)3进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)(原码阅读与系统编程级)4简单进程通信(管道、消息缓冲、邮件槽等)(原码阅读与系统编程级)小组成员姓名学号组内分工自我评分教师评分小组成绩评定教师签名:年月日第3页实验分项1Linux系统常用进程管理命令的使用(操作系统观察级)实验目的学会基本的Linux系统常用进程管理命令的使用实验要求具体题目Linux系统常用进程管理命令的使用系统平台Linux系统实验原理步骤(算法流程)1、ps命令查看权限:作用:ps命令主要查看系统中进程的状态。格式:ps[选项]主要选项如下。-A:显示系统中所有进程的信息。-e:显示所有进程的信息。-f:显示进程的所有信息。-l:以长格式显示进程信息。-r:只显示正在运行的进程。-u:显示面向用户的格式(包括用户名、CPU及内存使用情况等信息)。-x:显示所有非控制终端上的进程信息。-p:显示由进程ID指定的进程的信息。-t:显示指定终端上的进程的信息。2、kill命令杀掉进程:作用:kill命令终止一个进程。格式:kill[-ssignal|-p][-a]pid…kill-l[signal]主要选项如下。-s:指定发送的信号。-p:模拟发送信号。-l:指定信号的名称列表。第4页pid:要终止的进程的ID号。signal:表示信号。3、bg:后台运行命令:作用:bg命令使一个被挂起的进程在后台执行用法:bg该应用实例如下。(1)将一个大目录的文件进行排序后,将结果输入到一个文件中#du-a/|sort-rn/tmp/du.sorted(2)在命令后使用&符号由于这个命令执行时间很长,可以把它放在后台运行。使用组合键CtrlZ,然后使用bg命令。如果想直接把这个命令放在后台执行,可以在命令后使用&符号:#du-a/|sort-rn/tmp/du.sorted&[1]2374、fg:挂起程序作用:fg命令使一个被挂起的进程在前台执行。用法:fg[job-spec][job-spec]:后台任务号码。说明:fg命令和bg命令是相对应的。如果想查看后台程序运行情况,可以使用fg命令把它调回前台查看。bg命令可以使多个进程放到后台中执行。应用实例如下。使用fg命令时,要加入后台任务号码,如果不加任何号码,则所变动的均是当前任务。#du-a/|sort-rn/tmp/du.sorted&[1]237#fg1第5页第6页实验结果及分析实验结果截图:心得体会通过这次实验,对进程进行监测和控制的操作及原理有了一定的了解,在实验过程中利用ps命令对进程运行,进程挂起进行查看。了解了如何中断一个前台进程,如何杀掉进程即终止进程,如何使进程后台运行等。这次实验使我们学会在LINUX系统下使用进程管理命令,认识和掌握了进程管理是如何进行的原理。第7页实验分项2Linux系统常用进程创建与管理的系统调用(原码阅读与系统编程级)实验目的理解系统常用进程创建与管理的系统调用实验要求具体题目Linux系统常用进程创建与管理的系统调用系统平台Linux操作命令实验原理步骤(算法流程)#includesys/types.h#includeunistd.h#includeerrno.h#includestdio.hintmain(){pid_tret;intstatus,i,role=-1;ret=fork();if(ret0){printf(Parent:thisistheparentprocess(pid%d)\n,getpid());for(i=0;i6;i++){printf(Parent:Atcount%d\n,i);sleep(2);}ret=wait(&status);role=0;}elseif(ret==0){printf(Child:thisistheChildprocess(pid%d)\n,getpid());for(i=0;i6;i++){printf(Child:Atcount%d\n,i);sleep(2);}role=1;}else{printf(Parent:Errortryingtofork()(%d)\n,errno);}printf(%s:Exiting...\n,((role==0)?Parent:Child));return0;第8页实验结果及分析}实验结果截图:心得体会这次实验使我们学会在LINUX操作系统下使用进程管理命令,对进程的创建,对进程的有效管理及对进程的调用,认识和掌握了进程管理是如何进行的原理。利用gcc对程序进行编译,充分了解编译器调试工具下各自文件类别及指令。第9页实验分项3进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)(原码阅读与系统编程级)实验目的学习并理解进程同步与互斥控制的原理实验要求具体题目进程同步与互斥控制(哲学家吃饭)系统平台linux实验原理步骤(算法流程)由Dijkstra提出并解决的哲学家就餐问题是典型的同步问题。该问题的描述是有五位哲学家公用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五个筷子,他们的生活方式是交替的进行思考和进餐,饥饿时便试图取左右最靠近他的筷子,只有在他拿到两个筷子的时候才能进餐。进餐完毕,放下筷子,继续思考。经分析可知,放在桌子上的筷子是临界资源,在一段时间内允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下:Varchopstick:array[0,…,4]ofsemaphore;所有信号量均被化为1,第i位哲学家的活动可描述为:RepeatWait(chopstick[i]);Wait(chopstick[(i+1)mod5]);..Eat;..Signal(chopstick[i]);Signal(chopstick[(i+1)mod5]);..Think;Untilfalse;所有哲学家的初始状态为思考第10页方法一:先获取左边筷子,再获取右边筷子,若可以获取则进餐;若不能则放下左边筷子,继续思考。/**philosopher1.c*/#includestdio.h#includestdlib.h#includeunistd.h#includepthread.h#includesemaphore.h#includestring.h#definePEOPLE_NUM5#defineTHINKING1#defineHUNGRY2#defineEATING3#defineQUIT4sem_tchopsticks[PEOPLE_NUM];pthread_mutex_tmutex;pthread_mutex_tm2;voiddisp(intid,char*msg){pthread_mutex_lock(&mutex);printf(Philosopher[%d]:%s\n,id,msg);pthread_mutex_unlock(&mutex);}void*philosopher(void*arg){intid=(int)arg;intstate=THINKING;//intright=(id+1)%PEOPLE_NUM;intright=(id)%PEOPLE_NUM;intleft=(id+PEOPLE_NUM-1)%PEOPLE_NUM;charptrState[64];while(state!=QUIT){switch(state){caseTHINKING:strcpy(ptrState,Thinkingbeforeeat);disp(id,ptrState);第11页usleep(300*1000);state=HUNGRY;strcpy(ptrState,Hungry);disp(id,ptrState);usleep(50*1000);break;caseHUNGRY:strcpy(ptrState,Iwanttoeat);disp(id,ptrState);//dec,blockifsemaphoreis0beforedecif(sem_wait(&chopsticks[left])==0){sprintf(ptrState,L(%d)fetched,R(%d)wanted.,left,right);disp(id,ptrState);//dec,non-block,retrunEAGAINifsemaphoreis0beforedecif(sem_trywait(&chopsticks[right])==0){state=EATING;}else{state=THINKING;sprintf(ptrState,R(%d)isbusy,putdownL(%d)andbacktothink.,right,left);disp(id,ptrState);//incsemaphoresem_post(&chopsticks[left]);//printf(Philosopher[%d]'srightchopstick(R-%d)isbusy\n,id,right);}}else{//Thisstatementwon'tbeexecuted.printf(Philosopherleftchopsticksisbusy,left=%d,threadidis%d\n,left,id);}break;caseEATING:printf(Philosopher[%d]:fetchbothchopsticks:(L-%d,R-%d),eating\n,id,left,right);usleep(500*1000);//incsemaphoresem_post(&chopsticks[left]);sem_post(&chopsticks[right]);printf(Philosopher[%d]:releasebothchopsticks:(L-%d,R-%d),quitting\n,id,left,right);state=QUIT;break;}usleep(1000*1000);}第12页pthread_exit((void*)0);}intmain(){pthread_ttid[PEOPLE_NUM];inti;pthread_mutex_init(&mutex,NULL);for(i=0;iPEOPLE_NUM;i++){sem_init(&chopsticks[i],0,1);}for(i=0;iPEOPLE_NUM;i++){pthread_create(&tid[i],NULL,philosopher,(void*)i);}for(i=0;iPEOPLE_NUM;i++){pthread_join(tid[i],NULL);}return0;}执行结果截屏:第13页方法二:0-3号哲学家先获取左边筷子,再获取右边筷子;4号哲学家先获取右边筷子,再获取左边筷子。void*philosopher(void*arg){intid=(int)arg;intstate=THINKING;//intright=(id+1)%PEOPLE_NUM;intright=(id)%PEOPLE_NUM;intleft=(id+PEOPLE_NUM-1)%PEOPLE_NUM;charptrState[64];while(state!=QUIT){switch(state){caseTHINKING:strcpy(ptrState,Thinkingbeforeeat)
本文标题:操作系统实验2
链接地址:https://www.777doc.com/doc-5308040 .html