操作系统复习笔记

操作系统
多道批处理系统

作业处理时间长 交互能力差

作业按照它们的性质分组 成组(或成批)地提交给计算机系统,减少作业建立和结束过程中的时间浪费。

用户所提交的作业存放在外存上并排成“后备队列”;

分时操作系统

时间片为单位 轮流分配多个终端 高性能主机(运算内存)+多个终端(io显示)

中断和通道 多任务多用户 事务性任务 io很多

多路调制 交互性 独占性

嵌入式 软硬件一体的

网络操作系统 提供网络服务

操作系统的逻辑结构 os设计 实现思路

整体式结构 模块构建

层次结构 硬件最底层 外部在最外层 中间层传递信息

微内核结构 操作系统=微内核(很小 只有核心功能 +核外服务器

cpu的态 对资源和指令使用权限不同

核心态 kernelmode

用户态 user mode

管态 supervisor mode

操作系统按进程来区分cpu状态 硬件按态区分CPU

存储器 存放程序和数据的部件

ram rom

主存 辅存

半导体 磁 光

寄存器 高速缓存cache 主存 辅存

cpu在高速缓存查找 即命中 没有就去主存 主存没有就是缺页

缺页的话就去找辅存 把内容从辅存调到主存

中断处理

中断的目的

1 cpu切换 并发活动 可以实现并行运行

2 故障自动处理

3实时处理

中断类型

强迫性 没有预期的

自愿中断

外中断 不可屏蔽 可屏蔽

内中断 俘获

中断现场 (上下文 程序能够运行依赖的信息 相关寄存器

现场的保护 进入中断服务程序前 保护到栈中

现场的恢复

中断响应过程

识别中断源 保护断点和现场 装入中断服务程序的入口地址 cs:ip

进入中断 恢复现场和断点

中断返回 iret 原来程序继续运行把断点弹出到cs:ip

中断响应实质:

交换指令执行地址 交换cpu的态 中断在内核态 程序在用户态

中断返回:iret 回到

进程 是程序运行一次的软硬件环境

通道用于控制IO设备与内存之间的数据传输。启动后可独立于CPU运行,实现CPU与IO并行

操作系统启动 bios和主引导记录
实模式

刚通电 程序 8086寻址方式 访问1m即 1兆空间(基本内存+显卡内存+bios

寻址方式:段地址加偏移

保护模式

操作系统启动后 进入保护模式 内存保护模式

寻址方式 段32+偏移32

段页式寻址 虚拟地址 保护内存 cpu支持多任务

BIOS

在rom 是固件 以硬件方式存在 但内部是软件

(rom是只读内存 内存分 cache rom ram

操作系统启动过程

1 按下开机 此时 CPU 为实模式,该模式下地址总线是 20 位,寻址范围是 0x00000~0xFFFFF 的 1M 范围。所以 BIOS 的容量就是 1MB。

执行ffff0处的指令 是cs:ip (指令寄存器(instruction pointer)初始化的地方

2 bios 加电自检post 检查cpu内存 显卡 错误喇叭发出蜂鸣响

3 BIOS 记录系统设定值

包括系统bios 支持系统输入输出 最后的 64k

提供基本io服务 设置系统参数

显卡bios 其他bios

4 BIOS 尝试加载操作系统 硬盘,光驱,软驱,网络等依次寻找

假设在硬盘上找到 首先读取硬盘上的大小为 512 Bytes 的 0号扇区主引导记录(master boot record,MBR)扇区存放和os启动的相关信息

bios读 首扇区 主启动记录 mbr 把控制权交给mbr 512k

5 mbr读分区表 找到活动分区 找到分区引导记录 pbr

6 pbr读取os的内核文件 初始化基本参数

7 os接手系统

8 核心初始化

初始化核心数据 寄存器 内存 页表 的初始化 构建核心进程

9 系统初始化

为用户使用做准备 文件 网络 图形界面 系统开始接受信息

linux启动

post->mbr->kernel映像(是压缩过的 -》kernel自解压并执行 -》内核初始化

init程序 1号进程 通过/etc/inittab脚本

用户登录过程: fork()执行登录 -》用户名登录 -》bin/sh -》读取执行命令 执行

进程 是程序运行一次的软硬件环境

动态 并发 异步 独立(进程是系统分配资源和调度cpu的单位

一个程序运行多次就是多个进程

进程在内存驻留 包括 使用资源:进程 运行进程

偏cpu/io的进程

同步和互斥

互斥 共享独占性资源的多个进程 每次只有一个在运行

同步关系 合作进程相互协调运行步伐 一个进程开始某操作前 要求另一进程完成某个操作 不然等待

进入临界前 p上锁

离开后v 开锁

p(s信号量,q 队列) 通过 s-1 s<0 就阻塞 进程放入队列 等待调度

v(s,q) 释放 s+1 和大于0进程继续运行 若小于等于0 就从队列唤醒一个进程

死锁

1 多个进程无限期的等待 永远不会发生的状态 陷入了永远的阻塞

2 每个进程都持有 某些资源 又申请其他资源 所以每个进程都不能推进

哲学家进餐

死锁起因

1 系统资源有限 2 并发时请求或释放资源的顺序不当

死锁的必要条件

1 互斥 2 不剥夺 已有的资源不能被其他抢占

3 部分分配资源 边运行边申请

4 环路条件 循环需要资源 如5个哲学家 限定最多4人同时吃饭 破坏环路

所以预防死锁

破坏互斥 难

破坏不剥夺 难

破坏部分分配条件

预先静态分配法 (运行前一次性分配资源

有序资源分配法给所有资源编号 并按照序号递增的顺序申请及分配 可以预防死锁

破坏环路 有序资源分配

预防死锁容易实现 但是代价很大 效率低

避免死锁

分配资源时 如果有死锁风险则不分配 如银行家算法

检测和恢复死锁

检测出死锁状态 并采取措施 清除 实现很难

windows linux 都没有采取死锁的解决方案 留给用户解决 鸵鸟策略

进程调度算法

1 平均周转时间 完成时间-提交时间(开始)除以n

带权周转时间 完成时间-提交时间/进程的运行时间

先来先服务 first come first serve

2 短作业优先 short job first 容易饥饿

3 相应比高者优先调度

响应比=等待时间/运行时间+1

4优先数调度

静态(运行前设置 资源 运行时间等 y+动态(等待时间 等

5 循环轮转调度round -robin

先进先出排列 以时间片为单位 轮流使用 cpu

linux的调度策略

0 普通分时

1 实时 两种

先进先出 sched-fifo

时间片轮转 sched-rr

存储管理
内存管理
1 地址映射 (地址重定位 重映射 )

程序中的虚拟地址/逻辑地址 变成物理地址 是cpu可以直接访问的

固定地址映射

编译器转换或直接指定

程序加载时必须放在指定内存区域 容易地址冲突

静态地址映射

程序装入时即确定(双击图标时 或命令行输入指令的回车时)

MA MEMORY物理地址=BA base装入基址+VA virtual

(x+BA)把所有虚拟地址转换成真实地址 在运行前影射

装入后不可移动 移动必须放回原来位置 需要连续的内存空间

动态地址映射

在执行过程中把逻辑地址转成物理地址 遇到访存指令才临时转换

程序占用的内存可以动态变化 如果程序有移动 BA可能改变需要重新计算

不用占用连续内存 每段BA知道即可(段氏 页式

便于多个进程共享代码 共享代码独立存放

需mmu(内存管理单元)硬件支持

虚拟存储

解决程序过多内存不够和并发时的地址冲突问题 使大程序可以在小内存运行 无碎片 提高利用效率

从0号开始

是面向用户的虚拟存储空间 32位 一般一个程序分配2 32次幂 即4g

和物理地址分离 无冲突 程序编程时用线性虚拟地址

内存分配
存储保护

防止访问越界和越权 界址寄存器

分区内存管理

固定分区 动态

单一区 DOS

分区 固定分区 动态分区

把内存固定分开 每个分区的大小位置固定 系统运行时不再重新划分

浪费内存 程序比分区小 大程序可能无法运行

根据分区表分配装入顺序 当程序的大小 个数 装入顺序固定时效率很高

适合具有固定任务数的多道操作系统

动态分区

程序装入时动态创建分区 分区=程序大小

但仍存在内存碎片

虚拟内存管理(段 页 段页

程序性运行时 只把当前必要的很小一部分代码和数据装入内存 其余的必要时装入

依据程序运行的局部性在有限时间段内 访问的代码和数据 集中在一段内

等大小的小片 4k intel

1 2 4k

页 即虚拟页或页面 页框指物理地址

进程以页为单位装入内存 把程序部分页装入内存 页框不必相邻

需要新页时 按需从硬盘调入内存 再删除不需要的页

虚拟地址VA=页号P+页内偏移W

va=2500 页号1K

p=2500/1024=2

w=2500-2048=

CPU用更快速的计算方法

p=va>>n相当于除以2的n次幂

w=va&&(2的n-1次幂)

页表 记录页号和页框之间的对应关系

页式地址映射 1 va->p . w 2 查页表 3 计算ma

快表 cache

慢表即页表放在内存中

快表 页表放在cache里

快表是慢表部分内容的复制 映射时优先访问快表 若找到即命中 没有找到就访问慢表并更新快表

合理的页面调度可以使命中率很高

快表是硬件比对 更快 慢表是软件比对

快表执行访存 需要访问几次内存呢 2次/1次

查询的页面在快表中,通过快表给出的地址直接访问内存。(1

不在快表中,访问内存得到需要访问页面的地址,根据地址再次访问内存的到数据。(2

如果没有快表时 ,需要2次访问内存。
第一次是获取段表、页表里面的块号、页号算出物理地址
第二次访问物理地址得到数据。

页面的共享

不同进程的页表写相同页框号

缺页中断 即访问的页面不再内存里

页表扩充 中断位+辅存地址 访问位 修改位

中断处理牛广旭把页表指的辅存地址调入内存的某个页框号 并更新页表中的页框号

缺页率(中断率 缺页次数/访问页面总次数 =1-命中率

页面抖动 内存和辅存间频繁交换的现象

淘汰页面的算法

opt算法(最佳 淘汰最远的将来才会用的页面

先进先出淘汰法 fifo

lru最久未使用算法 least recently used

移位寄存器 页面被访问则置1 周期性的将所有页面的r左移 淘汰最大的页面

lfu算法 最不经常使用 设置访问计数器 淘汰数值最小的

段式存储管理

把进程按逻辑意义划分 数据 代码 堆栈 有段名 段和段间不相邻

段式虚拟地址va=段号s+w位移

段表smt segment momory table

段号 段长 段基址

1 va->s w

2查询段表找到b 基址 l 长度

3 物理地址ma=b+w

段缺点 段需要连续 最大尺寸受到内存限制 辅存时管理可变长 比较复杂

页式 一维空间

段 二维空间

段页式管理

在段里再划分页面

地址构成:段号 页号 页内偏移

每个进程一个段表 每个段表有一个页表

va(s,w) ->(s,p,w)->ma

spooling (同时的外围设备 联机操作

应用于windows等

也叫假脱机输入输出系统 因为他是联机系统 但实现了脱机的效率

虚拟分配 进程需要与独占设备交换信息时 将对应的虚拟设备(部分辅存 分配给他

提前读 延后写

任务前 将数据程序存入输入井

运行时将数据取出 输出时将数据写入输出井

运行完 输出全部信息

感谢你看到了这里!一个彩蛋

一 假溢出

顺序队列 假溢出 rear到头无法插入元素

解决办法 循环队列 转成0插入即可

用rear==front 无法判断是否满

处理办法变成循环队列 牺牲一个存储空间

是否为空 可以出队 rear==front

是否满 可以入队 (rear+1)%count==front

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值