为什么实现共享内存? 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。
cgroup从2.6.4引入linux内核主线,目前默认已启用该特性。在cgroup出现之前,只能对一个进程做资源限制,比如通过sched_setaffinity设置进程cpu亲和性,使用ulimit限制进程打开文件上限、栈大小等。
https://blog.betacat.io/post/2020/03/a-pattern-for-writing-testable-go-code/ UT(单元测试)是个好东西,我们每个人都爱它。当写完一段功能复杂的逻辑时,各种变态的测试样例能增强我们对这段逻辑的信心;当更改别人的代码时,好的 UT coverage 能帮我们确保这次的更改不会影响到其他的代码;当阅读别人代码时,相应的 UT 也是一份文档,能告诉我们这段代码所实现的功能。因此我们总是希望别人的代码能有 UT,但自己却很少写 UT,这是为什么呢?🤔
tcp向上层提供的数据肯定是按顺序排好的。比如一共有1 2 3 4 5五个包,假设前3个包的大小可以填满tcp的缓冲区,那么如果第4个包丢失,这时候并不会影响应用层接收前三个包。而如果是前三个包里面发生丢失,即使4 5都正常接收也不行,因为前面还有包没有收到,这时候tcp是不会向上层提供数据的。
https://mp.weixin.qq.com/s/gNAani93Xrb02oDsgDc1fQ 在某些垃圾回收器算法中,“停止世界”(Stop the World: STW,下同)是跟踪内存使用最重要的阶段,它会停止程序的执行,以扫描内存使用,并添加写障碍。让我们回顾一下它在内部如何工作,以及它可能面临的潜在问题。 停止世界(Stop the world) 停止程序意味着停止所有正在运行的 goroutine。下面是一个执行 STW 的简单程序: