随笔分类 -  go

摘要:不能并发写的原因 1. 元素丢失 // TODO 2. 破坏map的结构 // TODO sync.Map相比RWLock在哪些点减少了加锁的粒度,应该就是上述2点 // TODO sync.Map的原理应该就是减小了锁的粒度, 如果写操作既不会造成元素丢失,也不会破坏map结构,就不需要加锁,这就 阅读全文
posted @ 2020-04-03 23:55 sicnu-yudidi 阅读(1064) 评论(0) 推荐(0)
摘要:1. 栈溢出 "golang fmt递归引起stack overflow异常" 2. fmt包是很好的sync.Pool的使用例子 3. 顺便还问了sync.Once的源码 4. epoll 5. redis 6. 怎么避免内存泄露 阅读全文
posted @ 2020-03-28 21:24 sicnu-yudidi 阅读(162) 评论(0) 推荐(0)
摘要:第一个例子 不会打印OK "关于 Go1.14,你一定想知道的性能提升与新特性" 为什么不会打印? "golang高并发模型" 第二个例子 package main import ( "fmt" "runtime" "time" ) func main() { for i := 0; i 所以我们可 阅读全文
posted @ 2020-03-08 17:41 sicnu-yudidi 阅读(299) 评论(0) 推荐(0)
摘要:主要回答的问题 1. 进程,线程,协程区别 2. 虚拟内存 3. 局部性原理 4. Go 1.0调度器的4个缺点 5. Go 1.1调度器如何应对这4个缺点 6. GMP模型 7. 本地队列与全局队列的负载均衡 8. 查看调度器日志 9. GMP的状态转换 进程,线程,协程 TODO 虚拟内存 局部 阅读全文
posted @ 2020-03-08 15:17 sicnu-yudidi 阅读(297) 评论(0) 推荐(0)
摘要:前置知识点: go程序中,任何对系统 API 的调用,都会被 runtime 层拦截来方便调度。 go一共有4种阻塞的情况,并且这些阻塞都是可以被runtime检测到的,runtime检测到阻塞时就可以进行优化处理。 1. blocking syscall (for example opening 阅读全文
posted @ 2020-03-05 19:28 sicnu-yudidi 阅读(2300) 评论(0) 推荐(0)
摘要:先看这个 "谈谈调度 Linux O(1)" linux scheduler的主要操作: search+insert 1. 查找要执行的任务(search) 2. 任务执行完时间片后放回或删除(insert/delete) 3. 切换上下文 // 这个最多只有CPU核数那么多个线程需要切换,所以本身 阅读全文
posted @ 2020-03-05 18:14 sicnu-yudidi 阅读(293) 评论(0) 推荐(0)
摘要:从Go 1.0 到 Go 1.1,作者有篇设计文档 "Scalable Go Scheduler Design Doc" 。 我一直觉得奇怪,为什么要说是Scalable呢。 后来在go夜读的一次讨论中,了解到linux2.4 linux2.6的调度器优化过程也类似的原因和过程。 Go 1.0和li 阅读全文
posted @ 2020-03-05 15:07 sicnu-yudidi 阅读(288) 评论(0) 推荐(0)
摘要:注: 只讲了调度器,不涉及任何GC相关知识 "预备知识" 回顾一下Go调度器的发展历程 参考附录9 新旧2种调度器 "调度系统设计精要" 验证真抢占式调度是哪个版本引入的 "Go Version Manager用于切换不同版本的Go" "这里说到1.14之前都是请求抢占,1.14才是真抢占" Sch 阅读全文
posted @ 2020-02-29 22:51 sicnu-yudidi 阅读(362) 评论(0) 推荐(0)
摘要:几个概念 "Linux进程和线程" 用户态和内核态 系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)// 参考附录4 内核虚拟内存的构造 // 参考附录1 以32位为例,有4G虚拟地址空间。 用户代码可以访问3G的内存空间,内核代码可以访问1G的内存空间,分别就对应程序用户 阅读全文
posted @ 2020-02-29 22:49 sicnu-yudidi 阅读(153) 评论(0) 推荐(0)
摘要:"【转载】队友博客" Q: 为啥要字节对齐的 https://www.nowcoder.com/discuss/57978 TODO: Q: go反汇编指令 Q: a[0]:(int32,0,5)(int32,3,5) 3可以append,0不可以append. Q: 如何证明slice底层函数被修 阅读全文
posted @ 2020-02-22 13:52 sicnu-yudidi 阅读(134) 评论(0) 推荐(0)
摘要:主要回答一下几个问题 1.单核并发问题 2.多核并发问题 2.几个不正确的同步案例 1.单核并发问题 先看一段go(1.11)代码: 单核CPU,1万个携程,每个携程执行100次+1操作, 思考n最终会打印多少? 0++ sleep切换 1++ sleep切换 打印2,退出 您说的没错,我写了一段新 阅读全文
posted @ 2020-02-15 13:21 sicnu-yudidi 阅读(772) 评论(0) 推荐(0)
摘要:预备知识 CAS机制 1. 是什么 参考附录3 CAS 是项乐观锁技术,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并 ,而是被告知这次竞争中失败,并可以再次尝试。 CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新 阅读全文
posted @ 2020-02-14 16:17 sicnu-yudidi 阅读(441) 评论(0) 推荐(0)
摘要:"概览最简单版的mutex(go1.3版本)" "预备知识" 主要结构体 func (m Mutex) Lock() { // 情况1: CAS1直接加锁成功 // Fast path: grab unlocked mutex. if atomic.CompareAndSwapInt32(&m.st 阅读全文
posted @ 2020-02-07 11:32 sicnu-yudidi 阅读(559) 评论(0) 推荐(0)
摘要:https://blog.csdn.net/u011957758/article/details/82846609 几个我忽略的点 基础 1. map中value的默认值 2. key与value的限制 3. value的三种查询方式 4. map的有序遍历 5. map函数传参【面试过】: map 阅读全文
posted @ 2020-02-03 15:41 sicnu-yudidi 阅读(218) 评论(0) 推荐(0)
摘要:vendor 使用vendor进行包管理,首先要保证项目在$GOPATH/src/路径下(踩过坑),然后build时就会按照如图所示的优先级进行包的搜索。 一个没有找到包的实例: module GO 依赖管理工具go Modules(官方推荐) 主要步骤 1. 打开 Go modules go en 阅读全文
posted @ 2020-01-17 15:27 sicnu-yudidi 阅读(1044) 评论(0) 推荐(0)
摘要:Go语言中有单个字符和ascii码值直接转换的方法吗? // 附录1 golang的字符称为rune,等价于C中的char,可直接与整数转换。 var c rune='a' var i int =98 i1:=int(c) fmt.Println("'a' convert to",i1) c1:=r 阅读全文
posted @ 2020-01-10 17:39 sicnu-yudidi 阅读(326) 评论(0) 推荐(0)