2.6 协程
发表于|更新于|操作系统
|总字数:203|阅读时长:1分钟|浏览量:
协程
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
文章作者: Estom
文章链接: https://estom.github.io/2021/04/19/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2.6%20%E5%8D%8F%E7%A8%8B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!
相关推荐

2022-12-19
08 Java内存模型
内存模型1 Java 内存模型Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 主内存与工作内存处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。 加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。 所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中,保存了该线程使用的变量的主内存副本拷贝。 线程只能直接操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成。 内存间交互操作Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。 read:把一个变量的值从主内存传输到工作内存中 load:在 read 之后执行,把 read 得到的值放入工作内存的变量副本中 use:把工作内存中一个变量的值传递给执行引擎 assign:把一个从执行引擎接收到的值赋给工作内存的变量 store:把工作内存的一个变量的...

2021-03-30
2.5 进程与线程
1 进程与线程进程 进程是资源分配的基本单位。进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。 下图显示了 4 个程序创建了 4 个进程,这 4 个进程可以并发地执行。 线程 线程是独立调度的基本单位。一个进程中可以有多个线程,它们共享进程资源。 线程栈是在进程的堆中分配栈空间,每个线程拥有独立的栈空间,为了避免线程之间的栈空间踩踏,线程栈之间还会有以小块guardsize用来隔离保护各自的栈空间,一旦另一个线程踏入到这个隔离区,就会引发段错误。 QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。 区别 调度。线程是独立调度的基本单位,进程是资源分配的基本单位。在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。 并发性。线程使得操作系统具有更好的并发性,从...

2021-03-29
2 进程管理
进程管理 目录 进程的基本概念 进程控制 进程同步 进程通信 线程

2021-04-21
附录5 协程
协程1 概念协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 例如: 12345678def A() :print '1'print '2'print '3'def B() :print 'x'print 'y'print 'z' 由协程运行结果可能是12x3yz。在执行A的过程中,可以随时中断,去执行B,B也可能在执行过程中中断再去执行A。但协程的特点在于是一个线程执行。 2 区别 那和多线程比,协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。 3 其他在协程上利用多核CPU呢...

2021-09-07
A.8-chinese
A.8 线程本地变量线程本地变量允许程序中的每个线程都有一个独立的实例拷贝。可以使用thread_local关键字来对这样的变量进行声明。命名空间内的变量,静态成员变量,以及本地变量都可以声明成线程本地变量,为了在线程运行前对这些数据进行存储操作: 123456789101112thread_local int x; // 命名空间内的线程本地变量class X{ static thread_local std::string s; // 线程本地的静态成员变量};static thread_local std::string X::s; // 这里需要添加X::svoid foo(){ thread_local std::vector<int> v; // 一般线程本地变量} 由命名空间或静态数据成员构成的线程本地变量,需要在线程单元对其进行使用前进行构建。有些实现中,会将对线程本地变量的初始化过程,放在线程中去做;还有一些可能会在其他时间点做初始化,在一些有依赖的组合中,根据具体情况来进行决定。将没有构造好的线...

2020-07-21
5.4 IO多路复用与线程进程
IO多路复用1 单线程并发的含义IO多路复用即单线程并发,事件驱动模型。有事件响应机制、事件回调机制等。 单线程并发,并非真正意义上的单线程。而是只有单一的用户线程。还包括数据库,socket等系统多线程。 单个用户线程:对于十万个用户同时访问服务器,有两种方式处理并发。 为每个用户开一个新的用户线程,每个线程内部采用阻塞通信的方式,即同步通信,从数据库中取数据、与服务器通信等,直到得到结果,返回给用户。其中涉及多个用户线程。 只有一个用户线程,采用非阻塞通信的方式,即异步通信,通过事件驱动的方式实现并发。从数据库中取数据、与服务器通信或与其他进程通信,并不会阻塞线程的执行,每次数据获取完毕,通过事件的方式,调用用户进程,处理得到的数据,返回给用户。其中,只有一个用户进程。 对于事件驱动的方法:会存在一个事件队列,唯一的用户进程会不断地依次处理队列中的事件。所以不会存在冲突。有两种处理事件的方法:基于监听器的事件处理机制和基于回调的事件处理机制。 常见的线程通信:与服务器进行通信socket,与数据库进行通信、与文件读写进程进行通信。 前者通过扩展空间的方式,后者通过缩短时间...
公告
欢迎参观Estom的小屋




