自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Shanks

这是一位码农的博客

  • 博客(733)
  • 资源 (3)
  • 收藏
  • 关注

原创 博客地址更改

最新的个人博客地址 shanks.link

2021-05-17 10:54:39 874

转载 Go语言panic/recover的实现

以下内容转载自https://mp.weixin.qq.com/s/0JTBGHr-bV4ikLva-8ghEw原创爱写程序的阿波张源码游记2019-07-02本文主要分析Go语言的panic/recover在AMD64 Linux平台下的实现,包括: 主动调用 panic() 函数所引发的panic的处理流程,比如go代码中直接调用panic()函数或编译器插入的对panic()的调用; 非法操作所导致的panic的处理流程,这主要跟信号处理流程有关。 阅读本文所必需的...

2021-04-01 20:29:49 928

转载 深入理解defer(下)defer实现机制

以下内容转载自https://mp.weixin.qq.com/s/iEtMbRXW4yYyCG0TTW5y9g原创爱写程序的阿波张源码游记2019-06-17上一篇文章我们主要从使用的角度介绍了 defer 的基础知识,本文我们来分析一下 defer 的实现机制。还是从一个例子程序开始。packagemainimport"fmt"funcsum(a,bint) {c:=a+bfmt.Println("sum:",c)}fun...

2021-04-01 20:29:22 1127

转载 深入理解defer(上)defer基础

以下内容转载自https://mp.weixin.qq.com/s/QmeQTONUuWlr_sRNP8b5Tw原创爱写程序的阿波张源码游记2019-06-11深入理解 defer 分上下两篇文章,本文为上篇,主要介绍如下内容: 为什么需要 defer; defer 语法及语义; defer 使用要点; defer 语句中的函数到底是在 return 语句之后被调用还是 return 语句之前被调用。 为什么需要 defer先来看一段没有使用 de...

2021-04-01 20:29:06 425

转载 Go语言调度器之盗取goroutine(17)

以下内容转载自https://mp.weixin.qq.com/s/o2UmxmFFOwUAkgE-Ao9MsA原创爱写程序的阿波张源码游记2019-05-17本文是《Go语言调度器源代码情景分析》系列的第17篇,也是第三章《Goroutine调度策略》的第2小节。上一小节我们分析了从全局运行队列与工作线程的本地运行队列获取goroutine的过程,这一小节我们继续分析因无法从上述两个队列中拿到需要运行的goroutine而导致的从其它工作线程的本地运行队列中盗取goroutine...

2021-04-01 20:28:56 424

转载 抢占系统调用执行时间过长的goroutine(22)

以下内容转载自https://mp.weixin.qq.com/s/If0-35Pt8dN7G1gD4L9-hw原创爱写程序的阿波张源码游记2019-06-01本文是《Go语言调度器源代码情景分析》系列的第22篇,也是第六章《抢占调度》的第2小节。上一节我们分析了因运行时间过长而导致的抢占调度,这一节我们来分析因进入系统调用时间过长而发生的抢占调度。剥夺工作线程的p现在重新回到sysmon监控线程定期调用的retake函数:runtime/proc.go : 4380f...

2021-04-01 20:25:53 463

转载 因goroutine运行时间过长而发生的抢占调度(21)

以下内容转载自https://mp.weixin.qq.com/s/i8DQ0HrO5Bt-qE5cX7c1ng原创爱写程序的阿波张源码游记2019-05-28本文是《Go语言调度器源代码情景分析》系列的第21篇,也是第六章《抢占调度》的第1小节。前面几节我们分析了Goroutine因读写channel等阻塞而导致的被动调度以及通过调用Gosched函数发起的主动调度,现在还剩下最后一种调度方式即抢占调度未讨论,从本节开始,我们就来对它进行分析。本小节我们需要重点关注: 什么情...

2021-04-01 20:25:48 599

转载 工作线程的唤醒及创建(19)

以下内容转载自https://mp.weixin.qq.com/s/T9CDaNF5KUFjE_Z6YW7mRw原创爱写程序的阿波张源码游记2019-05-23本文是《Go语言调度器源代码情景分析》系列的第19篇,也是第四章《Goroutine被动调度》的第2小节。本文需要重点关注: 如何唤醒睡眠中的工作线程 如何创建新的工作线程 上一篇文章我们分析到了ready函数通过把需要唤醒的goroutine放入运行队列来唤醒它,本文接着上文继续分析。唤醒空闲的P...

2021-04-01 20:25:21 286

