编程语言出现之后 软件的编写效率得到极大的提升
软件治理的需求
- 多个软件如何同时运行
- 共用存储空间
- 外部设备
- 如何相互通讯
- 病毒、恶意软件如何治理
操作系统的启动过程
操作系统的需求演进
软件治理六个子系统
- 进程管理
- 存储管理
- 输入设备管理
- 输出设备管理
- 网络管理
- 安全管理
基础编程接口问题
核心的流量入口
三个商业闭环
- 账户
- 支付
- 应用市场
- 硬件
- 操作系统
- 浏览器
曾因酒醉鞭名马 生怕情多累美人
两个线程操作同一临界区时,通过互斥锁保护,若A线程已经加锁,B线程再加锁时候会被阻塞,直到A释放锁,B再获得锁运行,进程B必须不停的主动获得锁、检查条件、释放锁、再获得锁、再检查、再释放,一直到满足运行的条件的时候才可以(而此过程中其他线程一直在等待该线程的结束),这种方式是比较消耗系统的资源的。而条件变量同样是阻塞,还需要通知才能唤醒,线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,该线程就休眠了,应该仍阻塞在这里,等待条件满足后被唤醒,节省了线程不断运行浪费的资源。这个过程一般用while语句实现。当线程B发现被锁定的变量不满足条件时会自动的释放锁并把自身置于等待状态,让出CPU的控制权给其它线程。其它线程 此时就有机会去进行操作,当修改完成后再通知那些由于条件不满足而陷入等待状态的线程。这是一种通知模型的同步方式,大大的节省了CPU的计算资源,减少了线程之间的竞争,而且提高了线程之间的系统工作的效率。这种同步方式就是条件变量。
如果学过java的话,其实就是线程之间的互斥和协作,条件变量就是用来协作的,对应java里wait()和notify()函数。
编程语言的出现,诞生了软件工程师(也叫做程序员)这样一个职业,而汇编语言则可以看做是软件工程师这个分工出现的标志。
通过编程语言,软件工程师和计算机可以进行交互,表达自己的思想。但是,如果我们把掌握编程语言看做是软件工程师的专业技能,其实又低估了编程语言带来的革命性变化。
编程语言在信息科技发展中的位置,如同人类文明中语言所在的位置。而编程语言写出来的软件(及其源代码),如同人类文明中不断被传承下来的图书典籍。
软件是活的书籍,有两个方面的理解
编程范式的进化
两个优点
信息的封装
面向对象还有一个至关重要的概念是接口 通过接口 优雅实现过程式编程当中很费劲才能做到的一个能力: 多态
引入继承的概念 虽然带来了编码上的便捷性 但是带来了不必要的心智负担 本来复合对象的唯一构造方法是组合 现在多了一个选择 继承
GO语言的设计 是放弃了继承 全面强化组合
官方宣称是面向连接的语言 面向连接就是朴素的组合思想 研究连接 就是研究人与人如何组合 研究代码之间怎么组合
消息传递是多核背景下流行起来的一种编程思想 尽可能用消息传递来取代共享内存 从而尽可能避免显式的锁 降低编程负担
不只是提供了语言内建的消息传递机制 还因为消息传递是类型安全的 大大降低了犯错的机会
语言对架构的影响是什么??
选择团队开发时采用的语言来描述接口
决策之一是开发效率
CPU指令是一个有限的指令集 CPU执行的指令序列不是固定的 依赖于保存在存储中的数据 由软件工程师编写的软件决定
程序是计算机的灵魂
指令序列的可能性是无穷的 程序的可能性是无穷的 今天计算机创造的世界如此多姿多彩 正是得益于程序无穷的可能性
史前时代 为了解决编程效率的问题 汇编语言出现了
编译器将汇编语言写的程序编译为CPU指令序列 并将其保存到外置的存储设备(如硬盘)上
汇编语言解放的生产力是惊人的 有选择的话 没有人愿意用0101这样的东西来表达自己的思想
键盘和显示器的驱动程序
主流的外置存储设备
汇编程序编辑器
汇编编译器
可以执行一段保存在外置存储设备中的机器代码程序
不变的是 存储 编辑器 和 鼠标键盘磁盘的驱动程序和这些程序存储的位置
变化的是 用户输入的指令序列和位置 因为用户的输入的内容 可以由计算机来指定位置自动存储。