加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡水站长网 (https://www.0318zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

如果超级智能机器要伤害人类,拔插头也无法阻止

发布时间:2021-01-29 13:55:05 所属栏目:动态 来源:互联网
导读:NO1:说说zookeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口

NO1:说说zookeeper是什么?

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户 。

Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下:
 

实际上不只brk系统调用,sbr、mmap系统调用也可以实现同样的目的,mmap也更为灵活,但该函数并不是本文重点,就不在这里详细讨论了。现在我们知道了,如果malloc自己维护的内存空间不足将通过brk系统调用向操作系统申请内存。这样malloc就可以把这些从操作系统申请到的内存当做新的空闲内存块分配出去。

看起来已经讲完的故事

现在我就可以简单总结一下了,当我们申请内存时,经历这样几个步骤:

程序调用malloc申请内存,注意malloc实现在标准库中

malloc开始搜索空闲内存块,如果能找到一块大小合适的就分配出去,前两个步骤都是发生在用户态

如果malloc没有找到空闲内存块那么就像操作系统发出请求来增大堆区,这是通过系统调用brk(sbrk、mmap也可以)实现的,注意,brk是操作系统的一部分,因此当brk开始执行时,此时就进入内核态了。brk增大进程的堆区后返回,malloc的空闲内存块增加,此时malloc又一次能找到合适的空闲内存块然后分配出去。
 

堆区增长后占用的内存就会变多,这就解决了内存分配器空闲内存不足的问题,那么很自然的,malloc该怎样让堆区增长呢?原来malloc内存不足时要向操作系统申请内存,操作系统才是真大佬,malloc不过是小弟,对每个进程,操作系统(类Unix系统)都维护了一个叫做brk的变量,brk发音break,这个brk指向了堆区的顶部。

将brk上移后堆区增大,那么我们该怎么样让堆区增大呢?这就涉及到我们刚提到的系统调用了。

向操作系统申请内存

操作系统专门提供了一个叫做brk的系统调用,还记得刚提到堆的顶部吧,这个brk()系统调用就是用来增加或者减小堆区的。
 

现在我们知道了,malloc是标准库的一部分,当我们调用malloc时实际上是标准库在为我们申请内存。这里值得注意的是,我们平时在C语言中使用malloc只是内存分配器的一种,实际上有很多内存分配器,像tcmalloc,jemalloc等等,它们都有各自适用的场景,对于高性能程序来说使用满足特定要求的内存分配器是至关重要的。那么接下来的问题就是malloc又是怎么工作的呢?

malloc是如何工作的

实际上你可以把malloc的工作理解为去停车场找停车位,停车场就是一片malloc持有的内存,可用的停车位就是可供malloc支配的空闲内存,停在停车场占用的车位就是已经分配出去的内存,特殊点在于停在该停车场的车宽度大小不一,malloc需要回答这样一个问题:当有一辆车来到停车场后该停到哪里?通过上面的类比你应该能大体理解工作原理了,具体分析详见《自己动手实现一个malloc内存分配器》。但是,请注意,上面这篇文章并不是故事的全部,在这篇文章中有一个问题我们故意忽略了,这个问题就是如果内存分配器中的空闲内存块不够用了该怎么办呢?在上面这篇文章中我们总是假定自己实现的malloc总能找到一块空闲内存,但实际上并不是这样的。

内存不够该怎么办?

让我们再来看一下程序在内存中是什么样的:

(编辑:衡水站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读