转载 Goroutine被动调度之一(18)

以下内容转载自https://mp.weixin.qq.com/s/w3i5hVKmYW_M06nLaMlwvQ原创爱写程序的阿波张源码游记2019-05-22本文是《Go语言调度器源代码情景分析》系列的第18篇,也是第四章《Goroutine被动调度》的第1小节。前一章我们详细分析了调度器的调度策略,即调度器如何选取下一个进入运行的goroutine,但我们还不清楚什么时候以及什么情况下会发生调度,从这一章开始我们就来讨论这个问题。总体说来,go语言的调度器会在以下三种情况下对go...

2021-04-01 20:24:55 314

转载 第三章 Goroutine调度策略(16)

以下内容转载自https://mp.weixin.qq.com/s/2objs5JrlnKnwFbF4a2z2g原创爱写程序的阿波张源码游记2019-05-14本文是《Go语言调度器源代码情景分析》系列的第16篇,也是第三章《Goroutine调度策略》的第1小节。在调度器概述一节我们提到过,所谓的goroutine调度,是指程序代码按照一定的算法在适当的时候挑选出合适的goroutine并放到CPU上去运行的过程。这句话揭示了调度系统需要解决的三大核心问题: 调度时机:什么...

2021-03-29 15:01:26 329

转载 非main goroutine的退出及调度循环(15)

以下内容转载自https://mp.weixin.qq.com/s/XttP9q7-PO7VXhskaBzGqA原创爱写程序的阿波张源码游记2019-05-12本文是《Go语言调度器源代码情景分析》系列的第15篇,也是第二章的第5小节。上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goroutine退出时则会进入goexit函数完成最后的清理工作,本小节我们首先就来验证一下非main goroutine执行完成后是否真的会去执行go...

2021-03-29 15:01:07 371

转载 Go语言调度器之调度main goroutine(14)

以下内容转载自https://mp.weixin.qq.com/s/8eJm5hjwKXya85VnT4y8Cw原创爱写程序的阿波张源码游记2019-05-09本文是《Go语言调度器源代码情景分析》系列的第14篇,也是第二章的第4小节。上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们接着来分析调度器如何把main goroutine调度到CPU上去运行。本节需要重点关注的问题有: 如何保存g0的调度信息? sc...

2021-03-29 15:00:47 322

转载 Go语言调度器之创建main goroutine(13)

以下内容转载自https://mp.weixin.qq.com/s/FF8YU8nXP9TKt0qvSuzmtw原创爱写程序的阿波张源码游记2019-05-07本文是《Go语言调度器源代码情景分析》系列的第13篇,也是第二章的第3小节。上一节我们分析了调度器的初始化,这一节我们来看程序中的第一个goroutine是如何创建的。创建main goroutine接上一节,schedinit完成调度系统初始化后,返回到rt0_go函数中开始调用newproc() 创建一个新的gorou...

2021-03-29 15:00:32 582

转载 Go语言goroutine调度器初始化 十二

以下内容转载自https://mp.weixin.qq.com/s/W9D4Sl-6jYfcpczzdPfByQ原创爱写程序的阿波张源码游记2019-05-05本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。packagemaini...

2021-03-29 15:00:06 406

转载 Go语言调度器之主动调度(20)

以下内容转载自https://mp.weixin.qq.com/s/zA7KY_25NGjip9pP38RIvg原创爱写程序的阿波张源码游记2019-05-24本文是《Go语言调度器源代码情景分析》系列的第20篇,也是第五章《主动调度》的第1小节。Goroutine的主动调度是指当前正在运行的goroutine通过直接调用runtime.Gosched()函数暂时放弃运行而发生的调度。主动调度完全是用户代码自己控制的,我们根据代码就可以预见什么地方一定会发生调度。比如下面的程序...

2021-03-29 14:59:29 274

转载 goroutine调度器概述(11)

以下内容转载自https://mp.weixin.qq.com/s/2wkZyOFAyhHgvNkEkXamkQ原创爱写程序的阿波张源码游记2019-05-01本文是《go调度器源代码情景分析》系列的第11篇,也是第二章的第1小节。goroutine简介goroutine是Go语言实现的用户态线程,主要用来解决操作系统线程太“重”的问题,所谓的太重,主要表现在以下两个方面: 创建和切换太重:操作系统线程的创建和切换都需要进入内核,而进入内核所消耗的性能代价比较高,开销较大; ...

2021-03-26 13:04:22 306

转载 Go语言调度器源代码情景分析之十:线程本地存储

