Golang
文章平均质量分 77
self-motivation
专注LINUX系统与性能分析优化
展开
-
libco开发教程(一) ---- 第一个测试用例
libco开发教程(一) ---- 第一个例子libco背景关于libco的背景,可以看我之前的文章,在c中实现协程前一段时间一直在忙换工作的事情,因此c语言协程库的开发有一些搁浅.最近换工作的事情告一段落了,代码实现也就提上了日程.感兴趣的小伙伴可以跟着我的教程一步一步实践,最终实现一个功能完善能够在生产中使用的c协程库.TDD项目以TDD测试驱动开发的方式进行编码,我们先来编写一个最简单的测试用例test case#include "gtest/gtest.h"#include "原创 2021-09-22 15:51:36 · 419 阅读 · 0 评论 -
golang抢占实现(一)----------抢占的时机
golang抢占时机golang 1.14版本以后开始支持抢占协程.这里有个有趣的问题是:用户态调度的goroutine在什么时机触发抢占判断?熟悉linux的朋友可能知道,linux可能的抢占时机有:时钟中断处理里系统调用返回golang目前的实现golang编译器在每个函数调用之前都会插入以下代码: mov %fs:0xfffffffffffffff8,%rcx //获取tls cmp 0x10(%rcx),%rsp // 判断当前协程的stack是否足够原创 2021-07-14 23:48:34 · 575 阅读 · 0 评论 -
golang程序启动流程详解
golang程序启动流程详解环境go1.16.5 linux/amd64用例package mainimport "fmt"func main() { fmt.Println(42)}编译-gcflags “-N -l”: 关闭优化和内联,方便调试跟踪$ go build -gcflags "-N -l" -o hello hello.go gdb跟踪执行流程$ gdb hello$ source /usr/lib/go/src/runtime/runti原创 2021-07-10 20:35:22 · 1834 阅读 · 0 评论 -
在C语言中实现协程库(一)----------协程切换原理详解
从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct原创 2021-07-04 21:46:17 · 1394 阅读 · 15 评论 -
如何在C语言中实现Golang
如何在C语言中实现GolangGolang介绍Golang语言2007年诞生于Google,Google发明这门语言的目的是什么呢?从语言层面直面问题传统的语言c++, java, python等,都和其使用的计算环境无关.随着多核处理器、网络化系统、大规模计算集群的发展以及Web编程模型的发展,这些传统语言虽然也能应付,但都没有直面面对这些问题.此外,程序规模也发生了变化:今天的服务器程序由数千万行代码组成,由成百上千的程序员编写,每天都在更新.更糟糕的是,构建时间,即使是在大型编译集群上,原创 2021-06-13 10:07:09 · 1438 阅读 · 2 评论 -
golang实现的压力测试工具
代码地址:https://github.com/happyAnger6/loadstress.git轻松实现单机10K qps.原创 2019-09-08 22:18:40 · 1985 阅读 · 1 评论 -
Go语言调度器实现(二)----go scheduler
简介在上一篇文章里,我介绍了OS调度方面的相关内容,我认为这些内容对理解Go调度器的语义很重要。本篇文章,我将从语义层面会介绍GO调度器是如何工作的,将会重点关注G调度器的高层行为。Go调度器是一个复杂的系统,小的细节是不重要的。重要的是我们要有一个对Go调度器如何工作和其调度行为的好的认知模型。这些有助于我们做出工程上的决策。启动你的程序当你的Go程序开始运...原创 2019-08-11 21:24:46 · 434 阅读 · 0 评论 -
go语言调度器实现(一)---os调度
go语言最大的卖点在于并发编程,尤其是现在免费的午餐已经结束,这意味着要挖掘硬件的高性能,软件越来越重要.而易于编写并发程序的go语言,调度器的实现是一关键因素.因此本系列文章希望探索go语言的调度器实现.将分3篇文章进行讲述,分别是OS调度器,GO调度器以及如何进行并发编程.介绍Go调度器的设计和行为能够让Go多线程程序的编写更加高效和具有更高的性能。这要得益...原创 2019-08-11 21:22:46 · 374 阅读 · 0 评论 -
怎么使用CONTEXT
http://www.anger6.com/?p=1903简介context库是go 1.7中加入的,本篇文章主要是讲解如何正确的使用它。缘起一切有为法,让我们先来看看golang里加入context的缘由。在一个go实现的服务器程序中,通常我们对每个请求使用一个goroutine来进行处理。在请求处理里,我们还有可能启动新的goroutine来访问一些后台程序,如进行数...原创 2019-08-18 21:56:49 · 298 阅读 · 0 评论 -
Go工具和调试详解
工具集go build-gcflags: 传递给编译器的参数-ldflags: 传递给链接器的参数-work: 查看编译临时目录-race: 允许数据竞争检测(仅支持amd64)-n: 查看但不执行编译指令-x: 查看并执行编译命令-a: 强制重新编译所有依赖包-v: 查看被编译的包名,包括依赖包-p n:并行编译所使用的CPU数,默认为全部-o:输出文原创 2017-12-05 20:39:57 · 14993 阅读 · 0 评论 -
Go实现控制任程序的生命周期
runner/runner.go:package runnerimport ( "errors" "os" "os/signal" "time")type Runner struct { interrupt chan os.Signal complete chan error timeout <-chan time.Time tasks []func(int)原创 2017-04-23 23:49:05 · 1267 阅读 · 0 评论