最近在研究协程,产生了几个疑问
- 为什么协程能提升性能?
- 单核CPU是不是同一时刻只能运行一个线程?
- 协程产生的背景是什么?
为了解决这些疑惑,我觉得应该先从操作系统的进程、线程开始入手
进程
进程产生的背景:计算机在运行任务,任务进入阻塞状态时(I\O阻塞),此时不希望一直等待产生系统性能浪费,是否可以运行其他的任务,在切换回原来的任务时,是否可以继续之前的进度执行?
进程的概念由此产生,进程是用来描述任务在计算机系统中的状态,进程中存储了任务的上下文信息,用于进程切换恢复。
那是否可以用户来控制进程切换呢?
答案肯定是不可以的,如果用户控制进程使用,可能会让某个任务长期占有CPU资源不释放,导致其他任务无法进行,或是让系统崩溃。所以进程的切换应交由内核来控制。
现在我们产生了另外一个问题,因为进程之间是相互独立的,进程中保存了上下文信息,频繁切换进程会导致内核要频繁置换状态,切换进程会产生大量的资源浪费,怎么才能解决这个问题呢?
线程
线程就由此产生了,线程是属于进程的,同一个进程下多个线程共用了进程资源,而且线程占用的资源要远小于进程。现在进行线程任务切换,只需要刷新寄存器的状态(保存当前线程的工作变量),但此时线程切换还是由内核来控制。
是否线程切换不需要了,在进程中写逻辑流调度的东西,这样就可以进行高并发,同时避免系统频繁调用产生的开销
协程
协程就是用户态的线程。协程属于线程,同一个线程下多个协程共享资源,由程序来控制逻辑流切换,具体需要协程通过某个指令,主动上交控制权,执行其他线程任务。
协程特点:占用资源小,线程内共享资源,用户态线程。
多线程
为什么要实现多线程?
线程是CPU调度的最小单位。
多线程的出现是有多任务并行执行的需要,比如我们需要在编辑文档的同时,也可以听音乐,如果是单线程执行,那就在编辑文档的同时,只能挂起音乐任务了,这样显然不能达到我们的目的。
同时多核CPU、多处理器的计算机的出现,也使得多线程也成为一种趋势。多线程能更好的利用CPU的效率,能让多个任务并行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。