复习
本次课回答的问题
本次课主要内容
终端
GPU (CUDA)
磁盘需要支持数据的持久化
文件系统:设计目标
“存储设备 (字节序列) 的虚拟化”
std::vector<char> (随机读写/resize)信息的局部性:将虚拟磁盘 (文件) 组织成层次结构

目录树
.
└── 学习资料
├── .学习资料(隐藏)
├── 问题求解1
├── 问题求解2
├── 问题求解3
├── 问题求解4
└── 操作系统
树总得有个根结点

C:\ “C 盘根目录”C:\Program Files\, C:\Windows, C:\Users, ...A:\, B:\?game.iso 一度非常麻烦……/UNIX: 允许任意目录 “挂载 (mount)” 一个
/, /home, /var 可以是独立的磁盘设备mount 系统调用
int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data);
mount /dev/sdb /mnt (RTFM)Linux-minimal 运行在 “initramfs” 模式
最小 “真正” Linux 的启动流程
export PATH=/bin
busybox mknod /dev/sda b 8 0
busybox mkdir -p /newroot
busybox mount -t ext2 /dev/sda /newroot
exec busybox switch_root /newroot/ /etc/init
通过 pivot_root (2) 实现根文件系统的切换
文件的挂载引入了一个微妙的循环
Linux 的处理方式
ioctl(3, LOOP_CTL_GET_FREE)ioctl(4, LOOP_SET_FD, 3)FHS enables software and user to predict the location of installed files and directories.
例子:macOS 是 UNIX 的内核 (BSD), 但不遵循 Linux FHS

这个简单
rm -rf 会遍历目录,逐个删除 (试试 strace)count 个目录项 (ls, find, tree 都使用这个)合适的 API + 合适的编程语言
from pathlib import Path
for f in Path('/proc').glob('*/status'):
print(f.parts[-2], \
(f.parent / 'cmdline').read_text() or '[kernel]')
需求:系统中可能有同一个运行库的多个版本
libc-2.27.so, libc-2.26.so, ...libc.so.6”,能否避免文件的一份拷贝?硬连接:允许一个文件被多个目录引用
大部分 UNIX 文件系统所有文件都是硬连接 (ls -i 查看)
软链接:在文件里存储一个 “跳转提示”
~/usb → /media/jyy-usb~/Desktop → /mnt/c/Users/jyy/Desktop (WSL)ln -s 创建软链接
symlink 系统调用“任意链接” 允许创建任意有向图 😂
ls -i 可以看到 find -L A | tr -d '/'Working/current directory
pwd 命令或 $PWD 环境变量可以查看chdir 系统调用修改/bin/cd问题:线程是共享 working directory, 还是各自独立持有一个?
文件:虚拟的磁盘
文件描述符:进程访问文件 (操作系统对象) 的 “指针”
使用 open 打开一个文件后
MAP_SHARED 将文件映射到地址空间中MAP_PRIVATE 创建一个 copy-on-write 的副本void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset); // 映射 fd 的 offset 开始的 length 字节
int munmap(void *addr, size_t length);
int msync(void *addr, size_t length, int flags);
小问题:
SIGBUS...文件的读写自带 “游标”,这样就不用每次都指定文件读/写到哪里了
例子
read(fd, buf, 512); - 第一个 512 字节read(fd, buf, 512); - 第二个 512 字节lseek(fd, -1, SEEK_END); - 最后一个字节mmap, lseek, ftruncate 互相交互的情况
length = 2 MiB)SEEK_SET)在任何时刻,写入数据的行为是什么?
文件描述符在 fork 时会被子进程继承。
父子进程应该共用偏移量,还是应该各自持有偏移量?
offset 存储在哪里考虑应用场景
write 的原子性 ✅操作系统的每一个 API 都可能和其他 API 有交互 😂
O_APPEND 方式打开的文件,偏移量永远在最后 (无论是否 fork)这也是 fork 被批评的一个原因
fork() in the road本次课回答的问题
Takeaway messages