4.1 缓存 buff 说明 一般设置缓存 buff  的大小是由一定的规律的,就是根据磁盘块的大小来定. Linux下输入命令: df -k  查看磁盘 可以用命令查看下 /dev/sda1 磁盘的磁盘说明 sudo tune2fs -l /dev/sda1 Block size 就是磁盘块的大小,这个磁盘块的大小为 4M ,那么就可以设置缓存 buff 大小为 4096,一次就可以将数据写入. 设置的缓存大小最好与磁盘块的大小保持一致,有利于提升读写文件的效率. 4.2 操作文件中内核数据结…
3. 文件I/O的内核数据结构 (1) 内核数据结构表 数据结构 主要成员 文件描述符表 ①文件描述符标志 ②文件表项指针 文件表项 ①文件状态标志(读.写.追加.同步和非阻塞等状态标志) ②当前文件偏移量 ③i节点表项指针 ④引用计数器 i节点 ①文件类型和对该文件的操作函数指针 ②当前文件长度 ③文件所有者 ④文件所在设备.文件访问权限 ⑤指向文件数据在磁盘块上所在位置的指针等. (2)3张表的关系 4. 文件的原子操作 (1)文件追加 ①打开文件时使用O_APPEND标志,进程对文件偏移量…
open调用将引入原子atomicity操作的概念. 将某一系统调用所要完成的各个动作作为不可中断的操作,一次性加以执行. 原子操作是许多系统调用得以正确执行的必要条件. 还介绍一个系统调用fcntl,并学习其应用之一读取和设置打开文件的状态标志. 审视用于表示文件描述符和已打开文件的内核数据结构.理解这些数据结构有助于理解文件IO中的微妙之处.给予这一模型,还会解释如何复制文件描述符. 然后会讨论一些支持扩展功能的读写调用.此类调用可以在不改变文件当前偏移量的情况下,在文件的特定位置进行读写操…
在unix世界中视一切为文件,无论最基本的文本文件还是网络设备或是u盘,在内核看来它们的本质都是一样的.大多数文件IO操作只需要用到5个函数:open . read . write . lseek 以及 close. 这些函数并不是 ISO C 的组成部分,而是unix的系统调用函数.相比较ISO C中带缓冲的IO操作函数,它们是不带缓冲的IO函数.它们之间的区别看上去是这样的: 可以简单的这么来理解,write函数直接将内容写到文件中.而像printf这样的函数将内容先写到缓冲区,然后由缓冲区…
春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动.  上周末在元大都遗址公园海棠花溪拍的海棠花.   进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定open的flag参数,以特定的文件描述符打开某一文件. 这两个flag会对写盘的性能有很大的影响,因此对这两个flag做一些详细的了解. 先看一个open函数的使用例子. /* Open new or existing file for reading and wrting, sync io and…
3.文件io 3.1 文件内核数据结构 3.2 复制文件描述符的内核数据结构 3.3 对指定的描述符打印文件标志 #include "apue.h" #include <fcntl.h> int main(int argc, char *argv[]) { int val; if (argc != 2) err_quit("usage: a.out <descriptor#>"); if ((val = fcntl(atoi(argv[1])…
一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进程共享资源(包括文件)时,会有很多额外的烦恼,需要对共享资源.原子操作等概念深入理解,需要理解涉及的内核有关数据结构,这些数据结构对理解文件.共享有重要作用: 最后介绍dup.fcntl.sync.fsync和ioctl函数. 二.文件描述符 open或creat文件时,内核--文件描述符fd-->…
一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表. 1.1.2. 文件描述符这个数字是open系统调用内部由操作系统自动分配的,操作系统分配这个fd时也不是随意分配,也是遵照一定的规律的:fd从0开始依次增加.fd也是有最大限制的,在linux的早期版本中(0.11)fd最大是20,所以当时一个进程最多允许打…
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)…
目录 . 进程相关数据结构 ) struct task_struct ) struct cred ) struct pid_link ) struct pid ) struct signal_struct ) struct rlimit . 内核中的队列/链表对象 ) singly-linked lists ) singly-linked tail queues ) doubly-linked lists ) doubly-linked tail queues . 内核模块相关数据结构 ) st…
Chapter5 深入探究文件I/O 本章节将介绍另一个与文件操作相关的系统调用:多用途的fcntl(),并展示其应用之一读取和设置打开文件的状态标志. 5.1 原子操作和竞争条件 所有系统调用都是以原子操作方式执行的.是以为内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断. 以独占方式创建一个文件: 当同时制定O_EXCL与O_CREAT作为open()标志位时,如果要打开的文件已存在,则open()将返回一个错误.保证了进程是打开文件的创建者.…
C3:文件IO 1 引言 本章描述的函数被成为不带缓冲的IO,涉及5个函数:open.read.write.lseek.close. 文件控制:dup.sync.fsync.fdatasync.fcntl.ioctl. 2 文件描述符 文件描述符为非负整数,取值范围为0 - OPEN_MAX - 1,调用open.create返回参数路径的文件描述符,可以作为传递给read.write. 可使用shell命令查询系统对OPEN_MAX定义,grep -rn --col OPEN_MAX /usr…
1.文件IO 2.文件与目录 3.进程 4.多线程编程 5.信号 6.进程间通信 学习linux编程,首先要学会使用shell,这里一些基础命令就不介绍了.这里唯一要提的一个shell命令就是man.man是任何一个开发者都应该学会经常使用的工具,使用man比去查看任何一本教材都要来的快速准确.man可以查看一下内容: 1.一般命令(shell命令)2.系统调用(open write等直接陷入内核的函数)3.子函数(C函数库等不直接陷入内核的函数)4.特殊文件(/dev/zero等linux系统…
I/O管理器 nt!_IRP IRP表示一个I/O请求包结构体,它用来封装执行一个特定I/O操作所需要的所有参数以及I/O操作的状态.IRP的表现也类似于一个线程独立调用栈因此它可以从一个线程传递到另一个线程,也可以通过驱动实现的队列传递给一个DPC例程.IRPs是Windows异步I/O处理模型的关键所在,应用程序可以发出一连串的I/O请求并继续执行其他代码,而与此同时I/O请求会被驱动或硬件设备处理.这种异步模型允许相当大的吞吐量且可以实现最佳资源利用.IRPs通过I/O管理器组件分配,由W…
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy内核代码. 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦.让我们看一下下面这张图. 图一 1.       穿越各层写文件方式 程序的最终目的是要把数据写到磁盘上, 但是系统从通用性和性能角…
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy内核代码. 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦.让我们看一下下面这张图. 1. 穿越各层写文件方式 程序的最终目的是要把数据写到磁盘上, 但是系统从通用性和性能角度,尽量提供一个折…
1.函数open和函数openat #include<fcnl.h> int open(const char *path,int oflag,.../*mode_t mode */) int openat(int fd,const char *path,int oflag,.../*mode_t mode*/) //两个函数的返回值:若成功,返回文件描述符:若出错,返回-1 oflag 参数可用来说明此函数的多个选项.用下列一个或者多个常量进行“或运算”构成oflag参数.(常量定义在头文件&…
注:Unix \ Linux 环境下的network IO   用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000…
为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不再是我焦虑. 每一个底层细节的攻克,就越发觉得自己对计算机一无所知,这可能就是对知识的敬畏. 新IO和传统IO-intsmaze 新IO和传统IO都是用于进行输入/输出.  新IO采用了内存映射的方式来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了,通过…
上篇文章已经讲过了文件系统的一些基本的概念,这里首先对文件IO进行详细的学习,文件IO也称为系统调用IO,是操作系统为"用户态"运行的进程和硬件交互提供的一组接口,即操作系统内核留给用户程序的一个接口,按照操作系统的结构划分,Linux系统自上而下依次是:用户进程.Linux内核.物理硬件.其中Linux内核包括系统调用接口和内核子系统两部分.Linux内核处于“承上启下”的关键位置,向下管理物理硬件,向上为操作系统和应用程序提供接口,这里的接口就是系统调用. 下面依次介绍linux系…
一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台. 标准I/O:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准I/O库处理很多细节.例如缓存分配,以优化长度执行I/O等.标准的I/O提…
本文转载自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html 先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准IO库处理很多细节.例如缓存分配,以优化长度执行IO等.标准的IO提供了三种类型的缓存. (1)全缓存:当填满标准IO缓存后才进行实际的IO操作.         (2)行缓存:当输入或输出中遇到新行符时,标准…
这篇文章写的比较全面,也浅显易懂,备份下.转载自:http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy内核代码. 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好…
1.文件描述符 文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时候,内核向进程返回一个文件描述符,新打开文件返回文件描述符表中未使用的最小文件描述符.Unix系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与进程的标准输出相关联,文件描述符2与进程的标准出错相关联,在POSIX标准中,幻数0.1.2应当替换为符号常量STDIN_FILENO.STDOUT_FILENO和STDERR_FILENOLinux最大打开文件描述符数 cat /proc/sys/fs/fi…
先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准IO库处理很多细节.例如缓存分配,以优化长度执行IO等.标准的IO提供了三种类型的缓存. (1)全缓存:当填满标准IO缓存后才进行实际的IO操作.         (2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作.         (3)不带缓存:stderr就是了. 文件IO:文件IO称之为不带缓存的IO(u…
前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应用程序开发标准教程>的前几章没必要看了,都是写浅显的知识点,从第六章文件IO编程开始记录笔记.后期再根据APUE的内容进行补充和扩展. 一.linux系统调用及API 1. 系统调用 linux分为内核空间和用户空间,用户空间无法直接访问内核空间.内核通过系统调用为用户提供服务,很精简,大约250个左右…
四种 IO 模型:       首先需要明确,IO发生在 用户进程 与 操作系统 之间.可以是客户端IO也可以是服务器端IO. 阻塞IO(blocking IO):     在linux中,默认情况下所有socket都是blocking:kernel和用户都在阻塞等待数据.   非阻塞IO(non-blocking):        用户程序重复调用系统调用 recvfrom ,等待 return OK信号. polling轮询         为什么没有Block:用户进程发出read请求后…
前同事的文章,觉得写得很清晰,收藏了. http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy内核代码. 阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架…
内核数据结构 Linux内核实现了这些通用数据结构,而且提倡大家在开发时重用. 内核开发者应该尽可能地使用这些数据结构,而不要自作主张的山寨方法. 通用的数据结构有以下几种:链表.队列.映射和二叉树 一.链表 1.1 单向链表和双向链表 链表是Linux中最简单.最普通的数据结构. 最简单的数据结构表示一个链表: /* 一个链表中的一个元素 */ struct list_element { void *data; /* 有效数据 */ struct list_element *next; /*…
本文所述是针对 linux 引入了虚拟内存管理机制以后所涉及的知识点.linux 中页缓存的本质就是对于磁盘中的部分数据在内存中保留一定的副本,使得应用程序能够快速的读取到磁盘中相应的数据,并实现不同进程之间的数据共享. 因此,linux 中页缓存的引入主要是为了解决两类重要的问题: 磁盘读写速度较慢(ms 级别); 实现不同进程之间或者同一进程的前后不同部分之间对于数据的共享: 如果没有进程之间的共享机制,那么对于系统中所启动的所有进程,在打开文件的时候都要将需要的数据从磁盘加载进物理内存空间…