操作系统实验题目之进程控制(含c语言代码)

① 编写一段程序,实现进程的软中断通信。

   要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
   Child Processll is Killed by Parent!
   Child Processl2 is Killed by Parent!
   父进程等待两个子进程终止后,输出如下的信息后终止
   Parent Process is Killed!

解答:
源代码:
Fork.c:
操作系统实验题目之进程控制(含c语言代码)_第1张图片
Fork2.c
操作系统实验题目之进程控制(含c语言代码)_第2张图片
相关操作界面和运行结果界面截图:
操作系统实验题目之进程控制(含c语言代码)_第3张图片

判定顺序不同,pid不同 原因: pid=fork() ;
fork函数是通过系统调用创建一个与原来相似的进程,同时返回两个值,父进程返回的是新创建子进程的进程id,子进程返回的是0,若出现错误,fork返回一个负值。

② 在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN), 观察执行结果,并分析原因。

解答:
源代码

Process.c
操作系统实验题目之进程控制(含c语言代码)_第4张图片
操作系统实验题目之进程控制(含c语言代码)_第5张图片
操作系统实验题目之进程控制(含c语言代码)_第6张图片
不加signal(SIGINT,SIG_IGN)的process_ignore.c的代码:
操作系统实验题目之进程控制(含c语言代码)_第7张图片
相关操作界面和运行结果界面截图:

操作系统实验题目之进程控制(含c语言代码)_第8张图片
在这里插入图片描述不加signal(SIGINT,SIG_IGN);
操作系统实验题目之进程控制(含c语言代码)_第9张图片
原因:

signal (SIGNAL, SIG-IGN) 和 signal (SIGQUIT,
SIG-IGN)系统调用可以阻塞信号通道的接收,影响改变各子进程之间的中断次序。SIGINT ,程序终止信号,
在用户键入INTR字符(通常是Ctrl+C)时发出,用于通知前台进程组终止进程。SIGQUIT ,和SIGINT类似,
但由QUIT字符(通常是Ctrl+)来控制. 进程在因收到SIGQUIT退出时会产生core文件,
在这个意义上类似于一个程序错误信号。当使用Ctrl+C时,signal函数会接收到中断信号,并结束进程,当注释掉子进程的signal函数后,子进程中不能再接收中断信号,所以只有父进程接收到了中断信号,父进程被结束。

2.求100000个浮点数(精确小数点右4位)的平均值(和、最大值、最小值)。

要求: ① 随机生成100000个浮点数(父进程); ② 创建4个子进程,分别求25000个浮点数之和; ③ 父进程完成100000个浮点数之和并打印结果; ④ 统计顺序计算的时间和多个进程采用多道程序设计完成计算的时间。

解答:
源代码
Sigle_process.c
操作系统实验题目之进程控制(含c语言代码)_第10张图片Multi_process.c
操作系统实验题目之进程控制(含c语言代码)_第11张图片

操作系统实验题目之进程控制(含c语言代码)_第12张图片
相关操作界面和运行结果界面截图如下:
单线程注释掉sleep(1):
操作系统实验题目之进程控制(含c语言代码)_第13张图片
单线程未注释掉sleep(1)
操作系统实验题目之进程控制(含c语言代码)_第14张图片
多线程注释掉sleep(1)
操作系统实验题目之进程控制(含c语言代码)_第15张图片
多线程未注释掉sleep(1)
操作系统实验题目之进程控制(含c语言代码)_第16张图片
分析:

对比单线程在注释掉解锁和加锁代码前后,注释前运行1.0291,注释后运行1.0055,可见解锁加锁对进程的运行时间有影响,加锁后运行时间会延长。在sleep(1)下,对比多线程和单线程,多线程运行1.1272,单线程运行1.0291,单线程运算比多线程快,因为多线程要将100000个浮点数化为4部分分别进行计算,sleep了4次,而单线程只sleep了1次,另外启动线程也需要一定时间,故单线程要快一些。在多线程中,对比注释掉sleep(1)前后,注释前运行1.1272,注释后运行0.1267,明显注释掉后运行时间更短,可见sleep时间会影响线程的运行速度。分配的CPU资源是一定的,多线程只是轮流抢占CPU,并不会真正提高处理速度。这意味着,多线程的作用主要在于提高了并发数量。但是多线程由于轮换使用CPU,会造成单个线程的执行速度变慢。而且在时间片轮转的时候,频繁切换线程也会造成一定的时间浪费。但是在多CPU的服务器上,多线程就很有优势了,它不但能提高并发数量,而且能提高处理速度。因为在多CPU的服务器上,CPU调度很灵活,当一个线程占用着一个CPU的时候,其他线程可以被分配给其他CPU去处理

你可能感兴趣的:(操作系统,操作系统)