进程线程协程的区别
目录
一、进程(Process)
操作系统资源分配的基本单位,具有独立的内存空间
一般一个应用代表一个进程
二、线程(Thread)
进程内的执行单元,共享进程内存
一个进程内可以同时并发执行多个线程,线程是由 CPU 内核进行控制:创建、执行、销毁
由 CPU 调度执行
三、协程(Goroutine)
准确的来说,协程应该是 Goroutine,但是 go 基于 Goroutine 的理念创建了属于自己的协程 Goroutine,
用户态轻量级线程,由运行时调度,由语言自己进行调度控制,创建和销毁都由语言自身实现
四、区别
一个进程可以执行多个线程
一个线程可以同时执行多个协程
线程是面向内核态(操作系统)的,而协程是用户态(语言开发者)的,
在创建开销、切换成本、内存隔离、调度方式、通信方式等方面,协程的性能远高于线程
协程的初始化大小只有 2-4 k
常见问题
1. 线程是怎么调度的
线程调度是操作系统内核的基本功能之一,用于决定在多个线程之间分配 CPU 时间的算法和策略。线程调度的具体实现方式可能因操作系统而异,但通常包括以下几个方面:
调度策略 | 描述 | 特性 |
---|---|---|
时间片轮转调度 | 操作系统为每个线程分配一定的时间片,在时间片结束后,操作系统会将 CPU 时间切换到下一个就绪线程上 | 这种调度方式可以保证公平性,避免某个线程长时间占用 CPU,但在高负载环境下可能会导致上下文切换频繁,影响系统性能 |
优先级调度 | 操作系统为每个线程分配一个优先级,优先级高的线程会先获得 CPU 时间 | 种调度方式可以根据不同线程的需求,合理分配 CPU 时间,但可能会导致优先级低的线程长时间得不到执行,产生“饥饿”现象。 |
抢占式调度 | 操作系统可以在任何时候中断正在执行的线程,将 CPU 时间切换到其他就绪线程上 | 这种调度方式可以及时响应高优先级线程的请求,但可能会导致上下文切换频繁,影响系统性能 |
同步机制 | 操作系统提供了一些同步机制(如锁、信号量等),可以用于协调多个线程之间的执行顺序和访问共享资源的方式 | 这些同步机制可以通过阻塞线程或者挂起线程的方式来控制线程的执行。 |
2. 协程是如何调度的?
协程的调度由语言开发者自定义实现,比如 go 实现的 GMP 调度模型:Go 原理之 GMP 并发调度模型