ARTS 挑战打卡第六周(200615-200621)
Algorthm
leetcode-1302Deepest Leaves Sum]
思路1:遍历树(PostOrder Traversal),计算最高高度,再次遍历树,根据找到的最高高度求和。(Runtime: 1 ms Memory Usage: 41.5 MB)
思路2:遍历树(PreOrder Traversal),一次遍历,计算高度的同时求和。当遇到叶子节点时,判断当前高度是否大于等于最高高度。如果是,就可能要更新最高高度或者求和(Runtime: 0 ms Memory Usage: 41.7 MB)
Review
Why do we need distributed systems?]
描述需要分布式系统的原因,在某个时间单机很稳定,不代表就不需要分布式系统了,分布式系统主要解决:
1、提供更好的可用性
主要还是解决单点故障,比如单台机器的性能有限,平均失败率受硬件影响、机器挂了恢复时间过长(Time To Recovery)
2、提高系统的耐用性
跟可用性类似,系统提供多份备份的数据/软件,在某一个节点失败的时候系统还有其他节点可以服务。
3、提高系统可扩展性
有了可用性和耐用性后,系统的扩展变得更加方便。但是对于有状态的系统,状态如何分布以及请求需要到哪个地方获取需要的状态,这两个在分布式系统领域中仍然是占比很高的问题。目前有很多开源的项目在研究,比如Raft协议可以保证分布式系统数据一致性。
4、提供更好的效率
整个分布式系统能做更多的事情,保持系统不断地运转,提高系统的效率。
没有银弹
没有任何一个分布式架构设计能解决所有的系统问题,在生产环节上构建分布式系统还是一件比较困难的事情,因为需要从可用性、可扩展性等去折中考虑如何设计或调整整个系统,以及不能影响到业务的正常使用,但是整体来说还是充满挑战的。
之前也写过一篇为什么需要分布式系统,显然这篇更细地描述了需要分布式系统的原因,赞。
Tip
进程和线程会共享什么数据?堆和栈的区别是什么?
堆是进程和线程共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给操作系统,要不然就是内存泄漏。
栈是每个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是线程安全的。操作系统在切换线程的时候会自动切换栈。栈空间不需要在高级语言里面显式的分配和释放。
进程占有的资源:地址空间,全局变量,打开的文件,子进程,信号量,账户信息
线程占有的资源:栈,寄存器,状态,程序计数器
进程是操作系统进行资源分配和调度的一个独立单位,不会共享资源,通过进程间通信共享资源,而线程可以共享部分资源,独自占有的资源不共享。
线程共享的数据包括:
堆
进程代码段
进程的公有数据
Share
Blog-Raft探索历程-Part1
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
如果本文对你有帮助,请点个赞吧,谢谢
版权声明: 本文为 InfoQ 作者【老胡爱分享】的原创文章。
原文链接:【http://xie.infoq.cn/article/1d9c9b589c6ab1a2b1d890c70】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论