自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (5)
  • 收藏
  • 关注

原创 在Linux环境中通过Docker运行swift

在Linux环境通过 docker 运行swift 程序。

2024-06-07 11:45:09 533

原创 判断文件为文本文件还是二进制文件

本文介绍了 git 判断文本文件和二进制文件的方法,以及在linux系统中通过 file 命令区分各种文件类型。

2023-09-20 16:41:28 1237

原创 eBPF 之 ProgramType、AttachType和InputContext

本文列举了eBPF中 ProgramType、AttachType和 InputContext 的定义,以及三者之前的关系。因为这些定义都会随着Linux版本变化,因此本文对每个定义都标明了在Linux源码中的出处,在实际开发过程中可以根据自身内核版本来找对应的定义。

2023-02-17 17:21:48 1174

原创 Golang 异步读写文件

在Windows上支持异步读写文件,在Linux上不支持异步读写文件。能否支持异步读写文件主要是由操作系统决定的。在Linux上异步读写文件的能力并不是很好,如glibc通过线程方式和libaio底层支持方式,都有很多限制,因此Golang在Linux上只支持同步读写文件。对于网络IO,Golang在Linux上是支持异步方式的。因此可以总结:Golang对于网络IO密集型是友好的,对于磁盘IO密集型是不友好的。...

2022-05-31 15:07:59 783

原创 PEM 与 DER 格式详解

本文描述了PEM与DER格式的关系,并详细描述了两者如何转换,最后对PEM和DER的内容进行解析。

2022-05-05 20:44:20 13997

原创 Golang IPv4 字符串与整数互转

本文描述了Golang中如何实现字符串与整数的互相转换。

2022-05-05 14:32:54 1825

原创 Golang 判断IPv4和IPv6是否合法

