读书笔记系列深入理解计算机系统之IO

前言

输入输出(I/O)是主存和外部设备(磁盘,终端,网络)之间复制的过程。

Unix I/O

所有语言都提供执行I/O的工具。ANSI C提供标准I/O库,在Linux系统中,通过内核提供系统级I/O库,在Linux系统中,通过内核提供系统级I/O函数。 所哟I/O设备都被模拟为文件,Linux内核提供一个简单,低级的应用接口,通过统一的输入,输出方式来执行。

文件

每个linux文件有一个类型表示身份

内核组织所有文件为一个目录层次结构,每个文件都直接或间接是根目录的后代。目录之间通过绝对路径名和相对路径名

不足值

linux内核打开,关闭,读写文件都以不同函数,不同参数来进行,有些情况下,read读函数和wirte写函数传送字节比应用程序要求的少,称为不足值。

RIO

通过RIO自动处理上面的不足值,RIO提供两类函数

除此外linux还提供,读取文件元数据,读取目录和内容,以及I/O重定向的函数

java,c等语言基于Unix I/O的实现,提供了比Unix I/O更高级别的代替,更简单,但是由于标准I/O和网络文件一些互不相容的限制,Unix I/O比标准I/O更适合网络应用程序。

网络编程

客户端-服务器编程模型

每个网络应用都是基于客户端-服务器模型,一个应用由一个服务器进程和一个或多个客户端进程组成。服务器管理资源,通过操作资源来为客户端提供服务。 客户端-服务器模型中级别操作是事务。由以下四步组成:

  1. 客户端需要服务时,向服务器发送请求,发起一个事务。
  2. 服务器收到请求,解释它,并以适当方式操作资源。
  3. 服务器给客户端发送一个响应,并等待下一个请求
  4. 客户端收到响应并处理它

对主机而言,网络只是一种I/O设备,从网络上接收到的数据从适配器经过I/O和内存总线复制到内存。反之也能复制到网络。

物理上而言,网络是一个按照地理远近组成层次系统。最低层是LAN(局域网),最流行局域网技术是以太网,一个以太网段包括一些电缆(双绞线)和一个叫做集线器的小盒子,每根电缆由相同的最大位带宽,一端连接主机适配器,另一端连接集线器一个端口,集线器将收到的数据复制到其他端口进行发送。每个主机适配器都有全球唯一48位地址,每个主机发送以为单位的数据到这个网段上其他任何主机,包括一些固定数量头部,标识源和目的,帧长度,有效载荷,每个主机适配器都能看到这个帧,但只有目的主机读取它。

此处输入图片的描述

以太网段通过电缆和网桥连接位较大的局域网,称为桥接以太网

此处输入图片的描述

在更高层次中,多个不兼容局域网可通过叫做路由器特殊计算机连接起来,组成互联网络

互联网络很重要特性是,由不同和不兼容技术各种局域网和广域网组成,每台主机和每台主机都是物理相连,他们之间能够不互斥的进行数据传输依靠的是遵守相同的协议软件。 协议应该具备级别能力

主机和路由器通过相同协议在不兼容局域网间传送数据,如图:

此处输入图片的描述

  1. 位于主机A的客户端进行系统调用,将数据从虚拟地址空间复制到内核缓冲区
  2. 主机A的协议软件在传输数据前附加网络包头和LAN1帧头,创建LAN1的帧。LAN1帧头寻址到路由器,然后传送帧到适配器。LAN1帧有效载荷时互联网包,而互联网包有效载荷是实际用户数据。
  3. LAN1适配器复制到该帧到网络上
  4. 当帧到达路由器时,路由器LAN1适配器从电缆读取,并传送到协议软件
  5. 路由器从互联网包头中提取出目的地址,作为路由表索引,决定向哪里转发该包,剥落旧的LAN1帧头,封装为新的LAN2帧头,并把帧传送到适配器。
  6. 路由器LAN2适配器复制该帧到网络上
  7. 当此帧到达主机B时,适配器从电缆读到此帧,并传送到协议软件。
  8. 最后主机B剥落包头,帧头,读取数据到到虚拟地址空间

因特网客户端和服务器混合使用套接字接口函数和Unix I/O函数进行通信,套接字实现为系统调用,陷入内核,并调用各种内核模式的TCP/IP函数。

TCP/IP是现代计算机都支持的协议,IP协议提供基本命名方法递送机制。TCP是建立在IP上的复杂协议,提供进程间可靠的全双工连接。

不同主机有不同主机字节顺序,TCP/IP为任意整数数据项定义统一网络字节顺序,如IP地址总是使用大端法进行存储,解析

ip地址很难记住,我们通常使用域名来代替。域名集合形成一个层次结构

此处输入图片的描述

因特网定义了域名集合和IP地址间映射,很久以前是通过HOSTS.TXT文本文件手工维护。以后通过分布世界范围内的数据库DNS 进行维护,每个DNS由上百万主机条目。

主机之间的通过连接发送和接收字节流来通信,从连接一对进程意义上而言,连接是点对点的。套接字是连接的端点。每个套接字都有地址,由因特网地址和一个16位整数接口组成,用“地址:端口”表示。当发起连接请求时,内核自动分配客户端套接字地址中端口,而服务器套接字地址中端口是知名端口,一个连接由两端套接字地址唯一确定,叫做套接字对

套接字接口是一组函数(socket,connect,bind,listen,accept),它们和Unix I/O函数结合起来创建网络应用,linux提供函数将主机名,主机地址,服务名,端口号的字符串表示转化成套接字地址结构