不会飞的章鱼

熟能生巧,勤能补拙,静能生慧;念念不忘,必有回响。

作业

1
2
3
4
5
6
7
X86 OOO 
{ x=0; y=0; }
P0 | P1 ;
MOV [x],$1 | MOV [y],$1 ;
MOV EAX,[y] | MOV EAX,[x] ;
locations [x;y;]
exists (0:EAX=0 /\ 1:EAX=0)

并阅读明⽩输出结果。

  • 选做,难度+++:为什么使⽤atomic.cas可以实现⼀个互斥锁,为什么临界区内的内存读写操作不会被重排到 cas 操作之外?
阅读全文 »

作业

  • 必做:封装⼀个数据结构 MyMap,实现并发安全的Load,Store,Delete,LoadAndDelete,LoadOrStore⼏个API(禁⽌使⽤ sync.Map),不⽤考虑性能
  • 选做:编写 benchmark,⽐较 MyMap 与 sync.Map 的同名函数性能差异,输出相应的性能报告(注意,你应该使⽤ RunParallel),将性能⽐较结果输出为 markdown ⽂件
  • 选做:使⽤ channel 实现⼀个 trylock,模板 trylock.go
  • 选做:修复 deadlock.go 的死锁
  • 选做:在 context 学习过程中,我们知道,在⼦节点中 WithValue 的数据,⽗节点是查不到的。请实现⼀个 MyContext,其 WithValue ⽅法赋值的 k,v 在⽗节点中也可以查得到。模板:mycontext.go
  • 选做难度++:实现,或封装社区的 timewheel,使⽤ benchmark 或 pprof ⽐较⼤量 timer 存活时,内置 timer 和 timewheel 的性能差异。不要求提交代码,只需要性能对⽐报告 markdown。

作业

  • 必做:channel ⼀⻚中,找出所有红线报错在 runtime 中的位置,使⽤ Go 1.14.12 版本
  • 选做1:修复 https://golearn.coding.net/p/gonggongbanji/files/all/DF12 中的 test case
  • 选做2:扩展其功能,增加更多的操作符号⽀持(随意发挥)
  • 难度++选做:分析 Go 语⾔新版本的函数调⽤规约,将分析过程总结为 markdown ⽂档

作业

  • 部署好本机的 docker 环境,使⽤ ppt 中的 dockerfile build ⾃⼰的环境

  • 使⽤ readelf ⼯具,查看编译后的进程⼊⼝地址

  • 在 dlv 调试⼯具中,使⽤断点功能找到代码位置

  • 使⽤断点调试功能,查看 Go 的 runtime 的下列函数执⾏流程,使⽤ IDE 查看函数的调⽤⽅:
    (1).必做:runqput,runqget,globrunqput,globrunqget
    (2).选做:schedule,findrunnable,sysmon

  • 课外作业:跟踪进程启动流程中的关键函数,rt0_go,需要汇编知识

转眼间,又是一年一度的教师节,在此记录那些年我遇到的好老师给予的鼓励与帮助。

小学

小学记不清了,唯一记得是二年级那会,冬天下着大雪,我课间玩耍,吸入了太多的冷空气,肠子扭在了一起,下午上课疼的馒头都是汗,脸色很不对,走路都不行,于是我的班主任就把我一步一步的,在大雪中把我背回了家。然后父母把我送到医院,打了一针就好了。

这件事令我着实感动,让我第一次对老师这个职业不再感到有所畏惧。(可能是小时候不经常写作业吧,看到老师就很怕…)

初中

阅读全文 »

本内容来源于书籍《Go语言编程之旅》

本文内容将运行让Go程序遇到“恐慌”的代码例子

数组/切片索引越界

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
names := []string{
"1",
"2",
"3",
}
name := names[len(names)] //应该改为 names[len(names) - 1]
fmt.Printf("name: %s",name) //panic: runtime error: index out of range [3] with length 3
}

空指针调用

阅读全文 »

起因

部门的小leaderC想让我熟悉整个业务,知道来龙去脉,让我从零开始搭建一套环境,也方便开发人员直接在上面进行测试,所以从这周一开始,我的工作就来了。

过程

刚开始感觉这不是So easy嘛,一顿apt install 外加vim编辑配置配件,打完收工….

结果一上来,就说用docker来部署,去写个docker-compose.yaml文件吧,好的呢,花了不到一个小时,整会了,然后直接拉起mysqlredisnginx三个docker容器,结果nginx一直启动报错,原因是我挂载了一个不存在的目录,好嘛,直接折腾了一个新的docker容器,搞定了。

阅读全文 »

优雅退出

监听系统信号

服务器难免要遇到重启、升级的问题。那么当我们的服务器关闭的时候,我们需要考虑:

  1. 拒绝新的请求
  2. 等待当前的所有请求处理完毕
  3. 释放资源
  4. 关闭服务器
  5. 如果这中间超时了, 我们要强制关闭了

基础语法 —— goroutine

阅读全文 »

错误处理

基础语法 —— 错误处理

  • error:一般用于表达可以被处理的错误
  • error只是一个内置的接口
  • panic:一般用于表达非常严重不可恢复的错误

基础语法 —— errors 包

  • New 创建一个新的 error
  • Is 判断是不是特定的某个error
  • As 类型转换为特定的 error
  • Unwrap 解除包装,返回被包装的 error
阅读全文 »

转眼间新工作已经入职了三周,接手了一个没有文档没有注释的项目,不过bug较少,前期先熟悉。

写这篇文章也算是梳理一下目前的资源,以及对未来半年做一个简单的规划。

目前个人终于可以hold住一些中小型的项目(代码量大概在一万行以下),但高并发、分布式、微服务、消息队列、云原生这块还是很薄弱的,正好入职的新公司在研发分布式云存储系统,可以好好提升一下。在保质保量完成工作的同事,计划跟一些实战项目,以及一些有深度的技术专栏,在学习完它们之后,提炼自己的感受,做好总结。

目前的规划

核心就三点:算法+系统设计+英语。

阅读全文 »