为什么要使用通信的方式来实现共享内存
为什么要使用通信的方式来实现共享内存
GO 的 channal 底层还是使用共享内存的方式进行通信,抽象层面上在共享内存上面一层,在内部处理了线程竞争(CAS指令)、内存管理等内容,适用于更多场景。
总结:
- 首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们在程序设计上提供更好的封装,让程序的逻辑更加清晰;
- 其次,消息发送在解耦方面与共享内存相比也有一定优势,我们可以将线程的职责分成生产者和消费者,并通过消息传递的方式将它们解耦,不需要再依赖共享内存;
- 最后,Go 语言选择消息发送的方式,通过保证同一时间只有一个活跃的线程能够访问数据,能够从设计上天然地避免线程竞争和数据冲突的问题;
说明在chanel维护所有被该chanel阻塞的协程(读,写各一双向链表)来保证有资源的时候只唤醒一个协程来避免竞争之类的
从架构上来讲,降低共享内存的使用,本来就是解耦和的重要手段之一,举几个例子
golang建议使用channel来共享信息而不是使用共享内存,这是一种优雅的方式,避免了数据同步带来的繁琐和低效。
往大了说,本质上还是让资源去调度请求,而不是让请求去调度资源。
资源就那么多,所有请求有序使用资源的方式就是通信的方式,反过来,为每个请求虚拟出它独占资源的假象,那就是共享的方式。两种截然不同的方式,差异体现在仲裁成本,这个成本决定了它们承载并发的能力。
参考文章:https://draveness.me/whys-the-design-communication-shared-memory/
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!