1、程序
是一个可执行文件,是静态的,占有磁盘,不占计算机的运行资源
2、进程
【1】程序在计算机中的一次执行过程
【2】进程是一个动态的过程,占有计算机资源,有一定的生命周期
【注】同一个程序不同的运行过程是不同的进程。因为分配的资源和生命周期都不相同
3、进程特征
【1】进程是操作系统分配资源的最小单元
【2】每个进程拥有自己独立的运行空间 (虚拟内存空间)
【3】进程之间运行相互独立互不影响
4、进程相关概念
【1】cpu时间片
如果一个进程占有cpu此时我们称为该进程占有cpu时间片。多个进程任务会轮流占有cpu时间片形成并发效果。
【2】进程信息 (process)
进程的ID、 进程占有内存的位置,创建时间,创建用户。。。
PCB (进程控制块):进程创建后会自动在内存生产一个空间存放进程信息。
5、查看系统该进程信息
PID(process ID)
【ps -aux】
① 查看系统进程信息,linux终端下执行此命令
② STAT列表示进程状态
D 等待态 ,阻塞 ,不可中断等待态
S 等待态 ,睡眠 ,可中断等待态
T 等待态, 暂停, 暂停执行
R 运行态(就绪态)
Z 僵尸 + 前台进程 (在终端运行)
< 有较高优先级的进程
N 较低优先级的进程
s 会话组
l 有进程连接
6、进程的创建流程
【1】 用户启动一个程序或者调用接口发起进程创建
【2】 操作系统接收用户请求分配计算机资源创建进程
【3】操作系统将一定状态的进程提供给用户使用
【4】用户利用操作系统提供的进程完成任务
7、进程的状态
【三态】
【1】就绪态 : 进程具备执行条件,等待系统分配处理器 资源进入运行态
【2】运行态 : 进程占有cpu处于运行状态
【3】等待态 : 进程暂时不具备运行条件,需要阻塞等待
【五态】
(三态基础上增加新建和终止)
【4】新建 : 创建一个新的进程,获取系统资源的过程
【5】终止 : 进程执行结束,释放资源的过程
8、进程的优先级
【top】
① 动态查看进程优先级,linux终端下执行此命令
② < > 进行翻页, q退出
③ 优先级的取值范围 : -20 ~~ 19, -20最高
④ 【nice】
以指定的优先级运行一个程序
nice -9 ./while.py 以9的优先级运行
sudo nice --9 ./while.py 以-9优先级运行
9、父子进程
【1】在系统中除了初始化进程每个进程都有一个父进程,可能有0个或多个子进程。由此形成进程间的父子关系。
【2】便于进程管理,父进程发起创建子进程请求
【3】查看进程树:
pstree
PID
ps -ajx
10、父子进程区别
【1】子进程会复制父进程全部内存空间包括代码段
【2】子进程会从fork的下一句开始执行
【3】父进程中fork返回值即为新创建子进程的PID号
【4】父子进程不一定谁先执行,执行上互不干扰抢占时间片
【5】使用if 语句结构使父子进程执行不同的代码几乎是fork创建进程的固定结构
【6】在子进程中对变量等其他内容的修改,不会影响父进程中的内容
【7】子进程虽然复制父进程内容,但是也有自己的特有属性特征。比如: PID号 PCB 内存区间等
父子进程复制文件:
11、孤儿进程
【1】当父进程先于子进程退出,此时子进程就会成 为孤儿进程。
【2】孤儿进程会被系统指定进程收养,即系统进程会成为孤儿 进程新的父进程。系统进程会自动处理孤儿进程退出状态
12、僵尸进程
【1】子进程先于父进程退出,父进程没有处理子进 程的退出状态,此时子进程就会成为僵尸进程
【2】僵尸进程会滞留部分PCB信息在内存中,大量的僵尸进程会消耗系统的内存资源,所以要尽量避免僵尸进程产生
13、 如何避免僵尸进程产生
【1】父进程先退出
【2】父进程处理子进程退出状态
14、创建二级子进程
【1】父进程创建子进程等待子进程退出
【2】子进程创建下一级子进程,然后立即退出
【3】二级子进程成为孤儿,处理具体工作
二级子进程处理僵尸进程问题:
#二级子进程处理僵尸问题
import os
from time import sleep
def fun1():
sleep(3)
print("第一件事情")
def fun2():
sleep(4)
print("第二件事情")
pid = os.fork()
if pid < 0:
print("create process failed")
elif pid == 0:
#创建二级子进程
pid1 = os.fork()
if pid1 == 0:
fun2() #执行fun2
elif pid1 > 0:
os._exit(0) #子进程退出
else:
os.wait()
fun1()
二级子进程处理僵尸进程
15、进程的缺点
进程在创建和销毁的过程中消耗的资源相对较多
16、进程池技术
【1】产生原因 : 如果有大量的任务需要多进程完成,而任务周期又比较短且需要频繁创建。
此时可能产生大量进程频繁创建销毁的情况,消耗计算机资源较大
【2】使用方法 :
① 创建进程池,在池内放入适当数量的进程
② 将事件封装函数,放入到进程池
③ 事件不断运行,知道所有放入进程池事件运行完成
④ 关闭进程池,回收进程
17、注意
【1】如果多个子进程拷贝同一个父进程中的对象,则多个子进程使用的是同一个对象(如文件对象,套接字,队列,管道。。。)
【2】如果是在创建子进程后单独创建的对象,则多个子进程各不相同
18、进程间通信(IPC)
由于进程间空间独立,资源无法共享,此时在进程间通信就需要专门的通信方法。
19、进程间通信方法 :
管道
消息队列
共享内存
信号
信号量
套接字