重要知识点

输入/输出(I/O)

I/O是主存和外部设备(如磁盘驱动器、终端和网络)之间拷贝数据的过程。

  • 输入操作是从I/O设备拷贝数据到主存。
  • 输出操作是从主存拷贝到I/O设备。

Unix I/O

在unix中所有的I/O设备都被模型化为文件,这使得所有的输入输出都能以一种统一的方式进行。

  • 打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。

    Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)。头文件<unistd.h>定义常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,可用来代替显式的描述符值。

  • 改变当前文件位置:对于每一个打开的文件,内核保持着一个文件位置k,初始时为0。这个文件位置是从文件开头起始的字节偏移量。应用程序能够通过执行seek操作,显示地显示当前文件位置。
  • 读写文件:一个读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将增加到k+n。给定一个大小为m字节的文件,当k>=m时执行读操作会触发一个称为end-of-file(EOF)的·条件,应用程序会检测到这个符号。注:在文件结尾处并没有明确的"EOF符号"。
  • 关闭文件:当应用完成对文件的访问后,它会通知内核关闭这个文件。内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放了它们的存储器资源。

打开和关闭文件

进程通过调用open函数来打开一个存在的文件或者创建一个新文件。

  • filename为文件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没打开的最小描述符。
  • flags参数指明了进程打算如何访问这个文件

flags参数:

  • O_RDONLY:只读。
  • O_WRONLY:只写。
  • O_RDWR:可读可写。
  • O_CREAT:如果文件不存在,就创建它的一个截断的(空)文件。
  • O_TRUNC:如果文件存在就截断它。
  • O_APPEND:在每次写操作前,设置文件位置到文件结尾处。
  • mode参数指定了新文件的访问权限位, 同时作为上下文的一部分,每个进程都有一个umask,其通过umask函数来设置。文件的访问权限=mode&(~umask)。

    访问权限位:

进程通过close函数关闭一个打开的文件。

关闭一个已关闭的描述符会出错。

读和写文件

程序通过调用read和write函数来执行输入和输出的。

注:size_t:被定义为unsigned int,ssize_t被定义为int。

RIO包

RIO包会自动处理读写文件值出现的不足值。其提供了两类不同的函数:

  • 无缓冲的输入输出函数:这些函数直接存在存储器和文件之间传送数据,没有应用级缓冲·。它们将对二进制数据读写到网络和从网络中读写二进制数据尤其有用。
  • 带缓冲的输入函数:这些函数允许高效地从文件中读取文本行和二进制数据,这些文件的内容缓存在应用级缓冲区内,类似于为像printf这样的标准I/O函数提供的缓冲区

元数据

元数据即文件的信息。应用程序能通过调用stat和fstat函数检索元数据。

内核表示打开文件的数据结构

  • 描述符表:每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开描述符表项指向文件表中的一个表象。
  • 文件表:打开文件的集合是由一个张文件表来表示的,所有进程都共享这张表。每个文件表的表项组成包括当前文件位置、引用计数(即当前指向该表的描述符项目数),以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的引用记数。内核不会删除这个文件表表项,直到他的引用计数为零。
  • v-node表:同文件表一样,所有的进程共享这张v-node表。每个表项都包含stat结构中的大多数信息包括st_mode和st_size成员。

I/O重定向

Unix外壳提供I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。一般通过调用dup2函数实现I/O重定向。

标准I/O

ANSI C定义了一组高级输入输出函数,称为标准I/O库,为程序员提供Unix I/O的较高级别的替代。

 该库提供:

  • 打开和关闭文件的函数。
  • 读和写字节的函数。
  • 读和写字符串的函数。
  • 复杂的格式化的I/O函数。

标准I/O库将一个打开的I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。每个ANSI C程序开始时都有三个打开的流stdin、stdout和stderr,分别对应于标准输入、标准输出和标准错误:

FILE的流是文件描述符和流缓冲区的抽象。

 流缓冲区的目的(与RIO读缓冲区的一样):使开销较高的Unix I/O系统调用的数量尽可能小。

遇到问题

问题:

  使用课本上定义的csapp.h编译错误。

  

解决方法:

  从同学那获取了官网的csapp.h头文件,即可通过编译。

参考资料

    《深入理解计算机系统》第10章系统级I/O。

系统级I/O学习记录的更多相关文章

  1. 系统级IO实践学习记录

    代码分析 cp1.c 功能:复制文件. #include <stdio.h>#include <stdlib.h>#include <unistd.h>#inclu ...

  2. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型

    1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of ...

  3. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST

    1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...

  4. 02 | 日志系统:一条SQL更新语句是如何执行的? 学习记录

    <MySQL实战45讲>02 | 日志系统:一条SQL更新语句是如何执行的? 学习记录http://naotu.baidu.com/file/ad320c7a0e031c2d6db7b5a ...

  5. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer

    1.前言 2.generate timer 2.1 概述 提供了一个系统计数器,用来实时测量流逝的时间: 提供了一个虚拟计数器,用来测量某个虚拟机上流逝的虚拟时间: 定时器,每隔一段时间会触发事件,支 ...

  6. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  7. IA32系统级架构总览(一) 实模式和保护模式

    应用程序的编写大部分的时候是不必关心系统级架构的,最多学习一下平台所给的API即可,也就是我们通常说的黑箱子.但是在学习操作系统的时候,系统级架构是要关心的. 系统级架构很难学习,其中一个很大的原因是 ...

  8. 系统级性能分析工具perf的介绍与使用[转]

    测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...

  9. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

随机推荐

  1. navicat 连接sqlserver提示要安装 sql server native client

    navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

  2. 人机交互—对win10自带输入法的评价

    在我的电脑换成win10系统后我就用他自带的输入法,它可以中英文切换,用起来很方便,就用了它,就没有下载别的输入法. 用户界面:这个输入法的界面非常简单,没有像搜狗,百度之类的皮肤一说,看起来很简单, ...

  3. Spring-2-H Array Diversity(SPOJ AMR11H)解题报告及测试数据

    Array Diversity Time Limit:404MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Descript ...

  4. (ios)ARC常用设置,部分文件编译设置ARC

    1设置 整个项目是否支持ARC 选择No 不支持 YES 支持 2 设置部分文件是否支持ARC. 支持ARC的Flags -fobjc-arc   不支持的Flags -fno-objc-arc

  5. 烂泥:为KVM虚拟机添加网卡

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前几篇文章介绍了有关KVM安装虚拟机以及如何给虚拟机添加硬盘,今天我们再来介绍下有关如何给KVM虚拟机添加网卡. 给KVM虚拟机添加网卡,可以分为两种形 ...

  6. Linux系统搭建LAMP平台

    知识背景(来自:百度百科): LAMP指的Linux(操作系统).Apache HTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一 ...

  7. NOIP2008提高组(前三题) -SilverN

    此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0 ...

  8. OpenStack overview 笔记

    Example architecture example architecture 至少需要两个节点启动一个虚拟机或者实例.可选的服务,例如Block storage和Object storage需要 ...

  9. 用javascript得到客户端IP的新方法

    javascript得到客户端IP的新方法 很久以来,我都是经过http://fw.qq.com/ipaddress来得到客户端用户的IP,这个方法简单.快速.实用 . 我们调用它的写法是: < ...

  10. 一道题看bitset应用 --ZOJ 3642

    题意:给n个文件,包括文件名和文件大小,然后给出k个关键词,查询包含该关键词的文件的大小总和.文件名为一些中括号括起的关键词的合集. 解法:可用bitset记录每一个关键词在哪些文件中出现,然后查询即 ...