许式伟的架构课
许式伟
七牛云CEO
立即订阅
20106 人已学习
课程目录
已更新 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 | 接口设计的准则
许式伟的架构课
登录|注册

08 | 操作系统内核与编程接口

许式伟 2019-05-10
你好,我是七牛云许式伟。
今天我们在开发软件的时候,已经处于一些基础的架构设计之中,像冯·诺依曼计算机体系,像操作系统和编程语言,这些都是我们开发一个应用程序所依赖的基础架构。
在上一讲“07 | 软件运行机制及内存管理” 中,我们着重介绍了软件是如何被运行起来的。今天,我们着重聊一聊软件如何利用它所依赖的基础架构。
首先是冯·诺依曼计算机体系,它由 “中央处理器 + 存储 + 一系列的输入输出设备” 构成。这一层,提供了编程接口的是中央处理器(CPU),编程接口是 CPU 指令,但 CPU 指令非常难用。
为此,人们发明了编程语言来降低 CPU 指令的使用门槛。编程语言面向人类,CPU 指令面向机器,编译器负责将人类容易理解和掌握的编程语言的程序,翻译成机器能够理解的 CPU 指令序列。
其次是编程语言。虽然编程语言出现的起因是降低 CPU 指令的使用门槛,第一门编程语言汇编语言的能力也很接近 CPU 指令,但是语言的自然演化会越来越脱离 CPU 所限制的条条框框,大部分语言都会演化出很多基础的算法库。
比如,字符串算法库有:字符串连接(concat)、字符串子串(substring),字符串比较(compare)、字符串长度(length)等等。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《许式伟的架构课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(47)

  • :)
    老师讲得太好了,让我对操作系统有了更加深入的理解,个人认为理解好老师所讲的内容,有如下关键点:1. 操作系统和我们写的程序运行于两个进程中 2.我们写的程序无法直接访问操作系统所在的内存 3.连接操作系统进程和用户进程的桥梁是中断地址 。 可以设想在还没有出现操作系统的上古时代,有两个普通的程序A和B在cpu上跑着,那么程序A和程序B如何交互呢?一种简单的办法就是程序A直接跳到程序B的函数地址上,cpu去执行该函数。但是呢,如果程序A访问不了程序B的地址咋办呢?可以在他们之间创建一个桥梁,这个桥梁就是中断地址,程序A可以通过中断地址间接的把cou执行权限交给B。这样程序B就可以执行了。 从cpu的角度看程序A和程序B都是普通的程序,但是呢,程序B是个功能丰富的程序,它可以做很多事,比如管理内存,管理外围设备。话说,程序A也可以做管理设备的工作啊,程序C也可以做管理设备的工作,,,后来一发现,程序A,B,C....都做了和外围设备交互的工作,我擦大家都做了相同的工作啊,那要不都交给程序B来做吧,我们A和C希望和外围设备交互的时候,就通过中断做为桥梁,把执行权交给B,然后就达到间接的外围设备交互,,,于是乎B越来越壮大!不仅有外围IO管理的能力,还有了内存管理,进程环境,,,等等。于是乎操作系统产生了,,,这是我个人的理解,还请老师多多指正!
    2019-05-10
    39
  • SuperFranky
    cpu不需要检查是否发生了中断,它的原理类似于开关和灯泡的关系,当开关合上,灯泡就会亮,灯泡不需要定期检查开关是否合上了

    作者回复: 👍

    2019-05-11
    20
  • Fz
    交叉编译不是很理解

    作者回复: 其实理解清楚一个实质:编译器就是把高级语言翻译成为机器码,更抽象说,它其实就是格式转换器。目标格式是不是编译器正在运行的环境并不重要,只不过如果目标格式刚好是当前机器的CPU+操作系统,那么目标格式就可以直接执行,否则就编译出一个当前环境下无法执行的目标格式,这种情况就叫交叉编译。

    2019-05-10
    1
    18
  • 晓凉
    优秀的架构设计能带来的好处可能超出架构师最初的预想,例如Linux系统的容器特性,现在成了云计算领域的重要基础技术,成就了一个领域。基于前辈大师的优秀架构,现在的信息世界才能如此生生不息。优秀的架构不仅能解决当前的实际问题,更具有理论上的优雅,像一种真理,可照亮未来。

    作者回复: 我们日常所见明明有无数设计精良的例子,所以我们其实不需要一上来去设计新的例子,从这些最宏大的例子学起

    2019-05-12
    11
  • 云学
    看完有种苹果砸到脑袋上的感觉,好多问题之前总想不透,现在贯通了,许老师可以创立个品牌专门教小孩编程,以老师的功底肯定能教会

    作者回复: 正在教自家小孩😊

    2019-05-12
    8
  • 行者
    关于动态库,是不是可以理解为:提供动态库不是操作系统的责任(因为其他语言完全可以通过系统调用来自己实现动态库的功能),只是操作系统为了方便其他语言(减少不必要的冗余)而做的多余的事?

    作者回复: 是的

    2019-05-13
    1
    6
  • M
    请问一下cpu是如何检查是否有中断的。是怎么及时知道发生了中断?每执行完一条指令都去检查一次吗?

    作者回复: 挺好的问题。硬件中断和软中断不一样。硬件中断你可以理解为总是会定期检查。软中断本身是一条指令,所以不存在检查这样的概念。

    2019-05-10
    1
    6
  • 二星球
    老师好,我这有个问题,就是有中断必有对应的中断处理程序,那么执行中断处理程序会不会像普通线程那样抢占cpu资源呢,如果没抢到还要等一等?还有就是一下同时来了十几个中断,那么怎么处理呢?

    作者回复: 软中断你可以把它理解为虚函数调用,本来就占着cpu资源呢,不需要等。一下子来很多中断是可能的,在硬件中断的情况下,这时候会根据中断优先级响应。

    2019-05-13
    5
  • long.mr
    许老师,问一哈在画架构图的时候有没有一些约定俗成的准则呢,比如虚线 实线 方框 圆角矩形的选择。业界有一些权威的参考吗?

    作者回复: UML 里面有一些约定,可以参考。但是更重要的是团队内的约定。

    2019-05-12
    5
  • 没有昵称
    老师 但是实际上常见的系统级语言(比如 C 语言)都是可以编写出不依赖任何内核的程序的。这句话是说我们编写的程序 没有操作系统也可以跑起来是吗

    作者回复: 要让引导程序给你执行权才行,如果你写一个不依赖操作系统的程序,但是要让操作系统执行它是行不通的,因为操作系统接管了所有的资源,你不依赖它什么也干不了(没有权限)。所以这种写法基本上只适合写另一个操作系统。

    2019-05-11
    5
  • QQ怪
    老师能否讲下协程的优势?不太理解

    作者回复: 很快要讲到了

    2019-05-10
    4
  • 木 易
    老师可以谈谈最近华为要推出的“鸿蒙系统”吗,和Linux有什么关系,如果想开发一个操作系统,从哪些方面考虑。

    作者回复: 做操作系统的难度不在技术,而是在:1、用户为何用你,你有何不可替代性;2、开发者为何要支持你,你用户多不多。

    2019-06-17
    1
    3
  • 泉水叮咚💦🐱
    老师解释的真是很明白,尤其是系统调用的工作原理,我一直都没有想明白普通用户自定义函数调用和系统调用之间到底有什么区别,原来以为是垮进程内存地址传递和内存共享,原来压根儿就是在同一个内存地址空间里啊!OS内核地址空间被所有用户进程自己操作系统自己共享啊。
    上学时学习操作系统课程,上面说虚拟内存低地址空间已经分给操作系统内核使用,这句话原来是这个意思啊,真是恍然大悟,受教受教了。💐(/ε\*)给你花花
    2019-05-22
    3
  • Yayu
    请问老师,变成语言提供的内置库(SDK)可大体氛围两类:1、对(操作系统各个子系统的)系统调用的封装;2、业务(逻辑)层的工具。那我们这里说的SDK是文章末尾分层图中的 【编程语言操作系统相关的标准库】和【编程语言的算法库】对吧?那【编程语言的核心文法及内置库】这一层如何理解?落实到具体的指代哪些库呢?

    作者回复: 编程语言的核心文法及内置库主要就是语言各种基础特性,主要就是语言文法部分,比如变量、控制语句(if、for、switch)、函数定义等等

    2019-05-13
    3
  • K战神
    k8s是不是也是类似于软件治理平台?

    作者回复: 是的

    2019-05-10
    3
  • dong
    这是我看过的讲的最清楚的计算机组成原理和操作系统。期待更新。
    2019-05-10
    3
  • 小袋子
    插个题外话,以老师的经验,小孩几岁开始学编程比较合适😂

    作者回复: 8-9岁

    2019-06-23
    2
  • 马留
    对“硬件中断要周期性检查”不太理解。CPU和外设交互,有三种方式:轮询 中断 DMA。对CPU来说,硬件中断来自于外部触发,是异步的,怎么需要周期性检查呢?

    作者回复: 硬件中断周期性检查是一个错误的表述

    2019-05-16
    2
  • 尹少爷
    操作系统内核的进程都是共享内存的,在联合上一章内容:

    其实操作系统内核上层如果按照保护模式来看,通过虚拟内存做了一层安全隔离,不同程序的隔离, 那么同一个程序中的,不同进程的隔离是怎么做的,

    作者回复: 同一进程内的隔离是通过:1、分内核态很用户态;2、内存页的保护属性(不可读、不可写、不可执行)

    2019-05-15
    2
  • Barry
    看来有人提了朗读者之前读速有点快的问题,这节就慢了下来。这个语速挺好的
    2019-05-13
    2
收起评论
47
返回
顶部