CSAPP深入理解计算机系统笔记 第10章 系统级I/O 知识点总结,详细

  • 现实世界里,应用程序利用操作系统提供的服务来与I/O设备及其他程序通信。
  • 这一章讲述Unix操作系统提供的基本I/O服务,以及如何使用这些服务来构造应用程序。
    例如Web客户端和服务器,他们是通过Internet彼此通信的。
  • 将学习编写诸如Web服务器这样的可以同时为多个客户端提供服务的并发程序。
    编写并发应用程序,还能使程序在现代多核处理器上执行的更快。
  • 输入/输出(I/O):是在储存和外部设备(磁盘驱动器、中端和网络等)直接复制数据的过程。
  • 输入操作:从I/O设备复制数据到主存。
  • 输出操作:从主存复制数据到I/O设备。
  • Unix I/O
    • 一个Linux文件就是一个m个字节的序列:


      所有的I/O设备(网络、磁盘、终端)都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。
    • Unix I/O:将设备映射为文件的方式,允许Linux内核,引出一个简单、低级的应用接口,称为Unix。
    • 使得所有的输入和输出都能以一种统一且一致的方式来执行:
      • ①打开文件。
        一个应用程序通过要求内核,打开相应的文件,来宣告他想要访问一个I/O设备。内核反回一个小的非负整数,叫描述符,在后续对此文件的所有操作中标识这个文件。内核记录有关这个打开文件的所有信息。应用程序只需记住这个描述符。
      • ② Linux shell创建的每个进程开始时都有三个打开的文件:
        • 标准输入(描述符为0)
        • 标准输出(描述符为1)
        • 标准错误(描述符为2)
          头文件<unistd.h>定义了常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,他们可用来代替显示的描述符值。
      • ③改变当前的文件位置。
        对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。应用程序能够通过执行seek操作,显式地设置文件的当前位置为k。
      • ④读写文件。
        一个读操作就是从文件复制n>0个字截到内存,从当前文件位置k开始,然后将k增加到k+n。
        给定一个大小为m字节的文件,当k≥m时,执行读操作会触发一个称为end-of-file(EOF)的条件,应用程序能检测到这个条件。在文件结尾处并没有明确的“EOF符号”。
        类似的,写操作就是从内存复制n>0个字节到一个文件,从当前文件位置k开始,然后更新k。
      • ⑤关闭文件。
        当应用完成对文件的访问之后,就通知内核关闭这个文件。作为响应内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程应为何种原因终止时,内核都会关闭所有打开的文件并释放他们的内存资源。
  • 文件
    • Linux文件的类型(type):
      • ①普通文件(regular file)包含任意数据。
        应用程序常常要区分文本文件和二进制文件:
        文本文件(text file):只含有ASCII或Unicode字符的普通文件。
        二进制文件(binary file):所有其他的文件。
        对内核而言,本文件和二进制文件没有区别。
        Linux文本文件包含了一个文本行(text file)序列,其中每一行都是一个字符序列,以一个新行符(\n)结束。新行符与ASCII的换行符(LF)是一样的,其数字值为0x0a。
      • ②目录(directory)包含一组链接(link)的文件,其中每个链接都将一个文件名(filename)映射到一个文件,这个文件可能是另一个目录。
        每个目录至少还有两个条目:“.”是到该目录自身的链接,以及“..”适当目录,层次结构中父目录(parent directory)的链接。
        ​mkdir:命令创建一个目录
        ​1s:查看其内容
        ​rmdir:删除该目录
      • ③套接字(socket)用来与另一个进程进行跨网络通信的文件。
    • 其他文件类型包含命名通道(named file)、符号链接(symbolic link)、字符和块设备(character and block device)。
    • Linux内核,将所有文件组织成一个目录层次结构(directory hierarchy),由名为/(斜杠)的根目录确定。下图显示了Linux系统的目录层次结构的一部分:


      系统中的每个文件都是根目录的直接或间接的后代。
    • 每个进程都有一个当前工作目录(current working directory)来确定其在目录层次结构中的当前位置。
      cd:修改shell中的当前工作目录。
    • 目录层次结构中的位置,用路径名(pathname)来指定。
    • 路径名是一个字符串,包括一个可选斜杠,其后紧跟一系列文件名,文件名之间用斜杠分隔。
    • 路径名的两种形式:
      • ①绝对路径名(absolute pathname)以一个斜杠开始,表示从根节点开始的路径。
        例如Hello.c的绝对路径名为/home/droh/hello.c。
      • ②相对路径名(relative pathname)以文件名开始,表示从当前工作目录开始的路径。
        例如如果/home/droh是当前工作目录,那么hello.c的相对路径名就是./hello.c。反之,如果/home/bryant是当前工作目录,那么相对路径名就是../home/droh/hello.c。
  • 打开和关闭文件
    • 进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件。

       

    • open函数将filename转化为一个文件描述符,并且返回描述符数字。
    • 返回的描述符总是在进程中当前没有打开的最小描述符。
    • flags参数指明了菁纯打算如何访问这个文件:
      • ①O
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sabrikii

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值