首页
学习
活动
专区
工具
TVP
发布

程和无

当前很多的编程语言都内置程特性或者有自己的程库,如C/C++的libco、golang的goroutine等。而在实现机制上,又可以划分为有程和无程,我们分别进行介绍。...有程 所谓有程是指执行环境的恢复是通过函数(即运行时上下文)的恢复实现的,在此之前我们先回忆一下函数调用的基础知识。...,函数通过函数返回语句实现执行权限的归还&通过中返回地址实现被中断执行流程的恢复,而有程正是基于这一朴素的想法实现的:在有程中,将每个并行事务看成是一个函数调用,而程库负责把让出执行权时的程的上下文缓存起来...,然后把执行权限通过接口co_swap交还给父程即可,并将当前程退程 有程是基于函数切换上下文恢复的思路实现被中断程的继续执行,但是这个上下文里面有返回地址,即下一条指令的地址...这样既解决了上下文切换很多不必要的操作,也解决了程序修改后指令地址改变导致的无法恢复的问题 无程的Demo实现 一个程库要解决以下几个问题: 1)如何在程阻塞调用时归还执行权限?

4.3K43

程-无程(下)

程库——protothread ProtoThread源码如下所示: #define LC_INIT(s) s = 0; #define LC_RESUME(s) switch(s) { case...,直接通过return交出执行权限;在交出执行权限之前,调用LC_SET,查看LC_SET的代码,看到这里我们看PT是通过记录行号给源码打标签 ·ProtoThread通过宏PT_SCHEDULE来实现程的调度...,而外层用name->RoleData的映射关系管理程及其他程中间态数据;     需要注意的是——以protothread来说: ·对于无程来说,因为不存在指针等信息,所以无程的所有信息是可以缓存在共享内存的...,以避免因为逻辑修改导致程不可恢复的场景);     对于无程来说,执行流的恢复只是通过找到下一条指令的执行地址,但是不包括上下文,这意味着无程里面不能有局部变量,需要我们手动把后面需要用到的局部变量缓存起来...此外这里无程是通过switch-case实现的,嵌套的switch-case会产生问题,限制比较多,所以也不适用于线上场景。

70220
您找到你想要的搜索结果了吗?
是的
没有找到

初识

由于Go程的是Go运行时管理的,并分配于堆上,不由操作系统管理,所以我们先来看看的内存如何被Go运行时管理和回收的。本篇文章先从初步认识开始。...查看本系列完整内容请访问 https://tigerb.cn/go/#/kernal/ 前言 ---- 为了对有个初步的认识,我们先来回顾数据结构中的概念,再来看看内存的概念作用,最后我们再来通过对比进程中的内存和线程中的内存来对程中的内存有个初步的认知...谁决定了代码在运行过程中,从空间分配或释放多少内存? 我们分别从「进程」和「线程」、「」视角看看以上两个问题。 进程 什么是进程?...谁决定了代码在运行过程中,从空间(线程)分配或释放多少内存? 答:同进程,编译器决定。 什么是?...答:使用`go`关键字创建一个程时,Go运行时从堆上分配一块连续内存作为程的空间。 谁决定了空间的大小范围?

15730

程(上)

程 有程是基于函数切换上下文恢复的思路实现被中断程的继续执行,但是这个上下文里面有返回地址,即下一条指令的地址,所以当程序发生改动重新编译生成,指令地址有可能发生改变,这种对于需要重新编译生成发布的发布场景支持并不友好...无程的Demo实现     一个程库要解决以下几个问题:     1)如何在程阻塞调用时归还执行权限?     2)如何选择合适的程进行调度?     ...在前面讨论中,可以认为程是一个函数的调用,那么程的恢复无非是从调用中断处继续执行,而对于无程不需要进行上下文恢复,则核心是通过存储标签保证下次调度能从预期的地方继续执行,那么就有:     1)...,这个协程库提供相应接口支持即可;     3)针对问题三,因为程被认为是一次函数调用,则执行权限交给对应被调度程本质上调用程的接口即可,即通过接口调用实现执行权限的传递;     4)如何实现中断指令流的继续...虽然我们可以对上述进行优化和封装,但是在这我们并不准备过多赘述,后面我们则直接看一个开源的无程库-protothread     未完待续...

