内容回顾与总结
本文已经是这个文章系列的第9个文章了(中间跳过一个编号),
前面8个文章中, 通过比喻或者类比的办法了解到, 其实计算机就是一个执行指令(类似于古代的锦囊)的机器, 这些指令是程序员自己在程序运行前, 根据需要进行编制的。
然后, 后面7,8,9开始介绍一些分布式下的程序的工作情况, 到底什么是分布式的, 分布式可以类比 不在一个工作地点的不同人们的工作来联想。说的在通俗一点, 有时候我们可以把参加工作的各个人们都集中在一个房间, 一个地点让后让他们参加一项工作。 但是这个办法并不是总是有效, 例如人太做,房间装不下了, 或者一个军营,一个地点容不下了, 因此人们就会分别 安排到不同地点中去, 这个工作人员 分布在不同地点 的工作的安排方式叫分布式。
现实生活中,有这个问题, 计算机中也有这个问题。 那么在分布式系统中, 我们首先要必须明确的几点:
1. 异地同时工作问题
各个地点的人们是 同时在工作的, 也就是 甲地张三工作时, 乙地的 王五也在工作, 当然可以采用一定的办法 可以让他们 分别工作, 例如, 甲第, 白天工作, 乙地晚上工作, 但是这个情况比较少, 因此建议 在安排工作时, 确保同时工作能 正常进行, 才能保证不会有问题, 那么如何确保呢? 后面我们会慢慢讨论的。
2. 同地不同人同时工作(仍然有竞争的问题)
同一个地点的不同人 他们也会, 同时执行的, 这个是很有可能的,这样就有一个问题了, 就是竞争关系, 例如甲地 张三 正在拿起餐桌上的编号1的馒头, 同时 甲地的 马趴 也拿起编号1的馒头, 这样就有问题了, 必然打起来
若是在现实生活中很好解决,大家都是朋友, 自然有一个人退让就好了, 但是我们说的计算机是个傻东西, 他只会执行你告诉他的指令, 若是你没告诉他退让的指令, 他就不会退让, 然后。。。
3. 同地不同人, 覆盖问题
同一个地点的 两个不同人 还可能存在 覆盖的问题, 例如 甲地李四 拿起书包放到1号储物柜, 然后走了, 过一会 甲地 王五走来了, 他也把他的东西放到1号储物柜中。 这个情况下现实生活中 很好解决就是 放之前看一下, 但是计算机是个傻东西, 他就会执行指令, 若是你的指令里面没有 先检查一下的 指令, 他就不检查的呀, 就直接放了, 等到 李四到一号储物柜中取东西时, 他会取走全部东西的, 或者有的时候会变质, 例如, 李四放白菜到储物柜, 然后后面王五可能 放小白兔到储物柜, 因此等李四回来拿白菜时, 哪里还有呀!!
4. 异地不同人 集中访问一个资源 竞争问题
在不同地点的不同人也存在同时使用资源的问题
例如甲地张三 购买了城里唯一宠物店的 1号狗, 那么乙地 赵武也 购买了这个城市相同宠物店的 1号狗, 那么就有了 竞争的问题。
还是 一样, 人自己能解决这个问题, 有一个人退出就好了, 但是计算机可没那么只能, 你不告诉他, 他就会 有问题
是否有办法预防, 有, 后面慢慢会说到, 目前知道有这个情况就好
5. 异地不同人 的相互覆盖问题
这个情况同 前面的同一个地点的 两个不同人的相互覆盖有一样的事情。
例如两个不同地点的两个不同人 都到一个超市去购买东西, 然后他们放东西到超市的储物柜, 这个情况就有了相互覆盖的问题。
6. 总结一下, 一个人做指令(执行锦囊) 无论你有多少指令(或者锦囊), 也无论你这些指令如何排布(锦囊排布, 无论是分支还是循环), 这个人都要一个一个指令的做, 他没办法同时执行,原因就是他是一个人,必须一个接着一个的, 因此这些 被一个一个接着执行后的 指令可以就像一条线串到一起了, 因此这个 这些指令流 就可以是一个 线程。
什么线程, 线程通俗的说 就是一个执行路线。
每个人都会有一个执行路线, 因此一个人就相当一个cpu, 就有一个路线就是个线程(目前这么认为, 后面还会在讨论, 这个需要由简单到 复杂的慢慢过渡的)。
7. 一个任务可能有 多个人在同时执行, 例如到稻田里面去收割水稻, 要很多人进行, 这个时候 就有了多个线程, 也就是多个cpu
这些集中在一个计算机上(一个地方)的共同完成一个任务的线程构成了一个进程, 首先进程必须是执行的, 另外进程可能包括多个线程, 至少一个线程, 否则他就没有任何功能了。
8. 有的时候需要多高地方一起进行才能完成一个非常巨大的任务, 例如欢喜岭这边收割水稻,同时沙岭那边也要同时收割, 这些分布在不同地点的不同进程完成共同一个任务, 这个系统就是 分布式系统了。
对于计算机来说 不同的计算机就是不同的地点。
9. 这些分布到 不同地点的不同任务 需要协调才能更好的 一起工作, 例如一起开始, 一起结束, 然后 一起去看看 文艺节目啥的, 否则, 可能有人还在工作, 有人去看节目休息了, 这样就很不公平了。
10. 这些协调需要人员传达信息的, 任何人传达信息都要走路, 需要时间, 计算机也是 即使在快的计算机传递信息也是有 时间的
11. 不同人, 包括传递信息的人, 做工作的人, 还有路上的其他的人, 都可能 造成一定的影响, 或者这些人 工作速度等不一样, 例如早上工作快, 累了就慢了, 或者吃饱了工作快, 快到饭时了, 就慢了, 因此没有理想的 人,
计算机也是一样的 就是完全相同的cpu,完全的计算机硬件, 也可能因为环境温度, 湿度,等等造成速度的变化等
因此对数量有严格限制的 程序要特别注意这个问题
12. 对于数量有严格要求的程序或者任务要采用 计数的办法进行是最好的, 对于 没有数量要求的 任务例如收割水稻, 采用事件的办法,例如开始收割, 结束收割这些都可以看作事件,或者消息
13. 由于任何人,都可能有失误, 或者生病等, 因此例如人去传递信息时, 他病了,住院了, 那么信息谁来传递? 生活中他可以指定其他人去替他, 但是计算机比较傻的, 若是一个计算机传信息个另外计算机, 若是传递过程中出现失误, 若是没有指令告诉计算机去处理这个问题, 那么计算机就不会处理的!! 因此可能造成 整个任务失败的! 要如何避免?
还有可能某个工作的人, 工作中, 越来越累, 慢慢的睡着了, 然后睡了20天(夸张点), 那么正任务 就耽误了, 如何解决这些东西
这些都是程序要考虑的事情! 都要程序员 去编写指令 来完成这些事情。
复习是学习中非常重要的事情, 详情参见 http://www.iigrowing.cn/xue_xi_qu_xian_yu_xue_xi.html
上面两张图是学习同遗忘的关系, 因此本文才花了很多篇幅来复习前面学习的一些知识, 就是复习一下, 加深印象。
上面都是对过去的回顾, 我们本次内容依然分析一下分布式任务的事情
数量巨大的独立工作
前面讨论的分布式烙饼中一个特点是, 很多人一起烙饼, 当这些烙饼都完成了, 这个任务才算完成。
再有一个例子是, 抬木头时, 很多人共同抬一个木头才能抬的动。
两个例子有一个共同点: 他们都是一个 单一任务, 然后这个单一任务要很多人一起工作才能完成, 并且他们中每个人到要参与或者都要完成了, 这个任务才能完成。 假设这些任务中有任何人没烙饼, 或者少烙一个, 任务没完成。 抬木头中,若是有一个人突然不抬了, 可能就抬不起来, 而且会砸到其他人。
除了这个类型的 任务外, 还有别的吗?考虑下面的吃饭任务(老是吃饭有关的!)。
还是, 编个故事, 让孩子们高兴一下。看看, 能否看完故事明白道理
话说, 张飞烙饼的事迹已经在军中 传扬开了, 大家都知道张飞不光会打仗, 也会烙饼, 然后大家更是苛刻训练防备曹军在来进犯。
这一天张飞要检阅一下, 最近的练兵结果, 因此在教军场 点起1万士兵 进行检阅, 排成 各种阵势操练起来, 练来练去, 到了中午, 该吃饭了。 老张想, 今天给大家改善一下生活。 然后说大家今天累了, 大家自己去吃饭, 吃完饭下午放假半天。
这一万人, 沿着城镇的大街走起来去找饭馆去吃饭了!
1. 没有任何一个 饭馆能同时容纳1万人
2. 这些可以分开吃, 吃完各自回家就可以了!
3. 可以适当组织一下, 让他们都均匀的分散到城里各处, 这样才能快点, 否则都挤在一处饭馆, 岂不是要 等到天黑也吃不完。
简单总结一下这个 吃饭的问题
1. 每个人吃饭, 同其他人 没关系, 他吃完自然就完成了, 不需要其他人协助等等, 就是 他的任务是 独立于其他人的任务(吃饭)
2. 他们这些人中, 可以几个人一起吃, 也可以分开吃, 可以在一个地方吃, 也可以等着别人吃完后, 有地方在吃
总之 每个人吃饭是独立的, 但是就是人多。
3. 若是有个疏导的人员对他们进行 调整一下, 他们就会更有秩序的完成吃饭
可以看到这个特点是, 一个任务或者任务群 由若干个独立 子任务组成, 每个子任务不影响其他子任务。
最后这类任务, 最后需要的是 很多饭店 , 然后让这些士兵合理的分配到这些饭店去, 就解决任务。
如上图, 有20个饭店, 为这一万人提供服务, 其中张飞和他的助手负责疏导工作
如上图的红色的文字描述, 这个任务的特点。
大型任务的分布式解决方法
有了这个我们也来讨论前面的 烙饼的分布式任务的特点, 也画张图
如上图, 一个单次的任务, 这个任务要很多 厨房一起劳动才能完成。
两种任务的比较
两种任务的比较如下图
特别注意上图中中红色箭头和绿色箭头的情况
两种类型的任务图示已经出来了, 但是在实现上完全不一样, 难度也不一样, 目前仅仅需要知道他们的区别,将来实现时还是有很多可以借用的资源的, 因此也不是就特别难的
最后, 总结一下最近全部的一些内容, 放到一张图中,图没最后画完, 慢慢在补充。
相关文章