多任务编程
意义 | 充分利用计算机的资源提高程序的运行效率 | |||
定义 | 通过应用程序利用计算机多个核心,达到同时执行多个任务的目的 | |||
CPU实施方案 | 多进程 | |||
多线程 | ||||
并行 | 多个计算机核心在同时处理多个任务,多个任务之间并行关系 | |||
并发 | 计算机同时处多个任务,内核在多个任务间不断切换,达到好像同时处理的效果,此时多个任务实际为并发关系 | |||
进程 | 程序在计算机中运行一次的过程 | |||
程序 | 是一个可执行文件,是静态的,占有磁盘,不占有计算机运行资源 | |||
进程 | 进程是一个动态的过程描述,占有cpu内存等计算机资源的,有一定的生命周期 | |||
*同一个程序的不同执行过程是不同的进程没因为分开的计算机资源等均不同 | ||||
进程的创建流程 | 1.用户空间运行一个程序,发起进程创建 | |||
2.操作系统接收用户请求,开启进程创建 | ||||
3.操作系统分配系统资源,确认进程状态 | ||||
4.将创建好的进程提供给应用层使用 | ||||
CPU时间片 | 如果一个进程占有计算机核心,我们成为该进程在CPU时间片。多个任务对cpu会进行争夺,一般有操作系统分配cpu时间片 | |||
PCB进程控制块 | 在操作系统中进程创建后会自动产生一个空间存放进程信息 | |||
进程信息 | 进程PID、进程占有的内存位置、创建时间、用户 | |||
进程PID | 进程在操作系统中的唯一编号,大于0整数,由操作系统自动分配 | |||
进程信息查看 | ps –aux | |||
|
进程特征 | *进程是操作系统分配计算机资源的最小单位 *每个进程都有自己单独的虚拟内存空间 《计算机原理》 *进程间的执行相互独立,互补影响 | ||
进程的状态 |
三态 | 就绪态: 进程具备执行条件,等待系统分配cpu | ||
运行态: 进程占有cpu处理器,处理运行状态 | ||||
等待态: 进程暂时不具备运行条件,需要阻塞等待 | ||||
五态 | 在三态下添加新建态和终止态 | |||
新建态: 创建一个新的进程,获取资源的过程 | ||||
终止态: 进程结束释放资源符过程 | ||||
ps -aux | ------à STAT 查看进程状态 | |||
D 等待态 | 不可中断等待 | |||
S 等待态 | 可中断等待 | |||
T 等待态 | 暂停状态 | |||
R 运行态 | 就绪态 运行态 | |||
Z 僵尸态 |
| |||
| + : | 前台信息 | ||
<: | 高优先级 | |||
N: | 低优先级 | |||
L: | 有进程链接 | |||
S: | 会话组组长 | |||
进程优先级 | 优先级决定了一个进程的执行权限和占有资源的优先程度 | |||
查看进程优先级 | top 动态查看进程的优先级 | |||
取值范围:-20 ---- 19 -20优先级最高 | ||||
| ||||
父子进程 | 在系统中除了初始化进程每个进程都有一个父进程,可能有0个或者多个子进程,由此形成父子进程关系,我们人文每个人进程都有父进程发起请求创建的 | |||
查看进程数 | pstree | |||
查看父进程PID | ps –ajx |
!!!要求:
什么是进程,进程和程序的区别
了解进程的特征
清楚进程的状态及状态间的转化关系
并行和并发的区别,操作系统功能
需求:编写一个程序,能够同时执行多个任务。同时需要在程序运行过程中,根据情况创建进程
import os
pid = os.fork()
功能: 创建一个新的进程
参数: 无
返回值:失败返回一个负数 -1
成功返回在原有进程中返回新的进程的PID在新的进程中返回0
*子进程会复制父进程全部代码段,包括fofk 前的代码
*子进程从fork 的下一句开始执行
*父子进程通常会根据fork 返回值的差异选择执行不同的代码(使用if结构)
*父子进程在执行上互不干扰,执行顺序不确定
*子进程虽然复制父进程内存空间,但是有自己的特性,比如PID号,PCB等
*父子进程空间独立,各自修改各自的内容,互不影响
进程的相关函数
os.getpid() | 功能:获取当前进程的PID号 |
返回值:返回PID号 | |
os.getppid() | 功能:获取父进程的进程号 |
os._exit(status) | 功能:退出进程 参数:进程的退出状态 整数 |
os.exit([status]) | 功能:退出进程 参数:默认为0 如果是整数则表示退出状态 如果是字符串则表示退出时打印内容 *sys.exit 可以通过捕获systemExit异常阻止退出 缺点程序 |
pid,status = os.wait() | 功能:在父进程中阻塞等待处理子进程的退出 返回值:pid 退出的子进程的PID号 status 子进程的退出状态 |
pid,status=os.waitpid(pid,option) | 功能:在父进程中阻塞等待处理子进程的退出 参数:pid -1 表示任意子进程退出 >0 整数 指定PID号的子进程退出 option 0 表示阻塞等待 WNOHONG 表示非阻塞 返回值:pid 退出的子进程的PID号 status 子进程的退出状态 |
孤儿进程
意义 | 父进程先与子进程退出,此时子进程就会成为孤儿进程 |
*孤儿进程会被系统指定的进程收养,即系统进程会成为该孤儿进程新的父进程(孤儿进程退出时该父进程会处理退出状态) |
僵尸进程
意义 | 子进程先于父进程退出,父进程没有处理子进程退出状态,此时子进程成为僵尸进程 *僵尸进程已经结束,但是会滞留部分PCB信息在内存,大量的僵尸会消耗系统资源,应该尽量避免 | |
如何避免僵尸进程产生 | *父进程先退出 | 创建二级子进程 1. 父进程创建子进程等待子进程退出 2. 子进程创建二级子进程,然后马上退出 3. 二级子进程成为孤儿,处理具体事件 |
*父进程处理子进程退出状态 | 用此函数 (pid,status = os.wait()) |
multiprocessing(模块创建进程)
1. 需要将要做的事件封装为函数
2. 使用multiprocessing中提供的process类创建进程对象
3. 通过进程对象和process 初始化函数 对进程进行设置,并且绑定要执行的事件
4. 启动进程,会自动执行相关联函数
5. 事件完成后回收进程
创建进程对象
peocess()
功能:创建进程对象
参数:name : 给创建的进程对象起一个名字
默认Process -1
tareget : 绑定的函数
args : 元组 给tatget 函数按照位置传参
kwargs : 字典 给target 函数按照键值出传参
p.start()
功能: 启动进程,此时进程被创建。自动运行进程函数
p.join([timeout])
功能: 阻塞等待回收响应的进程
参数: 超时时间
示例:/bo2/多线程和多进程/day02/练习/11.py
* multiprocessing创建进程是原来进程的子进程,创建后父子进程个自执行互不影响
* 子进程同样是复制父进程的空间,子进程对内容的修改不会影响父进程空间
* join 回收子进程,会有效的阻止僵尸进程产生