Golang源码学习:监控线程

监控线程是在runtime.main执行的时候在系统栈中创建的,监控线程与普通的工作线程区别在于,监控线程不需要绑定p来运行。 监控线程的创建与启动 简单的调用图 先给出个简单的调用图,好心里有数,逐个分析完后做个小结。 主体代码 以下会合并小篇幅且易懂的代码段,个人认为重点的会单独摘出来。 main->newm->newm1->newosproc func main() { ...... if GOARCH != "wasm" { // no threads on wasm yet, so n...阅读全文

博客园 2020-05-28 11:29 flhs

Golang源码学习:调度逻辑(四)系统调用

Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口。并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口。保证系统的安全和稳定。 调用号:在Linux中,每个系统调用被赋予一个独一无二的系统调用号。当用户空间的进程执行一个系统调用时,会使用调用号指明系统调用。 syscall指令:因为用户代码特权级较低,无权访问需要最高特权级才能访问的内核地址空间的代码和数据。所以需要特殊指令,在golang中是syscall。 参数设置 x86-64中通过syscall指...阅读全文

博客园 2020-05-27 23:57 flhs

Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环

本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环。 main goroutine 的调度运行 runtime·rt0_go中在调用完runtime.newproc创建main goroutine后,就调用了runtime.mstart。让我们来分析一下这个函数。 mstart mstart没什么太多工作,然后就调用了mstart1。 func mstart() { _g_ := getg() // 在启...阅读全文

博客园 2020-05-27 12:31 flhs

Golang源码学习:调度逻辑(二)main goroutine的创建

接上一篇继续分析一下runtime.newproc方法。 函数签名 newproc函数的签名为 newproc(siz int32, fn *funcval) siz是传入的参数大小(不是个数);fn对应的是函数,但并不是函数指针,funcval.fn才是真正指向函数代码的指针。 // go/src/runtime/runtime2.go type funcval struct { fn uintptr // 真正指向函数代码的指针 } 关键字go 在golang中编译器会把类似 go foo(...阅读全文

从简历被拒到收割今日头条offer,我花了一年时间

一、印象中的头条 1.老板张一鸣跟我是福建老乡,龙岩市在我朋友说来就是山沟沟,能走出美团王兴和头条张一鸣让我卯足了去龙岩吃特产老鼠干的欲望。 2.给的钱多,笔试也贼难。参加过头条笔试的同学都知道,头条笔试可以笔试三次,就是不论你有没有参加都有三次机会。笔试就5道算法题,两个小时,去年第一次看到算法题就自闭了,第一次挂了。第二次又很认真地做,做到一半放弃了。没过几天又邀请我做第三次,有一种强行被侮辱的感觉。 3.内推被拒。正如我标题所说,简历被拒。去年3月份在知乎上看到一个头条大佬说可以内推春季实...阅读全文

简书 2020-05-30 15:32:50 码农小陈

23. 一篇文章 说清楚 Go语言里的函数

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构。将一段功能复杂、...阅读全文

Segmentfault 2020-06-01 13:32:36 Python编程时光

Stack Overflow 发布 2020 开发者概况报告,Rust 连续五年成为最受欢迎技术语言

技术编辑:宗恩丨发自 SiFou Office SegmentFault 思否报道丨公众号:SegmentFault 过去 10 年 Stack Overflow 的年度开发人员调查成为了对全球开发者最大规模的调查报告。今年Stack Overflow 更加聚焦于调查报告的多样性。需要强调的一点是报告调查在今年 2 月左右进行,当时疫情影响了世界上每个国家。在查看诸如工作和薪水数据之类的信息时,要考虑到这点。 调查报告最引人注意的重点: 在过去五年中持续增长之后,Python 在最受欢迎的技术列...阅读全文

Segmentfault 2020-06-01 07:32:36 宗恩

涂鸦智能分布式定时调度系统Sigmax设计与实践

1.导读 Sigmax是涂鸦智能中间件团队基于Golang开发的一款高性能,分布式的定时任务调度引擎。针对IoT领域特有的复杂多样的定时任务场景,Sigmax提供了一套统一,稳定,精准的定时调度平台,来协助公司内各业务线方便的实现定时场景。 目前Sigmax已经在公司内部稳定运行了1年时间,单集群的日任务调度、日均任务触发数达千万次。 2.背景 涂鸦智能作为全球领先的AI+IoT平台,连接着海量的智能设备,每天会有大量的用户控制自己的智能设备以实现一些智能化的场景,比如: 用户A,每天早上7点自...阅读全文

Segmentfault 2020-05-31 22:32:37 涂鸦智能技术团队

至联云讲解《IPFS 0.5版本改进较大,已出现系统级支持》

协议实验室于5月7~8日举办了 IPFS Pinning Submit。由于疫情原因,这次会议是线上举行。今日得闲,看了几个视频。IPFS 0.5.0版本发布,进展很大,本文做一个简单梳理。主要内容来自IPFS Project Lead - Molly Mackinlay。 IPFS生态日渐完善IPFS生态近期有比较大的发展,从内容分享、社交网络、身份服务、区块链应用、金融电子化等等各个方面。非常重要的是,目前有比较多的浏览器开始支持IPFS,包括Firefox、Chrome、Brave、Ope...阅读全文

简书 2020-05-30 03:32:50 雨中的泡面

Golang数据结构-线性表

基本概念 定义:零个或者多个数据元素的有限序列,在复杂的线性表中,一个数据元素可以由若干个数据项组成。 直接前驱元素:若线性表记为(a1a2a3...an),则表中a2领先于a3,则称a2是a3的直接前驱元素,且有且仅有一个直接前驱元素 直接后继元素:称a3是a2的直接后继元素,且有且仅有一个直接后继元素 线性表的长度:线性表的元素个数n,为线性表的长度,随着线性表插入和删除操作,该值是变动的,线性表的存储长度一般小于数组的长度 数组的长度:存放线性表的存储空间的长度,存储分配后这个值一般是不变...阅读全文

简书 2020-05-30 03:32:48 也疯狂

从一道面试题看golang slice

之前遇到一道感觉很不错的slice面试题,这里分享出来,先不贴答案了大家可以先思考下每个地方的打印会是什么;最后再给大家公布答案 v := make([]int, 0, 5) v = append(v, 2, 3, 5) a := append(v, 0, -1) fmt.Println(v) fmt.Println(a) b := append(v, 1) fmt.Println() fmt.Println(v) fmt.Println(a) fmt.Println(b) c := appen...阅读全文

golang标准库之sort

简介 标准库sort实现了4种排序方法,插入排序、堆排序、快排和归并排序,但是并没有暴露给用户接口。sort包会根据数据选择最优的排序方法(其实只使用了3种,归并排序除外)。 接口 用户需要实现以下接口才能使用sort包的排序功能。 type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // ...阅读全文

简书 2020-05-30 03:32:44 风铃草613

Go context 学习笔记

golang 的 Context包,是专门用来简化对于处理单个请求的多个goroutine之间与请求域的数据、取消信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。 比如有一个网络请求Request,每个Request都需要开启一个goroutine做一些事情,这些goroutine又可能会开启其他的goroutine。这样的话, 我们就可以通过Context,来跟踪这些goroutine,并且通过Context来控制他们的目的,这就是Go语言为我们提供的Context,中文可以称之...阅读全文

简书 2020-05-30 03:32:44 Jaycee88

Nsq原理分析(二)

在上一篇文章中对nsq进行了简单的介绍,从nsq 的golang的客户端代码分析了一下nsq的使用,这篇文章会分析nsqd的代码 Nsqd代码分析 nsqd做了什么 nsqd接收对topic、channel的创建以及对消息的存储和分发 nsqd向nsqlookup注册自己的服务信息,ip 和端口,向nsqlookup注册自己的元数据信息(topic、channel),nsqd也会向nsqdlook查询topic、和channel信息 nsqadmin 是一个简单的管理界面,通过它可以查询topi...阅读全文

Segmentfault 2020-06-01 09:32:34 朱伟

【译】CPU 高速缓存原理和应用

博客原文: 【译】CPU 高速缓存原理和应用 曾三次获得 F1 世界冠军的杰基•斯图尔特 (Jackie Stewart) 表示,了解汽车的工作原理让他成为了一名更好的驾驶员。 "你并不需要先成为一个工程师才能去做一个赛车手,但是你得有一种机械同感 (Mechanical Sympathy)" Martin Thompson (高性能消息库 LMAX Disruptor 的设计者) 就一直都把机械同感的理念应用到编程中。简而言之,了解计算机底层硬件能让我们作为一个更优秀的开发者去设计算法、数据结...阅读全文

Segmentfault 2020-05-31 22:32:38 panjf2000

构建 Golang 应用最小 Docker 镜像

我通常使用docker运行我的 golang 程序,在这里分享一下我构建 docker 镜像的经验。我构建 docker 镜像不仅优化构建后的体积,还要优化构建速度。 示例应用 首先贴出代码例子,我们假设要构建一个 http 服务 package main import ( "fmt" "net/http" "time" "github.com/gin-gonic/gin" ) func main() { fmt.Println("Server Ready") router := gin.Def...阅读全文

掘金 2020年05月29日 Eyas

探索 Go 语言数据类型的内部实现

向新程序员讲解 Go 语言的时候,必要的是解释 Go 各种数据值在内存中的组织来给他们建立正确的思想,知道哪些操作是开销昂贵的,哪些是不昂贵的。这篇文章就是关于基本类型,结构,数组和切片的内部实现原理。基本类型让我们从一个简单的例子开始 图1 变量 i 的类型是 int, 在内存中用一个32比特位的字来表示。j 的类型是 int32 ,由于显示类型转换。即使 i 和 j 由相同的内存布局,他们本质上还是不同的类型:在 Go 中直接 i = j 赋值将会产生一个错误,我们必须显示的转化 j,i =...阅读全文

简书 2020-05-29 13:32:54 CXX_FLAGS