Linux基础IO 零、前言 一、C语言文件IO 1、C库函数介绍 2、stdin/stdout/stderr 二、系统文件IO 1、系统调用介绍 2、系统调用和库函数 三、文件描述符 1、open返回值...2、制作使用动态库 零、前言 本章主要讲解学习Linux基础IO流的知识 一、C语言文件IO 1、C库函数介绍 具体详解博文: 文件操作超详解CSDN博客 打关文件fopen/fclose...对于任何语言来说,都有输入输出的需求,而不打开这三个输入出输出流文件,则无法使用这些接口 二、系统文件IO 1、系统调用介绍 操作文件,除了上述C接口(当然C++也有接口,其他语言也有),还可以使用系统接口...1、FILE 概念: 因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的,所以C库当中的FILE结构体内部,必定封装了fd 示例: #include...*_lock; #ifdef _IO_USE_OLD_IO_FILE }; 2、文件系统 命令 ls -l 查看文件信息: [root@localhost linux]# ls -l 总用量
这句话换到编程中就是 CPU 与外部存储器的输入输出,包括 CPU 本身的一,二,三级的缓存,内存,硬盘,网络,Usb 设备等等 Linux中的IO机制 阻塞与非阻塞 在调用IO函数时,如果需要等待IO...事件准备就绪才返回执行结果就是阻塞的IO调用,如果调用IO函数时,不需要IO事件准备就绪就可以返回结果就是非阻塞。...同步与异步 同步是指在非阻塞的前提下每次调用IO函数不一定会返回准备就绪的IO事件,所以需要不断地去调用IO函数查看是否有IO事件准备就绪。...异步是指在非阻塞的前提下每次调用IO函数后,本线程不在接管IO事件的处理,会告诉程序如果你有准备就绪的IO事件你就去把你的IO事件交给其他线程的函数处理。...多路复用IO技术 在早期的网络服务器中为了处理多个连接请求往往需要开辟多个线程,每个线程负责一个连接的处理,但是多线程需要进行CPU的上下文切换。
系统文件IO 打开文件的方式不仅仅是通过高级语言提供的fopen、ifstream等流式API,这些其实都是建立在系统调用之上的封装。操作系统才是真正负责文件打开和管理的最底层实现方案。...在Unix/Linux系统中,最基础的文件IO操作是通过系统调用如open()、read()、write()等完成的。...在学习这些系统文件IO接口之前,有一个重要的基础概念需要掌握:如何高效地传递标志位参数。这种方法在系统文件IO接口中被广泛使用。...引入系统文件I/O中的标志位传递 在Linux系统文件I/O中,标志位传递采用相同的位操作机制,尤其是open系统调用中。...一张图总结: 在Linux系统中,所有硬件外设和系统资源都被抽象为文件形式进行管理。
总结:狭义文件强调磁盘存储的永久性和硬件交互的IO本质,所有操作都围绕外设进行。 1.2 文件的广义理解 在Linux/Unix操作系统中,有一个重要的设计理念:"一切皆文件"。...操作系统的管理角色 操作系统作为磁盘的管理者,负责: • 文件系统的实现(如ext4, NTFS) • 磁盘空间分配与管理 • 文件缓存与IO调度 • 权限控制与安全机制 磁盘的管理者是操作系统:操作系统...(如Linux内核)负责磁盘的底层管理,包括文件系统组织、数据存储和安全控制。...系统调用与库函数 文件操作的实际执行路径: 用户程序调用库函数(如fopen/fread) 库函数封装系统调用(如open/read) 系统调用触发内核文件系统例程 内核与磁盘控制器交互完成IO 例如,...Linux 系统可通过 chmod() 提前设置权限。 总结 核心口诀: r 读,w 写(清空!),a 追加,b 二进制,+ 读写。
今天看到一篇文章,其中有几张图很有意思,进行记录一下,我相信如果你对IO子系统有初步了解的话,将会有一些收获: Linux 存储栈:涉及比较全面,分为文件系统层,块层,设备层三层; 对上图进行抽象后:...Buffer IO: 经典读写操作IO: 从磁盘到网络; 网络与磁盘读写IO: 参考来源: https://mp.weixin.qq.com/s/ccZJaRLq2-Ns9dJILigIgw...Linux Storage Stack Diagram
文件" 1、狭义理解 文件在磁盘里 磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的 磁盘是外设(即是输出设备也是输入设备) 磁盘上的文件 本质是对文件的所有操作,都是对外设的输入和输出 简称 IO...三、系统文件I/O 打开文件的方式不仅仅是fopen,ifstream等流式,语言层的方案,其实系统才是打开文件最底层的方案。...不过,在学习系统文件IO之前,先要了解下如何给函数传递标志位,该方法在系统文件IO接口中会使用到: 1、一种传递标志位的方法 #include #include ...而 open close read write lseek 都属于系统提供的接口,称之为系统调用接口 回忆一下我们讲操作系统概念时,画的一张图 系统调用接口和库函数的关系,一目了然。...perror("read"); break; } printf("%s", buf); fflush(stdout); } return 0; } printf是C库当中的IO
传统的 System Call I/O 在 Linux 系统中,传统的访问方式是通过 write() 和 read() 两个系统调用实现的,通过 read() 函数读取文件到到缓存区中,然后通过 write...存储设备的 I/O 栈 由图可见,从系统调用的接口再往下,Linux 下的 IO 栈致大致有三个层次: 文件系统层,以 write 为例,内核拷贝了 write 参数指定的用户态数据到文件系统 Cache...块层,管理块设备的 IO 队列,对 IO 请求进行合并、排序(还记得操作系统课程学习过的 IO 调度算法吗?)。 设备层,通过 DMA 与内存直接交互,完成数据和具体设备之间的交互。...结合这个图,想想 Linux 系统编程里用到的 Buffered IO、mmap、Direct IO,这些机制怎么和 Linux I/O 栈联系起来呢?...(甚至 Linux 2.4 还要求是文件系统逻辑块的整数倍)。
Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况,如果你想知道每个进程是如何使用IO的就比较麻烦,使用iotop命令可以很方便的查看。...iotop使用Python语言编写而成,要求Python2.5(及以上版本)和Linux kernel2.6.20(及以上版本)。iotop提供有源代码及rpm包,可从其官方主页下载。...有三种指定方式; -q:只在第一次监测时显示列名; iotop常用快捷键: 1)左右箭头:改变排序方式,默认是按IO排序。 2)r:改变排序顺序。 3)o:只显示有IO输出的进程。
1 传统的系统调用 I/O 在 Linux 系统中,传统的访问方式是通过 write() 和 read() 两个系统调用实现的,通过 read() 函数读取文件到到缓存区中,然后通过 write()...存储设备的 I/O 栈 由图可见,从系统调用的接口再往下,Linux 下的 IO 栈致大致有三个层次: 用: 文件系统层,以 write 为例,内核拷贝了 write 参数指定的用户态数据到文件系统...结合这个图,想想 Linux 系统编程里用到的 Buffered IO、mmap、Direct IO,这些机制怎么和 Linux I/O 栈联系起来呢?...上面的图有点复杂,我画一幅简图,把这些机制所在的位置添加进去: Linux IO系统 这下一目了然了吧?传统的 Buffered IO 使用 read 读取文件的过程什么样的?...(甚至 Linux 2.4 还要求是文件系统逻辑块的整数倍)。
:因为OS是软件,磁盘是硬件,硬件定位一个地址,用的是CHS,但是如果OS直接用了这个地址,万一硬件改变,OS也要发生变化,所以OS要和硬件做好解耦工作 ---- 第二点:即便是扇区512字节,单位IO...的基本数据量也是很小的,所以硬件是按照512字节处理, 操作系统实际进行IO,基本单位是4KB 操作系统和磁盘进行交互时,基本以4KB为单位, 基本大小:进行磁盘读取和磁盘写入时,必须以基本单位为基本大小...而且是统一更新的 为了防止Super Block区域坏掉,如果出现故障,整个分区不可以被使用,所以要做好备份 ---- Group Descriptor Table GDT:组描述符 -- 改组内的详细统计等属性信息...---inode表 ---- 文件的内容是变化的,用数据块对文件内容保存的,所以一个有效文件要保存内容就需要1/n数据块 若有多个文件就需要更多的数据块,数据块称为 Data blocks ---- linux...不正常工作 每一个比特位表示 一个inode是否空闲可用 ---- Block Bitmap 每一个bit位表示data block是否空闲可用 ---- 细节问题 1.inode与文件名 Linux
今日更新了Linux基础IO的内容 欢迎大家关注点赞收藏⭐️留言 理解文件系统 磁盘 图1,2是磁盘,图3是服务器,磁盘插入到服务器的凹槽中。...上图下半部分是磁盘文件系统图。 Linux文件系统特点:文件内容和文件属性 分开存储。 Block Group:文件系统会根据分区的大小划分为数个Block Group。...根目录是系统给我们的,是已知的,就可以找到目标文件了。这种逆向的路径解析由OS完成。这也是为什么Linux定位一个文件时,都要有路径的原因。...一个目录内部有几个目录=该目录引用计数-2 Linux系统中,不允许给目录建立硬链接。主要是为了避免路径环绕。...Linux中:.so(动态库) .a(静态库) windows中:.dll(动态库) .lib(静态库) 上图.c文件变成.o文件是翻译的过程。.
文件描述符 表示 宏 0 标准输入(stdin) STDIN_FILENO 1 标准输出(stdout) STDOUT_FINENO 2 标准错误(stderr) STDERR_FILENO 遵循Linux...open()系统调用 对文件进行读写之前,必须先打开文件。Linux提供了系统调用open()。...read()系统调用 文件打开后,就能够读文件了。read()是最基础、最常见的读取文件的机制。...系统调用write()时,数据从用户空间的缓冲区中拷贝到了内核空间的缓冲区,但并没有立即把数据写入磁盘中,这称为延迟写。延迟写的问题在于,如果在数据真正写入磁盘之前系统崩溃了,则数据可能丢失。...Linux系统也支持强制文件立即写入磁盘上,这在后面介绍。 close()系统调用 程序完成文件的读写后,调用close函数关闭文件描述符与文件之间的连接,使得文件描述符可以被重用。
在Linux系统中作为一个普通线程是非常苦逼的。不仅NMI 、硬中断、软中断可以打断它,甚至其它普通线程也可以来打断干扰到它的运行。...从Linux 5.14-rc1开始引入了一个新的tracer---(osnoise tracer)。就是从一个线程thread的角度把这些噪音全部详细统计出来。...统计到这个程度,感觉还是不够详细。 可以打开osnoise对应的trace event....代码实现: 在以上每个打断事件处理函数中都插上trace event的钩子函数 来统计事件的执行时间,然后在每个cpu上运行一个内核线程进行周期性统计....我在阅码场发布过一个视频课程,对linux系统中各个tracer的使用和代码实现都有非常详细的讲解: ---end---
而对于磁盘文件的管理,则离不开文件系统,本次文章将对此进行探讨。 磁盘的物理结构 磁盘是什么?...当然,OS进行IO的基本单位是可以进行调整的,一般都是4KB,即一个数据块的大小,这也是为什么磁盘会被称之为块设备的原因之一。这样也是为了提高IO效率,根据内存对齐原则。...同样,Linux操作系统为了更好的管理整个磁盘空间,也会对磁盘进行分区,对OS来说,管理好一个分区,就能管理好所有的分区(每一个分区的管理方法都一样),而为了更好的管理一个分区,又会在该区内进行分组管理...块组内的信息 如上所说,OS只需要管理好一个块组,就能管理好所有的块组,进而管理好一个分区,再进而管理好整个文件系统。那么,一个块组内,都包含些什么呢?...如下所示: 上面提到了一个inode节点,我们知道,Linux下一切皆文件,文件=内容+属性,Linux是将文件的内容与属性的数据分离开来,一个inode节点内,保存文件的各种属性信息,比如:文件的读写权限
存储设备的 I/O 栈 由图可见,从系统调用的接口再往下,Linux 下的 IO 栈致大致有三个层次: 文件系统层,以 write 为例,内核拷贝了 write 参数指定的用户态数据到文件系统 Cache...块层,管理块设备的 IO 队列,对 IO 请求进行合并、排序(还记得操作系统课程学习过的 IO 调度算法吗? )。 设备层,通过 DMA 与内存直接交互,完成数据和具体设备之间的交互。...结合这个图,想想 Linux 系统编程里用到的 Buffered IO、mmap、Direct IO,这些机制怎么和 Linux I/O 栈联系起来呢?...上面的图有点复杂,我画一幅简图,把这些机制所在的位置添加进去: Linux IO系统 这下一目了然了吧?传统的 Buffered IO 使用 read 读取文件的过程什么样的?...(甚至 Linux 2.4 还要求是文件系统逻辑块的整数倍)。
---- 二、系统文件I/O 文件操作除了上面我们所说的语言级别的文件操作,还有系统级别的文件操作调用接口。...stdin—>0,dup2(fd,0);//输入重定向 ---- 六、Linux一切皆文件 Linux一切皆文件: 在冯诺依曼体系中,我们知道硬件有键盘、显示器、磁盘、网卡等外设,在IO过程中,外设任何的数据处理都需要把数据读到内存...因为软硬件资源多,所以操作系统需要对其先描述,在组织。所以这些外设都有对应的结构体,对应着属性信息,同时,对应着自己的IO函数,具体硬件的读写方法都在应用匹配的驱动程序里。...每种硬件的访问方法都是不一样的,而Linux一切皆文件是这样体现的:任何一个被打开的文件结构体对象struct file{ //各种文件的属性 }对象,不同的文件对应的读写方法不一样,struct file...站在struct file上层看来,所有的设备和文件,统一都是struct file->,就可以调用具体的设备方法了,所以在用户级看到的就是Linux下一切皆文件!
前言 在基础IO(上)中,我们了解了文件相关的系统调用;以及文件描述符是什么,和操作系统是如何将被打开的文件管理起来的。...理解一切皆文件 我们知道:Linux下一切皆文件; 在windows中是文件的东西,在Linux下也是文件;一些在windows中不是文件的东西(磁盘,显示器,键盘等)这样的硬件硬件设备在Linux...在Linux操作系统中几乎所有(读文件,读系统状态,读PIPE)读操作都可以使用read函数来进行;几乎所有修改(修改文件,修改系统参数,写PIPE)操作都可以使用write函数进行。...一直在说Linux下一切皆文件,那它到底是什么,应该如何去理解呢? 我们知道操作系统是一款管理软硬件资源的软件,那操作系统是不是也要将硬件管理起来呢? 肯定要将硬件资源管理起来的,如何管理呢?...先描述,后组织 在Linux操作系统内核当中,存在一个struct device,它描述了硬件设备的相关信息;然后将这些硬件设备对应的struct device管理起来即可(将所有的struct device
在系统层面理解 我们操作文件(打开,关闭文件),本质上是进程对于文件的操作; 磁盘的管理者是操作系统; 我们在C/C++使用库函数来对文件进行读写操作,本质上是通过文件相关的系统调用去完成的。...Linux操作系统open接口就使用了一个参数来传递多个标志位。 2....还记得在程序运行时,C语言会默认给我们打开三个文件stdin、stdout和strerr; 在Linux操作系统中,进程默认情况下会有三个缺省打开的文件描述符(0、1、2),分别是标准输入、标准输出和标准错误...要想进行管理,那一定是先描述,再组织 **先描述:**操作系统要像对被打开文件进行管理,那就要先描述这些被打开文件;在Linux操作系统中就存在struct file结构体来描述这些被打开的文件(struct...)进行管理;在Linux操作系统中就存在一个全局链表,所以被打开文件的struct file都在这个链表当中。
【Linux系统】详解,进程控制-CSDN博客 本文我们来讲讲Linux中下一个重难点:文件的IO 理解文件 狭义理解 文件存储在磁盘中 磁盘的永久性存储介质...IO 文件IO不仅仅只有fopen、fwrite等语言提供的接口,系统也有对应的系统调用,并且系统调用是语言接口的根本 下面我们就来看看,文件IO的系统调用 标志位...这是因为系统中存在权限掩码umask。 感兴趣的同学可以看看这篇文章:【Linux】权限相关指令_linux 权限展示-CSDN博客 在:目录权限问题 -> 3.缺省权限。.../sysIO 1>log.txt 想要都写入log.txt中有两种方法: 法一: hyc@hyc-alicloud:~/linux/文件IO$ ....hyc@hyc-alicloud:~/linux/文件IO$ .
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。...2.2 iostat 下面再用更加专业的磁盘 IO 诊断工具来看下相关统计数据。 ? 它的相关字段说明如下: rrqm/s: 每秒进行 merge 的读操作数目。...://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/ [2] 理解Linux系统负荷 http://www.ruanyifeng.com.../en/interesting-articles/126-linux-wait-io-problem [10] Tracking Down High IO Wait in Linux http://ostatic.com...type=bbs [13] RAID卡 http://baike.baidu.com/view/95439.htm [14] Linux下的一些I/O统计工具 http://blogread.cn/it