一. 引言
进程, 正在执行的一个过程, 进程是对正在运行程序的一个抽象
进程的概念起源于操作系统, 是操作系统的核心概念.
操作系统的作用:
1. 隐藏丑陋复杂的硬件接口, 提供良好的抽象接口
2. 管理, 调度进程, 并将多个进程对硬件的竞争变得有序
多道技术:
1. 产生背景: 针对单核, 实现并发
现在的主机一般都是多核, 那么每个核都会利用多道技术, 例如四核, 有4个CPU, 运行于CPU1的某个程序遇到IO阻塞, 会等到IO结束再重新调度, 会被调度到4个CPU中的任意一个, 具体有操作系统调度算法决定.
2. 空间复用: 内存中同时有多道程序
3. 时间复用: 复用一个CPU的时间片
强调: 遇到IO切, 占用CPU时间过长也切, 核心在于切之前将进程的状态保存下来, 这样才能保证下次切换回来的时候能在上次切走的位置继续运行.
二. 什么是进程
进程是计算机中的程序关于某数据集合上的一次运行活动, 是系统进行资源分配和调度的基本单位, 是操作系统结果的基础. 在python文件中写的代码叫做程序, 运行这个python文件的时候叫做进程.
狭义定义: 进程是正在运行的程序的实例
广义定义: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.是操作系统动态执行的基本单元.
注意: 同一个程序执行两次, 就会在操作系统中出现两个进程.
三. 进程调度
多个进程交替运行, 操作系统需对这些进程进行调度, 但这个调度需要遵循一定的法则, 即进程的调度算法.
先来先服务调度算法, 短作业优先调度算法, 时间片轮转法, 多级反馈队列
四 并发与并行
并发: 是伪并行, 看起来是同时运行, 单个CPU+多道技术就可以实现并发, 并行也属于并发.
并行: 同时运行, 只有具备多个CPU才能实现并行
五. 同步,异步,阻塞,非阻塞
进程三态: 就绪 运行 阻塞
就绪状态: 当进程已分配到除CPU外的所有必要的资源, 只要获得处理机便可立即执行, 这时的进程状态成为就绪状态
运行状态: 当进程已获得处理机, 其程序正在处理机上执行, 此时的进程状态成为运行状态
阻塞状态: 正在执行的进程, 由于某个事件发生而无法执行时, 便放弃处理机而处于阻塞状态,比如, 等待IO完成, 申请缓冲区不能满足, 等待信号等.
同步: 一个任务完成需要依赖另外一个任务, 只有等待被依赖的任务完成后, 依赖的任务才能算完成. 一种可靠的任务序列, 要么都成功, 要么都失败, 两个任务的状态可以保持一致.
异步: 不需要等待被依赖的任务完成, 只是通知被依赖的任务要完成什么工作, 依赖的任务也立即执行, 只要自己完成了整个任务就算完成了.
阻塞与非阻塞是从程序等待消息通知时的状态角度来说的.
同步阻塞: 效率最低
异步阻塞: 异步操作是可以被阻塞的, 只不过不是在处理消息时阻塞, 而是在等待消息通知时被阻塞.
同步非阻塞: 效率低
异步非阻塞: 效率高,
六. 进程的创建, 结束与并发的实现
进程的创建: 通用系统中, 需要有系统运行过程中创建或撤销程序的能力, 主要分为4种形式创建新的进程.
1. 系统初始化
2. 一个进程在运行过程中开启了子进程(Popen, subprocess等)
3. 用户交互式请求, 创建一个新进程
4. 一个批处理作业的初始化
但无论是哪一种, 新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的.
关于创建的子进程 , UNIX和Windows的区别:
相同的是: 进程创建之后, 父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离), 任何一个进程的地址空间的修改都不会影响到另外一个进程.
不同的是, 在UNIX中, 子进程的初识地址空间是父进程一个副本, 子进程和父进程是可以有只读的共享内存区的, 但是Windows中, 从一开始父进程和子进程的地址空间就是不同的.
进程的结束: 正常退出 出错退出 严重错误 被其他进程杀死