进程、线程与协程

  • 2020.06.16

进程

直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,既不共享堆,也不共享栈,上级挂靠单位是操作系统操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程资源分配的最小单位

进程

因此进程的创建和销毁都是相对于操作系统的资源,所以是一种比较昂贵的操作。

进程主要有三种状态:

  1. 等待态: 等待某个事件的完成。

  2. 就绪态: 等待系统分配处理器以便运行。

  3. 运行态: 占有处理器正在运行。

进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程,因此看起来就像是多个进程在同时进行。

TIP

由于进程间是隔离的,各自拥有自己的内存和资源,因此相对于线程比较安全,所以不同进程之间的通信只能通过IPC(Inter-Process Communication)进行通信共享。

IPC的通信主要涉及到如下,这里不进行详细的解释:

  • 管道(Pipe)
  • 命名管道(FIFO)
  • 消息队列(Message Queue)
  • 信号量(Semaphore)
  • 共享内存(Shared Memory)
  • 套接字(Socket)

线程

线程从属于进程,共享进程的内存地址空间,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位

线程

进程和线程的区别与联系

区别

  1. 进程是系统分配资源的最小单位, 线程是CPU调度的最小单位。

  2. 不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  3. 进程是拥有资源的一个独立单位线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间打开的文件句柄集文件系统状态信号处理handler等线程所维护的运行相关的资源(动态资源),如:运行栈调度相关的控制信息待处理的信号集等

  4. 在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

联系

  1. 线程是进程内部的资源,共享进程的内存地址空间,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

  2. 由于默认进程内只有一个线程,所以多核CPU处理多进程就行是一个进程一个核心。

  3. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

协程

协程是属于线程的。协程的程序是在线程里面跑的。因此协程又称作微线程和纤程等。

协程没有线程的上下文切换消耗。协程的调度是用户手动切换的,因此更加灵活,不会出现执行一半的代码被强制中断,无需原子操作锁。

协程

协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

  • 极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;

  • 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

上次更新时间: 2020-06-16 21:04:00