在 Golang 中,可以通过标准库的net.ParseIP 方法来判断IPv4 或 IPv6 是否合法,该方法声明如下:func ParseIP(s string) IP该方法输入是一个字符串的 IP 地址, IPv4或IPv6 都可以。如 1.1.1.1、2001:db8::68 等。当输入的 IP 是合法时,返回值 IP 为非 nil,当输入的 IP 非法时,返回值 IP 为nil。可以根据这点来判断 IP 地址的合法性。判断 IPv4 地址func IsIPv4(ip...

2022-05-05 11:50:36 4619

原创 Nasm汇编GDB调试

1. 示例代码section .data message db "hello, nasm!", 0ah msgLen equ $-messagesection .text global _start_start: mov eax, 4 mov ebx, 1 mov ecx, message mov edx, msgLen int 80h mov eax, 1 mov ebx, 0 int 80h2. 调

2021-05-18 00:10:11 2069

原创 Docker中搭建nginx服务(二)

在上一篇文章docker nginx中搭建HTTP&HTTPS环境(一)中,通过nginx提供的官方镜像很简单的就把nginx服务搭建起来了,但通过这种方式,我们服务的nginx.conf文件、证书文件等都要通过绑定的方式将本地文件映射到docker文件系统中,这样在实际工程中并不方便,我们可能更希望这些文件直接放置在docker文件系统中,这样更方便部署。这样我们就必须自已编写dockerfile文件来实现,下面主要讲解如何通过dockerfile来搭建nginx服务。1.1 工作目录在本地建

2020-07-28 23:22:16 178

原创 Docker中搭建nginx服务(一)

1. 下载nginx的Docker镜像在Docker Hub有很多Nginx镜像,可以通过 docker search nginx查看,如下:[.. docker_nginx]# docker search nginxNAME DESCRIPTION STARS OFFICIALnginx Official b

2020-07-28 23:19:50 385

原创 lua-resty-moongoo源码安装

1 安装lua-resty-moongoo1.1 下载lua-resty-moongoo安装包https://github.com/isage/lua-resty-moongoo,下载lua-resty-moongoo-master.zip包。1.2 解压安装包,并把lib/resty/目录拷贝到openresty的lua_package_path所指定的目录下。unzip lua-resty-moongoo-master.zipcp -R lua-resty-moongoo-master/

2020-07-20 16:50:39 455

原创 Golang调试之GDB高级功能

1 使用汇编调试1.1 disassemble简写为disas,查看当前函数的汇编指令,并显示下一条要执行的执令,如下:(gdb) disassembleDump of assembler code for function main.main: 0x00000000004872c0 <+0>: mov %fs:0xfffffffffffffff8,%rcx 0x00000000004872c9 <+9>: cmp 0x10(%rcx)

2020-07-20 16:25:04 739

原创 Golang源码中xmm0寄存器

在阅读Golang源码时,经常看到下面一段汇编代码,如下: 0x00000000004310c8 <+24>: xorps %xmm0,%xmm0 0x00000000004310cb <+27>: movups %xmm0,0x8(%rsp) 0x00000000004310d0 <+32>: movups %xmm0,0x18(%rsp) 0x00000000004310d5 <+37>: movups %

2020-07-20 16:20:22 3316

原创 正向代理与反向代理

相同点代理服务器的在收发消息的功能是相同的:客户端将请求发送给代理服务器;代理服务器收到请求后,将请求转发给服务端;服务端收到消息处理完后,将响应消息回给代理服务器;代理服务器收到响应后,将响应转发给客户端;区别从上面知道,代理服务器做的工作本质上是一样的。它们的差别在于部署和使用上:正向代理 代理的是客户端,是客户端部署的;反向代理 代理的是服务器,是服务端部署的;...

2020-07-20 16:12:10 104

原创 HTTP chunked传输如何表示结束

一般服务器响应消息都会在HTTP响应头部加上Content-Length,这样客户端就知道要接收多少数据。这也要求一定要先发送响应头部,再发送响应内容。但并不是所有场景都能事先知道响应包长度,比如动态页面,事先并不知晓响应包大小,这样也无法在响应头部设置Content-Length,这时可通过chunked来进行传输。那么通过chunked方式传输时,客户端如何感知包传输完了呢?一个chunk包有两部分组成:前部分为包大小,后部分为包内容。当包的大小为0时,当客户端收到一个包大小为0的chunk包时,

2020-07-20 16:09:38 1661

翻译 HPACK:HTTP/2 头部压缩 (译)

摘要本规范定义了HPACK,一种用于有效表示HTTP头部字段的压缩格式,将在HTTP/2中使用。1. 简介在HTTP/1.1(详见[RFC7230])协议中,头部字段是没有被压缩的。随着网页增长到需要数十到数百个请求,这些请求中的冗余标头字段不必要地消耗了带宽,从而显著增加了延迟。SPDY [SPDY]最初通过使用DEFLATE [DEFLATE]格式压缩标头字段来解决这个冗余问题,事实证明,这种格式非常有效地表示冗余头部字段。 但是,这种方法暴露了安全风险,如CRIME(Compression R

2020-07-20 16:06:50 1007

原创 Go Modules使用

Go Modules使用Go Modules在Go 1.12版本后默认支持。如果是1.12之前的版本,需要设置一下GO111MODULE环境变量。1. 为什么要用Go Modules?在没有Go Modules之前,使用的是GOPATH。在使用GOPATH时,感觉非常不适的是:如果你的工程有自建包,则一定要将工程放到GOPATH下,然后import才能引用到这些包。helloword├── code│ ├── unicode.go│ └── utf8.go├── lang│ ├

2020-07-20 16:04:20 383

原创 僵死进程

1. 产生的原因一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。2. Linux系统中如何查看是否有僵死进程通过命令ps -el,再查看第二列,是否有标志为Z的进程,如果有,则表示该进程是僵死进程。图1:ps命令后的结果图。3. 如何杀死僵死进程僵死进程用kill -9命令是杀不掉的,只能通过杀死其父进程来杀死它(当然重启服务器也是可以的)。先通过僵死进程的PID找

2020-07-20 15:59:40 196

原创 Golang源码之初始化流程

在用Go编写应用程序的时候,可以认为main.main是整个应用程序的入口,但站在整个Go程序的角度来看,却并非如此。在main.main函数之前,Go底层已经做了大量的初始化工作,下面开始从程序真正的入口开始了解下初始化前的工作。入口通过GDB可以找到程序入口:go build -gcflags "-N -l" -o test test.goinfo files会列出程序的入口地址:(gdb) info filesSymbols from "/home/sandydu/program/gol

2020-06-22 19:55:28 503

原创 Go源码之命令行参数实现

在Go中我们可以很方便的通过os.Args获取命令行参数,下面来看下是如何实现的?先看下Args声明,是一个string切片,是os包的一个全局变量:@(src/os/proc.go:15)var Args []stringArgs在os包的init函数中通过调用runtime_args被赋值,代码如下:@(src/os/proc.go:17)func init() { ... Args = runtime_args()}func runtime_args() []string

2020-06-22 19:55:14 430

原创 马克飞象上下标写法

1. 上标方法1,markdown自带语法:2N 的写法为:2^N^方法2,html语法:2N 的写法为:2<sup>N</sup>方法3,markdown公式表示法2N2^N2N表达式写法:$$2^N$$。注意:这种方式会强制要求换行,如果写公式用这种方式比较好。2. 下标方法1,markdown自带语法:2N 的写法为:2~N~方法2,html语法:2N 的写法为:2<sub>N</sub>...

2020-06-18 16:29:23 278

原创 nginx resolver失败

在配置nginx反向代理时,经常会发现代理的域名无法解析,在nginx的error日志中可以看到错误码,如下:2020/03/31 11:43:26 [error] 14393#0: *1695 no resolver defined to resolve www.baidu.com, client: 129.204.84.x,无法解析域名 www.baidu.com,导致代理请求失败...

2020-03-31 12:29:19 4165

原创 Golang二进制反汇编

Go的源码是Plan 9汇编与Go语言的混合使用,即有汇编调用Go,也有Go调用汇编。在很多情况下,直接看汇编代码更直观,特别是在研究编译器生成的函数实现时更有用。下面介绍两种反汇编方法:假设有个helloworld.go程序,源码如下:package mainimport "fmt"func main() { fmt.Println("Hello, World!")}先将代码...

2019-12-03 00:12:10 9694

原创 Golang iota常量计算原理

iota,一个很奇怪的英文单词,一直想弄清楚其中文含义,但经过查证,它并不是英文缩写,而是一个完整的希腊单词,没有具体意思,常做为数学符号使用。常见用法iota主要用于常量自增,如下面一个很常见的例子,当iota赋值给常数A后,第一个常数A值为0,后面的常数会自动加1:const ( A = iota // 0 B // 1 C ...

2019-11-20 11:18:21 698

转载 Linux Performance Observability : Sar tools

2019-09-11 17:23:53 287

转载 Linux Performance Tuning Tools

2019-09-11 17:21:23 323

转载 Linux Performance Benchmarking Tools

2019-09-11 17:20:17 341

转载 Linux Performance Observability Tools

2019-09-11 17:18:27 546

转载 LInux 性能分析工具图解

2019-09-11 17:10:19 113

转载 Linux 存储协议栈图解

2019-09-11 17:03:31 666

原创 Golang map之needkeyupdate函数详解

定义和实现@(src/runtime/type.go:385)func (mt *maptype) needkeyupdate() bool { // true if we need to update key on an overwrite return mt.flags&8 != 0}我们先看下这个函数的使用场景,在对map做插入时,当发现插入的key已经存在时,正常流程只...

2019-09-10 21:24:58 417

原创 Golang map之reflexivekey函数详解

定义和实现@(src/runtime/type.go:382)func (mt *maptype) reflexivekey() bool { // true if k==k for all keys return mt.flags&4 != 0}reflexive中文意思是反身的、反射性的,从注释上看是说当k==k时,表示是reflexivekey,但有字段k!=k吗?还真有...

2019-09-10 21:22:24 233

原创 Golang kindNoPointers标志详解

在看golang源码时,有时会判断变量类型是否为kindNoPointers,然后根据判断做出一些处理,那kindNoPointers究竟表示什么意思呢?定义@(src\runtime\typekind.go:37)kindNoPointers = 1 << 7注,在源码中多个文件都有定义kindNoPointers,但没关系,值都是1 << 7从字面上看...

2019-09-10 21:20:25 450

原创 Golang map源码详解

Golang的map是用哈希表实现的,在实现性能上非常优秀,这里会主要对map创建、插入、查询、删除以及删除全部的源码做详解,刻意避开了扩容以及迭代相关的代码,后续会用一个新的文章去讲述。Golang好几个版本都对map源码进行了重构,整体逻辑变化不大,但实现细节上有很大优化,下面介绍是1.12.5版本的源码。1、名词解释对哈希桶、桶链、桶、溢出桶做一下区分,方便后面阅读。哈希桶指整个哈...

2019-09-06 16:51:40 3432

原创 Golang map之tophash详解

Golang之map tophash详解tophash是一个长度为8的数组,它不仅仅用来存放key的哈希高8位,在不同场景下它还可以标记迁移状态,bucket是否为空等。弄懂tophash对我们深入了解map实现非常重要。如上图:每一个tophash唯一对应一个K/V对。tophash值含义当tophash对应的K/V被使用时,存的是key的哈希值的高8位;当tophash对应的K/V未...

2019-09-06 16:46:55 2648

原创 golang gccgo vs gc

GCC是一个功能强大的编译器,不仅可以编译我们很熟悉的C/C++,也可以做为Fortran、Pascal、Objective-C等语言的编译器。而GCCGO则是GCC专门用来编译Golang语言的。GC,全称Golang Compiler,是Go语言官方编译器,也是自带的,通常我们使用的go build等,就是GC。大部分人认同的比较结果:GC是Go语言原生的编译器,不需要安装,使用方使;...

2019-07-26 10:22:17 8026 2

原创 Golang 位运算之 &^

看Golang源代码,突然看到一个 a &^ b的位操作,有点懵,在通过不断的写测试验证,终于弄清楚了是怎么回事,在这里记录一下,避免忘记。在弄清楚a &^ b是怎么回事之前,我们先看一个我们熟悉的 a += b:a += b ==> a = a + b其实&^也是一样:a &^ b ==> a ^ (a & b)只是把 = ...

2019-07-25 20:32:47 992 1

原创 Golang之map tophash详解

tophash是一个长度为8的数组,它不仅仅用来存放key的哈希高8位,在不同场景下它还可以标记迁移状态,bucket是否为空等。弄懂tophash对我们深入了解map实现非常重要。如上图:每一个tophash唯一对应一个K/V对。tophash值当tophash对应的K/V被使用时,存的是key的哈希值的高8位;当tophash对应的K/V未被使用时,存的是K/V对应位置的状态。下面是...

2019-07-25 20:29:50 2916 4

原创 Golang汇编 中点号如何输入

先切换到中文办输入法,在按下 “~”键,即Tab正上方的键。切换到中文并输入"~"键时,会出现如下图所示的问题:这不是问题,直接按Enter键中点号就出来了。...

2019-07-25 20:24:06 344

转载 每个程序员都应该知道的延迟数

Latency Comparison Numbers--------------------------L1 cache reference 0.5 nsBranch mispredict 5 nsL2 cache reference ...

2019-07-25 19:49:08 530

《Go语言编程》高清完整版电子书

一本非常好的GO语言入门书藉,适合新手学习。全本资源,高清,也有目录,很方便阅读。

2015-10-22

用C模访写一个c++ map

用纯c代码模仿写的一个c++ map。底层的数据存储采用的是红黑树,上面为了支持所有的数据类型,写成一个通用的c map,大量的采用了宏函数。这个c map基本上支持所有的数据类型,只是用起来不如c++方便。

2014-05-14

SLAB内存池

这是一个Linux SLAB内存池的简化版,不考虑平台相关性,也没有复杂的数据结构组织,代码简短精炼,程序执行效率高,易于维护。

2014-05-14

4.4BSD-Lite2.tar.gz

4.4BSD-Lite网络编程源码,是TCP/IP教材中演示的源代码

2013-03-20

sha512C++源码下载

非常不错的C++编码,仅供参考。SHA512哈希散列算法。

2013-01-30

空空如也

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

TA关注的人

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