进程控制编程预习

1.为什么需要多进程,为何需要并发

有了并发技术,就是可以在同一时间同时执行多条任务的技术,程序不仅可以规规矩矩的一条线执行,可以多条线同时执行,这样就可以实现更加强大的功能,提供更多的服务,所以并发是必不可少的。


2.何谓进程调度

在linux中,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当这个正在运行的进程时间耗尽,或执行完毕退出,或因某种原因暂停,linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,从使用者的角度看,就好像多个进程同时运行一样。


3.kill,killall,pkill,xkill的区别

kill的应用是和ps 或pgrep 命令结合在一起使用的;
kill 的用法:
kill [信号代码]   进程ID
注:信号代码能省略;我们常用的信号代码是 -9 ,表示强制终止;

对于僵尸进程,能用kill -9 来强制终止退出;
比如一个程式已完全死掉,如果kill 不加信号强度是没有办法退出,最佳的办法就是加信号强度 -9 


killall 通过程式的名字,直接杀死所有进程,咱们简单说一下就行了。
用法:killall 正在运行的程式名
killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程式在运行;


pkill 和killall 应用方法差不多,也是直接杀死运行中的程式;如果你想杀掉单个进程,请用kill 来杀掉。
应用方法:
#pkill    正在运行的程式名


xkill 是在桌面用的杀死图像界面的程式。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。当xkill运行时出来和个人脑骨的图标,哪个图像程式崩溃一点就OK了。如果你想终止xkill ,就按右键取消;
xkill 调用方法:
[vivian@localhost vivian]$ xkill


4.linux进程的三态是哪些

1.就绪状态,Ready, 当进程已分配到除cpu以外的所有必要的资源,只要获得处理器便可以立即执行,这时的进程状态称为就绪状态。

2.执行状态,Running, 当进程已获得处理器,其程序正在处理器上执行,此时的进程状态称为执行状态。

3.阻塞状态,Blocked, 正在执行的过程,由于等待某个进程发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可以有多种,如等待I/O完成,申请缓冲区不能满足,等待信号等。


5.三种状态是如何转换的

1.就绪->执行。 处于就绪状态的进程,当进程调度程序为之分配了处理器后,该进程就绪状态转变成执行状态。

2.执行->就绪。 处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理器,于是进程就从执行状态转变为就绪状态。

3.执行->阻塞。 正在执行的进程因等待某种事情发生而无法继续执行时,便从执行状态变成阻塞状态。

4.阻塞->就绪。 处于阻塞状态的进程,若其等待的事情已经发生,于是进程由阻塞状态转变为就绪状态。


6.进程调度用来做什么?
(1)进程调度记录者系统中所有进程的有关情况和状态特征

(2)进程调度负责从就绪队列中选取一个就绪进程、分配给CPU并决定它运行多长时间。

(3)在进程的开始和结速阶段,进程调度实施处理机的分配与回收、修改PCB表项等。

7.什么时候发生进程调度?
(1)当新进程建立时,调度算法可以合理地选择运行父进程或者子进程。

(2)在有进程退出时,必须从就绪队列中引入新进程,如果就绪队列为空,通常运行系统提供的空闲进程。

(3)当一个进程因为I/O阻塞或其他原因阻塞时,必须选择另一个进程。

(4)在分时系统中,如果时间片用完,也要进行调度。


8.进程调度算法
(1)先到先服务(FCFS)算法。FCFS算法就是每次从就绪队列中选择一个最先进入该队列的进程,把CPU分配给它。

(2)时间片轮转(TRR)算法。TRR算法主要用于分时系统中的进程调度。每当执行进程调度时,总是从就绪队列队首选出进程,让它在CPU上运行一个时间片的时间,当进程用完它的时间片之后,系统计时器发出时钟中断,该进程停止并被放到就绪队列的队尾,然后CPU分配给下一个进程,重复以上过程。就像我们打牌一样,轮到你,你才能出牌,然后下手的人依次出牌,转一圈后,又回到你出牌,如此往复。

(3)高优先级优先调度算法。该算法的原则是“重要的事先办”,利用优先级调度算法时,给每一个进程确定一个优先级,调度时,从就绪队列中选出优先级最该的进程,把CPU分配给它。但这有一个问题,如果在进程运行过程中出现比当前进程优先级更高的进程怎么办?这就涉及到‘抢占式优先级’和‘非抢占式优先级’。非抢占式优先级类似于“你打完电话,他再打电话”,当前进程会一执行下去,直到任务完成后再让出CPU。抢占式优先级类似于“不等你说完,他就抢过电话”。当前进程遇到更高优先级的进程时,CPU被强行剥夺分配给给高优先级的进程。


9.什么是优先级反转

优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源,高优先级任务因资源缺乏而处于阻塞状态,一直等到低优先级任务释放资源为止,而低优先级获得的cpu时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务反而超过这两个任务而获得cpu资源。如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,因为此时低优先级进程无法与高优先级争夺cpu资源,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资源而继续运行。


10.如何避免僵尸进程

父进程 通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。

如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会受到该信号,可以在handler中调用wait回收。

如果父进程不关心进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号。

还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收,不过子进程的回收还要自己做。


猜你喜欢

转载自blog.csdn.net/cb673335723/article/details/78604225