许式伟的架构课
许式伟
七牛云CEO
立即订阅
20092 人已学习
课程目录
已更新 72 讲 / 共 77 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 怎样成长为优秀的软件架构师?
免费
基础平台篇 (21讲)
01 | 架构设计的宏观视角
02 | 大厦基石:无生有,有生万物
03 | 汇编:编程语言的诞生
04 | 编程语言的进化
05 | 思考题解读:如何实现可自我迭代的计算机?
06 | 操作系统进场
07 | 软件运行机制及内存管理
08 | 操作系统内核与编程接口
09 | 外存管理与文件系统
10 | 输入和输出设备:交互的演进
11 | 多任务:进程、线程与协程
12 | 进程内协同:同步、互斥与通讯
13 | 进程间的同步互斥、资源共享与通讯
14 | IP 网络:连接世界的桥梁
15 | 可编程的互联网世界
16 | 安全管理:数字世界的守护
17 | 架构:需求分析 (上)
18 | 架构:需求分析 (下) · 实战案例
19 | 基础平台篇:回顾与总结
加餐 | 我看Facebook发币(上):区块链、比特币与Libra币
加餐 | 我看Facebook发币(下):深入浅出理解 Libra 币
桌面开发篇 (16讲)
20 | 桌面开发的宏观视角
21 | 图形界面程序的框架
22 | 桌面程序的架构建议
23 | Web开发:浏览器、小程序与PWA
24 | 跨平台与 Web 开发的建议
25 | 桌面开发的未来
26 | 实战(一):怎么设计一个“画图”程序?
27 | 实战(二):怎么设计一个“画图”程序?
28 | 实战(三):怎么设计一个“画图”程序?
29 | 实战(四):怎么设计一个“画图”程序?
30 | 实战(五):怎么设计一个“画图”程序?
31 | 辅助界面元素的架构设计
课外阅读 | 从《孙子兵法》看底层的自然法则
加餐 | 想当架构师,我需要成为“全才”吗?
32 | 架构:系统的概要设计
33 | 桌面开发篇:回顾与总结
服务端开发篇 (14讲)
34 | 服务端开发的宏观视角
35 | 流量调度与负载均衡
36 | 业务状态与存储中间件
37 | 键值存储与数据库
38 | 文件系统与对象存储
39 | 存储与缓存
40 | 服务端的业务架构建议
41 | 实战(一):“画图”程序后端实战
42 | 实战(二):“画图”程序后端实战
43 | 实战(三):“画图”程序后端实战
44 | 实战(四):“画图”程序后端实战
45 | 架构:怎么做详细设计?
46 | 服务端开发篇:回顾与总结
加餐 | 如何做HTTP服务的测试?
服务治理篇 (11讲)
47 | 服务治理的宏观视角
48 | 事务与工程:什么是工程师思维?
49 | 发布、升级与版本管理
50 | 日志、监控与报警
加餐 | 怎么保障发布的效率与质量?
51 | 故障域与故障预案
52 | 故障排查与根因分析
53 | 过载保护与容量规划
54 | 业务的可支持性与持续运营
55 | 云计算、容器革命与服务端的未来
56 | 服务治理篇:回顾与总结
架构思维篇 (9讲)
57 | 心性:架构师的修炼之道
用户故事 | 站在更高的视角看架构
58 | 如何判断架构设计的优劣?
59 | 少谈点框架,多谈点业务
60 | 架构分解:边界,不断重新审视边界
加餐 | 实战:“画图程序” 的整体架构
61 | 全局性功能的架构设计
62 | 重新认识开闭原则 (OCP)
63 | 接口设计的准则
许式伟的架构课
登录|注册

13 | 进程间的同步互斥、资源共享与通讯

