操作系统深入

2021-03-21  本文已影响0人  后来丶_a24d

目录

目录1.png
目录2.png

整体架构

冯若依曼模型

冯若依曼模型图
  1. CPU从PC(程序计数器)获得指令内存地址, 然后控制单元操作地址总线从内存拿到数据, 数据通过数据总线返回并存入指令CPU的寄存器中
  2. CPU分析指令寄存器中的指令, 如果是计算类型的指令交给逻辑运算单元, 如果是存储类型的指令交给控制单元执行。
  3. CPU 执行完指令后程序计数器的值通过自增指向下个指令, 不断循环执行直到程序结束

多核cpu

  1. 寄存器: 最靠近CPU的存储单元,访问速度0.5个时钟周期,时钟也称为定时器,cpu根据固定周期切换就是定时器其作用
  2. L1缓存: 各个cpu独享,缓存数据跟指令, 访问速度2-4个时钟周期
  3. L2缓存: 各个cpu独享, 访问速度10~20个时钟周期
  4. L3缓存: 各个cpu共享, 访问速度20~60个时钟周期
  5. 内存: 多个CPU共用,访问速度是200~300个时钟周期
  6. 固体硬盘SSD: SSD断电不会丢数据,比内存慢10~1000倍
  7. 机械盘HDD: HDD断电不会丢数据,访问速度比内存慢10W倍
  8. Cache Line: CPU读取数据是按照Cacheline = 64KB把数据加载到缓存中,所以L1,L2可能会触发伪共享(将数据划分到相同到CacheLine中, 当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会影响彼此的性能)。避免伪共享就是将数据划分到不同的CacheLine中,JDK8 新增加的 LongAdder就是这块知识。
  9. 大小从上到小一次增加,访问顺序从上到下查找

如何尽可能提高CPU缓存命中率

  1. 数据缓存: 顺序读取能够提升速度, 道理跟磁盘顺序写一样。数组就是连续内存连续读取。
  2. 指令缓存: CPU有分支预测器,能提前将可能要的指令放到缓存区,所以尽提供有规律的条件分支语句,能帮助提高缓存命中率。
  3. 线程绑定到CPU: 线程切换时每次切换回来用同一个核心CPU这样能复用L1,L2缓存,也就是绑定线程到CPU提高性能。

内存管理

虚拟内存

内存管理单元MMU(Memory Management Unit)

内存管理方式

页式存储管理
  1. 多级页表(参考现代操作系统的图): 避免不需要的页表也放入内存中,32位举例,前10位PT1用作顶级页表的索引,中间10位PT2用作二级页表索引,映射到物理地址就跟只有一级页表一样。


    多级页表.png
加速访问TLB(地址转换后援缓冲器也叫快表)

页面置换算法

  1. 最优: 标记最后会被使用的页面,这个实现不了
  2. FIFO: 先进先出
  3. LRU: 最近最少访问算法
  4. LFU: 最少访问频率算法
  5. linux使用的页面置换算法, 改进的LRU。

linux内存管理图

linux内存管理图

进程管理

进程跟线程的区别

  1. 进程是系统调度资源的最小单位,进程独占系统资源,而线程缺占用很少的资源。
  2. 进程由于资源比较多所以切换速度慢,线程资源少所以切换速度快。
  3. 由于线程共享进程资源所以线程通信方便,进程的IPC复杂一些。

进程状态图

PCB(进程控制块)

  1. 独立标记一个进程
  2. 进程管理的依据
  3. 进程调度的依据
  4. 进程通信的依据
  1. 进程标识符: 唯一标识一个进程
  2. 处理机状态: 记录一些寄存器信息,cpu切换时restart用
  3. 进程调度信息: 进程优先级之类的信息
  4. 资源清单: 所打开的文件句柄,虚拟地址空间信息
PCB管理方式

进程控制

进程创建
  1. 分配Pid唯一标识号
  2. 分配所需资源
  3. 初始化PCB
  4. 资源允许的情况下进入就绪队列
进程终止
  1. 根据标识符,从PCB集合中找出该进程PCB
  2. 执行状态, 则直接终止, 如果有子进程,则等待子进程终止
  3. 全部资源还给操作系统或者父进程
  4. 从PCB链表中移除

进程调度

  1. FCFS 算法: First Come First Severd,类似FIFO算法,对长作业有利,不适合I/O密集型
  2. SJF算法: Shortest Job First 最短作业优先算法, 对短作业有利
  3. HRRN算法: Highest Response Ratio Next 最高响应比优先算法, 1,2的折中,按照响应优先级来的
  4. RR算法: Round Robin 时间片轮转算法, 每个进程都按照固定的时间片运行,轮流运转
  5. HPF算法: Highest Priority First 最高优先级调度算法, 低优先级的可能一直无法执行
  6. MFQ算法: Multilevel Feedback Queue 多级反馈队列调度算法, 多个队列中优先级不同,优先级高时间片短,新进程会先加入到最高优先级队列,下次执行则进程下一级优先级队列


    MFQ算法.png

进程通信

管道
消息队列
共享内存
信号量
信号
socket

线程

异常与中断

switch if效率问题


文件管理

  1. 磁盘文件系统: EXT3之类
  2. 内存文件系统: 占用内存数据,/sys之类的
  3. 网络文件系统:常见的网盘挂载NFS

文件组成

inode
一次查找/usr/ast/mbox的过程
  1. 文件系统定位到根目录/usr, 根目录iNode放在固定的磁盘位置
  2. 查找usr得到iNode是6
  3. iNode 6说明usr在块132上
  4. 根据第三步骤得到/usr/ast是iNode 26
  5. iNode 26说明/usr/ast在块406中
  6. 从块406得知/usr/ast/mbox的iNode是60
  7. 这个文件的iNode会被读取到内存中知道关闭


    一次查找/usr/ast/mbox的过程.png
目录
共享文件之软链接和硬链接:
  1. 硬链接:两个文件硬链接指的是两个文件inode相同,所以不能跨文件系统。只有两个文件删除,源文件才会被删除。
  2. 软链接:两个文件软链接指的是两个文件有不同的iNode,所以软链接可以跨文件系统。某个文件删除后,另个文件还存在不过找不到它了。
文件存储
空闲空间管理

文件系统四大对象

  1. 引导块: 引导操作系统用,一般启动时用到
  2. 超级块: 物理磁盘中文件系统结构的相关信息
  3. i节点: iNode,文件系统元数据信息

输入输出管理

I/O控制器跟驱动程序

驱动接口与设备控制器

I/O控制

0拷贝

老式读写
mmap

sendfile

I/O分层

  1. 文件系统层提供统一文件访问接口
  2. 通用块层包括块设备的 I/O 队列和 I/O 调度器。
  3. 设备层有设备控制器和驱动程序给最底层打交道。

死锁

死锁的产生条件

死锁检测

死锁的避免

死锁预防


参考文献

  1. 用心讲解操作系统几个核心知识
  2. 页面置换算法[转]
  3. 线程状态流转图
  4. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
  5. I/O会一直占用CPU吗?
  6. 磁盘I/O那些事
  7. start和run区别
  8. 中断线程
  9. 异常中断处理
  10. 中断理解
  11. 关于switch和if else的效率问题
上一篇下一篇

猜你喜欢

热点阅读