MQ大牛成长课——从0到1手写分布式消息队列中间件「官方同步」
MQ大牛成长课——从0到1手写分布式消息队列中间件「官方同步」
获取ZY↑↑方打开链接↑↑
操作系统原理之 – 传统文件IO读写介绍
在计算机科学中,文件I/O(输入/输出)指的是程序与存储设备之间的数据交换。操作系统提供了文件I/O接口,使得应用程序能够读取、写入、修改文件系统中的数据。下面是对传统文件I/O读写的基本介绍:
文件描述符
在大多数操作系统中,打开的文件会关联一个整数编号,称为文件描述符(File Descriptor)。文件描述符为0通常对应标准输入(stdin),为1对应标准输出(stdout),为2对应标准错误输出(stderr)。其他文件描述符则对应于程序中打开的文件或网络套接字等。
文件I/O操作
操作系统提供了多种API来实现文件I/O操作,常见的包括:
-
打开文件 (
open): 打开一个文件供读写。如果文件不存在,则根据参数决定是否创建该文件。返回一个文件描述符。c深色版本
-
int open(const char *pathname, int flags); -
读取文件 (
read): 从文件描述符指定的位置读取数据到缓冲区中。c深色版本 -
ssize_t read(int fd, void *buf, size_t count); -
写入文件 (
write): 将缓冲区中的数据写入到文件描述符指定的位置。c深色版本 -
ssize_t write(int fd, const void *buf, size_t count); -
关闭文件 (
close): 关闭文件描述符,释放相关资源。c深色版本 -
int close(int fd); -
定位文件指针 (
lseek): 移动文件描述符的读写位置。c深色版本 -
off_t lseek(int fd, off_t offset, int whence);whence参数决定了偏移量的基准点,可以是文件的起始位置(SEEK_SET)、当前位置(SEEK_CUR)或文件末尾(SEEK_END)。 -
获取文件状态 (
fstat): 获取文件的状态信息,如大小、权限等。c深色版本 -
int fstat(int fd, struct stat *buf); -
删除文件 (
unlink或remove): 删除文件。c深色版本 -
int unlink(const char *pathname); -
同步文件内容 (
fsync): 强制将缓存中的数据写入磁盘,保证数据的一致性。c深色版本
-
int fsync(int fd);
传统文件I/O的特点
- 阻塞性: 传统的文件I/O操作通常是阻塞的,这意味着在一个读或写操作完成之前,程序将会暂停执行。这种模式适用于数据量不大或对实时性要求不高的情况。
- 直接与内核交互: 传统文件I/O直接调用系统API与内核进行交互,因此其性能受到操作系统调度策略的影响。
应用场景
传统文件I/O非常适合于那些需要直接控制文件读写的应用程序,如文本编辑器、日志记录工具等。然而,在现代高性能服务端应用中,由于阻塞性带来的性能瓶颈,非阻塞I/O、异步I/O、甚至是用户态文件系统(如FUSE)等更高效的I/O模型逐渐成为主流。
理解这些基本概念有助于开发者更好地掌握文件I/O操作,并能根据不同的需求选择合适的I/O模型来优化程序性能。