协同学的目的是通过放弃当前协同学调度并在有长时间I/O操作时执行下一个任务来消除ContextSwitch的开销 。
谢城特色操作系统负责调度线程切换 , 用户负责调度进程 , 减少了上下文切换 , 提高了效率 。
线程的默认堆栈大小是1M,而协程更?。咏?K 。因此,可以在同一个内存中打开更多的协程 。
因为是在同一个线程上,所以可以避免竞争,使用锁 。
适用于需要大量并发的阻塞场景 。但不适合计算量大的多线程 。在这种情况下,不如用实用的线程来解决 。
协同过程原理当发生IO拥塞时,由协调调度器进行调度 。通过立即让出数据流 , 并将数据记录在当前堆栈上 , 堆栈在拥塞后立即由线程恢复,拥塞的结果放在该线程上运行 。看起来好像和写同步代码没什么区别 。整个进程可以称为协程,在协程的调度中运行的线程称为纤程 。比如Golang中的go关键字,其实就是负责打开一个纤程,让func逻辑在上面运行 。
因为协调过程的暂停完全由程序控制 , 它发生在用户状态;但是,线程的阻塞状态是由操作系统的内核切换的,这发生在内核状态 。
所以协程的开销远小于线程 , 所以ContextSwitch上没有开销 。
进程和线程的比较比较线程协调占用资源的初始单位是1MB,固定的初始通常是2KB,可以根据需要增加 。调度属于OS内核,切换由用户完成 。开销包括模式切换(从用户模式切换到内核模式)、刷新16个寄存器、PC、SP , ...诸如此类 。只有三个寄存器被修改——PC/SP/DX 。性能问题占用太多资源,频繁的创建和销毁会带来严重的性能问题 。资源占用小,但不会带来严重的性能问题 。数据同步需要锁定和其他机制来确保数据的一致性和可见性 。没有多线程锁机制,因为只有一个线程 , 不存在同时写变量的冲突 。在协调过程中只需要判断控制共享资源时的状态,所以执行效率远高于多线程 。
推荐阅读
- 美的电饼铛怎么用
- 织毛衣、围巾、帽子 编织人生围巾
- 浸锡对身体有什么危害
- 如何辨别第一套人民币 人民币辨别
- 安逸花未入账是什么意思
- 爵位公侯伯子男一定是这个顺序吗 公侯伯子男五种爵位什么级别
- 霍家二少霍启山:爱过章子怡 霍启山 章子怡
- 美的电磁炉E3的解决办法
- 人在选择工作时如何做选择