协程(用户态线程)
协程
首先什么是协程?有人认为进程下有线程,线程管理着协程.其实这并不对
协程是一种用户态线程.它比线程更加轻量并且协程对于操作系统是并不可见的.
也就是说操作系统看不见协程
同一时刻一个CPU只会执行一个协程.
比如交给协程去执行的代码你可以理解为一个个提交的任务
对比线程
那什么是线程?
线程是进程的一个实体,是CPU调度和分派的基本单位.线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。
创建一个线程每个线程都有自己的TCB都有自己的堆栈.创建一个线程是有很大的花销的
也就是说一台服务器的资源总是有限的,你不可能无休止的去开线程(总有一天你会把内存占完)
默认创建一个线程的大小是1MB(取决于实现)也就是说4G的内存 最多只能创建4096个
但是很多时候我们创建的一个线程用不了这么多内存空间
线程的平均内存空间利用率是很低的
那可能有很多人写过这样的一个程序. 是一个基于Socket聊天的程序.大部分人是这样做的来一个Socket以后为其开一个线程工作.这样小程序的时候貌似没有什么问题
但是只要程序一大可能计算机资源就被分配光了. 更好的做法应该是像Reactor模式一样(有兴趣的可以去看一下).使用IO多路复用.反应器模式的效率会高很多
多线程一定快吗?
有的人一说到多线程就觉得多线程开越多程序用行越好.其实并不是的
多线程的创建和销毁都有一定的开销(更好的方式是线程池和任务队列)
有时候多线程并不如串行化快(一会说).
确实有些场景下多线程会比单线程快 比如:返回一个页面,这个页面可能是图文并茂.你经常看到的一个场景是文字先全部出来然后是图片加载出来.因为文字是很快的,而有时候图片是很大的.如果按顺序加载可能会造成一些不太友好的界面
再比如你使用归并排序或者Dijkstra的求最短路径算法.归并排序和Dijkstra是可以分开成一个个子任务的,每一个线程去执行一个个子任务彼此都是分开的不会产生共享不会产生并发的问题.这样的问题 如果你有很多的数据的话那么使用多线程的效率可能会高一些,但是数据比较小往往来说得到的效果就会很差
而且你有时候可能想尝试使用多线程去优化你的程序,你会发现还不如不使用呢
并发和上下文切换
现代OS可以并发和上下文切换密不可分
在操作系统中,CPU切换到另一