请教我学操作系统(一)进线程与内存管理

什么是操作系统

  1. 操作系统是管理计算机软硬件资源的程序,是计算机的基石。

  2. 本质上是一个应用程序。

  3. 操作系统的存在屏蔽了硬件设备的复杂性,由操作系统统一管理和分配。

  4. 内核是操作系统的核心部分。负责系统的内存管理,硬件设备管理,文件系统管理和应用程序管理。

什么是系统调用

用户态:该状态运行的进程可以直接读取用户程序的数据。

系统态:该状态运行的进程或程序可以访问计算机任意资源。

程序运行在用户态时想要调用操作系统提供的系统态子功能时需要进行系统调用。

系统调用按功能大致分为:

设备管理。完成设备的请求或释放,以及设备启动等功能。

⽂件管理。完成⽂件的读、写、创建及删除等功能。

进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。

进程通信。完成进程之间的消息传递或信号传递等功能。

内存管理。完成内存的分配、回收以及获取作业占⽤内存区⼤⼩及地址等功能。

进程和线程

  1. 区别:线程时进程划分成的更小的运行单位。进程之间基本相互独立,而线程之间可能相互影响。线程执行开销小,但不利于资源的管理和保护,而进程则相反。

  2. 进程的状态:

    创建状态(new) :进程正在被创建,尚未到就绪状态。

    就绪状态(ready) :进程已处于准备运⾏状态,即进程获得了除了处理器之外的⼀切所需资

    源,⼀旦得到处理器资源(处理器分配的时间⽚)即可运⾏。

    运⾏状态(running) :进程正在处理器上上运⾏(单核 CPU 下任意时刻只有⼀个进程处于运

    ⾏状态)。

    阻塞状态(waiting) :⼜称为等待状态,进程正在等待某⼀事件⽽暂停运⾏如等待某资源为

    可⽤或等待 IO 操作完成。即使处理器空闲,该进程也不能运⾏。

    结束状态(terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运⾏。

  3. 进程间的通信方式:

    (1)管道(匿名管道):用于有情缘关系的进程。

    (2)有名管道: 任意进程,先进先出。

    (3) 信号: 通知接收进程某个事件已经发生。

    (4) 消息队列: 存放在内核中。克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限的缺陷。

    (5) 信号量:计数器,多进程对共享数据的访问。进程间同步。

    (6) 共享内存: 多个进程访问同一快内存空间

    (7)套接字:用于客户端和服务器之间通过网络进行通信。

  4. 线程间的同步方式:

    (1) 互斥量

    (2) 信号量:允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量

    (3) 事件:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐较操做

  5. 进程的调度算法:

    (1) 先到先服务(FCFS)

    (2) 短作业优先(SJF)

    (3) 时间片轮转

    (4) 多级反馈队列调度算法:多级反馈队列调度算法既能使⾼优先级的作业得到响应⼜能使短作业(进程)迅速完成。,因⽽它是⽬前被公认的⼀种较好的进程调度算法

    (5)优先级调度:同一优先级采用FCFS调度

内存管理

常见的内存管理机制

  1. 连续分配管理方式:为⼀个⽤户程序分配⼀个连续的内存空间

    (1)块式管理:在每个块中未被利⽤的空间,我们称之为碎⽚

  2. 非连续分配管理方式:允许⼀个程序使⽤的内存分布在离散或者说不相邻的内存中

    (1)页式管理:主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式 ,通过⻚表对应逻辑地址和物理地址

    (2)段式管理:段式管理把主存分为⼀段段的,每⼀段的空间⼜要⽐⼀⻚的空间⼩很多 。段式管理通过段表对应逻辑地址和物理地址 。

    (3)段页式管理:结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⼲⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的

快表和多级页表

在分⻚内存管理中,很重要的两点是:

  1. 虚拟地址到物理地址的转换要快。

  2. 解决虚拟地址空间⼤,⻚表也会很⼤的问题。

快表:把快表理解为⼀种特殊的⾼速缓冲存储器(Cache),其中的内容是⻚表的⼀部分或者全部内容。 采⽤⻚表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问⼀次⾼速缓冲存储器,⼀次主存,这样可加速查找并提⾼指令执⾏速度 。

快表的地址转换流程:

  1. 根据虚拟地址中的⻚号查快表;

  2. 如果该⻚在快表中,直接从快表中读取相应的物理地址;

  3. 如果该⻚不在快表中,就访问内存中的⻚表,再从⻚表中得到物理地址,同时将⻚表中的该

映射表项添加到快表中;

  1. 当快表填满后,⼜要登记新⻚时,就按照⼀定的淘汰策略淘汰掉快表中的⼀个⻚。

多级页表:引⼊多级⻚表的主要⽬的是为了避免把全部⻚表⼀直放在内存中占⽤过多空间,特别是那些根本就不需要的⻚表就不需要保留在内存中。多级⻚表属于时间换空间的典型场景。

分页机制和分段机制的异同

  1. 共同点:

    (1)分⻚机制和分段机制都是为了提⾼内存利⽤率,减少内存碎⽚。

    (2)⻚和段都是离散存储的,所以两者都是离散分配内存的⽅式。但是,每个⻚和段中的内存是连续的

  2. 不同点:

    (1)⻚的⼤⼩是固定的,由操作系统决定;⽽段的⼤⼩不固定,取决于我们当前运⾏程序。

    (2)分⻚仅仅是为了满⾜操作系统内存管理的需求,⽽段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满⾜⽤户的需要。

逻辑(虚拟地址)和物理地址

指针⾥⾯存储的数值就可以理解成为内存⾥的⼀个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址指的是真实物理内存中地址,更具体⼀点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。

CPU寻址,为什么需要虚拟地址空间

使⽤虚拟寻址, CPU需要将虚拟地址翻译成物理地址(由CPU中内存管理单元硬件完成),这样才能访问到真实的物理内存。

为什么要有虚拟地址空间:没有时,程序直接访问操作物理内存。可能造成操作系统崩溃,运行多个程序特别困难。

通过虚拟地址访问内存有以下优势:

程序可以使⽤⼀系列相邻的虚拟地址来访问物理内存中不相邻的⼤内存缓冲区。

程序可以使⽤⼀系列虚拟地址来访问⼤于可⽤物理内存的内存缓冲区。当物理内存的供应量变⼩时,内存管理器会将物理内存⻚(通常⼤⼩为 4 KB)保存到磁盘⽂件。数据或代码⻚会根据需要在物理内存与磁盘之间移动。

不同进程使⽤的虚拟地址彼此隔离。⼀个进程中的代码⽆法更改正在由另⼀进程或操作系统使⽤的物理内存。

虚拟内存

什么是虚拟内存

虚拟内存 可以让程序可以拥有超过系统物理内存⼤⼩的可⽤内存空间。另外, 虚拟内存为每个进程提供了⼀个⼀致的、私有的地址空间,它让每个进程产⽣了⼀种⾃⼰在独享主存的错觉(每个进程拥有⼀⽚连续完整的内存空间) 。

虚拟内存的重要意义是它定义了⼀个连续的虚拟地址空间,并且 把内存扩展到硬盘空间。

局部性原理

虚拟内存技术的基础,正是因为程序运⾏具有局部性原理,才可以只装⼊部分程序到内存就开始运⾏。

  1. 时间局部性 :如果程序中的某条指令⼀旦执⾏,不久以后该指令可能再次执⾏;如果某数据被访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着⼤量的循环操作。
  2. 空间局部性 :⼀旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、顺序执⾏的,数据也⼀般是以向量、数组、表等形式簇聚存储的。

时间局部性是通过将近来使⽤的指令和数据保存到⾼速缓存存储器中,并使⽤⾼速缓存的层次结构实现。空间局部性通常是使⽤较⼤的⾼速缓存,并将预取机制集成到⾼速缓存控制逻辑中实现。虚拟内存技术实际上就是建⽴了 “内存⼀外存”的两级存储器的结构,利⽤局部性原理实现髙速缓存。

虚拟内存的技术实现

建⽴在离散分配的内存管理⽅式的基础上

  1. 请求分⻚存储管理 :建⽴在分⻚管理之上,为了⽀持虚拟存储器功能⽽增加了请求调⻚功能和⻚⾯置换功能。

  2. 请求分段存储管理 :建⽴在分段存储管理之上,增加了请求调段功能、分段置换功能。

  3. 请求段⻚式存储管理

补充:

缺⻚中断:如果需执⾏的指令或访问的数据尚未在内存 称为缺⻚或缺段),则由处理器通

知操作系统将相应的⻚⾯或段调⼊到内存,然后继续执⾏程序 。

页面置换算法

⻚⾯置换算法的作⽤?常⻅的⻚⾯置换算法有哪些 ?

当发⽣缺⻚中断时,如果当前内存中并没有空闲的⻚⾯,操作系统就必须在内存选择⼀个⻚⾯将其移出内存,以便为即将调⼊的⻚⾯让出空间。

  1. OPT(最佳页面置换算法):换出后续永不会再用到的页面,只在理论上存在。
  2. FIFO
  3. LRU(最近最久未使用页面置换算法)
  4. LFU(最少使用页面置换算法)