python_thread,,多任务编程:可以有效


多任务编程:可以有效的利用计算机资源,同时执行多个任务
进程:进程就是程序在计算机中一次执行的过程
进程 和 程序的区别:
1、程序是一个静态文件的描述,不占计算机的系统资源
2、进程是一个动态的过程,占有cpu、内存等资源,有一定的生命周期
注意:同一个程序的不同执行过程即为不同的进程
问题1、什么决定了进程的创建
答:用户通过应用层程序进行进程的创建申请-->调用操作系统接口进行进程创建
-->告知系统内核创建新的进程提供给应用层使用
问题2、进程如何占有CPU
1、同一个内核同一时刻只能运行一个进程
2、多个进程对内核资源进行抢占,由操作系统内核进行分配
3、哪个进程占有计算机内核,我们称为该进程占有CPU的时间片
问题3、进程在运行过程中的形态和附带内容
1、PCB(进程控制块):在linux和unix操作系统中,进程创建后会在内存中开辟一块空间存放进程的相关信息,这个空间称之PCB
2、PID:在操作系统中进程的唯一标识,是一个大于0的正整数,由系统自动分配
ps -aux 查看进程信息
3、虚拟内存:每个进程占有4G内存地址空间,这里的内存指的是虚拟内存
4、进程状态
1、三态:
1、就绪态:进程具备运行条件,等待系统分派处理器以便运行
2、运行态:进程占有CPU处于运行状态
3、等待态:又称为阻塞态或睡眠态,指进程不具备运行条件,正在等待某些条件的达成
2、五态:在三态的基础上添加两个状态新建态、终止态
1、新建态:创建一个进程的过程,直接表现为执行某个程序或在程序中创建新的进程
2、终止态:进程执行结束,完成回收的过程
D:等待态(不可中断,不会被外界条件所影响)
S:等待态(可中断,会被伟杰条件所影响)
T:等待太(暂停,无条件的等待)
R:运行态
Z:僵尸态
上面只能选一个,后面的是配合上面使用的
+:前台进程
N:低优先级进程
<:高优先级进程
l:有进程连接
s:会话组
进程的优先级:
1、优先级往往决定了一个进程的执行权限和占有系统资源的优先程度
2、linux系统中优先级范围 -20~19 -20优先级最高
3、用户创建的进程默认优先级为0
4、top:动态查看系统进程运行情况,(NI字段值就是优先级)
< > 可以用来翻页查询
5、nice:以指定的优先级运行某个进程
示例: nice -9 ./while.py #以9的优先级运行程序

sudo nice --9 ./while.py #以-9的优先级运行程序
6、renice n PID:修改一个正在运行的进程的优先级
示例:renice 8 12836 :将12836号的进程优先级修改为8
父子进程:在系统中除了初始化进程之外每个进程都是由父进程创建的,每个进程有一个唯一的父进程,可能有多个子进程
pstree:查看进程树
总结:
1、什么是进程:程序在计算机中一次执行的过程
2、进程和程序的区别:进程是动态的占有cup内存资源,程序是静态文件,不占有从cpu内存资源
3、进程的集中状态及相互间的转换
4、什么是PCB PID CPU时间片

需求:两件不想关的事情希望同时来做

方案1:创建两个进程,分别承担不同的事情,各自执行
分析:
1、两个程序比较麻烦
2、无法确定两个程序应该在什么时间开始运行
方案2:写一个程序,在程序中指定位置用接口来创建新的进程

实现方法:
1、os.fork()函数实现
fork()
1、功能:创建一个新的进程
2、参数:无
3、返回值:
1、<0表示进程创建失败
2、==0在子进程中fork的返回值为0
3、>0在父进程中fork的返回值大于0
fork 是os模块只能在linux和Unix系统下使用

技术分享图片
#os 模块提供大量和系统相关的功能函数接口#os 模块的使用是与系统相关的,在不同的系统中可能有不同的功能import osprint(‘before craete process‘)a = 10pid = os.fork()if pid < 0:    print("Create process failed")elif pid == 0:    print(‘This is the new process‘)    print(a)#a=10:父进程中fork之前的内容,子进程同样也会复制,但是父子进程空间内容的修改不会相互影响    print(os.getpid())    a = 1000else:    print(‘This is the parent process‘)    print(a)#a=10:但是父子进程空间内容的修改不会相互影响    print(pid)#pid的值等于子进程的PIDprint("The process end")
View Code

