好长时间没有更新博客内容了,最近一直在研究python,刚好了解多进程 那我们就一起了解一下多进程。(写给自己看 怕自己忘了。。。)
1、什么是进程?
进程指的是程序的一次执行过程,而程序则指的是一个文件,磁盘中可执行的代码。
进程运行时需要把程序加载如内存,进程有一定的生命周期,进程的创建由操作系统控制,进程占有系统的资源
2、进程的分类
IO密集型 : IO操作远远大于计算操作,因为CPU效能要远远高于IO的读写操作,所以这类程序一般cpu都处于等待IO运行的状态。
cpu密集型:程序中运算较多,IO较少,cpu占用率高
3、进程控制块 (PCB)
指的是在内存中开辟的存放进程信息的空间。在linux下查看进程相关信息:ps -aux
每个内存都有单独占有4G地址空间=======》存放在计算机的虚拟内存地址。
4、进程的状态:
三态:
就绪 : 进程具备运行条件,等待系统分配资源
执行 : 进程占有cpu开始运行
等待 : 又称为阻塞态或者睡眠态,进程等待某种条件,或等待某件事件的完成
五态(在3态基础上增加)
新建 : 创建一个进程, 直接表现为创建程序,或者创建子进程
终止 : 程序执行结束,完成善后,或处于僵尸状态
进程状态标识:
D : 等待态
S : 等待态
T : 等待态
R : 运行态,就绪态
Z : 僵尸态进程
N : 低优先级的进程
< : 高优先级
+ : 前台进程
linux 下进程相关命令
ps -aux 显示进程信息
ps -ef
ps -ajx
pstree 查看进程树结构
top 检测系统中的进程
进程优先级 : linux 进程优先级范围 -20 --- 19 数字越小优先级越高
nice -9 ./while 表示以9的优先级运行某个程序
renice n pid 将pid的进程 优先级修改为 n
kill -sig pid 给pid的进程发送一个sig信号
./while.py & 将程序后台运行
5、创建进程:
fork 创建新的进程 (linux 和unix 平台)
import os
fork()
功能 : 为当前进程,创建一个子进程
参数: 无
返回值:
< 0 表示创建进程失败
= 0 在新创建的进程中返回一个返回值
> 0 在父进程中返回一个返回值
父子进程 :
子进程会继承父进程几乎全部的代码段
子进程拥有自己独立的信息标识
* 子进程和父进程都是独立存在的,在运行上相互不影响
* 利用fork返回值在父子进程中的不同去执行不同的内容,是多任务的固定方法
* 父进程中fork的返回值为创建的子进程的PID号
* 父子进程几乎拥有相同的资源,包括fork前所定义的内容
1 import os 2 from time import sleep 3 4 a = 10 5 #创建子进程 6 pid = os.fork() 7 8 if pid < 0: 9 print('create process failed') 10 elif pid == 0: 11 a = 1000 12 print("This is child process") 13 else: 14 sleep(2) 15 print('The pid = ',pid) 16 17 print("This is parent process") 18 19 print('a = ',a) 20 print("**********the end***********")
import os
os.getpid() 获取当前进程的PID号
os.getppid() 获取当前进程父进程的PID号
进程退出函数
import os
os._exit([status])
import sys
sys.exit([status])
功能 : 退出一个进程
1 import os 2 import sys 3 4 a = 0 5 while a < 10: 6 print('a = ',a) 7 a += 1 8 try: 9 if a == 5: 10 # sys.exit(3) 11 os._exit(0) 12 except SystemExit as e: 13 print(e) 14 15 print("+++++++++++++++++")
参数 : 表示进程的退出状态,0表示进程正常退出,非0表示异常退出。sys.exit()可以传入字符串,在退出时打印一下字符串
区别 : _exit() 直接退出
exit() 抛出SystemExit,如果要是处理了异常
僵尸进程:子进程先于父进程退出,父进程没有处理子进程的退出状态,此时子进程就会成为僵尸进程