多道技术
单道批处理系统:多个程序串行使用CPU
多道程序设计技术:多个程序同时进入计算机的主存储器并启动,宏观上是并行的,多道程序处在运行中;微观上是串行的,各道程序轮流交替使用CPU.空间上的复用,一个CPU可以让多个用户使用
- 空间上的复用:一个CPU可以提供给多个用户使用
- 时间上的复用:切换+保存状态
- 当CPU遇到IO操作[input(),print(),time.sleep()],会将当前执行程序的CPU使用权断开
- 优点:CPU的利用率高
- 当一个程序占用CPU时间过长,会断开当前CPU使用权
- 缺点:程序的执行效率降低
- 当CPU遇到IO操作[input(),print(),time.sleep()],会将当前执行程序的CPU使用权断开
进程的调度
先进先出算法
最先进入的进程最先执行,一直到该进程结束,或阻塞时,释放
缺点:若长时间先进入,后面无法使用
短进程优先
谁用时短,谁优先执行
缺点:长时间进程需要被控很长时间
时间片轮转法
CPU执行时间1s中,加载N个程序,将1s等分未N个时间片.
多级反馈队列
将执行优先分为多层级别
1:优先级最高
2:优先级第二
3:以此类推
......
同步和异步
指的是提交任务的方式
同步:
发送方发出数据后,等接收方回响应以后才发下一个数据包的通讯方式
异步:
发送方发出数据后,不等待接收方发回响应,接着发送下个数据包的通讯方式
同步时阻塞模式,异步是非阻塞模式.
注意:阻塞和非阻塞,同步和异步不是同一个概念!
进程的回收
孤儿进程
父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程
僵尸进程
子进程终止,父进程尚未对其ID进行回收,变成僵尸进程.
并发
基本概念
串行:排成一队一个个处理
好的程序都是串并行结合的
并发和并行的区别
并行,parallel
同时做某些事,可以互不干扰的同一个时刻做多件事
并发,
同时一个时刻或某一段时间内,需要有多件事需要做
并行可以解决并发问题
比如:十辆车要同时经过单车道,修建4车道,就是通过并行解决并发的问题
并发的解决
食堂打饭模型
12点开饭,都涌向食堂,这就是并发.如果人特别多,这就时高并发.
1.队列.缓冲区
排成队列,就是一个缓冲地带,就是缓冲区
如若有女士,那女士队就是一个优先队列
2.争抢
有人抢这打饭,抢到了就相当于锁定窗口,只是一种锁机制
是一种解决高并发的解决方案,但是不好,因为有人长时间抢不到
如果争抢,一定要有锁机制,不然争到了也会很快被别人抢掉
3.预处理
提前做80%的菜预备着
一种提前加载用户需要的数据的思路,预处理思想,缓存常用
4.并行
相当于开多个窗口让人打饭,成本上升
日常可以通过购买更多服务器,或多开进程,进程实现并行处理,来解决并发问题
这些都是水平扩展思想
注:
如果线程在单CPU上处理,就不是并行了
但是多数服务器都是多CPU的,服务的不是往往是多机的,分布的,这都是并行处理,
5.提速
提高单个窗口的打饭速度,也是解决并发的方式.
提高单个CPU性能,或单个服务器安装更多的CPU
这是一种垂直扩展的思想
缺点:容易触到技术天花板,而且价格到后面会飙升
6.消息中间件
相当于缓冲,但是在系统外面(第三方)缓冲
进程和线程
在实现了线程的操作系统中,线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一个程序的执行实例就是一个进程.
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.
进程和线程的关系
-
程序是源代码编译后的文件,而这些文件存放在磁盘上,当程序被操作系统加载到内存中,就是进程,进程中存放着指令和数据(资源),它也是线程的容器.进程就是个大集合,真正工作的是线程.
-
Linux进程有父进程,子进程,Windows的进程是平等关系.
-
线程,有时侯被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.
-
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.
进程线程的理解
现代操作系统提出进程的概念,每一个进程都认为自己独占所有的计算机硬件资源,
进程就是独立的王国,进程间不可以随便的共享数据
线程就是省份,同一个进程内的线程可以共享进程的资源,每一个线程拥有自己独立的堆栈.
每个线程都有一个独立的线程id,用以区分不同的线程
线程的状态
-
运行态
该时刻,该线程正在占用CPU
-
就绪态
可随时转换为运行态,因为其他线程正在运行而暂停,该线程不占用CPU
-
阻塞态
除非某些外部事情发生,否则线程不能运行.等条件满足时,执行
状态 | 含义 |
---|---|
就绪(Ready) | 线程能够运行,但在等待被调度.可能线程刚刚创建启动,或刚刚从阻塞中恢复,或被其他线程抢占 |
运行(Running) | 线程正在执行 |
阻塞(Blocked) | 线程等待外部事件发生而无法运行,如I/O操作 |
终止(Terminated) | 线程完成,或退出,或被取消 |
多进程.多线程的选择
1.CPU密集型
CPython中使用了GIL.多线程的时候锁相互竞争,且多核优势不能发挥,Python多进程效率更高
2.IO密集型
适合使用多线程,可以减少多进程间IO的序列化开销.且在IO等待的时候,切换到其他线程继续执行,效率大大的好.
https://www.jianshu.com/p/873de32e37dd
生产者消费者模型
也叫缓存保定问题,是一个经典的,多进程同步问题.
生产者往缓冲取写入数据,消费者从缓冲区拿去数据,两者同过缓冲区来进行通信,这样的话生产者不必担心要等待消费者使用完数据,消费者也不用担心不够时间处理所有数据
协程
协程是单线程下的并发,又称微线程,纤程,英文名Coroutine.
协程是一种用户态的轻量线程,即协程是由用户程序自己控制调度.
注意:
- Python线程是内核级别,即由操作系统控制调度,所以单线程遇到IO或者执行时间过长就会被迫交出CPU执行权限,切换其他线程运行.
- 单线程内开启协程,一旦遇到IO,就会从应用程序级别(非操作系统)控制切换,以此来提升效率.
优点:
- 协程的切换开销更小,属于程序级别的切换,操作系统感觉不到,所以更加轻量级
- 单线程内就可以实现并发的效果,最大限度的利用CPU
缺点:
- 协程的本质是单线程,无法利用多核.所以可以是一个程序开启开启多个进程,每个进程内开启多个线程,每个线程开启协程.
- 协程是单个线程,所以一旦出现阻塞,就会阻塞整个线程.
使用gevent模块