4.编程语言与操作系统

  1. 1.ring0-ring3在os代码中是怎么体现的
  2. 2.函数传参的时候是不是只要在六个之内,就会通过寄存器操作
  3. 3.后面会讲网络编程吗?(netpoller,epoll)这种
  4. 4.是所有的syscall,都会发生M+G独立出来吗? 比如getpid这种syscall,感觉是很轻的系统调用行为。
  5. 5.汇编中的SB是什么意思,比如:runtime.exitsyscall(SB),怎么确定值是什么
  6. 6.怎么看实际内存占用?
  7. 7.有效的环境变量比如 GODEBUG GOGC 的列表,以及可用参数的文档哪里可以查到?
  8. 8. 曹大简单生动地讲下中断以及应用
  9. 9. 是否可以通过CGO创建线程?
  10. 10.syscall是不是很耗cpu,cpu需要等待syscall 返回吗
  11. 11.go 应该有办法获取ring0权限吧?
  12. 12.select 是使用epoll吗?是一种是同步io吗?1
  13. 13.陷入系统调用期间的M,它不可用了,被剥离的P,是被新创建的M持有继续执行吗?
  14. 14.虚拟寄存器(?)与CPU其他寄存器有什么区别,比如作用或实现
  15. 15.异步和同步的 Linux有异步的系统调用吗
  16. 16.go的sysmon 是单独的一个线程吧 跟m0有关系吗?
  17. 17.像time.sleep 这种底层是通过系统调用实现的sleep么
  18. 18.可以手动syscall.clone创建M然后放到M idle队列么?
  19. 19.sysmon是查看g.status==syscall吗?那rawsyscall会把g.statu改为多少才不会让sysmon检测到?
  20. 20.那就是如果有并发有大量的阻塞系统调用 系统调用完成后都将m放到了空闲的队列 这时候那么多的 m 会被清空吗
  21. 21.软中断和硬中断哪一个速度更快?为什么?
  22. 22.可以讲一下MADV_FREE和MADV_DONTNEED吗
  23. 23.可以列举下内核升级导致应用系统行为变化的例子吗?
  24. 24.P上不止一个G,为什么剥离PM,未阻塞的G怎么处理的?
  25. 25.怎么做性能报告?benchmark pprof 大概做哪些方面的报告,对于第三课的第一题作业不知道做哪些方面的分析
  26. 26.”spec可以搜索到类型的所有用法”, spec是指什么网址?
  27. 27.放到空闲队列的m会绑定到CPU上运行吗 会占用CPU的时间片吗?
  28. 28.那用户代码能清空空闲队列的m么 或者 有提供函数获得 空闲队列的大小么,那么空闲m队列也不会被gc回收么?
  29. 29.What is RSS?
  30. 30.RSS比实际占用多,有可能是go 运行时调用了cgo的,然后就占内存多了。这里有个哥们探究了的。
  31. 31.go12->+ kernel 5+,没设置 madvdontneed=1
  32. 39.调用netpoll 底层应该使用epoll_wait 那个go调用是用阻塞的还是非阻塞的?

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 的列表,以及可用参数的文档哪里可以查到?

  • google

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的,然后就占内存多了。这里有个哥们探究了的。

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

×

喜欢就点赞,疼爱就打赏