测试1:父进程中fork之前的内容,子进程同样也会复制,但是父子进程空间内容的修改不会相互影响
测试2:父子进程在执行上互不影响,理论上不一定谁先执行
测试3:子进程虽然复制父进程的空间,但是也有自己独特的特性,比如:自己的PID,进程控制块,进程栈等,父进程中的fork的返回 值即为创建子进程的PID号
进程相关的函数:
1、os.getpid(): 获取当前进程的PID号
2、os.getppid(): 获取当前进程父进程的PID号
3、os._exit(status)
1、功能:结束一个进程
2、参数:一个数字(必须是整数)表示进程的退出状态,通常0表示正常退出,其它数字表示非正常退出
4、sys.exit([status])
1、功能:结束一个进程,如果处理了抛出异常,则不结束进程
2、参数:一个数字表示进程的退出状态,通常0表示正常退出,其它数字表示非正常退出,
还可以是一个字符串,如果是字符串则退出进程会打印这个字符串

技术分享图片
import osimport sys# os._exit(0)try:    #如果处理了抛出异常,则不结束进程    sys.exit(0)#参数可有可无,如果是字符串会打印这个字符串(小数视为字符串),except SystemExit as e:    print(e)    #次数的参数就是exit传进去的参数print(‘process over‘)
View Code

僵尸进程:
1、定义:子进程先于父进程退出,父进程没有对子进程的退出做相应的处理,此时子进程就会变成僵尸进程
2、影响:进程退出后,仍有部分信息残留在内存空间,大量的僵尸进程会影响系统运行, 所以应该尽量避免僵尸进程的产生

孤儿进程:
1、定义:父进程先于子进程退出,此时子进程就会变为孤儿进程
2、影响:当一个进程变为孤儿进程,系统会自动的使用一个进程成为孤儿进程的父进程。当孤儿进程退出时,该系统进程会自动
回收孤儿,使他不会成为僵尸,所以孤儿进程对系统资源没有什么影响
处理僵尸进程的方法:
1、让父进程先退出(不好控制)
2、父进程处理子进程的退出
1、os.wait():
1、功能:等待子进程退出进行处理
2、参数:无
3、返回值:返回一个包含两个元素的元组,第一个是退出的子进程的PID号,第二个是子进程的退出状态
4、wait是一个阻塞函数 即 进程处于等待态,等待某种条件的达成才会继续运行

技术分享图片
import osimport sysfrom time import *pid = os.fork()if pid < 0:    print(‘create process failed‘)elif pid == 0:    print(‘Child process...‘)    print(‘Child_PID:‘,os.getpid())    sleep(2)    sys.exit("ok11")#子进程退出else:    #wait阻塞等待子进程的退出    p,status = os.wait()#p等于子进程的PID,status等于exit参数为正值时的值乘以256    print(p,status)#如果退出状态是字符串时,status的值为256    print(os.WEXITSTATUS(status))#等于子进程退出的状态    print(‘Parent process..‘)
View Code

2、os.waitpid(pid,option)
1、功能:同wait 处理子进程退出使其不会变成僵尸
2、参数:pid=-1时 表示等待任意子进程退出
pid>0时 表示等待指定进程号的子进程退出
option=0时 表示阻塞等待
option = os.WNOHANG时 表示 非阻塞等待

技术分享图片
import osimport sysfrom time import *pid = os.fork()if pid < 0:    print(‘create process failed‘)elif pid == 0:    print(‘Child process...‘)    print(‘Child_PID:‘,os.getpid())    sleep(2)    sys.exit(1)#子进程退出else:    #waitpid非阻塞等待子进程的退出:如果执行到这里刚好这时子进程退出则处理,否则不处理    p,status = os.waitpid(-1,os.WNOHANG)#p等于子进程的PID,status等于exit参数为正值时的值乘以256    print(p,status)    print(os.WEXITSTATUS(status))#等于子进程退出的状态    print(‘Parent process..‘)
View Code

总结:
1、函数的使用 fork()/getpid()/getppid()/os._exit/sys.exit/wait/waitpid
2、理解什么是僵尸进程和孤儿进程即两者产生的过程
3、知道僵尸进程的危害和两种处理方法
4、理解进程的创建流程

python_thread

评论关闭