每天一点不知道(2021-05-09)

每天记录一点自己不知道东西,闲下来的时候解决掉这些问题。

  1. 如何理解golang的并发哲学,CSP模型?
    CSP是Communicating Sequential Processes的缩写,翻译过来是“顺序过程间通信”。它的宗旨是不要通过共享内存来通信,而要通过通信来实现内存共享。这个思想来自Hoare的一篇论文,这篇论文证明如果一门编程语言中把processes间的通信看得第一等重要,那么并发编程的问题就会变得简单。在golang中主要通过channel来实现。参考如下文章:Paper Reading CSP 理解顺序进程间通信Actor模型/CSP模型/共享内存模型如何深入浅出地解释并发模型中的CSP模型?为什么使用通信来共享内存

  2. 对比下CSP和共享内存?
    本质上线程或者协程都是从内存中获取数据,那么为什么我们使用发送消息的方式来同步消息,而不是多个线程或者协程直接共享内存?抽象层级,channel内部实现广泛用到了共享内存和锁,通过组合两者提供了更高级的同步机制。我们应该使用这种抽象层级更高的方法,它提供了更好的封装和设计,只有它无法满足需求时才应该考虑层级更低的方法。CSP模型与消息队列类似,通过channel这一层让资源的生产者和消费者更清晰。channel保证了被共享的变量不会同时被多个协程访问。

  3. 除了CSP模型,还有其他模型吗,如何理解其他的模型?
    还有Actor模型,erlang使用的是Actor模型,golang使用的是CSP模型。在CSP模型中,process之间是通过channel来关联。在Actor模型中,actor执行体是第一类对象,每个actor都有自己的ID(类比人的身份证),可以被传递。actor的交互通过发送消息来完成,每个actor都有一个通信信箱(mailbox,本质上是FIFO消息队列),用于保存已经收到但尚未被处理的消息。actorA要向actorB发消息,只需持有actorB ID,发送的消息将被立即Push到actorB的消息信箱尾部,然后返回。因此Actor的通信原语是异步的。面向对象编程中对象的交互通常是顺序执行的(占用的是调用方的时间片,是否并发由调用方决定),而Actor模型中actor的交互是并行执行的(不占用调用方的时间片,是否并发由自己决定)。

  4. 能从源码维度阐述channel的实现原理吗?

  5. golang中还有哪些方式可以做并发控制,channel和它们相比有何优缺点?

  6. 内存逃逸是什么意思,什么情况下会出现内存逃逸?

  7. 内存泄漏和内存逃逸有什么区别?

  8. golang中是如何分配内存的?

  9. golang中的垃圾回收机制是怎样的?

  10. golang中为什么引入context?

  11. 能从源码维度阐述context的实现原理吗?

  12. 什么情况下使用context会出现内存泄露?

  13. golang的GMP模型如何理解?

  14. 闭包是什么意思,有什么作用,golang中如何实现的闭包?

  15. 每个协程占用多少内存空间,系统能够支持多少的协程数目?

  16. 如何实现一个简单的协程池,类比java的协程池?

  17. 为什么说golang中的接口是鸭子类型?

  18. interface是如何实现的,怎么判断数据是否是nil?

  19. 能从源码维度阐述map的实现原理吗?

  20. 什么样的数据类型能作为map的key呢?

  21. 为什么map中的key是无序的?

  22. 可以边遍历边删除map吗,map的删除过程是怎样的?

  23. map的遍历,赋值和扩容过程是怎样的?

  24. map是线程安全的吗?

  25. golang中反射有什么用,什么场景需要用反射?

  26. 反射在golang中是如何实现的?

  27. golang程序的启动过程是怎样的?

  28. panic, recover和defer解决什么问题,是如何实现的?

  29. golang中如何实现OOP中的封装,继承,多态?

  30. golang有哪些web框架,orm框架,对比他们的优缺点?

  31. 对比下golang中的数组和切片,切片如何扩容的?

  32. golang有哪些数据类型,哪些是基本数据类型,哪些是引用数据类型?

  33. 对比下golang和java在web后端开发时的优缺点?

  34. 聊下你知道golang生态中的常用工具链?

  35. 聊下golang的编程规范?

  36. 不借助外部库,写一个golang程序判断计算机是大端存储还是小端存储?

  37. 输入一个字符串,例如12, 1.4K,1.4M,1.4G,输出其对应的字节数,异常输入返回-1。

 Share!

 
comments powered by Disqus