以下内容转载自https://mp.weixin.qq.com/s/-tiXJpH0IrJw-RH4x5SRdQ原创爱写程序的阿波张源码游记2019-04-27本文是《go调度器源代码情景分析》系列 第一章 预备知识的第十小节,也是预备知识的最后一小节。线程本地存储又叫线程局部存储,其英文为Thread Local Storage,简称TLS,看似一个很高大上的东西,其实就是线程私有的全局变量而已。有过多线程编程的读者一定知道,普通的全局变量在多线程中是共享的,一个线程对其进行了修改...

2021-03-26 13:03:29 443

转载 go调度器源代码情景分析之九:操作系统线程及线程调度

以下内容转载自https://mp.weixin.qq.com/s/OvGlI5VvvRdMRuJegNrOMg原创爱写程序的阿波张源码游记2019-04-25本文是《go调度器源代码情景分析》系列 第一章 预备知识的第九小节。要深入理解goroutine的调度器,就需要对操作系统线程有个大致的了解,因为go的调度系统是建立在操作系统线程之上的,所以接下来我们对其做一个简单的介绍。很难对线程下一个准确且易于理解的定义,特别是对于从未接触过多线程编程的读者来说,要搞懂什么是线程可能并不...

2021-03-26 13:02:04 268

转载 go语言调度器源代码情景分析之八:系统调用

以下内容转载自https://mp.weixin.qq.com/s/CXhc71UZtbdbAo15xbJ6_Q原创爱写程序的阿波张源码游记2019-04-24我们将在最后一章讨论有关系统调用方面的抢占调度,所以这里有必要对系统调用有个基本的了解。系统调用是指使用类似函数调用的方式调用操作系统提供的API。虽然从概念上来说系统调用和函数调用差不多,但本质上它们有很大的不同,操作系统的代码位于内核地址空间,而CPU在执行用户代码时特权等级很低,无权访问需要最高优先级才能访问的内核地址空...

2021-03-26 11:51:49 238

转载 go语言调度器源代码情景分析之七:函数调用过程

以下内容转载自https://mp.weixin.qq.com/s/3RUjui-q6bgRnUW7TgOjmA原创爱写程序的阿波张源码游记2019-04-22前面几节我们介绍了CPU寄存器、内存、汇编指令以及栈等基础知识,为了达到融会贯通加深理解的目的,这一节我们来综合运用一下所学知识,看看函数的执行和调用过程。本节我们需要重点关注的问题有: CPU是如何从调用者跳转到被调用函数执行的? 参数是如何从调用者传递给被调用函数的? 函数局部变量所占内存是怎么在栈上...

2021-03-25 21:38:08 291

转载 go语言调度器源代码情景分析之六:go汇编语言

以下内容转载自https://mp.weixin.qq.com/s/dNzLMtn1X7dBvtkfX7Ifag原创爱写程序的阿波张源码游记2019-04-21go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也需要经过汇编器转换成机器指令才能被CPU执行。需要注意的是,用go汇编语言编写的代码一旦经过汇编器转换成机器指令之后,再用调试工具反汇编出来的代码已经不是go语言汇编代码了,而...

2021-03-25 21:35:00 293

转载 go语言调度器源代码情景分析之五:汇编指令

以下内容转载自https://mp.weixin.qq.com/s/fuox6st_iXg_rpklxWXXRA原创爱写程序的阿波张源码游记2019-04-20汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣的读者可以多花点时间把它学好。与高级编程语言一样,汇编语言也是一门完整的计算机编程语言,它所涉及的知识内容也很多,好在我们的主要目标是通过对本小节的学习而有能力去读懂汇编代...

2021-03-25 21:33:59 827 1

转载 go语言调度器源代码情景分析之四:函数调用栈

以下内容转载自https://mp.weixin.qq.com/s/EY1acVrkUnmFQ0E1IwLzUQ原创爱写程序的阿波张源码游记2019-04-19什么是栈栈是一种“后进先出”的数据结构,它相当于一个容器,当需要往容器里面添加元素时只能放在最上面的一个元素之上,需要取出元素时也只能从最上面开始取,通常我们称添加元素为入栈(push),取出元素为出栈(pop)。不知道读者是否有快餐店吃饭的经历,快餐店一般都有一摞干净的盘子让顾客取用,这就好比一个栈,我们取盘子时通常都是拿走...

2021-03-25 20:51:45 102

转载 go语言调度器源代码情景分析之三:内存

