龙华网页设计公司网站,那些网站是php做的,网站如何做收录排行,美食网站的设计与制作【一】僵尸进程和孤儿进程
【1】引入 我们知道在unix/linux中#xff0c;正常情况下#xff0c;子进程是通过父进程创建的#xff0c;子进程在创建新的进程。 子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它…【一】僵尸进程和孤儿进程
【1】引入 我们知道在unix/linux中正常情况下子进程是通过父进程创建的子进程在创建新的进程。 子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。
【2】僵尸进程
1什么是僵尸进程
僵尸进程是指完成自己的任务之后没有被父进程回收资源
例如开了一个pycharm --- 将 pycharm 关闭 -- 任务管理器所有的关于 pycharm 的进程应该都被关闭但是有时候会发现有某几个 pycharm 进程任然在后台运行 -- 本来这部分资源应该被回收结果因为还在运行占用系统资源
2解决办法 因此UNⅨ提供了一种机制可以保证父进程可以在任意时刻获取子进程结束时的状态信息 在每个进程退出的时候内核释放该进程所有的资源包括打开的文件占用的内存等。 但是仍然为其保留一定的信息包括进程号the process ID退出状态the termination status of the process运行时间the amount of CPU time taken by the process等 直到父进程通过wait / waitpid来取时才释放. 但这样就导致了问题如果进程不调用wait / waitpid的话那么保留的那段信息就不会释放其进程号就会一直被占用但是系统所能使用的进程号是有限的 如果大量的产生僵死进程将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害应当避免。 任何一个子进程(init除外)在exit()之后并非马上就消失掉而是留下一个称为僵尸进程(Zombie)的数据结构等待父进程处理。 这是每个子进程在结束时都要经过的阶段。 如果子进程在exit()之后父进程没有来得及处理这时用ps命令就能看到子进程的状态是“Z”。 如果父进程能及时 处理可能用ps命令就来不及看到子进程的僵尸状态但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出则子进程将由init接管。 init将会以父进程的身份对僵尸状态的子进程进行处理。
3示例
import multiprocessing
import time
def work(name):print(f{name} is starting ...)time.sleep(2)print(f{name} is ending ...\n)
def main():for i in range(3):task multiprocessing.Process(targetwork,args(ftask_{i},))task.start()
if __name__ __main__:print(fmain process starting ...)main()print(fmain process ending ...)
# main process starting ...
# main process ending ...
# task_0 is starting ...
# task_1 is starting ...
# task_2 is starting ...
# task_0 is ending ...
# task_1 is ending ...
# task_2 is ending ...
【3】孤儿进程
1什么是孤儿进程
孤儿进程是指父进程在子进程终止之前就退出了
例如在没有关闭共享屏幕的前提下直接退出腾旭会议这时共享屏幕也会退出不会还挂在后台
在主程序死亡以后因为子进程就没有办法再和主进程通信。就像是有一个福利院 init进程 会接管这些没有父亲的孤儿如果最后没有人来领取吗就把所有子线程杀死
2示例
import os
import sys
import time
if __name__ __main__:pid os.getpid()ppid os.getppid()print(父进程,pid:,pid,ppid:,ppid)pid os.fork()# 执行pidos.fork()则会生成一个子进程# 返回值pid有两种值# 如果返回的pid值为0表示在子进程中# 如果返回的pid值0,表示在父进程中if pid 0:print(父进程终止)sys.exit(0)# 保证主线程退出完毕time.sleep(1)print(我是子进程,os.getpid(),os.getppid())
【4】僵尸进程和孤儿进程谁的危害性更大 僵尸进程的危害性更大因为僵尸进程一直会持续存在在后台占用资源孤儿进程会因为主进程的死亡然后有init进程接管并销毁
例如有个进程它定期的产 生一个子进程这个子进程需要做的事情很少做完它该做的事情之后就退出了因此这个子进程的生命周期很短但是 父进程只管生成新的子进程至于子进程 退出之后的事情则一概不闻不问这样的话系统运行一段后就会存在很多僵尸进程如果实在Linux中的话可以使用ps命令查看就可以看到很多状态为Z的进程
严格来说僵尸进程并不是问题的根源罪魁祸首是产生大量僵尸进程的父进程因此当我们需要消灭系统中大量的僵尸进程时最好的办法就是将制造的元凶干掉也就是通过kill发送SIGTERM或者SIFKILL信号如此的话由他产生的僵尸进程就变成了孤儿进程就会被init接管然后wait()这些孤儿进程即释放了
【二】守护进程
【1】什么是守护进程 守护进程时一种特殊的进程只要系统不关机就会一直存在 它们通常不与用户直接交互也不接受标准输入和输出而是在后台执行某种任务或提供某种服务。 守护进程往往是由系统管理员手动启动的它们可以在系统启动时自动启动一直运行在后台直到系统关闭或被停止而且不需要用户交互有较高的权限因此编写守护进程需要注意安全性和稳定性 常见的守护进程包括网络服务如web服务器、邮件服务器、ftp服务器、日志记录系统 例如安装一个MySQL服务TCP服务端关机会导致服务端关闭MySQL服务加一个守护进程只要系统不关机MySQL服务就会一直在后台运行除非主动杀死
示例
from multiprocessing import Process
import time
def task(name):print(f皇太妃 :{name}正常存活)time.sleep(2)print(f皇太妃 :{name}正常死亡)
if __name__ __main__:print(f皇帝 : ChiMeng 执掌江山)p Process(targettask, args(dream,))
p.start()
print(f皇帝 : ChiMeng 寿终正寝)# 主进程结束子进程未结束# 皇帝 : ChiMeng 执掌江山
# 皇帝 : ChiMeng 寿终正寝
# 皇太妃 :dream正常存活
# 皇太妃 :dream正常死亡