Linux0.11之文件系统

type
status
date
slug
summary
tags
category
icon
password

PCB

操作系统感知和管理进程通过PCB,进程运行在内存中,是直接关系
进程与文件系统的关系如何建立?
  • 进程的可执行映像是文件;
  • 进程对辅存读写也主要基于文件。
内存与辅存间交换信息需要建立内存缓冲区
几大核心模块能够有机的建立联系
notion image
notion image
X86体系从硬件上支持任务间的切换。
任务状态段(TSS),它和数据段、代码段一样也是一种段。
任务切换的时候,CPU会将原寄存器的内容写出到相应的TSS,同时将新TSS的内容填到寄存器中,这样就实现了任务的切换。
notion image

进程打开文件时数据结构的建立

notion image
打开文件
  1. 将用户进程打开的文件(句柄fd)在filp[20]中进行登记
  1. 建立filp[fd]与内核中的file_table[64]进行连接
  1. 将要打开文件的i节点在file_table[64]中进行登记
  1. 将新打开的i节点登记到inode_table[32]
通过inode_table[32]掌控正在使用的文件i节点数
打开文件的本质就是要建立*filp[20]file_table[64]inode_table[32]三者之间的关系
notion image
notion image
notion image
notion image

创建一个与父进程不同的子进程

使用fork创建一个子进程核心过程包括:创建进程控制块、分配内存、IO系统、文件访问。
这个过程没有通过文件系统访问块设备,fork创造子进程与父进程完全相同
  • fork创建一个子进程,返回pid(=0子进程中)
  • 在子进程中执行shell终端程序(/bin/sh)
  • sh也只是一个正常的具有main函数的可执行程序,其读取用户在命令行输入的程序名以及相应参数,然后fork出一个子进程去execve这个程序,子程序执行完成后又回到命令行等待输入,
  • execve(“/bin/sh”,argv,envp)函数是关键
  • execvesys_execvedo_execve (exec.c)
函数的参数是通过堆栈传递的,返回地址是在call语句时被压入堆栈的,返回值通过eax传递。

期末真题

2024春

六、综合分析题。(9分)
设系统采用MINIX文件系统,盘块大小为1KB,时间片大小为10ms,采用段页式存储管理,二级页表。你有一个C语言源文件mytest.c,内含printf语句,大小为6KB。现用gcc -o mytest mytest.c编译之,并运行之。该程序运行时间为30ms,并且会将打印结果输出到日志文件./log中,大小为1MB。试从进程管理,进程调度,文件管理,虚拟内存管理等角度详细阐述该进程运行的全过程。
一、进程管理角度
(一)编译阶段
  1. Shell 进程解析命令行,fork 出一个子进程;
  1. 子进程执行 execve("/usr/bin/gcc", argv, envp)
  1. do_execve 过程中:
      • 清空原进程地址空间;
      • 加载 gcc 可执行文件(段页式映射);
      • 为代码段、数据段分配页表;
      • 在 PCB 中设置新程序入口地址。
  1. gcc 进程开始运行,编译 mytest.c
(二)运行阶段
  1. 当用户执行 ./mytest > ./log
      • Shell 再次 fork 出子进程;
      • 子进程执行 execve("./mytest", argv, envp)
      • 文件描述符重定向:stdout(fd=1) → 打开文件 ./log
      • filp[fd]file_table[64]inode_table[32] 连接建立(PPT中的三层结构)。
  1. 内核在 PCB 中记录:
      • 可执行文件 inode;
      • 当前工作目录 inode;
      • 文件指针 filp 数组(含 stdout → log)。
二、进程调度角度
  • 系统采用时间片轮转调度(时间片 10ms);
  • 程序运行 30ms ⇒ 占用 3 个时间片
  • 调度器每 10ms 调用 schedule()
    • 保存当前进程寄存器状态到 TSS;
    • 从就绪队列中选出下一个进程;
    • 加载其 TSS 寄存器值,实现任务切换;
    • 更新 PCB 的时间片剩余量;
  • CPU 在运行 mytest、Shell、日志 I/O 缓冲进程之间交替切换。
