首页 > 其他分享 >协程

协程

时间:2023-05-10 20:57:21浏览次数:28  
标签:协程 ucp 线程 ucontext 上下文 uc

引言

在使用socket编程时,我们会用到accept、connect、recv、send等函数,这些函数在没有数据到达时,会阻塞等待IO数据的到达。 这不利于我们处理多个连接并快速响应。一种方案是,服务端每accept一个连接,就创建一个新的线程用来处理这个连接。这会导致线程过多, 而且线程之前切换开销很大。这就可以使用到协程了。当然不止socket这种可以使用协程,IO密集型都可以使用协程,无论是网络IO还是其他IO。

协程

协程可以理解为用户态的非抢占线程。

特点

用户态:协程是在用户态实现调度。
轻量级:协程不用内核调度,内核态与用户态之间切换。
非抢占:协程是由用户自己实现调度,并且同一时间只能有一个协程在执行,协程自己主动交出CPU的。

优缺点

  • 优点:
    • 协程切换的时候开销小,用户态且轻量
    • 非抢占式,不用加很多锁,减小复杂度,不用很复杂的处理线程同步问题。
  • 缺点:
    • 协程不能利用多核,只能使用单核,因为同时只有一个协程在运行。

适用场景

IO密集型。 在IO密集的情况下,协程的开销比线程小,能快速实现调度。 协程不适用于计算密集型,协程不能很好的利用多核cpu。

ucontext组件

linux下在头文件ucontext.h 提供了getcontext(),setcontext(),makecontext(),swapcontext()四个函数和mcontext_t和ucontext_t结构体。
其中mcontext_t与机器相关。ucontext_t结构体如下(一般在/usr/include下):

typedef struct ucontext
{
    unsigned long int uc_flags;
    struct ucontext *uc_link;
    stack_t uc_stack;
    mcontext_t uc_mcontext;
    __sigset_t uc_sigmask;
    struct _libc_fpstate __fpregs_mem;
} ucontext_t;

其中uc_link指向下文,及当前上下文(可以理解为执行状态)执行完了,恢复运行的上下文;
uc_sigmask为该上下文中的阻塞信号集合;
uc_stack为该上下文中使用的栈;
uc_mcontext保存的上下文的特定机器表示,包括调用线程的特定寄存器等。
通过栈式计算机原理,我们可以知道,保存栈区和所有通用寄存器的值就可以保存程序运行的状态。这里uc_mcontext就是用来保存所有的寄存器的值的。而我们把栈设置到uc_stack所指向的内存, uc_stack就保存了栈的状态。

ucontext的4个函数介绍

int getcontext(ucontext_t *ucp);
获取当前上下文,初始化ucp结构体,将当前的上下文保存到ucp中。如果执行成功,返回0。执行失败返回-1。
int setcontext(const ucontext_t *ucp);
设置当前上下文,设置当前的上下文为ucp, 恢复ucp的执行状态。如果ucp执行完了,会恢复到uc_link所指向的上下文,若uc_link为NULL,则线程退出。如果执行成功,不返回。执行失败返回-1。
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);
创建上下文,修改通过getcontext取得的上下文ucp, 然后给该上下文指定一个栈空间ucp->stack,设置后继的上下文ucp->uc_link。
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
切换上下文,保存当前上下文到oucp结构体中,然后激活upc上下文。 如果执行成功,不返回。执行失败返回-1。

标签:协程,ucp,线程,ucontext,上下文,uc
From: https://www.cnblogs.com/shubin/p/17389297.html

相关文章

  • 协程
    引子之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们......
  • 1 接口 、2 并发与协程 、3 信道,缓冲信道 、4 mutex 、5 异常处理
    目录1接口2并发与协程3信道,缓冲信道4mutex5异常处理1接口#1实现多个接口#2接口嵌套#3接口零值packagemainimport"fmt"//接口//1实现多个接口具体类型可以赋值给多种接口类型//typeAnimalinterface{// run()//}////typeDoginterface{......
  • 《asyncio 系列》2. 详解 asyncio 的协程、任务、future,以及事件循环
    楔子上一篇文章我们深入讨论了并发性,探讨了如何同时使用进程和线程实现并发,还探索了如何利用非阻塞IO和事件循环来实现只使用一个线程的并发性。本篇文章将介绍在asyncio中使用单线程并发模型编写程序的基础知识,使用本文中的技术,你将能执行长时间运行的操作,如Web请求、数据......
  • 【协程】进程,线程和协程
    进程进程,描述的是程序的执行过程,是运行着程序的代表,在操作系统中,每个进程的内存空间都是独立的,使用多进程并发有两个缺点:一是内核的管理成本高,而是无法简单地通过内存同步数据(进程运行的虚拟内存空间),很不方便,于是多线程模式就出现了。线程线程是操作系统能够运行运算调度的最......
  • Go语言协程技术文档
    协程(goroutine)是Go语言的一种轻量级线程,可以在一个线程中运行多个协程,从而实现高并发程序。协程具有低开销、高效率和易于管理等优点,被广泛应用于网络服务、云计算、大数据处理和人工智能等领域。本文将介绍Go语言协程的基本概念和使用方法。协程的概念协程是一种用户级线程,由Go......
  • Go语言入门12(协程 goroutine)
    协程进程和线程进程​ 当运行一个应用程序的时候,操作系统会为这个应用程序启动一个进程。可以将这个进程看作一个包含了应用程序在运行中需要用到和维护的各种资源的容器。这些资源包括但不限于内存地址空间、文件和设备的句柄以及线程线程​ 一个线程是一个执行空间,这个空间......
  • Python教程:协程、异步
    协程,又称作Coroutine。从字面上来理解,即协同运行的例程,它是比是线程(thread)更细量级的用户态线程,特点是允许用户的主动调用和主动退出,挂起当前的例程然后返回值或去执行其他任务,接着返回原来停下的点继续执行。yield语句实现函数执行到一半返回等会又跑到原来的地方继续执行。yiel......
  • Tars-Cpp 协程实现分析
    作者:vivo互联网服务器团队-YeFeng本文介绍了协程的概念,并讨论了TarsCpp协程的实现原理和源码分析。一、前言Tars是Linux基金会的开源项目(https://github.com/TarsCloud),它是基于名字服务使用Tars协议的高性能RPC开发框架,配套一体化的运营管理平台,并通过伸缩调度,......
  • C++ 20 协程总结
    C++20协程总结介绍C++20提供的是非对称的、一等对象、无栈的协程(CoroutinesinC++20areasymmetric,first-class,andstackless)所谓协程,即用户级线程,一种用于将异步代码同步化的编程机制,使得程序的执行流可以在多个并行事务之间切换但又不必承担切换带来的过高的性能损耗。......
  • Android开发,使用的是OkHttp和Reftrofit,用的是Kotlin协程,用Kotlin写一个网络拦截器,模拟
    首先,我们需要定义一个网络拦截器类,继承自OkHttp的Interceptor接口:classLoginInterceptor:Interceptor{overridefunintercept(chain:Interceptor.Chain):Response{//模拟登录请求,这里可以根据具体情况进行修改valrequest=chain.request().ne......