操作系统 - Linux

Linux Operating System

C7 进程管理

  1. 进程控制块,其中与进程管理、存储器管理和文件管理有关的一些字段,线程组标识符。
  • Linux为每一个进程建立进程控制块,又称进程描述符

    • 用一个task_struct类型的数据结构表示

      task_struct{
               
      	thread_info   // 基本信息
      	mm_struct     // 虚拟内存描述符
      	fs_struct     // 指向文件系统信息
      	files_struct  // 进程打开的文件
      	signal_struct // 所接受的信号
      	dentry	      // 指向目录结构的指针
      }
    • 包含了与进程相关的所有信息

  • 每个进程有一个唯一的进程标识符PID

    • 新创建的通常是PID+1
    • 使用pidmap_array位图管理PID号(分配和空闲)
  • 线程组标识符

    • pid_t tgid
    • 同一线程组中所有轻权进程tgid相同
  • PID哈希表

  1. 与进程创建有关的函数:fork( )、vfork( )、clone( )系统调用
  • fork()函数
    • 传统的UNIX创建子进程系统调用函数
    • 调用sys_fork()do_fork()
    • 创建成功后,子进程使用写时复制技术共享父进程的资源
  • vfork()
    • sys_vfork()do_fork()
    • 创建成功后, 暂时挂起父进程, 直到子进程退出或执行新程序
  • clone()创建轻权进程
    • sys_clone()do_fork()
    • 轻权进程可以共享父进程在内核的很多数据结构,如页表, 打开信号表
  • do_fork()
    • 负责处理以上三种系统调用,也负责实现内核进程的创建
  1. 理解进程切换的过程。涉及到页目录表、核心栈、硬件上下文
  • 进程切换(进程上下文切换):

    • 暂停正在CPU上运行的进程, 恢复已就绪的某个进程
    • 进程切换只发生在核心态
  • 过程:

    • 第一步, 切换页目录表以安装一个新的地址空间
    • 第二步, 切换核心栈和硬件上下文
    • 保存将要切换出的进程的硬件上下文*(储存到核心栈)**,用将要切换进来的进程的硬件上下文来代替。*
  • 硬件上下文:

    • 尽管每个进程可以拥有属于自己的地址空间,但是所有进程必须共享CPU寄存器,因此,在恢复一个进程的执行前,内核必须确保每个寄存器装入了挂起进程时的值

    • 进程恢复执行前必须装入寄存器的那一组数据成为硬件上下文

    • 涉及到大部分寄存器,但是eax ebx等通用寄存器还是存在核心栈中

  1. 进程调度方式。进程调度时机。
  • 可抢先式的动态优先级调度

    • 内核完全可重入
    • 无论进程处于用户态还是核心态,都可能被抢占CPU, 从而保证高优先级进程及时执行
    • 基于进程过去行为的启发式算法
      • 确定把进程看作批处理进程还是交互进程
  • 进程分为三类:

    • 批处理进程: 后台程序: 编译, 科学计算等
    • 交互式进程: shell, 文本编辑, 图形界面
    • 实时进程: 实时监测, 音视频等, 有很强的调度需求
  • 普通进程的调度: (基本:100~139)

    • 分时进程
    • 照顾到基本时间片和动态优先级
    • 新进程继承父进程的静态优先级; 也会动态调整优先级(依赖于进程的过去行为)
  • 实时进程的调度: (基本: 1~99)

    • 相同优先级 - 时间片轮转
    • 不同优先级 - FIFO
  • 交互式进程:

    • 动态优先数≤3×静态优先数 /4+28, 否则为批处理
  • 调度时机:

    • 出现了更高优先级的实时进程
    • 进程阻塞
    • 进程停止运行或杀死
    • 自愿放弃处理机
    • 时间片用完
  1. Linux 有很多内核线程,了解 0 号进程和 1 号进程的作用。
  • 0号进程:

    • 所有进程的祖先进程,又叫idle进程或swapper进程.
    • 每个CPU都有一个0号进程
    • 进程描述符存放在init_task变量中
  • 1号进程

    • 由0号进程创建的内核线程init
    • 1号进程创建后,执行init()函数, 完成内核的初始化
    • 与0号进程共享每个进程所有的内核数据结构
    • 在系统关闭前一直存在,创建和监控OS的所有用户态进程