51740

小白学程笔记3-实现自己的程库(独立,共享)-2021-2-22

文章目录 前言 一、程库实现-独立 1.程结构体定义 2.程调度器定义 3.程创建函数 4.程启动/恢复函数 5.程挂起函数 6.判断程是否运行完毕函数 7.使用示例 二、程库实现-...,本文将介绍如何通过c语言实现自己的程库,分为独立和共享两种实现,代码见git仓库。...一、程库实现-独立 通过独立实现程库中的每一个程都有自己独立的空间,大小固定且互不干扰。...-共享 通过共享实现程库中的每一个程在运行时都使用一个公共的空间,当程挂起时将自己的数据从共享拷贝到自己的独立程运行时又将数据从独立拷贝到共享运行,本文是参考cloudyun大神代码进行简要分析...而共享实现程运行时,数据存放在schedule_t结构体中的stack成员中,这个被所有程共享。

1K40

我对无程的理解

从后台工程师的角度说,有程的应用更普遍。例如,云风封装的非常经典的基于C的ucontext.h来实现的共享程,具体请见《C 的 coroutine 库》。...而golang在语言级实现程是独立程。...独立实现相比共享的方式而言少了在每次切换上下文时候的数据拷贝,理论上来说性能更高一些,但是也有这样的问题: 共享内存拷贝,也只是拷贝调用方开始的上下文切换的部分,这个数据也不算很大;...独立必然要为每个协程分配空间的内存,golang 1.4开始的大小是2kb,2kb可能对某些程很浪费,对某些程又完全不够;程太多必然也导致分配和GC方面的压力。...以上只是用C代码来模拟无程的运行模式而已,实际上自带generator(生成器)能力的编程语言会用一些语法糖来屏蔽复杂的切换细节,可以参考python+gevent的实现

1K30

解密Go程的内存管理

网管碎碎念:堆和都是编程语言里的虚拟概念,并不是说在物理内存上有堆和之分,两者的主要区别是是每个线程或者程独立拥有的,从上分配内存时不需要加锁。...; v1.4 — 将最小内存降低到了 2KB; 分段和连续 分段 Go 1.3 版本前使用的结构是分段,随着goroutine 调用的函数层级的深入或者局部变量需要的越来越多时,运行时会调用...连续 连续可以解决分段中存在的两个问题,其核心原理就是每当程序的空间不足时,初始化一片比旧大两倍的新并将原中的所有值都迁移到新的中,新的局部变量或者函数调用就有了充足的内存空间。...copystack会把旧里的所有内容拷贝到新里然后调整所有指向旧的变量的指针指向到新, 我们可以用下面这个程序验证下,扩容后同一个变量的内存地址会发生变化。...| FixedStack | NumStackOrders // -----------------+------------+--------------- // linux

4.1K20

队列实现&实现队列

前言 给你两个你如何实现一个队列,给你两个队列你如何实现一个。 本文就跟大家分享下这两个问题的解决思路与实现过程,欢迎各位感兴趣的开发者阅读本文。...,我们先来看下如何用实现队列: 我们的已知条件只有两个,将这两个进行标识:1、2 执行入队操作时,我们元素放进1。...接下来,我们来看下如何用队列来实现: 同样的,我们的已知条件有两个队列,将这两个队列进行标识:队列1,队列2 执行入操作时,将元素放进队列1 执行出操作时: 如果队列2为空,我们将队列1中除队首外的元素放进队列...实现代码 经过上述分析,我们有了实现思路,接下来我们就将上述思路转化为具体的代码,下述代码中将引入我们之前写好的队列与实现代码,对此不了解的开发者请移步我的另外两篇文章:数组实现与对象实现、队列与双端队列的实现...实现队列 创建StacksAndQueues类文件,声明解决本文问题所需要的变量 // 与队列的相关操作 import Stack from "../..

60320

实现的基本操作实现

