请你说说线程和协程的区别 (补:关于进程)
- 协程适合I/O 密集型任务, 线程在这方面弱于协程
- 协程的开销远远小于线程的开销
- 同一时间, 在多核处理器的环境下, 多个线程是可以并行的,但协程只能并发
- 在协程之间的切换不需要涉及任何系统调用或任何阻塞调用
- 通常的线程是抢先式(即由操作系统分配执行权), 而协程是由开发者分配执行权
由于协程在同一个线程中, 所以不需要用来守卫临界区段的同步性原语(primitive)比如互斥锁、信号量等,并且不需要来自操作系统的支持
进程:一个程序,可以独立运行的一段程序。系统对它进行资源分配和调度。
线程: 进程的基本单位,对它进行cpu分配和调度。只拥有一点在运行中必不可少的资源(寄存器,栈,程序计数器)
协程:Coroutines)是一种比线程更加轻量级的存在。协程完全由程序所控制(在用户态执行),带来的好处是性能大幅度的提升。 一个操作系统中可以有多个进程
一个进程可以有多个线程;同理,一个线程可以有多个协程
协程,看起来和线程差不多,但创建一个协程却不用调用操作系统的功能,编程语言自身就能完成这项操作,所以协程也被称作用户态线程。
而服务器端开发中,大多数时候都是要花大量等待时间的场景,也就是所谓的IO密集,协程极为适合这种场景,而go又主打协程,直接从语法层面支持,切中了以往开发高性能程序太过于复杂的痛点,因此广受程序员们的欢迎。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,且至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
进程与线程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
用多线程的原因:
协程: