并发、串行、并行及多道技术原理
一、并发与串行
1、目前程序存在的问题
程序默认执行方式就是 串行
即,程序自上而下,一行一行顺序执行,必须把当前任务执行完毕才能执行下一个任务无论当前任务需要多长时间
问题举例:
如tcp服务器的服务器中 ,如果正在进行通讯循环则无法,处理其他的客户端请求
如从硬盘读取大文件
执行了input
2、学习并发的目的
就是要编写可以同时执行多个任务的程序,来提高效率
串行和并发都是程序处理任务的方式
3、实现并发的方式
1.多进程
2.多线程
3.协程
二、进程是什么
进程指得是正在运行的程序,是操作系统调度以及进行资源分配的基本单位
是一个资源单位
进程是怎么来的?
当把一个程序冲硬盘读入到内存时,进程就产生了多进程 ,指的是同一时间有多个程序被装入内存并执行进程来自于操作系统,有操作系统进行调度以及资源分配多进程的实现原理其实就是操作系统调度进程的原理
三、多道技术
实现原理:
1.空间复用
统一时间,加载多个任务到内存中,多个进程之间内存区域需要相互隔离,这种隔离是物理层面的隔离,其目的是为了保证数安全
2.时间复用
指的是,操作系统会在多个进程之间做切换执行
切换任务的两种情况
1.当一个进程遇到了IO操作 时会自动切换
2.当一个任务执行时间超过阈值会强制切换
注意:在切换前必须保存状态,以便后续恢复执行
并且 频繁的切换其实也需要消耗资源
当所有任务都没有IO操作时,切换执行效率反而降低,但是为了保证并发执行 必须牺牲效率
简单的总结就是切换加保存
有了多道技术,计算机就可以同时并发的处理多个任务
四、并发编程中的重要概念
1、串行 自上而下顺序执行
2、并发 多个任务同时执行 ,但是本质是在不同进程间切换执行,由于速度非常快所以感觉是同时运行
3、并行 是真正的同时运行,必须具备多核CPU ,有几个核心就能并行几个任务,当任务数量超过核心数还是并发执行
以上三个概念都是用于描述处理任务的方式
五、程序运行的状态(阻塞和非阻塞)
1、阻塞:指的是程序遇到了IO操作,无法继续执行代码时的一种状态
2、非阻塞: 指的是程序没有遇到IO操作的一中状态
阻塞非阻塞也可以用来描述执行任务的方式
input() 默认是一个阻塞的操作
我们可以用一些手段将阻塞的操作变成非阻塞的操作 , 例如非阻塞的socket
3、一个进程的三种状态
阻塞
运行
就绪
进程的创建和销毁 了解
对于通用计算机而言.必须具备创建和销毁进程的能力
4、进程的创建
1.用户的交互式请求 鼠标双击
2.由一个正在运行的程序 调用了开启进程的接口 . 例如subprocess
3.一个批处理作业开始
4、系统初始化
5、进程的销毁:
1.任务完成 自愿退出
2.强制结束 taskkill kill 非自愿
3.程序遇到了异常
4.严重错误 比如访问了不该访问的内存
六、进程和程序的区别
程序是 一堆代码放在一个文件中 通常后缀为exe 原本是存储在硬盘上的
进程是 将代码从硬盘读取到内存然后执行 产生的
进程是由程序产生的
一个程序可以产生多个进程,例如qq多开 每一个进程都具备一个PID 进程变编号 且是唯一的
进程的层次结构 了解
在linux中 进程具备父子关系,是一个树状结构 ,可以互相查找到对方
在windows 没有层级关系 , 父进程可以将子进程的句柄转让
父进程 子进程? 例如qq开启了浏览器 那么qq是父进程 浏览器是子进程
七、PID 和 PPID
PID 是当前进程的编号
PPID 是父进程的编号
注意:当我们运行py文件时其实运行的是python解释器
访问PID与PPID
import os
os.getpid()
os.getppid()