最初多数的用户线程被设计成协同式调度 所以有了别名“协程” 又由于此时的协程会完整的调用栈保护 恢复工作 也被称为“有栈协程” 与后来的“无栈协程”区分开
无栈协程的典型应用即各种语言中await async yield这类关键字 本质上是一种有限状态机 状态保存在包里 比有栈线程调用栈要轻量很多 功能也相对更有限
协程的主要优势是轻量 无论是有栈协程还是无栈协程都比传统内核线程要轻量的多 但是协程也有他的局限 需要在应用层面实现的内容特别多(调用栈 调度器等)
有栈协程有一种特例实现名为纤程(典型的有栈协程)
一个轻量级或用户模式纤程 调度java虚拟机而不是操作系统 纤程占用空间小 任务切换开销小 可以拥有数百万个
一段使用纤程并发的代码会被分为两部分——执行过程和调度器
执行过程主要用于维护执行现场 保护恢复上下文状态 而调度器负责编排所有要执行的代码的顺序
将调度程序与执行过程分离的好处是用户可以自己选择自行控制其中的一个或者多个 而java中现有的调度器也可以被直接重用
进程与线程的区别
进程是资源分配最小单位,线程是程序执行的最小单位;
进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;
CPU切换一个线程比切换进程花费小;
创建一个线程比进程开销小;
线程占用的资源要⽐进程少很多。
线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数据,进程之间的通信需要以通信的方式(IPC)进行;(但多线程程序处理好同步与互斥是个难点)
多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间);
进程对资源保护要求高,开销大,效率相对较低,线程资源保护要求不高,但开销小,效率高,可频繁切换;