以下内容转载自https://mp.weixin.qq.com/s/iZxfTL34NFKsJNyLvREZPQ原创张方波源码游记2019-04-18内存是计算机系统的存储设备,其主要作用是协助CPU在执行程序时存储数据和指令。内存由大量内存单元组成,内存单元大小为1个字节(1字节包含8个二进制位), 每个内存单元都有一个编号,更专业的说法是每一个内存单元都有一个地址,我们在编写汇编代码或编译器把用高级语言所写的程序编译成汇编指令时,如果要读写内存,就必须在指令中指定内存地址,这样...

2021-03-25 20:46:04 88

转载 go语言调度器源代码情景分析之二:CPU寄存器

以下内容转载自https://mp.weixin.qq.com/s/wTfbFfBfTJNGsgIJ_71nAg原创张方波源码游记2019-04-17寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU的工作原理决定了有些操作运算只能在CPU内部进行,二是因为CPU读写寄存器的速度比读写内存的速度快得多。为了便于交流和使用汇编语言进行编程,CPU厂商为每个寄存器都取了一个名字,比如...

2021-03-25 13:13:45 390

转载 gin post 数据参数_golang--gin获取post里body的参数

以下内容转载自https://blog.csdn.net/weixin_36344862/article/details/111932206如题,post发送数据有几种形式,form和流是最常用的。特别是在程序里使用httpcpackage mainimport ("fmt""net/http""github.com/gin-gonic/gin")func main() {router := gin.Default()router.POST("/events", e.

2021-03-23 18:12:50 1922

转载 谈谈 Git 存储原理及相关实现

以下内容转载自 https://www.toutiao.com/i6938300453767676455/闪念基因2021-03-11 15:53:07【编者的话】Git 是目前最流行的版本控制系统,从本地开发到生产部署,我们每天都在使用 Git 进行我们的版本控制,除了日常使用的命令之外,如果想要对 Git 有更深一步的了解,那么研究下 Git 的底层存储原理将会对理解 Git 及其使用非常有帮助,就算你不是一个 Git 开发者,也推荐你了解下 Git 的底层原理,你会对 Git 的强..

2021-03-22 20:05:47 239

转载 千万同时在线直播聊天室架构演进

以下内容转载自https://www.toutiao.com/i6940139685289132582/腾讯技术工程2021-03-16 18:02:00作者:kellyliang聊天室概述随着直播和类直播场景在微信内的增长,业务对临时消息通道的需求日益增长,聊天室组件应运而生。聊天室组件是一个基于房间的临时消息信道,主要提供消息收发、在线状态统计等功能。1500w在线的挑战视频号直播上线后,在产品上提出了直播后台需要有单房间支撑1500w在线的技术能力。接到这个...

2021-03-22 20:04:05 638

原创 TCP粘包,UDP不存在粘包问题

以下内容参考http://www.cnblogs.com/lancidie/archive/2013/10/28/3392428.htmlhttps://blog.csdn.net/hik_zxw/article/details/48398935https://blog.csdn.net/varyall/article/details/80920721有关TCP和UDP 粘包 消息保护边界在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。TCP的socket编程,..

2021-03-22 11:56:18 249

转载 TCP建立连接三次握手和释放连接四次握手

以下内容转载自http://blog.csdn.net/guyuealian/article/details/52535294在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部格式的的几个名词(这里只是简单说明,具体请查看相关教程) 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。...

2021-03-22 11:54:43 185

转载 【TCP/IP详解 卷一:协议】TCP的小结

以下内容转载自https://www.cnblogs.com/qq952693358/p/5796520.html前言:TCP学习的综述在学习TCP/IP协议的大头:TCP协议 的过程中,遇到了很多机制和知识点,详解中更是用了足足8章的内容介绍它。TCP协议作为 应用层 和 网络层 中间的 传输层协议,既要为下面的网络层协议保证连接的可靠性(IP协议)弥补不足,又要作为 应用层进程向网络层发送数据的中转站(作为多路复用/解复用器)。这就使得我们在审视TCP这个协议的过程中,需要横向和纵.

2021-03-22 11:50:55 115

转载 Redis的性能瓶颈

以下内容转载自https://blog.csdn.net/AAA821/article/details/829306791.首先Redis为什么这么快?1.基于内存,不会受到硬盘IO速度的限制2.单线程,避免了多线程切换导致的CPU消耗,也不用考虑锁的问题,不存在加锁释放锁的操作,也不存在因死锁而导致的性能消耗3.使用多路I/O复用模型,非阻塞IO 多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,.

