面试-进程 线程 协程

一、进程

进程的概念

1.进程是一个实体。每个进程都有自己的地址空间(CPU分配)。实体空间包括三部分:

* 文本区域:存储处理器执行的代码。
* 数据区域:存储变量或进程执行期间使用的动态分配的内存。
* 堆栈:进程执行时调用的指令和本地变量。

2.进程是一个“执行中的程序”。

程序是指令与数据的有序集合,程序本身是没有生命的,只有CPU赋予程序生命时(CPU执行程序),它才能成为一个活动的实体,称为“进程”。

概括来说,进程就是一个具有独立功能的程序在某个数据集上的一次运行活动

进程的特点

* 动态性:进程是程序的一次执行过程,动态产生,动态消亡。
* 独立性:进程是一个能独立运行的基本单元。是系统分配资源与调度的基本单元。
* 并发性:任何进程都可以与其他进程并发执行。

二、并发与并行

并发:在操作系统中,某一时间段,几个程序在同一个CPU上运行,但在任意一个时间点上,只有一个程序在CPU上运行。

当有多个线程时,如果系统只有一个CPU,那么CPU不可能真正同时进行多个线程,CPU的运行时间会被划分成若干个时间段,每个时间段分配给各个线程去执行,一个时间段里某个线程运行时,其他线程处于挂起状态,这就是并发。并发解决了程序排队等待的问题,如果一个程序发生阻塞,其他程序仍然可以正常执行。

并行:当操作系统有多个CPU时,一个CPU处理A线程,另一个CPU处理B线程,两个线程互相不抢占CPU资源,可以同时进行,这种方式成为并行。

区别

并发只是在宏观上给人感觉有多个程序在同时运行,但在实际的单CPU系统中,每一时刻只有一个程序在运行,微观上这些程序是分时交替执行。
在多CPU系统中,将这些并发执行的程序分配到不同的CPU上处理,每个CPU用来处理一个程序,这样多个程序便可以实现同时执行。

三、线程

3.1、线程的引入

60年代,操作系统中拥有资源并独立运行的基本单位是进程,进程是资源的拥有者,进程的创建、撤销、切换花销太大。多CPU处理出现,可以满足多个单位同时运行,但是多个进程并行花销太大。80年代,出现了轻量级的,能够独立运行的基本单位,线程。

3.2、线程的概念

  • 线程是进程中的一个实体,是被系统独立调度和分派的基本单位。 线程的实体包括程序,数据,TCB。TCB包括:

  1. 线程状态
  2. 线程不运行时,被保存的现场资源
  3. 一组执行堆栈
  4. 每个线程的局部变量
  5. 访问统一进程中的资源
  • 线程自己不拥有系统资源,只拥有一点运行中必不可少的资源。
  • 同一进程中的多个线程并发执行,这些线程共享进程所拥有的资源。

3.3、进程与线程的区别

  • 进程是CPU资源分配的基本单位,线程是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。
  • 进程拥有自己的资源空间,一个进程包含若干个线程,线程与CPU资源分配无关,多个线程共享同一进程内的资源。
  • 线程的调度与切换比进程快很多。

四、协程

协程是一种比线程更加轻量级的存在,最重要的是,协程不被操作系统内核管理,协程是完全由程序控制的。

运行效率极高,协程的切换完全由程序控制,不像线程切换需要花费操作系统的开销,线程数量越多,协程的优势就越明显。

协程不需要多线程的锁机制,因为只有一个线程,不存在变量冲突。

对于多核CPU,利用多进程+协程的方式,能充分利用CPU,获得极高的性能。

Python中使用协程的例子

yield关键字相当于是暂停功能,程序运行到yield停止,send函数可以传参给生成器函数,参数赋值给yield。

def customer():
    while True:
        number = yield
        print('开始消费:',number)
        
custom = customer()
next(custom)
for i in range(10):
    print('开始生产:',i)
    custom.send(i)

结果

原文地址:https://www.cnblogs.com/fan-1994716/p/11873012.html