




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上院 系: 计算机科学学院 专 业: 年 级: 课程名称: 操作系统 指导教师: 组 号: 学 号: 姓 名: 2015年5月20日年级 2009专 业 计算机科学与技术班级1组号6实验室9#205日期 2012-5-5实验名称实验二 进程控制与通信管理实验内容1 Linux 系统常用进程管理命令的使用(操作系统观察级)2 Linux 系统常用进程创建与管理的系统调用(原码阅读与系统编程级)3 进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)(原码阅读与系统编程级)4 简单进程通信(管道、消息缓冲、邮件槽等)(原码阅
2、读与系统编程级)小 组 成 员姓名学号组内分工自我评分教师评分 小组成绩评定教师签名: 年 月 日实验分项1 Linux 系统常用进程管理命令的使用(操作系统观察级)实验目的学会基本的Linux 系统常用进程管理命令的使用实验要求具体题目Linux 系统常用进程管理命令的使用系统平台Linux系统实验原理步骤(算法流程)1、ps命令查看权限:作用:ps命令主要查看系统中进程的状态。格式:ps 选项主要选项如下。-A:显示系统中所有进程的信息。-e:显示所有进程的信息。-f:显示进程的所有信息。-l:以长格式显示进程信息。-r:只显示正在
3、运行的进程。-u:显示面向用户的格式(包括用户名、CPU及内存使用情况等信息)。-x:显示所有非控制终端上的进程信息。-p:显示由进程ID指定的进程的信息。-t:显示指定终端上的进程的信息。2、kill命令杀掉进程:作用:kill命令终止一个进程。格式:kill -s signal |-p -apidkill -l signal 主要选项如下。-s:指定发送的信号。-p:模拟发送信号。-l:指定信号的名称列表。pid:要终止的进程的ID号。signal:表示信号。3、bg:后台运行命令:作用:bg命令使一个被挂起的进程在后台执行用法:bg该应用实例如下。(1)将一个大目录的文件进行排序后,将结
4、果输入到一个文件中du -a / | sort -rn > /tmp/du.sorted (2)在命令后使用&符号由于这个命令执行时间很长,可以把它放在后台运行。使用组合键Ctrl Z,然后使用bg命令。如果想直接把这个命令放在后台执行,可以在命令后使用"&"符号:du -a / | sort -rn > /tmp/du.sorted & 1 237
5、;4、fg:挂起程序作用:fg命令使一个被挂起的进程在前台执行。用法:fg job-specjob-spec:后台任务号码。说明:fg命令和bg命令是相对应的。如果想查看后台程序运行情况,可以使用fg命令把它调回前台查看。bg命令可以使多个进程放到后台中执行。应用实例如下。使用fg命令时,要加入后台任务号码,如果不加任何号码,则所变动的均是当前任务。du -a / | sort -rn > /tmp/du.sorted & 1 237 #fg 1 实验结果及分
6、析实验结果截图:心得体会通过这次实验,对进程进行监测和控制的操作及原理有了一定的了解,在实验过程中利用ps命令对进程运行,进程挂起进行查看。了解了如何中断一个前台进程,如何杀掉进程即终止进程,如何使进程后台运行等。 这次实验使我们学会在LINUX系统下使用进程管理命令,认识和掌握了进程管理是如何进行的原理。实验分项2Linux 系统常用进程创建与管理的系统调用(原码阅读与系统编程级)实验目的理解系统常用进程创建与管理的系统调用实验要求具体题目Linux 系统常用进程创建与管理的系统调用系统平台Linux操作命令实验原理步骤(算法流程)#include <sys/types.h>#i
7、nclude <unistd.h>#include <errno.h>#include <stdio.h>int main() pid_t ret; int status,i, role = -1; ret= fork(); if(ret>0) printf("Parent: this is the parent process (pid %d)n",getpid(); for(i=0;i<6;i+) printf("Parent: At count %dn",i); sleep(2); ret = wai
8、t(&status); role = 0; else if(ret = 0) printf("Child: this is the Child process (pid %d)n",getpid(); for(i=0;i<6;i+) printf("Child: At count %dn",i); sleep(2); role = 1; else printf("Parent: Error trying to fork() (%d)n",errno); printf("%s: Exiting.n",(
9、role = 0) ? "Parent" : "Child"); return 0;实验结果及分析实验结果截图:心得体会这次实验使我们学会在LINUX操作系统下使用进程管理命令,对进程的创建,对进程的有效管理及对进程的调用,认识和掌握了进程管理是如何进行的原理。利用gcc对程序进行编译,充分了解编译器调试工具下各自文件类别及指令。实验分项3进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)(原码阅读与系统编程级)实验目的学习并理解进程同步与互斥控制的原理实验要求具体题目进程同步与互斥控制(哲学家吃饭)系统平台linux实验原理步骤(算法流程)由
10、Dijkstra提出并解决的哲学家就餐问题是典型的同步问题。该问题的描述是有五位哲学家公用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五个筷子,他们的生活方式是交替的进行思考和进餐,饥饿时便试图取左右最靠近他的筷子,只有在他拿到两个筷子的时候才能进餐。进餐完毕,放下筷子,继续思考。经分析可知,放在桌子上的筷子是临界资源,在一段时间内允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下:Var chopstick:array0, , 4 of semaphore; 所有信号量均被化为1,第i位哲学家的活动可描述为: Rep
11、eat Wait(chopsticki); Wait(chopstick(i+1)mod5); . . Eat;. . Signal(chopsticki); Signal(chopstick(i+1)mod5);. .Think; Until false;所有哲学家的初始状态为思考方法一:先获取左边筷子,再获取右边筷子,若可以获取则进餐;若不能则放下左边筷子,继续思考。/* * philosopher1.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <
12、pthread.h> #include <semaphore.h> #include <string.h> #define PEOPLE_NUM 5 #define THINKING 1 #define HUNGRY 2 #define EATING 3 #define QUIT 4 sem_t chopsticksPEOPLE_NUM; pthread_mutex_t mutex; pthread_mutex_t m2; void disp(int id, char* msg) pthread_mutex_lock(&mutex); printf(&qu
13、ot;Philosopher%d : %sn",id, msg); pthread_mutex_unlock(&mutex); void *philosopher(void *arg) int id = (int) arg; int state = THINKING; /int right = (id + 1) % PEOPLE_NUM; int right = (id) % PEOPLE_NUM; int left = (id + PEOPLE_NUM - 1) % PEOPLE_NUM; char ptrState64; while(state!=QUIT) switch
14、(state) case THINKING: strcpy(ptrState,"Thinking before eat"); disp(id,ptrState); usleep(300*1000); state = HUNGRY; strcpy(ptrState,"Hungry"); disp(id,ptrState); usleep(50*1000); break; case HUNGRY: strcpy(ptrState,"I want to eat"); disp(id,ptrState); /dec, block if sem
15、aphore is 0 before dec if(sem_wait(&chopsticksleft) = 0)sprintf(ptrState,"L(%d) fetched, R(%d) wanted.", left,right); disp(id,ptrState);/dec, non-block, retrun EAGAIN if semaphore is 0 before dec if(sem_trywait(&chopsticksright) = 0) state = EATING; else state = THINKING; sprintf(p
16、trState,"R(%d) is busy, put down L(%d) and back to think.",right,left); disp(id,ptrState); / inc semaphore sem_post(&chopsticksleft); /printf("Philosopher%d's right chopstick (R-%d) is busyn",id,right); else /This statement won't be executed. printf("Philosopher
17、left chopsticks is busy,left=%d,thread id is %dn",left,id); break; case EATING: printf("Philosopher%d : fetch both chopsticks: (L-%d, R-%d), eatingn",id,left,right); usleep(500*1000); /inc semaphore sem_post(&chopsticksleft); sem_post(&chopsticksright); printf("Philosophe
18、r%d : release both chopsticks: (L-%d, R-%d), quittingn",id,left,right); state = QUIT; break; usleep(1000*1000); pthread_exit(void*)0); int main() pthread_t tidPEOPLE_NUM; int i; pthread_mutex_init(&mutex,NULL); for(i = 0 ; i < PEOPLE_NUM ; i +) sem_init(&chopsticksi,0,1); for(i = 0 ;
19、 i < PEOPLE_NUM ; i +) pthread_create(&tidi,NULL,philosopher,(void*)i); for(i = 0 ; i < PEOPLE_NUM ; i +) pthread_join(tidi,NULL); return 0; 执行结果截屏: 方法二:0-3号哲学家先获取左边筷子,再获取右边筷子;4号哲学家先获取右边筷子,再获取左边筷子。void *philosopher(void *arg) int id = (int) arg; int state = THINKING; /int right = (id
20、 + 1) % PEOPLE_NUM; int right = (id) % PEOPLE_NUM; int left = (id + PEOPLE_NUM - 1) % PEOPLE_NUM; char ptrState64; while(state!=QUIT) switch(state) case THINKING: strcpy(ptrState,"Thinking before eat"); disp(id,ptrState); usleep(300*1000); state = HUNGRY; strcpy(ptrState,"Hungry"
21、); disp(id,ptrState); usleep(50*1000); break; case HUNGRY: strcpy(ptrState,"I want to eat"); disp(id,ptrState); /dec, block if semaphore is 0 before dec if(id!= PEOPLE_NUM - 1) if(sem_wait(&chopsticksleft) = 0) sprintf(ptrState,"L(%d) fetched, R(%d) wanted.", left,right); dis
22、p(id,ptrState); if(sem_wait(&chopsticksright) = 0) state = EATING; else /This statement won't be executed. printf("Philosopher left chopsticks is busy,left=%d,thread id is %dn",left,id); else if(sem_wait(&chopsticksright) = 0) sprintf(ptrState,"R(%d) fetched, L(%d) wanted.
23、", right,left); disp(id,ptrState); if(sem_wait(&chopsticksleft) = 0) state = EATING; else /This statement won't be executed. printf("Philosopher right chopsticks is busy,right=%d,thread id is %dn",right,id); break; case EATING: printf("Philosopher%d : fetch both chopstick
24、s: (L-%d, R-%d), eatingn",id,left,right); usleep(500*1000); /inc semaphore sem_post(&chopsticksleft); sem_post(&chopsticksright); printf("Philosopher%d : release both chopsticks: (L-%d, R-%d), quittingn",id,left,right); state = QUIT; break; usleep(1000*1000); pthread_exit(void
25、*)0); 结果截屏:方法三:偶数号哲学家先获取左边筷子,再获取右边筷子;基数号哲学家先获取右边筷子,再获取左边筷子。 将 if(id!= PEOPLE_NUM - 1) 改为:if(id%2=0) 实验结果截屏: 实验结果及分析 心得体会在多道程序环境下,进程同步问题十分重要,也是相当有趣的问题。通过学习和研究“哲学家就餐”问题,我理解了进程同步的概念及其实现方法以及linux的多线程处理机制。总之,此次实验收获颇多。实验分项4简单进程通信(管道、消息缓冲、邮件槽等)(原码阅读与系统编程级)实验目的学习并理解简单进程管道通信实验要求具体题目简单进程通信系统平台windows xp实验原理步骤(算法流程)实现进程的管道通信c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初一数学期末试卷及答案
- 形容词考试题及答案
- 工业工程领域能代表新质生产力
- 辽宁省沈阳市重点高中联合体2023-2024学年高三上学期期中考试 物理(含答案)
- UG三维建模说课课件
- the-red-dog课件教学课件
- TFBOYS课件制作教学课件
- 《供应链管理》课件-课程思政主题培训
- SMT车间安全管理培训课
- 广东省深圳市龙岗区2024-2025学年七年级上学期语文第一次月考试卷(含答案)
- 学校教育用地土地租赁合同
- 药房用药小知识培训课件
- 乳腺癌图文课件版
- 大学意识形态安全教育
- 原材料不合格预防措施
- 2024-2025年江苏专转本英语历年真题(含答案)
- 高压氧护理进修汇报
- 中国神经病理性疼痛诊疗指南(2024版)解读
- 2024年微信小程序开发与代运营合同
- 2024国有企业与私营企业之间的混合所有制改革合作协议
- 【电气施工】工业厂房机电安装工程施工组织设计方案
评论
0/150
提交评论