2021-03-22 11:42:28 2161

转载 过期策略及内存满删除策略

以下内容转载自https://www.cnblogs.com/lukexwang/p/4694094.html设置过期时间可以用EXPIRE key seconds为给定key设置生存时间,当key过期时(生存时间为0),它会被自动删除更新生存时间可以对一个已经带有生存时间的key执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。过期键的处理就是把过期键删除,这里的操作主要是针对过期字段处理的。Redis中有三种处理策略:定时删除、惰性删除和定期删除...

2021-03-22 11:33:31 125 1

转载 Redis的主从复制

以下内容转载自https://blog.csdn.net/AAA821/article/details/83069954Redis的主从复制是为了读写分离,进一步提高Redis的性能redis怎么进行主从复制呢?redis复制主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。redis复制过程如下:1、slave server启动.

2021-03-22 11:29:50 60

转载 存穿透,缓存击穿,缓存雪崩

以下内容转载自https://blog.csdn.net/AAA821/article/details/810516041.缓存穿透我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞,所以可以将每次查询为空也缓存起来,但这样会造成...

2021-03-22 11:27:13 58

转载 读扩散和写扩散的理解

以下内容转载自https://blog.csdn.net/aaa821/article/details/72550767今天看一篇文章时,提到了微信的群聊是写扩散的,第一次接触到写扩散这个名词,于是去查了下资料,有写扩散就有读扩散嘛定义如下:根据上面的定义,我是这样理解的,什么是写扩散,什么是读扩散,要怎么区分他们,区别之处就在于“主动”写扩散是主动把消息写到订阅者的消息列表里,这样订阅者就不用去我的outbox拉取消息 ,所以当我要是有很多订阅者时,我就要写很多次,这就是上面定义..

2021-03-22 11:04:58 273

转载 Go 面试题:Go interface 的一个 “坑” 及原理分析

以下内容转载自https://mp.weixin.qq.com/s/vNACbdSDxC9S0LOAr7ngLQ原创陈煎鱼脑子进煎鱼了今天收录于话题#Go34#面试题4大家好,我是煎鱼。前几天在读者交流群里看到一位小伙伴,针对 interface 的使用有了比较大的疑惑。无独有偶,我也在网上看到有小伙伴在 Go 面试的时候被问到了:来自网上博客的截图今天特意分享出来让大家避开这个坑。例子一第一个例子,如下代码:funcmain(){...

2021-03-16 15:05:09 246

转载 Golang 语言中 map 的键值类型选择,它是并发安全的吗?

以下内容转载自https://mp.weixin.qq.com/s/vV2VMGguLgMik-FjIlDWKA原创frankGolang语言开发栈昨天收录于话题#并发9#golang13#Golang52#GO语言20#map1大家好,我是 frank。欢迎大家点击上方蓝色文字「Golang 语言开发栈」关注公众号。01介绍关于 golang 语言的 map,已经在「Go 基础」系列文章中介绍过,文末会附上文章链接,建议还没有阅读的读者阅读。我们知...

2021-03-16 15:03:43 412

转载 go 垃圾回收:三色算法

以下内容转载自https://juejin.cn/post/6844903897253806088go 垃圾回收:三色算法三色算法go垃圾回收器的操作都是基于三色算法,这篇文章主要来说明此算法。注意:三色算法并不是go独有的,它也会在其它编程语言中使用到严格来说,在Go中这个算法的官方名称是叫做三色标记清除算法(tricolor mark-and-sweep algorithm)。它可以和程序一起并发工作并且使用写屏障(write barrier)。这就意味着,当Go程序员运行起来,g.

2021-03-15 20:59:39 279

转载 详解Go逃逸分析

以下内容转载自https://juejin.cn/post/6917201712029630478Go是一门带有垃圾回收的现代语言,它抛弃了传统C/C++的开发者需要手动管理内存的方式,实现了内存的主动申请和释放的管理。Go的垃圾回收,让堆和栈的概念对程序员保持透明,它增加的逃逸分析与GC,使得程序员的双手真正地得到了解放,给了开发者更多的精力去关注软件设计本身。就像《CPU缓存体系对Go程序的影响》文章中说过的一样,“你不一定需要成为一名硬件工程师,但是你确实需要了解硬件的工作原理”。Go虽然帮.

2021-03-15 20:47:35 260

programming_in_lua.pdf

programming_in_lua.pdf

2019-07-12

DisplayFusionPro8

屏幕管理软件

2017-07-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除