操作系统-第七讲-访问操作系统对象

访问操作系统对象

jyy 老师的讲义


内容回顾

目前提到的操作系统中的对象有:

  1. 进程 - 状态机,通过进程管理 API 复制、重置、退出状态机
  2. 连续的内存,可以在进程间共享,也可以映射文件,通过内存管理 API 来映射、解映射内存

很明显,操作系统还有其他对象!

文件描述符

什么是文件:有“名字”的数据对象,分为字节流形式和字节序列形式。

文件类型对比:字节流 vs 字节序列

🌊

字节流文件 (Stream)

连续的数据流,只能顺序访问
A B C D E F G H
📍
当前读取位置
只能向前流动
📖 顺序读取
🚫 无法回退
⏱️ 实时数据
典型例子:
键盘输入 网络数据 麦克风 管道
📄

字节序列文件 (Sequence)

固定大小的数据块,支持随机访问
A
B
C
D
E
F
G
H
位置1
位置5
可以跳转到任意位置
🎯 随机访问
🔄 可以回退
💾 持久存储
典型例子:
普通文件 数据库文件 图片视频 硬盘文件

文件描述符 是指向操作系统对象的“指针”,UNIX 设计中秉承着 Everything is a file 理念,任何对象的访问都需要指针,通过相关 API 来分配、销毁、修改指针 (open, close, read/write, lseek(指针内赋值), dup(指针间赋值))

每个进程有自己的一系列文件描述符,os 总是分配最小未使用的描述符,例如描述符 0, 1, 2 是标准输入、输出和错误。新打开的文件从 3 开始分配。文件描述符是进程文件描述符表的索引,是一个无符号整数。关闭文件后,该描述符号可以被重新分配。

一个进程可以打开文件的最大值是有限制的,可以通过 ulimit -nsysctl fs.file-max 来查看进程/系统限制。

文件描述符自带一个 offset,当通过文件描述符进行文件读写操作时,会自动从 offset 处开始,并在结束时使 offset 自动移动到结束位置。UNIX 中,通过 fork()dup() 后,offset 是共享的。

文件描述符:文件描述符是指向操作系统对象的 “指针”——系统调用通过这个指针 (fd) 确定进程希望访问操作系统中的哪个对象。我们有 open, close, read/write, lseek, dup 管理文件描述符。

访问操作系统中的对象

任何“可读写”的东西都可以是文件,例如真实的设备 /dev/sda, /dev/tty,虚拟的设备 dev/urandom, /dev/null

管道是一个特殊的“文件流”,由读者和写者共享,一个读口负责 read,一个写口负责 write。

UNIX 管道UNIX 管道 (pipe) 是一种典型的进程间通信机制,允许数据在不同的进程之间单向流动。管道可以被视为一种特殊的文件,其中一个进程将数据写入管道的一端,而另一个进程从另一端读取数据。

总结

Take-away Messages 操作系统必需提供机制供应用程序访问操作系统对象。对于 UNIX 系统,文件描述符是操作系统中表示打开文件 (操作系统对象) 的指针;而 Windows 则更直接地提供了 handle 机制。