北交 操作系统 课程笔记(一)
北交 操作系统 课程笔记(一)
根据王垠的博文,关于微内核的对话,可将 Linux 看作 C 语言的运行时系统。也有很多对这个观点的批评,让人分不清对错。让我们借着课程再思考一次吧!
文章目录
- 北交 操作系统 课程笔记(一)
- 概念
- 地位和目标
- 作用
- 计算机系统的组成及层次模型
- 实例
- 硬件基础
- 计算机系统的组成和体系结构
- 组成
- 体系结构
- 指令集
- 权限与陷入
- 权限
- 陷入
- 硬件基础
- 用户接口与系统调用
- 用户接口
- 系统调用
- 系统调用与普通过程调用的区别
- 类型
- 实现
- 启动模块与自装入
- 引导
- 发展
- 单道批处理
- 多道批处理
- 特点
- 需求
- 功能及特征
- 处理器管理
- 进程控制
- 进程同步
- 进程通信
- 内存管理
- 主要任务
- 机制
- 设备管理
- 任务
- 机制
- 文件管理
- 任务
- 机制
- 特征
- 结构设计
- 设计原则
- 模块化
- 分层原则
概念
地位和目标
- 计算机系统
- 软件
- 应用软件
- 系统软件
- 光盘刻录工具、汇编程序、编译器、数据库
- 操作系统
- 裸机(硬件和固件)
- 软件
所谓系统软件,大概是指直接接触硬件的软件。光盘刻录工具需要接触光驱,汇编器、编译器需要和 CPU 接触,数据库和硬盘接触(据说 MySQL 团队希望绕过文件系统操作硬盘)。而应用软件可以利用操作系统提供的硬件交互功能。
方便
用户接口
有效
提高系统资源利用率
可扩充
适应计算机体系结构的发展
开放
兼容不同厂家的设备
作用
- 用户与硬件系统之间的接口
- 命令方式,通过 Shell
- 系统调用,通过内核
- 系统资源管理
- 管理对象
- 处理器
- 存储器
- 外设
- 管理内容
- 分配
- 回收
- 访问控制
- 策略
- 管理对象
- 虚拟机
操作系统的作用有很多,但对用户来说只有计算和存储(不考虑网络)。Windows 让系统暴露给用户的部分基本完善,但暴露给开发者的部分仍然有待改进。
有一种观点认为,开发者就应该了解计算机系统的方方面面。这在计算机系统日益复杂,计算机行业分工逐渐细化的今天是不现实的。强迫前端开发人员了解后端内容,业务逻辑设计人员了解编程语言的解释器。把开发者想象成系统的一个模块,放在程序中都是接口设计的失败,放在人身上怎么就理所当然了呢?
计算机系统的组成及层次模型
- 外壳
- 系统调用
- 核心
- 硬件接口
- 硬件
外壳是程序员使用的系统界面,设计初心是用简单的命令实现复杂的功能,但复杂程序难以用 shell 脚本表达。这推动 shell 脚本添加越来越多的特性,现在已经类似 C 的子集。添加特性背离了简单命令复杂功能的初心,让 shell 的学习成本越来越高。
我认为部分 Linux 发行版预装 python 就是个很好的想法。Python 作为一个成熟的高级语言,以语法简洁著称。用 python 代替 shell,功能上没有损失,也减轻了学习负担。
实例
操作系统是最基本的系统软件,是一组管理和控制计算机硬件和软件资源、对各类作业进行调度以组织和控制系统工作流程,并方便用户使用计算机的程序的集合。
- 最基本的系统软件
- 控制、调度系统
- 方便用户使用计算机
- MS DOS
- Windows
- Unix
- Linux
- Android
硬件基础
计算机系统的组成和体系结构
组成
处理器配合内存,通过总线指挥其他所有设备。如,网卡、硬盘。
内存系统由主存和高速缓存组成。主存是一个按字节编址的线性地址空间,搭配高速缓存(局部性原理),为大部分设备提供工作记忆。
体系结构
体系结构是指计算机系统的指令集,是系统识别的一套指令,且是唯一的一套。编译器要将高级语言翻译为机器指令。
指令集
- 寄存器架构
- 内存架构
- 用户指令
权限与陷入
权限
C 语言可以利用指针直接修改内存,有可能利用这个特性修改内核,破坏设备。限制程序可以操作的内存可以组织恶意程序修改内核,但是内核自身仍需要指针操作,所以给不同的程序不同的特权级别。
陷入
也叫软中断,是程序失败时内核介入处理。和中断的相同点是都转而执行内核代码,不同点是陷入是程序内部时间触发的,中断是外部事件触发的,如 IO 操作。
硬件基础
体系结构是操作系统面对的硬件基础。体系结构中,
寄存器架构
内存管理模式
中断与异常
- 中断向量
- 中断描述符表
- 中断源
- 异常源
任务管理
基本输入输出系统 BIOS
……
用户接口与系统调用
用户接口
- 表现形式
- 交互
- 联机命令
- 脱机命令
- 程序
- 系统调用
- 交互
- 使用者
- 本地
- 网络
我认为,python 在一定程度上统一了用户接口的表现形式,python 代码既有联机命令的简洁,又能作为脱机命令,还能进行系统调用。像jupyter
这样的项目,也在一定程度上统一了本地与远程,对使用者来说只有 local host 和“非 local host ”的区别。
所以,现在看来仍有意义的是键盘终端处理程序的概念。其功能,
- 接收用户从终端输入的字符
- 管理字符缓冲
- 字符屏幕显示
- 屏幕编辑
- 特殊字符处理
系统调用
系统调用与普通过程调用的区别
运行在不同的系统状态
软中断进入
返回重新调度
我认为软中断与重调度在一定程度上从属于切换系统状态。
区别 | 原因 |
---|---|
运行在不同的系统状态 | 为保护内核安全 |
软中断进入 | 切换系统状态 |
返回重新调度 | 优化 IO 相关操作 |
按我目前的理解,系统调用本应该仅仅是涉及操作系统服务的普通函数调用。将系统调用区别于普通过程调用的根本原因是保护内核的需求,而需要保护内核的原因是 C 语言指针操作内在的安全隐患。
软中断进入和返回重调度都不是需要特殊化系统调用的理由:
- 软中断和普通调用对用户来说区别不大
- 返回重调度难道不能作为操作系统的特性赋予涉及 IO 的“系统函数”吗?
综上,我认为特殊化系统调用是 C 语言的设计缺陷导致的。或者换句话说,操作系统根本不应该允许用户使用 C 语言这样的系统语言开发应用程序,而应该一律使用类似 JVM 的面向开发者的接口。
类型
- 进程控制
- 创建
- 结束
- 等待子进程结束
- 进程信息设置与获取
- 执行文件
- 文件操纵
- 进程通信
- 系统信息维护
- 时间设置与获取
- 文件访问、权限设置
放在硬盘中的代码叫作业,作业加载到内存中成为进程。从机器的角度看,进程是一个操作序列;从人的角度看,进程是一组有顺序的函数调用。
进程通信的概念是怎么来的?站在某个函数的角度讲,本身所在进程的函数和其他进程的函数有什么区别?同进程的函数间有共享的内存。函数间需要共享内存的原因很多,主要还是为了节省内存空间。
为什么不把所有的内存都共享?因为我们希望给每个作业独占系统资源的错觉。既然希望独占,那为什么又要进程通信?我觉的其中原因是比较复杂的,试分析如下:
别人编写的软件不是以函数库的形式,而是以机器代码的形式(可执行文件)出现在你的电脑里。这种情况下,你无法以函数传参的方式利用该软件的某项功能,因为可执行文件已经讲所有编程阶段可见的接口掩盖了。
为了体会其间差别,你可以想象一下,如果所有的 python 库不是以函数库,而是以一组可执行文件的方式出现,那么利用这些第三方软件的唯一方式就是进程通信了。
在目前的系统中,系统调用只能通过进程通信。由于系统允许直接执行第三方的机器码,理论上这些第三方代码与操作系统对计算机有同等的控制力。为防止恶意代码破坏系统,操作系统要让应用程序运行在一个较低的权限下,不能直接访问系统资源。这种情况下,应用程序也不能通过调用操作系统的函数实现系统调用,因为应用程序所在进程的权限根本无法执行操作系统的函数。
这时只能通过(除直接函数调用之外的)某种方式将“参数”传给已经在运行的操作系统了,也就是进程通信。
实现
- 设置系统调用号和参数
- 用户态转为系统态
- 进程切换(保护现场,中断/陷入向量表)
启动模块与自装入
引导
系统加电后,基本输入输出系统 BIOS 会执行磁盘特定位置的机器码。在这个位置放上引导程序,把整个操作系统从硬盘加载到内存中。引导程序必须长512字节,准确占据一个磁盘扇区,最后两个字节为55AA。这个磁盘中特殊的位置就是启动盘引导扇区(0:0:1)。
发展
单道批处理
一批作业在监督程序的控制下顺序执行,内存中始终只有一道作业。
- 自动
- 顺序
- 单道
多道批处理
特点
- 多道。内存驻留多道程序,允许并发
- 无序。先开始不一定先结束
- 调度
需求
- 处理器分配与回收
- 内存分配、回收、保护
- IO 设备共享
- 文件管理
这个阶段的内存管理问题应该还是相对简单的,因为没有进程通信的需求,只要禁止程序访问别人的内存空间就可以了。
功能及特征
处理器管理
- 作业调度
- 进程调度
- 就绪进程队列
- 处理机分配
- 运行现场
- 调度算法
- 先来先服务
- 优先级
进程控制
- 主要任务
- 创建
- 撤销
- 状态转换(开始、暂停)
- 机制
- 原语,类似数据库中的事务
- 进程、线程
进程同步
- 主要任务
- 并发协调
- 临界资源
- 机制
- 锁
- 信号量
进程通信
- 共享存储器
- 管道
- 消息传递
- 消息缓冲队列
- 邮箱
内存管理
主要任务
- 提高内存利用率
- 进程互不干扰,保护内核安全
- 逻辑地址转换为物理地址
- 逻辑上扩充内存容量
机制
内存管理数据结构
- 连续/离散
- 静态/动态
回收
越界检查
- 上下界寄存器
- 定长页、段
- 特权分级
页表
虚拟内存
操作系统的内存管理和 JVM 的内存管理有何不同?最明显的不同是操作系统以页或段为单位管理内存,要时刻提防越界行为。而 Java 程序只能通过引用访问内存中的对象,以对象(数据结构)为单位管理内存。
设备管理
任务
- 设备分配
- 缓冲管理
- 设备通信
机制
- 虚拟设备
- 单/双/多缓冲
- 字符缓冲
- 公用缓冲池
- IO 指令(合法性检查)
- 中断
文件管理
任务
- 外存管理(分配、回收)
- 防止未经核准的用户存取文件
- 防止冒名顶替存取文件
- 防止以不正确的方式使用文件
- 文件按名存取
- 快速查找
- 共享与保护
机制
- 文件控制块
- 索引结点
- 目录结构
特征
并发
为了充分利用计算资源。
共享
和数据库类似。
虚拟
JVM 广受欢迎,虚拟机应用越来越多,说明虚拟是一项重要特征。
异步
进程执行顺序与执行时间不确定,和 Internet “尽力而为”的服务有点像。
结构设计
设计原则
- 可维护性
- 可靠性
- 可理解性
- 可用性
- 性能
模块化
分层原则
分层 |
---|
用户接口 |
策略 |
…… |
时钟管理、进程调度 |
资源管理公用模块。如队列、堆栈、信号量操作等 |
这一课学完,我对王垠的观点更加赞同了。大量的复杂性是允许计算机直接运行第三方机器码带来的,比如
- 第三方机器码可能直接修改内核,所以需要保护,需要区分内核空间和用户空间,需要区分系统调用和普通函数调用。
- 第三方机器码可能滥用系统资源,产生内存泄漏、文件句柄泄漏。所以第三方代码的内存(以及文件)操作需要操作系统的监督。
- 第三方机器码可能设计各种各样的接口,所以需要输入输出重定向,带来很多字符流解析错误(这甚至引起安全漏洞,参见模拟 SQL 注入攻击)。
而这些问题都可以通过增加一层抽象,即虚拟机(如 JVM),来一举消灭。鉴于 chez scheme 拥有接近于 C 的速度,我认为这并不是天方夜谭。
北交 操作系统 课程笔记(一)相关推荐
- 清华教授的操作系统-----课程笔记
文章目录 操作系统 准备 系统调用 计算机体系结构及内存分层体系 地址空间 & 地址空间是如何生成的 MMU 连续内存分配 内存碎片问题 分区的动态分配 压缩式碎片整理 交换时碎片整理 **非 ...
- 清华大学 - 操作系统 课程笔记
目录 第零讲 在线教学环境准备 step 1 step 2 step 3 第一讲 操作系统概述 1.1 课程概述 1.2 教学安排 1.3 什么是操作系统 1.4 为什么学习操作系统 1.5 操作系统 ...
- 西电李航 操作系统课程笔记 day11 IO softwarelayer
文章目录 Principles of IO software IO软件目标 设备独立性(device independence) 统一命名(uniform naming) 错误处理(error han ...
- 西电李航 操作系统课程笔记 day8 Implementation of File system
文章目录 File system Implementation 文件系统(file system) 布局 普通文件(file) 分配(allocation) 连续存储 指针存储 追踪(tracking ...
- 西电李航 操作系统课程笔记 day10 IO hardware principles
文章目录 Principles of IO hardware IO设备 块设备(block device) 字符设备(character device) 设备控制器(device controller ...
- 操作系统——bilibili王道考研操作系统课程笔记
第一章:操作系统概述 1.操作系统的概念(定义).功能和目标. 知识总览 计算机系统的层次结构:逻辑(纯硬件)->操作系统->应用程序->用户. 操作系统: 1.负责管理协调硬件.软 ...
- 大学操作系统课程笔记
第一章 操作系统引论 1.什么是操作系统? 操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他 ...
- EDA实验课课程笔记(一)——linux操作系统及linux下的基本指令
EDA实验课课程笔记(一)--linux操作系统及linux下的基本指令 实验目标 1,了解Linux系统的基本特点 2,掌握Linux的常用命令 3,掌握Linux的命令输入技巧 实验内容 1,基本 ...
- 【计算机视觉】计算机视觉与深度学习-北邮鲁鹏老师课程笔记
计算机视觉与深度学习-北邮鲁鹏老师课程笔记 01-计算机视觉相关介绍 02-图像分类 03-全连接神经网络 04-图像去噪&卷积&边缘提取 05-纹理表示&卷积神经网络 06- ...
最新文章
- B1056 组合数的和
- 数据结构 归并排序 C++
- html根据文档定位,html文档中的location对象属性理解及常见的用法
- NSkyKit 项目实践-Dagger2
- 第三次软工作业——实现最大字段和算法并进行判定条件覆盖
- iptables 防火墙(上)
- densepose安装_基于DensePose的姿势转换系统,仅根据一张输入图像和目标姿势
- 史上最经典CAP讲解
- Flume Sink
- oracle10G分区的创建与维护Oracle分区表和本地索引
- 基于JAVA+SpringMVC+Mybatis+MYSQL的药方中医管理系统
- TCP报文段的首部格式
- 可浮动的在线qq咨询客服代码
- python 百度地图api热力图,Python+百度API 画出美美哒热力地图(代码+数据)
- 租车APP都哪些,租车平台成功案例
- JAVA调用Excel公式和js判断选择计算有效集合
- 微信 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}
- CSS3学习笔记-05-盒模型详解
- 汉语言文学专业c学校,理科生能报汉语言文学专业吗?哪些学校找理科生
- JAVA面试问答 NOTE2