2021年7月17日
gopool-头条使用的协程池 原生goroutine使用很方便 1 2 3 go func() { // do something } 但是原生goroutine存在一些问题,包括无法限制使用的goroutine总数。 单个goroutine使用的内存虽然很少2KB,但是大量的goroutine并发可能会导致OOM,所以协程池的使用还……
阅读全文
2021年7月14日
memory model https://golang.org/ref/mem heppens-before的概念 内存重排 为了读写内存的效率,会对读写指令进行重新排列,这是cpu重排。 还有编译器重排: x = 0 for i in range(100): x = 1 fmt.Println(x) 编译器优化后 x = 1 for i in range(100): fmt.Println(x) 但是一旦x被别的goroutine修改,就会无法出现预期的结果。 CPU为了抚平内核、内存和硬盘之间的读写……
阅读全文
2021年7月11日
epoll epoll是一种I/O事件通知机制,是linux内核实现IO多路复用的一种方式。select和poll属于轮询机制。 假设有大量的请求和一个进程保持着TCP连接,但是其中只有一小部分是活跃的,这需要监听这些连接,在需要的时候返回,从而对其进行读写操作。 https://www.jianshu.com/p/31cdfd6f5a48……
阅读全文
2021年7月11日
goroutine M:N模型 go创建M个线程,之后创建个N个goroutine会依附在M个线程上执行。 pstree 命令看进程下几个线程 同一时刻,一个线程只能跑一个goroutine,当goroutine发生阻塞(chan阻塞,mutex,syscall陷入内核)时,go的runtime会进行调度,让其他g……
阅读全文
2021年7月8日
mmap: 在进程的虚拟内存地址空间中分配地址,创建和物理内存之间的映射关系。mmap在虚拟内存中分配空间,只有在第一次使用虚拟内存的时候才分配物理内存。 mmap的write: 1. 用户态将需要写入的数据直接拷贝到mmap的地址 2. 若mmap地址未对应物理地址,缺页异常,由内核处理 3. 若对……
阅读全文
2021年5月31日
http basic 把 username和 password 做成 username:password 的样子(用冒号分隔) 进行Base64编码。Base64("username:password") 得到一个字符串(如:把 haoel:coolshell 进行base64 后可以得到 aGFvZW86Y29vbHNoZWxsCg ) 把 aGFvZW86Y29vbHNoZWxsCg放到HTTP头中 Authorization 字段中,形成 Authorization:……
阅读全文
2021年5月31日
LSM-Tree Log Structured-Merge Tree,在面对亿级别之上的海量数据的存储和检索的场景下,我们选择的数据库通常都是各种强力的NoSQL,比如Hbase,Cassandra,Leveldb,RocksDB等等,这其中前两者是Apache下面的顶级开源项目数据库,后两者分别是Google和Facebook开源……
阅读全文
2021年5月25日
协程池 golang语言原生的goroutine和channel等机制,对于并发编程提供了很简单的实现。一个go关键字即可生成一个独立的协程。协程的管理需要协程池去实现。 对worker的总协程数量进行限制 限制并发 有任务排队时也不阻塞任务的提交 数据结构 1 2 3 4 5 6 7 8 9 10 11 12 type TaskHandler func() error……
阅读全文
2021年5月15日
网络轮询器 大部分服务都是I/O密集型的,程序会花费大量时间等待I/O操作的完成。网络轮询器是golang runtime用来处理I/O操作的关键部件,它使用了操作系统提供的I/O多路复用机制增强并发能力。 设计原理 网络轮询器不仅用于监控网络I/O,还用于监控文件I/O。 I/O模型 操作……
阅读全文
2021年5月14日
调度器 golang语言强大的并发编程能力,得益于语言在原生层面对并发的支持。接下来介绍go语言运行时调度器的设计和实现,以及运行调度相关的数据结构。 进程与线程 process/thread 多个线程可以同属于一个进程,并共享内存空间。线程之间的通信就是通过基于共享的内存进行的,与重量的进程相比,线程更轻。但是……
阅读全文