学习笔记 --《现代操作系统》
现代操作系统
1. 概述
- 计算机有两种运行模式:内核态和用户态.操作系统,它运行在内核态中。操作系统具有硬件的访问权,可以执行机器能够运行的任何指令。软件的其余部分运行在用户态下。
- 计算机包含运算器、控制器、存储器、输入设备、输出设备五个部分,是冯罗伊曼结构。各个部分通过总线相连。(CPU=运算器+控制器)
- 运算器最主要的功能是对数据和信息进行加工和运算。
- 控制器主要起到了控制命令执行的作用,完成协调和指挥整个计算机系统的操作。控制器是由程序计数器、指令寄存器、解码译码器等构成。
- 总线(Buses),在整个系统中运行的是称为总线的电气管道的集合,这些总线在组件之间来回传输字节信息。通常总线被设计成传送定长的字节块(64或32位)。
2.进程与线程
- 进程(process)是程序的一次执行,是具有独立功能的程序在一个数据集合上的运行过程,系统资源调配的独立单位。
- 严格意义来说,在某一个瞬间,一个CPU 只能运行一个进程。
- 进程是某一类特定活动的总和,它有程序、输入输出以及状态。
- 进程的创建
- 系统初始化(init):启动操作系统时,通常会创建若干个进程。
- 正在运行的程序执行了创建进程的系统调用(比如 fork)。
- 用户请求创建一个新进程。
- 一个批处理作业的初始化。
- 进程的终止
- 正常退出(自愿的) : 多数进程是由于完成了工作而终止。这个调用在 UNIX 中是 exit ,在 Windows 中是 ExitProcess。
- 错误退出(自愿的):比如执行一条不存在的命令,于是编译器就会提醒并退出。
- 严重错误(非自愿的)
- 被其他进程杀死(非自愿的) : 某个进程执行系统调用告诉操作系统杀死某个进程。在 UNIX 中,这个系统调用是 kill。
- 进程状态
- 运行态,运行态指的就是进程实际占用 CPU 时间片运行时
- 就绪态,就绪态指的是可运行,但因为其他进程正在运行而处于就绪状态
- 阻塞态,除非某种外部事件发生,否则进程不能运行
- 进程的实现,
- 操作系统为了执行进程间的切换,会维护着一张表,这张表就是进程表(process table)。
- 该表包含了进程状态的以下重要信息。第一列内容与进程管理有关,第二列内容与存储管理有关,第三列内容与文件管理有关。
- 一个进程在执行过程中可能被中断数千次,但关键每次中断后,被中断的进程都返回到与中断发生前完全相同的状态。
- 线程,cpu是调度和分派的基本单位,是程序执行流的最小单位。
- 多线程之间会共享同一块地址空间和所有可用数据的能力,这是进程所不具备的。
- 线程要比进程更轻量级,由于线程更轻,所以它比进程更容易创建,也更容易撤销。
- 线程必须在某个进程中执行。进程用于把资源集中到一起,而线程是cpu上被调度执行的实体。
- 线程之间的状态转换和进程之间的状态转换是一样的。
- 线程实现分为三种类型
- 在用户空间中实现线程,内核对线程一无所知,它不知道线程的存在。
- 在内核空间中实现线程,通过系统调用实现。
- 在用户和内核空间中混合实现线程,采用了一种内核级线程的方式实现。
- 进程间通信(Inter Process Communication, IPC)
- 当两个或两个以上的进程/线程处于就绪状态时需要采用一定的调度算法。因为不同的应用程序和不同的操作系统有不同的目标。也就是说,在不同的系统中,调度程序的优化也是不同的
- 批处理(Batch) : 商业领域
- 先来先服务、最短作业优先
- 交互式(Interactive): 交互式用户环境
- 轮询调度、优先级调度、多级队列、最短进程优先、保证调度、彩票调度、公平分享调度
- 实时(Real time)分为硬实时(hard real time)与软实时(soft real time)
- 批处理(Batch) : 商业领域
3.存储管理
- 要使多个应用程序同时运行在内存中,必须要解决两个问题:保护和重定位
- 可以使用动态重定位技术或者基址寄存器和变址寄存器解决
- 基址寄存器:存储数据内存的起始位置。变址寄存器:存储应用程序的长度。
- 每当进程引用内存以获取指令或读取、写入数据时,CPU 都会自动将基址值添加到进程生成的地址中,然后再将其发送到内存总线上。同时,它检查程序提供的地址是否大于或等于变址寄存器 中的值。如果程序提供的地址要超过变址寄存器的范围,那么会产生错误并中止访问
- 可以使用动态重定位技术或者基址寄存器和变址寄存器解决
- 交换技术,用于解决内存不足。即把一个进程完整的调入内存,然后再内存中运行一段时间,再把它放回磁盘。
- 虚拟内存,基本思想是每个程序都有自己的地址空间,这个地址空间被划分为多个称为页面(page) 的块。每一页都是连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,硬件会立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
- 大部分使用虚拟内存的系统中都会使用一种分页的技术。
- 程序生成的地址被称为虚拟地址(virtual addresses) 并形成虚拟地址空间(virtual address space){包含虚拟页号(高位部分)和偏移量(低位)},在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存中线上,读写操作都使用同样地址的物理内存。在使用虚拟内存时,虚拟地址不会直接发送到内存总线上。相反,会使用MMU(Memory Management Unit)内存管理单元把虚拟地址映射为物理内存地址,像下图这样。
- 页表给出虚拟地址与物理内存地址之间的映射关系。
- 虚拟页号可作为页表的索引用来找到虚拟页中的内容。
- 由页表项可以找到页框号(如果有的话)。
- 然后把页框号拼接到偏移量的高位端,以替换掉虚拟页号,形成物理地址。
- 页表的目的是把虚拟页映射到页框中。从数学上说,页表是一个函数,它的参数是虚拟页号,结果是物理页框号
- 页表项的结构
- 页面置换算法,当发生缺页中断(内存不足)时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调用的页面腾出空间。每次选用不常用的页面会提高性能。
- 最优页面置换算法
- 最近未使用页面置换算法
- 先进先出页面置换算法
- 第二次机会页面置换算法
- 时钟页面置换算法
- 最近最少使用页面置换算法
- 最好的页面置换算法是老化算法和WSClock算法。他们分别是基于 LRU 和工作集算法。他们都具有良好的性能并且能够被有效的实现
- 空闲内存管理
- 位图(bitmap),位图的大小取决于内存和分配单元的大小
- 空闲列表(free lists),维护一个记录已分配内存段和空闲内存段的链表。
- 内存使用算法有首次适配(first fit)、下次适配(next fit)、最佳适配(best fit)算法等。
- 位图(bitmap),位图的大小取决于内存和分配单元的大小
4.文件系统
- 文件系统,便于OS存储和管理文件信息,方便用户对文件的存取、共享和保护等,有效提高系统资源的利用率。
- 文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。
- 在创建一个文件后,它会给文件一个命名。当进程终止时,文件会继续存在,并且其他进程可以使用名称访问该文件。
- 内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都是以块为单位进行的。即每次读块,或每次写出一块。类似于内存分页。磁盘块是文件系统读写数据的最小单位。
- 文件的物理实现
- 连续分配,实现简单、读取性能强,但会导致磁盘碎片化。
- 链表分配,每个文件构造磁盘块链表,每个文件都是磁盘块的链接列表。可以充分利用每个磁盘块,但随机访问困难,指针也会占用一些字节。
- 索引组织,在内存中使用表进行链表分配。取出每个磁盘块的指针字,把它们放在内存的一个表中,就可以解决上述链表的两个不足之处。缺点是需要内存存储文件分配表,不适合大磁盘。
- i节点
- 连续分配,实现简单、读取性能强,但会导致磁盘碎片化。
- 磁盘块与页的大小一般相等。
参考博客:
https://www.cnblogs.com/cxuanBlog/p/13297199.html
https://www.cnblogs.com/geaozhang/p/7041112.html
本文作者:oniisan
本文链接:https://www.cnblogs.com/oniisan/p/modernOS.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步