收藏 分享(赏)

北邮-大三-操作系统-进程管理实验报告.doc

上传人:HR专家 文档编号:8483260 上传时间:2019-06-29 格式:DOC 页数:11 大小:106.50KB
下载 相关 举报
北邮-大三-操作系统-进程管理实验报告.doc_第1页
第1页 / 共11页
北邮-大三-操作系统-进程管理实验报告.doc_第2页
第2页 / 共11页
北邮-大三-操作系统-进程管理实验报告.doc_第3页
第3页 / 共11页
北邮-大三-操作系统-进程管理实验报告.doc_第4页
第4页 / 共11页
北邮-大三-操作系统-进程管理实验报告.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、1/11实验一 进程管理1实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)了解 Linux 系统中进程通信的基本原理。2实验预备内容(1)阅读 Linux 的 sched.h 源码文件,加深对进程管理概念的理解;(2)阅读 Linux 的 fork()源码文件,分析进程的创建过程。3实验内容(1)进程的创建:编写一段程序,使用系统调用 fork() 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符

2、“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。源代码如下:#include#include#include#include #include int main(int argc,char* argv)pid_t pid1,pid2;pid1 = fork();if(pid1#include#include#include #include int main(int argc,char* argv)pid_t pid1,pid2;pid1 = fork();if(pid1#include#include#include #include 5/11#include int wf;void

3、 waiting()while(wf!=0);void stop()wf = 0;int main(int argc,char* argv)pid_t pid1,pid2;pid1 = fork();if(pid1#include#include#include #include int main(int argc,char* argv)pid_t pid1,pid2;int fd2;char parbuf50,childbuf50;pipe(fd);/建立管道pid1 = fork();if(pid10)fprintf(stderr,“childprocess2 failed“);exit(

4、-1);else if(pid1 = 0)lockf(fd1,1,0);sprintf(childbuf,“Child 2 is sending a message!n“);write(fd1,childbuf,50);/向管道中写东西sleep(5);lockf(fd1,0,0);exit(0);else9/11pid2 = fork();if(pid20)fprintf(stderr,“childprocess1 failed“);exit(-1);else if(pid2 = 0)lockf(fd1,1,0);sprintf(childbuf,“Child 1 is sending a

5、message!n“);write(fd1,childbuf,50);/向管道中写东西sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);/等待某个子进程结束read(fd0,parbuf,50);/从管道中读东西printf(“%s“,parbuf);wait(0);/等待某个子进程结束 read(fd0,parbuf,50);/从管道中读东西printf(“%s“,parbuf);exit(0);return 0;运行结果如下:值得注意的是,pipe(fd);pid1 = fork();这两句的位置不能调换,否则会出现下面结果:10/11也就是说,只有子

6、进程 1 向通过管道向父进程发送信息,且程序一直不退出。用 strace 命令追查,可发现如果先 fork,那么在 fork 之后就是两个独立的进程,在两个独立进程中分别调用 pipe 得到的是两个独立的 fd 数组,向子进程的 fd1写 入,从父进程的fd0读取,父进程会堵在 read 上,因为根本就没有进程在写父进程的 fd1 。4思考(1)系统是怎样创建流程的?系统通过调用 fork 函数创建进程,当一个进程调用了 fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程 ID和父 进程 ID,其他的都是一样.就象符进程 克隆(clone)自己一样.而此时子进程也与父

7、进程分道扬镳,各自执行自己的操作。至于先执行子进程,还是先执行父进程,取决去内核的调度算法。 一旦子进程被创建,父子进程相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用 wait或者 waitpid 系统调用. (2)可执行文件加载时进行了哪些处理?注册一个可执行文件的加载模块(包含信息:链表 list,所属的 module,加载可执行文件,加载共享库) ,然后遍历链表,依次按 module 加载这个可执行文件 (3)当首次调用新创建进程时,其入口在哪里?在进程队列的 ready 状态下,由离自己最近的父进程执行调度,即入口在最近的父进程处

8、。 (4)进程通信有什么特点?(针对管道通信)只支持单向数据流;只能用于具有亲缘关系的进程之间;没有名字;管道的缓冲区是 有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小) ;管道所传送的是无格式字节流,这就要求管道的读出方和写入方 必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;总结通过这次实验,让我对操作系统进程这一章的内容有了更深入的理解。此次实验有四部分组成。第一部分的重点是进程创建。在 linx 操作11/11系统中,进程的创建需要调用 fork 函数。此函数调用一次,返回两次。第二部分的重点进程互斥。所谓的进程互斥,是指两 个 或 两 个

9、 以 上 的 进程 ,不 能 同 时 进 入 关 于 同 一 组 共 享 变 量 的 临 界 区 域 。 通 过 编 程 , 能 更加 理 解 这 个 概 念 。 进 程 互 斥 通 过 lockf()来 实 现 。 第 三 部 分 的 重 点 是通 过 kill()函 数 和 signal()函 数 深 入 理 解 进 程 的 之 间 的 软 中 断 。 前者 是 发 送 软 中 断 信 号 , 后 者 是 接 收 软 中 断 信 号 。 第 四 部 分 的 重 点 是 通过 pipe()函 数 理 解 进 程 之 间 的 管 道 通 信 。此次实验,还让我学到了一些调试方法。其中一个就是 strace,即追查程序中的函数调用。在管道通信中,fork()和 pipe()这个函数的顺序不能随意调换。调换了之后引起的问题(程序一直不退出)可以用strace 命令来追查,发现是父进程 block 在 read()上面,即父进程不知道从哪里读取信息。进而再通过查阅资料可知,是 fork()和 pipe()函数的顺序问题。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报