进程和线程

多道技术

单道批处理系统:多个程序串行使用CPU

多道程序设计技术:多个程序同时进入计算机的主存储器并启动,宏观上是并行的,多道程序处在运行中;微观上是串行的,各道程序轮流交替使用CPU.空间上的复用,一个CPU可以让多个用户使用

  • 空间上的复用:一个CPU可以提供给多个用户使用
  • 时间上的复用:切换+保存状态
    • 当CPU遇到IO操作[input(),print(),time.sleep()],会将当前执行程序的CPU使用权断开
      • 优点:CPU的利用率高
    • 当一个程序占用CPU时间过长,会断开当前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,用以区分不同的线程

线程的状态

  1. 运行态

    该时刻,该线程正在占用CPU

  2. 就绪态

    可随时转换为运行态,因为其他线程正在运行而暂停,该线程不占用CPU

  3. 阻塞态

    除非某些外部事情发生,否则线程不能运行.等条件满足时,执行

状态 含义
就绪(Ready) 线程能够运行,但在等待被调度.可能线程刚刚创建启动,或刚刚从阻塞中恢复,或被其他线程抢占
运行(Running) 线程正在执行
阻塞(Blocked) 线程等待外部事件发生而无法运行,如I/O操作
终止(Terminated) 线程完成,或退出,或被取消

多进程.多线程的选择

1.CPU密集型

CPython中使用了GIL.多线程的时候锁相互竞争,且多核优势不能发挥,Python多进程效率更高

2.IO密集型

适合使用多线程,可以减少多进程间IO的序列化开销.且在IO等待的时候,切换到其他线程继续执行,效率大大的好.

https://www.jianshu.com/p/873de32e37dd

生产者消费者模型

也叫缓存保定问题,是一个经典的,多进程同步问题.

生产者往缓冲取写入数据,消费者从缓冲区拿去数据,两者同过缓冲区来进行通信,这样的话生产者不必担心要等待消费者使用完数据,消费者也不用担心不够时间处理所有数据

协程

协程是单线程下的并发,又称微线程,纤程,英文名Coroutine.

协程是一种用户态的轻量线程,即协程是由用户程序自己控制调度.

注意:

  1. Python线程是内核级别,即由操作系统控制调度,所以单线程遇到IO或者执行时间过长就会被迫交出CPU执行权限,切换其他线程运行.
  2. 单线程内开启协程,一旦遇到IO,就会从应用程序级别(非操作系统)控制切换,以此来提升效率.

优点:

  1. 协程的切换开销更小,属于程序级别的切换,操作系统感觉不到,所以更加轻量级
  2. 单线程内就可以实现并发的效果,最大限度的利用CPU

缺点:

  1. 协程的本质是单线程,无法利用多核.所以可以是一个程序开启开启多个进程,每个进程内开启多个线程,每个线程开启协程.
  2. 协程是单个线程,所以一旦出现阻塞,就会阻塞整个线程.

使用gevent模块

posted @ 2019-10-21 20:47  Agsol  阅读(113)  评论(0编辑  收藏  举报