许式伟 2019-05-28
你好,我是七牛云许式伟。
在上一讲,我们介绍了进程内执行体之间的协同机制。今天我们接着聊进程与进程之间的协同。
这些协同机制大体可分为:互斥、同步、资源共享以及通讯等原语。对于这些协同机制,我们对比了 Linux、Windows、iOS 这三大操作系统的支持情况,整理内容如下:
在逐一详细分析它们之前,我们先讨论一个问题:从需求角度来讲,进程内协同与进程间协同有何不同?
在早期,操作系统还只有进程这个唯一的执行体。而今天,进程内的执行体(线程与协程)被发明出来并蓬勃发展,事情发生了怎样的变化?
请先思考一下这个问题。我们在这一讲最后总结的时候一起聊聊。

启动进程

在讨论进程间的协同前,我们先看下怎么在一个进程中启动另一个进程。这通常有两种方法:
创建子进程;
让 Shell 配合执行某个动作。
前面在 “11 | 多任务:进程、线程与协程” 一讲中我们已经提到过,创建子进程 UNIX 系的操作系统都用了 fork API,它使用上很简洁,但是从架构角度来说是一个糟糕的设计。Windows 中我们用 CreateProcess,这个函数有很多的参数。
iOS 很有意思,它并不支持创建子进程。在进程启动这件事情上,它做了两个很重要的变化:
软件不再创建多个进程实例,永远是单例的;
一个进程要调用另一个进程的能力,不是去创建它,而是基于 URL Scheme 去打开它。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《许式伟的架构课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • Bachue Zhou
    iOS 可以大刀阔斧的改革的一个重要原因就是,这个操作系统的使用场景极为单一,全部都是直接面向用户的交互式应用。这点和通用操作系统 UNIX 有巨大的区别,例如它连 UNIX 最基本的命令行都没有,也没有 CS/BS 架构需求,大量 UNIX 进程间通讯都是为这些需求而设计的,需求没有了,自然底层机制也就不需要了。由此其实也可以看出来,通用操作系统应该是作为一个底层操作系统来用,只负责硬件抽象,而每一个系统应该根据自己的使用场景去设计一个上层操作系统,而不是直接拿底层操作系统充当上层操作系统用,或者将二者混为一谈,虽然这么多年来,人们已经习惯了这种设计,但这不是正确的。
    2019-05-28
    43
  • tim
    信号量(system V) 有一个属性是un-do,如果进程挂掉,这个进程获得的资源会释放。避免死锁饿死的问题

    作者回复: 👍,很好的补充

    2019-06-05
    5
  • L-jiehui
    老师思维高度很高,再一次收获巨大,谢谢老师
    有两个问题请教下老师:
    1、操作系统如果不知道信号量的值多少才合理,不能统一按照自定义默认的值,例如0来处理吗
    2、虚拟内存实现进程隔离具体如何实现的呢,网上看了一遍资料,还是理解得不够清晰

    作者回复: 1、0未必与事实相符,不相符会导致逻辑错乱
    2、见我们前面 “07 | 软件运行机制及内存管理” 一节

    2019-05-28
    5
  • ljf10000
    ios有点docker的意思

    作者回复: 是的,不过它出现得比docker早好多年。

    2019-05-28
    4
  • Cordova
    我觉得iOS这样设计挺好的,本来就该思考这个系统面对的是什么样的使用场景,也许我们以后只需要一个用户进程呢、只不过这个用户进程功能很强大、当系统变得微小化、各种设备被变得多样化、不需要去协调用户进程、需要什么数据问问另外一个微系统设备就好啦、那这样我们的以后的系统就只需要为这一个进程保留一个套接字就好啦!所以iOS我觉得代表了以后的方向和趋势!反正听完许老师的课我是想法很多~不过可能明天早上爬起来又背着电脑,坐着公交去上班了。

    作者回复: 挺有想法的,不过所有的预见都应该建立在逻辑上,需求是怎样演进的,所以技术会怎么变,这才是架构师预见未来的判断法则。

    2019-05-29
    3
  • 张永刚
    第一次认识到操作系统架构设计
    2019-05-28
    3
  • Geek_04e22a
    老师,读了这篇文章,感觉收货颇丰,以前所有机制只认为是进程间通讯,没有想过重新划分同步互斥,资源共享,收发消息几类。现在有两个问题,iOS共享资源使用的是剪切板吗?Linux创建子进程目的是什么?

    作者回复: 1、剪贴板是这里拿来凑数的,它并不是惯常的进程间通信手段;
    2、Unix 系的操作系统认为所有进程都有一个祖先,进程关系构成一个进程树。

    2019-05-28
    3
  • 82
    1,ios进程单实例就没法做到android的应用双开能力吧?
    2,在使用url scheme进程通讯时,如果存在多进程实例,是否会让系统疑惑跳转到哪个进程?
    3,一台机器就是一个局域网,每个进程实例都是一个端,这种通讯思想似乎拓宽了网络的边界,无处不网络。

    作者回复: 1、是的,架构设计是选择,你没法兼顾
    2、这个是个理由;简单也可以是理由

    2019-05-28
    3
  • 有铭
    IOS的核心思路就是进程先天级别的隔离。可以认为它自带docker。但是我认为这个代价太大了。说真的如果不是IOS的自带逼格光环,这种隔绝程度的操作系统流行不起来的。并不是理论上先进的系统就一定好。很多时候还是需要现实的妥协
    2019-05-28
    1
    2
  • 💪😊
    非常同意作者观点啊!另外有个疑惑就是Chrome浏览器是多进程设计的,据说是为了追求性能,许总怎么看?

    作者回复: 从客户端软件角度,多进程、多线程甚至多协程的性能差异很小。所以思考不应该是从性能出发,我觉得应该从隔离性出发,多进程的好处是隔离性好,一个出问题不影响别人。

    2019-06-19
    1
  • hua168
    一个软件只需启动一个进程实例。
    如果是多核,单进程不是浪费吗?
    我看nginx它是1核一个线程…
    2019-06-02
    1
  • Ender0224
    "为什么?因为进程可能会异常挂掉,这会导致同步和互斥的状态发生..."
    请教个问题,线程难道不会因为挂死而异常么? 如果这时候持有锁,其他线程同样的会持续拿不到锁而阻塞了。

    作者回复: 线程没法独立挂掉,进程会一起挂。

    2019-05-31
    1
  • BillyZhang
    有一点不太理解,IOS 是手机或是移动操作系统,linux和windows 是pc 或是服务器操作系统,虽然安卓也是基于linux 但是 使用场景还是不太一样的吧, 那么同是苹果操作系统 MacOS 是否也是沙箱设计模式呢?

    作者回复: macos 不是沙箱设计

    2019-05-31
    1
  • Aaron Cheung
    打卡13 深入操作系统进程架构
    2019-05-28
    1
  • 感恩大佬分享 随喜大佬
    2019-05-28
    1
  • 郝志强
    从来没想过可以通过分析计算机系统的设计来了解架构知识,老师功力深厚。
    2019-09-27
  • Hungry
    老师,iOS也是有信号量dispatch_semaphone,pthread 锁,条件变量,以及 mmap 的,毕竟iOS也是BSD的一类,用kqueue的

    作者回复: 进程间可用么?

    2019-07-14
  • zhuyc
    "规格强调的是自然体现需求,所以规格是稳定的,是子系统的契约。"关注规格与契约的讨论,后面有没有机会更详细展开看看。
    我能理解接口与实现的分离,老师提到的规格似乎是更高层的概念

    作者回复: 规格就是指接口

    2019-07-06
  • Lane
    很好的思考,我认为进程既然是资源隔离的,是没有必要共享内存,这里可以借助go的思想,要靠通信来共享。老师很自然的类比到了子系统的边界,本来UserService是个很单纯的用户信息的代码,有时和用户沾边的需求也放在这里,久而久之导致庞大而不纯粹。
    2019-06-18
  • Delia
    我们在Linux上做进程间通信的时候也选择的共享内存机制,速度确实很快。今天学了这节课,感觉思路又拓宽很多尤其是讲IOS的进程间通信,大开眼界。
    2019-06-17
收起评论
28
返回
顶部