将数据压入 清空 实现 软件实现——GO语言 软件的可以使用链表基本结构实现或使用数组实现:使用链表的优势是的容量几乎不限,确定是入都需要开销较大的声明结构体;数组实现的优势是速度快...(自增自减一般有指令实现),但是空间必须预先指定。...,不同的是读取后不改变“顶指针”的位置 清空 func (a *Array_stack) Clear() { a.length = 0 } 直接将“顶指针”清零即可实现清空 切片 切片是一种...Go语言特有的数据结构,类似于动态数组,使用切片可以实现深度可变的。...stack_point[DEPTH_LOG - 1:0]; ram_write_data <= stack_write_data; end end endmodule Verilog实现的关键点有三个

95050

实现原理

今天我们来探讨一个问题,Go 程的实现原理。此“程”非彼”携程“。 线程实现模型 讲程之前,我们先看下线程的模型。...我们知道在Linux操作系统编程中,往往都是通过fork()函数创建一个子进程来代表一个内核中的线程。一个进程调用fork()函数后,系统会先给新的进程分配资源,例如,存储数据和代码的空间。...JDK 1.8 Thread.java 中 Thread start 方法的实现,实际上是通过Native调用start0方法实现的;在Linux下, JVM Thread的实现是基于pthread_create...程的实现原理 程不只在Go语言中实现了,其实目前大部分语言都实现了自己的一套程,包括C#、erlang、python、lua、javascript、ruby等。...程正常结束后的状态为Done。 Fiber对象与Java的线程类似,主要用来维护Task的执行堆栈,Fiber是实现N:M线程映射的关键。

19320

从无程到 C++异步框架

而有程和无程的实现, 差异最大的地方就是如下两点了: 怎么保存和恢复当前的执行位置 怎么保存和恢复当前程引用到的内存(变量等) 本篇主要侧重无程, 无程相关的机制后续会具体展开....libco, 与 boost.context 这样的高性能有实现机制后, 标准委员会还会继续寻求无程的解决方案, 并最终将其作为 C++程的实现机制呢, 这里分析主要的原因是为了解决有程天然存在的限制...C++17 中基于 Duff Device Hack 的无实现, 以及 C++20 中的无程做更深入的介绍. 2....但当时的 GCC 用的是 8.3 版本, 并不支持 coroutine20, 所以我们最终采用的是一个基于 C++17 的无实现方案, 也就是使用前面介绍的 Duff Device Hack 方式实现的无程...Hack 的无实现的方式.

2.1K41

Linux 中的各种:进程 线程 内核 中断

根据的特点,很容易的想到可以利用数组,来实现这种数据结构。但是本文要讨论的并不是软件层面的,而是硬件层面的。 大多数的处理器架构,都有实现硬件。...ALU) 状态标记的副本 当前程序状态寄存器 (CPSR):存放 APSR 标记,当前处理器模式,中断禁用标记等 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR 上面是的原理和实现...各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。

3.3K20

Linux 中的各种:进程 线程 内核 中断

根据的特点,很容易的想到可以利用数组,来实现这种数据结构。但是本文要讨论的并不是软件层面的,而是硬件层面的。 大多数的处理器架构,都有实现硬件。...ALU) 状态标记的副本 当前程序状态寄存器 (CPSR):存放 APSR 标记,当前处理器模式,中断禁用标记等 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR 上面是的原理和实现...各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。

2.8K50

【Leetcode】队列实现实现队列

【Leetcode225】队列实现 1.链接 队列实现 2.题目再现 3.解法 这道题给了我们两个队列,要求去实现; 首先,我们要知道和队列的特征: :后进先出,只能从顶入数据和出数据...; 队列:先进先出,从队尾入数据,队头出数据; 根据这些特点,我们可以采用两边倒的方法来实现; 具体来说: 1.入时就是在不为空的队列插入数据,若两个队列都为空,就随便插入到一个队列中;...,在取顶元素前要判断是否为空; 5.销毁时,要先销毁其中的两个队列,然后再销毁。...因为是用C语言实现的,所以得自己手搓个队列。...【Leetcode232】实现队列 1.链接 实现队列 2.题目再现 3.解法 这个的解法和上面的类似,只不过这个不用总是来回倒; 根据和队列的特征,我们会发现将一个中的数据倒入另一个时,

7610
领券