1、进程
进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。进程是系统进行资源分配和调度的一个独立单位。进程是由代码(堆栈段)、数据(数据段)、内核状态和一组寄存器组成。 在多任务操作系统中,通过运行多个进程来并发地执行多个任务。由于每个线程都是一个能独立执行自身指令的不同控制流,因此一个包含多个线程的进程也能够实现进程内多任务的并发执行。进程是一个内核级的实体,进程结构的所有成分都在内核空间中,一个用户程序不能直接访问这些数据。
进程的状态:创建、准备、运行、阻塞、结束。
2、创建进程
Linux 和 Unix 操作系统提供了一个fork()函数创建新的进程,这也就意为这该函数仅适用于Linux和Unix平台,Windows操作系统没有fork()函数。
fork()函数比较特殊,python的os.fork()是唯一调用一次返回两次的函数,因操作系统将当前的进程(父进程)复制了一份新的进程(子进程),然后分别在父进程和子进程内返回。
例:利用fork()函数创建子进程
os.fork()创建子进程后,ret会返回两个值。
例:查看ret的值
ret的值如果大于0,代表当前进程是主进程,如果ret的值等于0,代表当前进程是子进程。
例:调整进程执行顺序
此时,父进程运行结束后,显示终端待输入命令,但是子进程没有运行结束,当子进程运行结束之后,就会打印子进程中的语句。
例:后面如果有语句,是否会执行
if之后的语句不论是主进程还是子进程都会正常执行,主进程与子进程都会执行程序中的所有代码。
3、查看主进程与子进程的进程号
例:查看主进程与子进程的进程号
os.getpid()函数会返回当前进程的进程号,os.getppid()函数会返回当前进程的父进程的进程号。
当os.fork()函数的返回值大于0时,此时的值会当做当前进程的子进程的ID号,如果Python解释器判断当前进程被占用,会依次向下寻找能够使用的ID号返回,所以子进程的进程号与父进程的ret返回值相同。子进程中的父进程号与主进程的进程号相同。
4、全局变量在父子进程中不共享
如果定义了全局变量,那么在父子进程中,该全局变量是独立的,不会互相影响。
例:全局变量在父子进程中不共享
5、多个fork
例:多个fork
使用fork()函数创建进程会占用大量的内存空间,容易造成fork()炸弹,同时父子进程之间是不会相互影响的,父进程或子进程结束时,另一个进程会正常运行,直到程序结束。