C8 存储器管理

  1. 进程地址空间的划分?管理进程私有地址空间的数据结构?指向映射文件对象的指针字段?指向进程页目录表的指针字段?
  • 进程地址空间的划分:
    • 32位/x86, 每个地址空间4GB, 彼此互相独立
      • 私有空间前3G, 公有空间后1G内核虚空间
  • 数据结构:
    • 虚拟内存区域数较少: 单链表
    • 虚拟内存区域数较多: 红黑树
  • 指针字段:
    • 虚拟内存描述符mm_struct
  1. Linux 堆的管理:malloc( ),free( )
  • malloc(size): 请求size字节的动态内存, 返回起始虚地址
  • calloc(n,size): 请求元素大小为size, 长度为n的数组
  • realloc(ptr,size)
  • free(addr): 释放malloc()或者calloc()分配的起始虚地址为addr的内存空间
  1. 管理物理内存页框的数据结构? 内存管理区 zone 结构,伙伴系统?分区页框分配器分配页框的过程
  • struct_page: 页框(帧)描述符, 存放在mem_map数组中

  • 三个管理区zone:

    • ZONE_DMA:包含低于16MB的常规内存 页框。用于对老式的基于ISA设备的DMA支持.

    • ZONE_NORMAL:包含高于16MB且低于896MB的常规内存页框.

    • ZONE_HIGHMEM:包含从896MB开始的高端物理页框。内核不能直接访问这部分页框。在64位体系结构上,该区总是空的.

    • 每个区域内, 除了留出小部分用于每CPU页框高速缓存,(满足CPU的请求), 其他由伙伴系统管理

  • 伙伴系统:

    • 管理连续的空闲内存页框, 以解决外碎片 (已分配区域之外的or之间的) 问题。
    • 分配过程:
      • 连接1,2,4,8,…,1024个连续页框的链表
      • 若请求8个,则在8个的链表中找. 之后依次向更大的链表中找.
      • 若在更大的中找到,则分为几部分重新练到链表中

操作系统 - Linux_第1张图片

  1. 理解 slab 分配器的原理。slab 分配器的作用?
  • slab分配器用于为只有几十或几百个字节的 小内存区分配内存。如,file对象。
  • 为什么需要slab
    • 伙伴系统以页为单位, 对于内核来说力粒度还是太大了
      • 为用户提供任意大小的内存
    • 原理:
      • 为某一模块预先申请一定内存备用(从分区页框分配器获得几组连续空闲页框), 从而无需每一次都从系统中分配内存,而是从预留的内存中取出一部分使用. 这样能够大大提高内存申请速度.
      • 每一个请求的内存称为对象
    • slab着色: 利用空闲未用的字节数对slab进行着色**,把slab中的一些空闲区域从末尾移到开头**
    • kernel → slab → budy → pages
  1. 进程页表建立的时机?了解页目录表项或页表项所包含的字段。逻辑地址的划分,利用两级页表实现地址转换的过程。
  • 二级页表

  • 建立的时机: 访问时才建立(节约内存)

  • 页表: (页框4096, 32位)

    • 页框物理地址20位
    • 其他(Present(是否在内存), accessed(访问位), dirty(正在写), r/w(权限), user/supervisor, pcd, pwt, pagesize, global)
  • 逻辑地址划分:

    • 页目录索引 - 10位
    • 页表索引 - 10位
    • 页内偏移 - 12位
  • 过程:

操作系统 - Linux_第2张图片

  • Cr3: 基址寄存器
  1. 请求调页。所缺的页可能存放的地方。
  • 把页框的分配一直推迟到进程要访问的页不在RAM中时引起一个缺页异常,才将所需的页调入内存。(有缺页"请求"是才调页)
  1. 了解盘交换区空间的管理方法。
  • 盘交换区用来存放从内存暂时换出的数据页 (顾名思义,交换区)
  • 每个盘交换区都由一组4KB的页槽组成
  • 第一个页槽用来存放该交换区的有关信息,有相应的描述符
  • 尽力把换出的页面相邻存储(减少寻道时间)
    • 存放在磁盘分区中的交换区只有一个子区, 存放在普通文件中的交换区可能有多个子区, 原因是磁盘上的文件不要求连续存放

C9~10 文件系统

  1. Ext2 文件卷的布局?各部分的作用是什么?

操作系统 - Linux_第3张图片

  • Ext2文件卷的布局:
    • 引导块: 读入并启动OS, 只有根目录的引导块才起作用
    • 超级块: 资源管理信息
      • 索引节点综述, 盘块总数, 空闲块技术, 空闲索引节点数, 每组盘块数
      • 盘块大小, 每组索引节点数, 索引节点结构大小
    • 块组描述符
      • 盘块位图的块号, 索引节点位图的块号
    • 索引节点位图: 管理控制信息
      • 只有块组0包含的超级快和组描述符才被内核使用; 在一致性检查时把块0的拷贝到后续块中
  1. Linux 系统把一般的文件目录项分成哪两部分?这样做的好处是什么?
  • 分为简单目录项索引节点
  • 简单目录项包含了文件名和索引节点号等, 可以提高文件目录的检索速度。
  • 系统只保留一个索引节点,就可实现多条路径共享文件,减少信息冗余。
  1. Linux 文件系统的索引节点中,索引表划分成几级?计算文件最大长度

    文件的索引表是如何增长的?要求能够利用索引表实现将文件中的字节地址转换成文件的物理块的操作。

  • 索引表:i_block字段是一个有15个指针元素的数组,每个元素占4B,共60B。

  • 存放文件逻辑块号与相应物理块号之间的映射关系。

    • 每个指针指向一个文件目录
  • 分为四级:

