进程、线程、协程

进程、线程、协程(W.W.W.H)

1.1、什么是进程?

  1. 进程是资源分配的最小单位
  2. 当一个程序被执行的时候就变成了进程

1.1.2、进程推展分析

  1. 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,这种执行的程序就称之为进程

  2. 程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行动,属于动态概念

  3. 在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。

  4. 进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。

  5. 进程之间有自己独立的内存,各进程之间不能相互访问

  6. 创建一个新线程很简单,创建新进程需要对父进程进行复制

多道编程: 在计算机内存中同时存放几道相互独立的程序,他们共享系统资源,相互穿插运行

单道编程: 计算机内存中只允许一个的程序运行

1.1.3.1、进程并发性:

  1. 在一个系统中,同时会存在多个进程被加载到内存中,同处于开始到结束之间的状态。

  2. 对于一个单CPU系统来说,程序同时处于运行状态只是一种宏观上的概念他们虽然都已经开始运行,但就微观而言,任意时刻,CPU上运行的程序只有一个。

  3. 由于操作系统分时,让每个进程都觉得自己独占CPU等资源。

    注:如果是多核CPU(处理器)实际上是可以实现正在意义的同一时间点有多个线程同时运行。

1.1.3.2、线程并发性:

  1. 操作系统将时间划分为很多时间段,尽可能的均匀分配给每一个线程。
  2. 获取到时间片的线程被CPU执行,其他则一直在等待,所以微观上是走走停停,宏观上都在运行。

多核CPU情况:          

  • 如果你的程序的线程数少于CPU的核心数,且系统此时没有其他进程同时运行,那么这个程序的每个线程会享有一个CPU,当同时运行的线程数多于CPU核心数时,CPU会采用一定的调度算法每隔一段时间就将这些线程调入或调出CPU以确保每个线程都能分享一部分CPU时间,实现多线程并发。

1.1.4、为什么有了进程还需要线程?

  1. 进程优点:

    • 提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率
  2. 进程的两个重要的缺点:

    • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
    • 进程在执行的过程中如果阻塞,即使进程中有些工作不依赖于输入的数据,也将无法执行(例如等待输入,整个进程就会挂起)。
    例如:

    c. 我们在使用qq聊天, qq做为一个独立进程如果同一时间只能干一件事,那他如何实现在同一时刻 即能监听键盘输入、又能监听其它人给你发的消息

    d. 你会说,操作系统不是有分时么?分时是指在不同进程间的分时呀

    e. 即操作系统处理一会你的qq任务,又切换到word文档任务上了,每个cpu时间片分给你的qq程序时,你的qq还是只能同时干一件事呀


2.1.1、什么是线程?

  1. 线程是操作系统调度的最小单位。
  2. 它被包含在进程之中,是进程中的实际运作单位。
  3. 进程本身是无法自己执行的,要操作cpu,必须创建一个线程,线程是一系列指令的集合。

2.1.2、线程拓展分析:

  1. 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
  2. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

  3. 无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行

  4. 进程本身是无法自己执行的,要操作cpu,必须创建一个线程,线程是一系列指令的集合

  5. 所有在同一个进程里的线程是共享同一块内存空间的,不同进程间内存空间不同

  6. 同一个进程中的各线程可以相互访问资源,线程可以操作同进程中的其他线程,但进程仅能操作子进程

  7. 两个进程想通信,必须要通过一个中间代理

  8. 对主线程的修改可能回影响其他子线程,对主进程修改不会影响其他进程因为进程间内存相互独立,但是 同一进程下的线程共享内存

2.2.1、进程和线程的区别:

启动一个线程比启动进程快,运行速度没有可比性。

现有一个进程,然后才有线程。

1、进程包含线程

2、线程共享内存空间

3、进程内存是独立的(不可互相访问)

4、进程可以生成子进程,子进程之间互相不能互相访问(相当于在父级进程克隆两个子进程)

5、在一个进程里面线程之间可以交流。两个进程想通信,必须通过一个中间代理来实现

6、创建新线程很简单,创建新进程需要对其父进程进行克隆。

7、一个线程可以控制或操作同一个进程里面的其它线程。但进程只能操作子进程。

8、父进程可以修改不影响子进程,但不能修改。

9、线程可以帮助应用程序同时做几件事

2.2.2、进程和程序的区别:

  1. 程序只是一个普通文件,是一个机器代码指令和数据的集合,所以,程序是一个静态的实体

  2. 而进程是程序运行在数据集上的动态过程,进程是一个动态实体,它应创建而产生,应调度执行因等待资源或事件而被处于等待状态,因完成任务而被撤消

  3. 进程是系统进行资源分配和调度的一个独立单位

  4. 一个程序对应多个进程,一个进程为多个程序服务(两者之间是多对多的关系)

  5. 一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程

2.3、多线程

Python多线程编程中常用方法:

  1. join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join([timeout]) timeout:可选参数,线程运行的最长时间
  2. isAlive()方法:查看线程是否还在运行
  3. getName()方法:获得线程名
  4. setDaemon()方法:主线程退出时,需要子线程随主线程退出,则设置子线程的setDaemon()

2.4、有了进程为什么还需要线程

  • 因为进程不能同一时间只能做一个事情

2.5、GIL全局解释器锁

  • 在python全局解释器下,保证同一时间只有一个线程运行
  • 防止多个线程都修改数据

2.6.1、线程锁(互斥锁)

  • GIL锁只能保证同一时间只能有一个线程对某个资源操作,但当上一个线程还未执行完毕时可能就会释放GIL,其他线程就可以操作了
  • 线程锁本质把线程中的数据加了一把互斥锁
    • mysql中共享锁 & 互斥锁
      • mysql共享锁:共享锁,所有线程都能读,而不能写
      • mysql排它锁:排它,任何线程读取这个这个数据的权利都没有
    • 加上线程锁之后所有其他线程,读都不能读这个数据
  • 有了GIL全局解释器锁为什么还需要线程锁
    • 因为cpu是分时使用的

2.6.2、死锁定义

  • 两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去

3.协程

  • 什么是协程
    • 协程微线程,纤程,本质是一个单线程
    • 协程能在单线程处理高并发
      • 线程遇到I/O操作会等待、阻塞,协程遇到I/O会自动切换(剩下的只有CPU操作)
      • 线程的状态保存在CPU的寄存器和栈里而协程拥有自己的空间,所以无需上下文切换的开销,所以快、
    • 为甚么协程能够遇到I/O自动切换
      • 协程有一个gevent模块(封装了greenlet模块),遇到I/O自动切换
  • 协程缺点
    • 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上
    • 线程阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
  • 协程最大的优点
    • 不仅是处理高并发(单线程下处理高并发)
    • 特别节省资源(500日活,用php写需要两百多态机器,但是golang只需要二十多太机器)
      • 200多台机器一年
      • 二十多天机器一年
posted @ 2020-03-31 09:29  硬汉不太硬  阅读(63)  评论(0)    收藏  举报