三、文件管理角度
(1)编译阶段
  • gcc 打开:
    • 源文件 mytest.c(读);
    • 输出目标文件 mytest(写);
  • 打开文件过程:
      1. 在进程的 filp[20] 数组中找空闲项;
      1. file_table[64] 找空闲项;
      1. 通过路径解析找到对应 inode;
      1. inode_table[32] 中登记;
      1. 建立三层链接(filp → file_table → inode)。
(2)运行阶段
  • 执行 printf 时,数据写入标准输出(stdout);
  • 因为重定向,stdout 实际连接到日志文件的 inode;
  • 缓冲区数据通过 write() 写入磁盘:
    • 若缓冲区满 → 写入磁盘块;
    • MINIX 分配 1MB / 1KB = 1024 个数据块;
    • 每个数据块通过逻辑块位图分配;
    • 日志文件的 inode 包含直接块、间接块指针(存放数据块地址)。
四、虚拟内存管理角度(段页式 + 二级页表)
  1. 程序运行时:
      • 段表包含代码段、数据段、堆栈段;
      • 每个段再分页(4KB 页)。
  1. 程序大小 6KB → 占用 2 页;
  1. 页表映射:
      • 一级页表指向页目录;
      • 二级页表记录物理页号;
  1. 执行过程中若访问的页不在内存:
      • 触发缺页中断;
      • 操作系统在物理内存中分配页框;
      • 从可执行文件(磁盘)读入相应页;
      • 更新页表项,重新执行指令。

2020春

六、综合题(10分)
假设当前操作系统采用段页式内存管理,并使用二级页表,页大小为4K,物理内存中已有多个进程且实际物理内存的未分配空间为14K。现有一个编译好的程序test放在一个指定的路径下,其大小为18K,此程序的运行至少需要两个时间片。请结合你所学过的进程管理、内存管理、文件管理等操作系统知识,详细描述该程序从创建进程到运行结束,操作系统所做的主要操作有哪些。
一、创建进程阶段
  1. 用户在 Shell 中输入命令 ./test
  1. Shell 执行 fork()
      • 复制父进程的 PCB;
      • 复制页表结构(写时复制);
      • 子进程获得新 PID;
  1. 子进程执行 execve("./test")
      • 清空原地址空间;
      • 根据可执行文件头建立新的段(代码段 + 数据段 + 栈段);
      • 建立段表与二级页表;
      • 装载前几页(例如 3 页共 12KB)入内存;
      • 剩余部分在磁盘等待按需调入。
二、内存管理阶段
  • 页大小 = 4KB,程序 = 18KB → 需要 5 页;
  • 可用物理内存 = 14KB → 可装入 3 页;
  • 执行时发生:
    • 访问未加载页 → 触发缺页中断;
    • 操作系统从磁盘读入对应页;
    • 若内存不足 → 页面置换算法(如 LRU);
  • 二级页表用于多级索引,节省空间:
    • 一级表存放页目录;
    • 二级表存放页表项(记录物理页号、权限、存在位)。
三、进程调度阶段
  • 时间片 = 10ms;
  • 程序运行至少两个时间片 → CPU 至少两次分配给该进程;
  • 每次时间片用完:
    • 调度程序保存寄存器状态(写入 TSS);
    • 从就绪队列选择下一个进程;
    • 恢复上下文切换;
  • 如果 test 进程等待 I/O(如磁盘页调入),会进入阻塞状态。
四、文件系统阶段
  • execve 调用时:
    • 根据路径解析文件名 → inode(通过目录项找到);
    • inode 表示 test 文件的元信息(大小、权限、数据块号);
    • 系统读取该文件的数据块到内存;
    • 建立可执行映像;
  • 进程运行期间可能打开输出文件或库文件,系统在 filp[20]file_table[64]inode_table[32] 中建立对应关系。
五、进程结束阶段
  1. 程序执行完毕,调用 exit()
      • 释放用户空间页;
      • 回收页表、inode 引用;
      • 写回文件缓冲区;
      • 更新 PCB 状态为 ZOMBIE
  1. 父进程调用 wait() 收集退出码;
  1. 操作系统最终回收 PCB、TSS、文件表项。

2014

六.Linux0.00上已实现随机打印‘A’、‘B’的两个进程,如果要再实现打印‘D’的进程应该怎么做。说明你的设计和改变,并说明为什么这样做。
Loading...