1.ring0-ring3在os代码中是怎么体现的
- ring3 -> ring0: syscall(硬件指令)
- ring0 -> ring3: sysret(硬件指令)
2.函数传参的时候是不是只要在六个之内,就会通过寄存器操作
- Go 应用层代码函数调用没有寄存器一说,都是通过栈传参的,1.17 以后才会用上寄存器
- C 语言:6 个以内寄存器,超过 6 个的话,超过部分会放到栈上(这里有简化,如果你参数是 int 和 float 混着的,那每一种类型如 int 能用的寄存器满了,后续这种类型的参数就在栈上)
- 系统调用:专有的调用规约,参数和返回值都是通过寄存器传递,最大 6 个参数,返回值只有一个
3.后面会讲网络编程吗?(netpoller,epoll)这种
- web 部分讲 netpoll 实现
4.是所有的syscall,都会发生M+G独立出来吗? 比如getpid这种syscall,感觉是很轻的系统调用行为。
- 先区分 sys(阻塞的系统调用)、sysnb(非阻塞),非阻塞系统调用不会独立出去;阻塞的系统调用,运行时间超过一定界限才会有独立。
- 还是sysmon在做监控的吗:是的
5.汇编中的SB是什么意思,比如:runtime.exitsyscall(SB),怎么确定值是什么
- 静态基地址寄存器,全局变量、函数声明的时候都需要用
- call runtime.exitsyscall
6.怎么看实际内存占用?
- top
- sar, tsar, asar
- runtime.MemStats
7.有效的环境变量比如 GODEBUG GOGC 的列表,以及可用参数的文档哪里可以查到?
8. 曹大简单生动地讲下中断以及应用
- The Linux Programming interface
- low level programming
- 看一下这两本书的相应章节吧~
9. 是否可以通过CGO创建线程?
- cgo 创建线程理论上是可以的,不过一般没人做这种 hack
10.syscall是不是很耗cpu,cpu需要等待syscall 返回吗
- 上下文切换成本比较高,但阻塞在 syscall 上等待的线程是不消耗 CPU 的
11.go 应该有办法获取ring0权限吧?
- 用户不能随便切换到 ring0,只能通过 syscall、int 80、sysenter
- 否则操作系统的安全机制就形同虚设了
12.select 是使用epoll吗?是一种是同步io吗?1
- select {} 和 epoll 没关系
- select 系统调用 epoll 两套东西,epoll 是 select 的进化版本,为了解决网络编程中的 c10k 问题被发明出来的
13.陷入系统调用期间的M,它不可用了,被剥离的P,是被新创建的M持有继续执行吗?
- sysmon -> retake -> handoffp -> mstart
14.虚拟寄存器(?)与CPU其他寄存器有什么区别,比如作用或实现
- Go 伪寄存器
- 64 位 AX -> rax, BX -> rbx
- 32 位 AX -> eax
15.异步和同步的 Linux有异步的系统调用吗
- 同步阻塞、同步非阻塞
- aio_write 是不是不太确定
16.go的sysmon 是单独的一个线程吧 跟m0有关系吗?
- 看一下第一课的 ppt
17.像time.sleep 这种底层是通过系统调用实现的sleep么
- 是的
18.可以手动syscall.clone创建M然后放到M idle队列么?
- 。理论上可以,但其实 runtime 里的 M 除了 clone 返回的结构还有一些别的结构,你得把那些东西也填好,而且要考虑 runtime.m 是个私有变量,你想做这个 hack 可不太容易
- 但理论上依然是可实现的
19.sysmon是查看g.status==syscall吗?那rawsyscall会把g.statu改为多少才不会让sysmon检测到?
- rawsyscall 不修改 g.status,依然是 running
20.那就是如果有并发有大量的阻塞系统调用 系统调用完成后都将m放到了空闲的队列 这时候那么多的 m 会被清空吗
- 1000 个线程被 syscall 阻塞 -> syscall -> midle 空闲线程列表里
21.软中断和硬中断哪一个速度更快?为什么?
- not sure….
22.可以讲一下MADV_FREE和MADV_DONTNEED吗
- man7.org
23.可以列举下内核升级导致应用系统行为变化的例子吗?
- madvise, 4.5 madv_free,导致的现象是你在监控里看到的 RSS 比实际占用的内存多很多
- GODEBUG=madvdontneed=1 ./server, go1.12 -> go1.15 + linux 4.5+
24.P上不止一个G,为什么剥离PM,未阻塞的G怎么处理的?
- M-G,syscall 阻塞住,CPU 最大化利用,所以希望 P 上的 local run queue 的任务能被执行
25.怎么做性能报告?benchmark pprof 大概做哪些方面的报告,对于第三课的第一题作业不知道做哪些方面的分析
- go test benchmark,《the go programming language》
- pprof
26.”spec可以搜索到类型的所有用法”, spec是指什么网址?
27.放到空闲队列的m会绑定到CPU上运行吗 会占用CPU的时间片吗?
- 空闲的线程,不占用 CPU
28.那用户代码能清空空闲队列的m么 或者 有提供函数获得 空闲队列的大小么,那么空闲m队列也不会被gc回收么?
- go func -> LockOsThread, return
29.What is RSS?
- Resident Set Size
30.RSS比实际占用多,有可能是go 运行时调用了cgo的,然后就占内存多了。这里有个哥们探究了的。
- https://povilasv.me/go-memory-management/
- https://povilasv.me/go-memory-management-part-2/
- https://povilasv.me/go-memory-management-part-3/
31.go12->+ kernel 5+,没设置 madvdontneed=1
- RSS 本身占用就比实际要多,GOGC=100,heap goal, SetMaxHeap
- tcmalloc,内部还是有一些内存碎片
- Go RSS = Stack + Heap,10w goroutine,10w-5w tcp conn,每一个 goroutine 8k
39.调用netpoll 底层应该使用epoll_wait 那个go调用是用阻塞的还是非阻塞的?
- syscall/runtime
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com