MQ大牛成长课——从0到1手写分布式消息队列中间件「官方同步」

45 阅读3分钟

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操作,常见的包括:

  1. 打开文件 (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);
    
  • 删除文件 (unlinkremove): 删除文件。

    c深色版本
    
  •   int unlink(const char *pathname);
    
  • 同步文件内容 (fsync): 强制将缓存中的数据写入磁盘,保证数据的一致性。

    c深色版本
    
  1.  int fsync(int fd);
    

传统文件I/O的特点

  • 阻塞性: 传统的文件I/O操作通常是阻塞的,这意味着在一个读或写操作完成之前,程序将会暂停执行。这种模式适用于数据量不大或对实时性要求不高的情况。
  • 直接与内核交互: 传统文件I/O直接调用系统API与内核进行交互,因此其性能受到操作系统调度策略的影响。

应用场景

传统文件I/O非常适合于那些需要直接控制文件读写的应用程序,如文本编辑器、日志记录工具等。然而,在现代高性能服务端应用中,由于阻塞性带来的性能瓶颈,非阻塞I/O、异步I/O、甚至是用户态文件系统(如FUSE)等更高效的I/O模型逐渐成为主流。

理解这些基本概念有助于开发者更好地掌握文件I/O操作,并能根据不同的需求选择合适的I/O模型来优化程序性能。