每天记录一点自己不知道东西,闲下来的时候解决掉这些问题。
-
如何理解golang的并发哲学,CSP模型?
CSP是Communicating Sequential Processes的缩写,翻译过来是“顺序过程间通信”。它的宗旨是不要通过共享内存来通信,而要通过通信来实现内存共享。这个思想来自Hoare的一篇论文,这篇论文证明如果一门编程语言中把processes间的通信看得第一等重要,那么并发编程的问题就会变得简单。在golang中主要通过channel来实现。参考如下文章:Paper Reading CSP 理解顺序进程间通信,Actor模型/CSP模型/共享内存模型,如何深入浅出地解释并发模型中的CSP模型?,为什么使用通信来共享内存 -
对比下CSP和共享内存?
本质上线程或者协程都是从内存中获取数据,那么为什么我们使用发送消息的方式来同步消息,而不是多个线程或者协程直接共享内存?抽象层级,channel内部实现广泛用到了共享内存和锁,通过组合两者提供了更高级的同步机制。我们应该使用这种抽象层级更高的方法,它提供了更好的封装和设计,只有它无法满足需求时才应该考虑层级更低的方法。CSP模型与消息队列类似,通过channel这一层让资源的生产者和消费者更清晰。channel保证了被共享的变量不会同时被多个协程访问。 -
除了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的交互是并行执行的(不占用调用方的时间片,是否并发由自己决定)。 -
能从源码维度阐述channel的实现原理吗?
-
golang中还有哪些方式可以做并发控制,channel和它们相比有何优缺点?
-
内存逃逸是什么意思,什么情况下会出现内存逃逸?
-
内存泄漏和内存逃逸有什么区别?
-
golang中是如何分配内存的?
-
golang中的垃圾回收机制是怎样的?
-
golang中为什么引入context?
-
能从源码维度阐述context的实现原理吗?
-
什么情况下使用context会出现内存泄露?
-
golang的GMP模型如何理解?
-
闭包是什么意思,有什么作用,golang中如何实现的闭包?
-
每个协程占用多少内存空间,系统能够支持多少的协程数目?
-
如何实现一个简单的协程池,类比java的协程池?
-
为什么说golang中的接口是鸭子类型?
-
interface是如何实现的,怎么判断数据是否是nil?
-
能从源码维度阐述map的实现原理吗?
-
什么样的数据类型能作为map的key呢?
-
为什么map中的key是无序的?
-
可以边遍历边删除map吗,map的删除过程是怎样的?
-
map的遍历,赋值和扩容过程是怎样的?
-
map是线程安全的吗?
-
golang中反射有什么用,什么场景需要用反射?
-
反射在golang中是如何实现的?
-
golang程序的启动过程是怎样的?
-
panic, recover和defer解决什么问题,是如何实现的?
-
golang中如何实现OOP中的封装,继承,多态?
-
golang有哪些web框架,orm框架,对比他们的优缺点?
-
对比下golang中的数组和切片,切片如何扩容的?
-
golang有哪些数据类型,哪些是基本数据类型,哪些是引用数据类型?
-
对比下golang和java在web后端开发时的优缺点?
-
聊下你知道golang生态中的常用工具链?
-
聊下golang的编程规范?
-
不借助外部库,写一个golang程序判断计算机是大端存储还是小端存储?
-
输入一个字符串,例如12, 1.4K,1.4M,1.4G,输出其对应的字节数,异常输入返回-1。