Linux0.11之文件系统
type
status
date
slug
summary
tags
category
icon
password
PCB
操作系统感知和管理进程通过PCB,进程运行在内存中,是直接关系
进程与文件系统的关系如何建立?
- 进程的可执行映像是文件;
- 进程对辅存读写也主要基于文件。
内存与辅存间交换信息需要建立内存缓冲区
几大核心模块能够有机的建立联系


X86体系从硬件上支持任务间的切换。
任务状态段(TSS),它和数据段、代码段一样也是一种段。
任务切换的时候,CPU会将原寄存器的内容写出到相应的TSS,同时将新TSS的内容填到寄存器中,这样就实现了任务的切换。

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

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



创建一个与父进程不同的子进程
使用
fork创建一个子进程核心过程包括:创建进程控制块、分配内存、IO系统、文件访问。这个过程没有通过文件系统访问块设备,
fork创造子进程与父进程完全相同fork创建一个子进程,返回pid(=0子进程中)
- 在子进程中执行shell终端程序(
/bin/sh)
- sh也只是一个正常的具有main函数的可执行程序,其读取用户在命令行输入的程序名以及相应参数,然后
fork出一个子进程去execve这个程序,子程序执行完成后又回到命令行等待输入,
execve(“/bin/sh”,argv,envp)函数是关键
execve→sys_execve→do_execve(exec.c)
函数的参数是通过堆栈传递的,返回地址是在
call语句时被压入堆栈的,返回值通过eax传递。期末真题
2024春
六、综合分析题。(9分)
设系统采用MINIX文件系统,盘块大小为1KB,时间片大小为10ms,采用段页式存储管理,二级页表。你有一个C语言源文件mytest.c,内含printf语句,大小为6KB。现用gcc -o mytest mytest.c编译之,并运行之。该程序运行时间为30ms,并且会将打印结果输出到日志文件./log中,大小为1MB。试从进程管理,进程调度,文件管理,虚拟内存管理等角度详细阐述该进程运行的全过程。
一、进程管理角度
(一)编译阶段
- Shell 进程解析命令行,fork 出一个子进程;
- 子进程执行
execve("/usr/bin/gcc", argv, envp);
- 在
do_execve过程中: - 清空原进程地址空间;
- 加载
gcc可执行文件(段页式映射); - 为代码段、数据段分配页表;
- 在 PCB 中设置新程序入口地址。
gcc进程开始运行,编译mytest.c。
(二)运行阶段
- 当用户执行
./mytest > ./log: - Shell 再次 fork 出子进程;
- 子进程执行
execve("./mytest", argv, envp); - 文件描述符重定向:
stdout(fd=1) → 打开文件./log; filp[fd]→file_table[64]→inode_table[32]连接建立(PPT中的三层结构)。
- 内核在 PCB 中记录:
- 可执行文件 inode;
- 当前工作目录 inode;
- 文件指针 filp 数组(含 stdout → log)。
二、进程调度角度
- 系统采用时间片轮转调度(时间片 10ms);
- 程序运行 30ms ⇒ 占用 3 个时间片;
- 调度器每 10ms 调用
schedule(): - 保存当前进程寄存器状态到 TSS;
- 从就绪队列中选出下一个进程;
- 加载其 TSS 寄存器值,实现任务切换;
- 更新 PCB 的时间片剩余量;
- CPU 在运行
mytest、Shell、日志 I/O 缓冲进程之间交替切换。
三、文件管理角度
(1)编译阶段
gcc打开:- 源文件
mytest.c(读); - 输出目标文件
mytest(写);
- 打开文件过程:
- 在进程的
filp[20]数组中找空闲项; - 在
file_table[64]找空闲项; - 通过路径解析找到对应 inode;
- 在
inode_table[32]中登记; - 建立三层链接(filp → file_table → inode)。
(2)运行阶段
- 执行
printf时,数据写入标准输出(stdout);
- 因为重定向,stdout 实际连接到日志文件的 inode;
- 缓冲区数据通过
write()写入磁盘: - 若缓冲区满 → 写入磁盘块;
- MINIX 分配 1MB / 1KB = 1024 个数据块;
- 每个数据块通过逻辑块位图分配;
- 日志文件的 inode 包含直接块、间接块指针(存放数据块地址)。
四、虚拟内存管理角度(段页式 + 二级页表)
- 程序运行时:
- 段表包含代码段、数据段、堆栈段;
- 每个段再分页(4KB 页)。
- 程序大小 6KB → 占用 2 页;
- 页表映射:
- 一级页表指向页目录;
- 二级页表记录物理页号;
- 执行过程中若访问的页不在内存:
- 触发缺页中断;
- 操作系统在物理内存中分配页框;
- 从可执行文件(磁盘)读入相应页;
- 更新页表项,重新执行指令。
2020春
六、综合题(10分)
假设当前操作系统采用段页式内存管理,并使用二级页表,页大小为4K,物理内存中已有多个进程且实际物理内存的未分配空间为14K。现有一个编译好的程序test放在一个指定的路径下,其大小为18K,此程序的运行至少需要两个时间片。请结合你所学过的进程管理、内存管理、文件管理等操作系统知识,详细描述该程序从创建进程到运行结束,操作系统所做的主要操作有哪些。
一、创建进程阶段
- 用户在 Shell 中输入命令
./test;
- Shell 执行
fork(): - 复制父进程的 PCB;
- 复制页表结构(写时复制);
- 子进程获得新 PID;
- 子进程执行
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]中建立对应关系。
五、进程结束阶段
- 程序执行完毕,调用
exit(): - 释放用户空间页;
- 回收页表、inode 引用;
- 写回文件缓冲区;
- 更新 PCB 状态为
ZOMBIE;
- 父进程调用
wait()收集退出码;
- 操作系统最终回收 PCB、TSS、文件表项。
2014
六.Linux0.00上已实现随机打印‘A’、‘B’的两个进程,如果要再实现打印‘D’的进程应该怎么做。说明你的设计和改变,并说明为什么这样做。
Loading...