实验一、进程管理

该实验旨在深化对Linux进程管理的理解,包括进程创建、控制、互斥、通信及调度。通过编写程序,学生实践fork()、lockf()、signal()、kill()等系统调用,模拟并发执行、互斥锁、软中断通信和管道通信。实验还涉及自定义的优先数调度算法,展示了进程状态的动态变化。
摘要由CSDN通过智能技术生成

实验一、进程管理

一、实验目的与要求

1、加深对进程的理解,明确进程和程序的区别。
2、进一步认识并发执行的实质。
3、分析进程争用资源的现象,学习解决进程互斥的方法。
4、了解Linux系统中进程通信的基本原理。

二、实验预备内容

1、阅读Linux 的sched.h源代码文件,加深对进程管理概念的理解。
2、阅读Linux 的fork.c源代码文件,分析进程的创建过程。

三、实验内容(程序代码及运行结果、分析)

1、进程的创建

<任务>:编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。
<程序代码>(见实验指导教材)

2、进程的控制

〈任务〉:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。
如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
<程序代码>(见实验指导教材)

3、软中断通信

① 编制一段程序,使其实现进程的软中断通信。
要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL信号,按下ctrl+C);当捕捉到中断信号后,父进程调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child Processl1 is Killed by Perent!
Child Processl2 is Killed by Perent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Perent Process is Killed!
<程序代码>(见实验指导教材)
② 在上面的程序中增加语句signal(SIGNIT, SIG-IGN)和 signal(SIGQUIT,SIG-IGN),观察执行结果,并分析原因。

4、进程的管道通信

编制一段程序,实现进程的管道通信。
使用系统调用pipe()建立一条管道线;两个子进程p1和p2分别向管道各写一句话: Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
<程序代码>(略)

5、进程调度

①设计一个按优先数调度算法实现处理机调度的程序
假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
②在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
③为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:
队首标志
K2
K1 P1 K2 P2 K3 P3 K4 P4 K5 P5
0 K4 K5 K3 K1
2 3 1 2 4
1 5 3 4 2
R R R R R
PCB1 PCB2 PCB3 PCB4 PCB5
在这里插入图片描述

④处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1 要求运行时间-1 来模拟进程的一次运行。
提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。
⑤进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。
⑥若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
⑦在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。
⑧为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。

四、思考

(1)系统是怎样创建流程的?
(2)可执行文件加载时进行了哪些处理?
(3)当首次调用新创建进程时,其入口在哪里?
(4)进程通信有什么特点?
(5)如果在一个进程中调用了一次lockf(),结果会如何?
(6)pipe()是建立管道线,具体的空间大小有限制吗?能否改变管道的两个端口?

五、实验小结:

本次实验主要是练习系统调用中的进程的创建。在实验前必须要先预习有关的函数,如:fork()、sleep。

实验过程

第一个实验
我运行到这里,还是看着老师打的,为什么就有错误呢,就是打不开GEDIT
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上Claire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值