操作系统 - Linux_第4张图片

  • 小型文件: 最初的12个元素是直接索引项,给出文件最初的 12个逻辑块号对应的物理块号
  • 中型文件: 索引12是一次间接索引块,是一个存放盘块号的 一维数组。对应的文件逻辑块号从12到 b / 4 + 11 b/4 + 11 b/4+11,b是盘块大小,每个逻辑块号占4B。
  • 大型文件: 索引13是二次间接索引块,对应的文件逻辑块号 从 b / 4 + 12 b/4+12 b/4+12到$ (b/4)^2+(b/4)+11$。
  • 巨型文件: 索引14是三次间接索引块,对应的文件逻辑块号 从 ( b / 4 ) 2 + ( b / 4 ) + 12 (b/4)^2+(b/4)+12 (b/4)2+(b/4)+12 ( b / 4 ) 3 + ( b / 4 ) 2 + ( b / 4 ) + 11 (b/4)^3+(b/4)^2+(b/4)+11 (b/4)3+(b/4)2+(b/4)+11
  • 其中 b b b为一个盘块以字节为单位的大小,每个盘块用四个字节表示

举个栗子:

数据块大小4KB,

  • 小型: 12 ∗ 4 K B = 48 K B 12 * 4KB = 48KB 124KB=48KB
  • 中型: ( 4 / 1 ) ∗ 4 K B = 4 M B (4/1)*4KB = 4MB (4/1)4KB=4MB
  • 大型: ( 4 / 1 ) 2 ∗ 4 K B = 4 G B (4/1)^2*4KB = 4GB (4/1)24KB=4GB
  • 巨型: ( 4 / 1 ) 3 ∗ 4 K B = 4 T B (4/1)^3*4KB = 4TB (4/1)34KB=4TB
  1. 硬链接和符号链接的区别?
  • 硬链接:多个文件项指向一个文件
    • 所有目录项inode指向同一索引节点
  • 软连接:存储真实文件的逻辑名称.
    • 它不与文件的索引节点建立链接,可以跨文件系统(当为一个文件 建立符号链接时,索引节点的硬链接计数 不改变)
  1. Linux 文件系统如何管理空闲存储空间?

磁盘块和索引节点的分配和回收;

文件的数据块和其索引节点尽量在同一个块组中。

文件和它的目录项尽量在同一个块组中 ; 父目录和子目录尽量在同一个块组中。

每个文件的数据块尽量连续存放。

  • 结构: 分区(MBR, GPT) - Group - block(引导 + …) - 索引节点 - 索引节点表 - physical
  1. VFS 通用文件模型中的四个主要对象?为什么可以支持众多的文件卷
  • VFS: 虚拟文件系统

    • 使得Linux具有操作其他OS文件系统的能力
      操作系统 - Linux_第5张图片
  • 主要是想: 引入通用文件模型,可以支持所有的文件系统

  • VFS的四个主要对象:

    • 超级块对象: 代表已安装的文件系统,存放管理和控制信息
      • 存放在FCB中, 即一个暗黄好的文件系统建立一个超级块对象
    • 索引节点对象: 打开文件对应的文件控制块FCB
      • 每个文件都有一个索引节点对象,唯一索引节点号,标识文件系统中的一个特定文件
    • 目录项对象:代表一个目录项
      • 目录项与对应文件进行连接的信息
    • 文件对象: 进程和打开的文件之间的交互信息
  1. Linux 系统中,进程打开一个磁盘文件要涉及哪些数据结构?它们各有哪些关 键字段?他们的作用是什么?
Struct tast_struct{
      
    struct fs_struct *fs; //指向文件系统信息 
    struct files_struct *files; //指向进程打开文件信息
}
struct fs_struct {
      
    atomic_t count; // 共享该结构的进程数 
    struct dentry *root, *pwd; //每个进程的当前工作目录和根目录,通过这两个目录与文件系统进行交互。 
    struct vfsmount *rootmnt; //根目录下安装 的文件系统对象 
    struct vfsmount *pwdmnt; //当前目录下安 装的文件系统对象
}
struct files_struct {
      
    struct file **fd; // 指向文件对象指针数组的 指针 
    struct file *fd_array[ ];//文件对象指针数组
}// 每个进程最多打开 1024个文件
  1. 一个文件在使用与不用时各占用系统哪些资源?

  2. 了解安装表的作用

  • 安装需要通过mount函数实现,将文件系统安装到根文件系统的某个目录节点上,将安装点与被安装文 件系统信息保存在已安装文件系统描述符vfsmount结构中,形成链式安装表
  • 安装表功能是保存已安装文件系统描述符

你可能感兴趣的:(操作系统)