$0:
计算机将程序(高级程序-》汇编程语言-》机器语言)加载到内存中然后由操作系统从内存中调度到CPU上执行,加载到内存中 则形成运动中的程序 称之为进程。被cpu调度的指令 是在一个时钟周期中能够执行的基本单位,需要指令集和硬件的支持
$1:
操作系统是什么?
cpu管理、内存管理、外存管理、io管理
隐藏一些计算机的细节, 提供api让用户使用
$2:
操作系统的发展历史?人们在不管的使用和探索的过程中, 不断解决问题 提高效率的过程中产生的
- 1th:状态机:1940年以前出现的
- 2th:单一操作员单一控制端(40年代) 刚开始计算机是人工控制状态机 而工作的, 计算机提供一些可以被调用的函数库 来完成工作任务, 虽然计算机的计算速度快 但是 需要等待人的操作 而人需要考虑下一步调用什么函数, 思考时间计算机是空闲 所以计算机的利用效率并不高Single Operator, Single Console, SOSC,代表机型为美国宾夕法尼亚大学与其他机构合作制作的ENIAC计算机
- 3th:批处理(50年代) 后来就出现了批处理, 用户将需要完成的工作 用函数调用的方式 依次 安排好, 然后记录在卡片上, 然后把卡片交给 管理员统一操作, 操作员将用户的程序 读入磁带 运行计算机 再将结果写入磁带 然后交给用户, 这种批处理的方式 就一定程度上解决了计算机效率的问题,代表是IBM的1401和7094等
上述 还存在一个问题 计算机程序想要中断程序 很困难, 一旦中断就需要重新计算, 并没有保存中间计算结果。后来出现了著名的MAD/UMES系统,即密歇根算法译码器和密歇根大学的执行程序,译码器是一种可扩展的程序设计语言,执行系统是一个能够保存中间结果的操作系统。即使如此 依然存在问题, 此时cpu和io是串行的, 需要相互等待,即当程序读、写到内存的过程中, cpu只能等待,并不断向iO询问 是否完成,所以不能同时执行其他程序 - 4th: 多道批处理操作系统(20世纪60年代):实现了多个程序并发执行,操作系统需要能够在多个程序(工作)之间进行切换,并且能够管理多个I/O设备,同时还需要能够保护一个进程不被另一个进程干扰。典型的多道批处理操作系统是IBM的OS/360(M)系统 首次引入了内存分段的概念, 解决了吞吐量的问题。此时存在的问题是, 所有程序都是由管理员统一操作了, 真的用户并没有控制其执行时机, 对用户而言是不方便的
- 5th:分时操作系统(20世纪70年代):典型代表有UNIX/VMS/CTSS系统, 基本思想是 多终端连接到计算机 每个终端支持输入,给每个终端分配一定等量的时间 处理其对应的程序,这种情况下不会出现机等人的情况 但是 有可能会出现人等机的情况,当用户输入比较快 其计算结果不能及时展示在终端显示设备上 就可能会感觉到计算机有卡顿的现象
- 5th之二: 实时操作系统
实时操作系统是指所有任务都在规定时间内完成的操作系统,即必须满足时序可预测性。实时操作系统的最重要部分就是进程或工作调度。只有精确、合理和及时的进程调度才能保证响应时间。当然,对资源的管理也非常重要 - 6th:现代操作系统(1980年以后)
个人计算机变得可得, 增加了网络的功能, 分为网络操作系统和分布式操作系统, 网络操作系统是在传统的操作系统的基础上 增加了网络部分, 二分布式操作系统从设计之初就已经考虑了多台计算机支持,所以后者效率更高 - 7th 虚拟化技术和云操作系统(21世纪)
虚拟化技术和云操作系统是传统操作系统和分布式操作系统的延伸和深化。虚拟机扩展的是传统操作系统,将传统操作系统提供的一个虚拟机变成多个虚拟机,从而同时运行多个传统操作系统;云操作系统扩展的是分布式操作系统,而这种扩展有两层意思:分布式范围的扩展和分布式从同源到异源的扩展。虚拟机技术带来的最大好处是闲置计算资源的利用,云操作系统带来的最大好处是分散的计算资源整合和同化。 -
操作系统的演变: 主要三个方向 主机操作系统(vmx) 服务器操作系统(linux unix ubantu) 个人操作系统(windows mac-os dos)
$3:
进程
抽象
用户态与内核态
地址翻译
操作系统的结构
- 大一统的结构(操作系统内部各种模块相互调用)
- 层次结构(依次调用, 但是都在内核态,比较庞大 效率低)
- 微内核结构
系统调用
1.分类
- 进程控制类
- 文件管理类
- 设备管理类
- 内存管理类
- 信息维护类
- 通信类
1.阶段
- 参数准备
- 系统调用识别(开始陷入内核态)
- 系统调用执行
shell
本质上就是与操作系统交互, 为不编程的用户提供方便
UI界面 和 文本命令两种方式
命令不是直接的操作系统服务 而是utilties 相当于高级语言提供的库函数
$4 进程管理
- 进程=程序+执行
- 执行在cpu上运行指令
- 进程 可以看成是对cpu的虚拟
- 为什么要多道编程,一个一个执行不行么? 主要是出于效率的考虑,当有多个程序的时候, 如果其中有些程序IO占了很长时间, 一个一个执行就会造成CPU的空闲,是很浪费的, 所以多道编程 有利于提高CPU的使用效率, 当然不是并行量越多越好, 因为调度本身就消耗资源
- 进程调度 即内存管理 程序要执行首先是先加载到内存中, 不同的程序分配不同的内存空间块,由于寄存器同一时间只能执行1条指令, 多个程序需要并行处理的话 就需要有个管理者(cpu)调度他们,即管理内存
- 进程的状态: 执行(在CPU上被运行指令) 阻塞(IO) 就绪(活生生的被暂停执行)
- 进程的生命周期: 创建和消亡, 创建工作是由操作系统完成的, 不同的操作系统 创建进程的方式不同,win是系统调用完成的, unix是fork自身
- 进程管理: 操作系统内核空间中维护 进程表, 一般记录进程的如下信息(寄存器 计数器 状态字 优先级 栈指针 进程id 信号 创建时间 当前持有的句柄等)
- 创建进程的步骤
-- 分配进程控制块
-- 初始化机器的寄存器
-- 初始化页表
-- 将程序代码读入内存
-- 将处理器的状态设为‘用户态’
-- 跳到程序的起始地址(设置程序计数器) 这是一条内核态的指令完成的