进程的创建和结束
一、进程的创建
但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动的微波炉,所有进程都已经存在。
而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分未4种形式创建心的进程:
- 系统初始化(查看进程Linux中用ps命令,Windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且至尊需要时才唤醒的进程,称之为受五金城,如电子邮件、web页面、新闻、打印)
- 一个进程在运行过程中启动了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
- 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)
- 一个批处理作业的初始化(至尊打星际的批处理系统中应用)
无论哪一种,新进程的创建都是由一个已存在的进程执行了一个用于创建进程的系统调用而创建的。
1.1UNIX和Windows创建进程
- 在UNIX中该系统调用的是:fork,for会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)
- 在Windows中该系统调用的是:CreateeProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新程序。
关于创建子进程,UNIX和Windows:
- 相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面进程之间内存的隔离),任何一个进程的其地址空间中的修改都不会影响到另一个进程。
- 不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于Windows系统来说,从一开始父进程与子进程的地址空间就是不同的。
二、进程的结束
- 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在Linux中用exit,在Windows中用Exit Process)
- 出错退出(自愿,python a.py不存在)
- 严重错误(非自愿,执行非发指令,如引用不存在内存,1/0等,可以不做异常,try...except...)
- 被其他进程杀死(非自愿,如kill-9)