文件低级IO深析

 可以说一切文件系统的基础是系统调用: open , creat, Xseek , read, write ... ,因为操作FS 必须不停的和IO进行打交道,要想获得高性能FS,就要在IO上下大功夫.另外高级IO没有提供读取文件的元数据的方式,比如文件的size, create Time

............................................................

各个IO操作参数不说,请参考APUE或其它,若不清楚,可以回帖一起讨论

    文件打开都是通过文件描述符进行应用,文件描述符是一个Non-Negative. 有 0 (standard inpu), 1(output), 2(erroor) ,在低级IO中用STDIN_FILENO, STDOUT_FILENO 和 STDERR_FILENO 进行代替.  文件描述符 是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表 .

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
	 int fd1,fd2;
	 fd1 = open("test", O_RDONLY, 0);
	 /* close(fd1); */			/**< 打开和关闭close注释查看文件描述符 */
	 fd2 = open("test", O_RDONLY, 0);
	 printf("%d\n",fd1);
	 return 0;
}


再看这段代码:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
	 int fd1,fd2,fd3;
	 fd1 = open("test", O_RDONLY, 0);
	 fd2 = open("test", O_RDONLY, 0);
	 fd3 = open("test", O_RDONLY, 0); 
//....不停的open呢?
	 printf("%d\n",fd3);
	 return 0;
}


总结:文件描述符是从0,1,2开始的, 打开的文件是从3开始计数,依次下去... UNIX限制一般在1024. 可用ulimit -n 查看,当然如果受限制你可以修改为4096 ,可以用    ulimit -HSn 65536 来修改


下面再看个有意思的:

read 和 write 的原型:

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, void *buf, size_t count);

注意到函数前的返回类型没? 这里说下ssize_t 为int型 ,而size_t为unsigned int .为什么不用size_t 留给读者去思考吧.


根据内核数据结构来分析IO操作.

下面仔细看下面的图:



示例程序,test文件中有crazy内容

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
	 int fd1,fd2;
	 char c;
	 fd1 = open("test", O_RDONLY, 0);
	 fd2 = open("test", O_RDONLY, 0);
	 read(fd1, &c, 1);
	 read(fd2, &c, 1);
	 printf("%c\n",c);
	 return 0;
}
请问输出什么?


此图分为三个表:依次为 描述符表,文件表,V-Node表

文件表:包含一些文件位置,引用计数(由描述符表指向的引用数)

V-Node表:包含一些 文件大小 ,文件类型等信息

此图是引用不同的文件.还可以共享文件,引用同一个文件.


再看下父子进程共享文件.


再来看这个程序,test还是 "crazy" 内容

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
	 int fd1;
	 char c;
	 fd1 = open("test", O_RDONLY, 0);
	 if (fork() == 0) {
		  read(fd1, &c, 1);
		  exit(0);
	 }
	 wait(NULL);
	 read(fd1, &c, 1);
	 printf("%c\n",c);
	 return 0;
}

输出什么?

...............................

最后来看下dup2 ,先看段代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
	 int fd1,fd2;
	 char c;
	 fd1 = open("test", O_RDONLY, 0);
	 fd2 = open("test", O_RDONLY, 0);
	 read(fd2, &c, 1);
	 dup2(fd2, fd1);
	 read(fd1, &c, 1);
	 printf("%c\n",c);
	 return 0;
}

先运行下看结果,test文件中内容为crazy 输出为 r .

再来看下图:



再参考原先这个图



描述符1对应于文件A,描述符4对应于文件B,A和B的引用计数都为1 ,dup2(4,1)后,两个文件描述符都指向B,文件A和它的文件表和V-node表都已经删除.文件B的引用计数增加了1 现在为2 .


(读 <<Computer Systems A Programmer's Perspective>> 总结)


原文链接: http://blog.csdn.net/crazyjixiang/article/details/6581291

转载于:https://my.oschina.net/chen106106/blog/51189

主要内容:本文详细介绍了一种QRBiLSTM(分位数回归双向长短期记忆网络)的时间序列区间预测方法。首先介绍了项目背景以及模型的优势,比如能够有效利用双向的信息,并对未来的趋势上限和下限做出估计。接着从数据生成出发讲述了具体的代码操作过程:数据预处理,搭建模型,进行训练,并最终可视化预测结果与计算分位数回归的边界线。提供的示例代码可以完全运行并且包含了数据生成环节,便于新手快速上手,深入学习。此外还指出了模型未来发展的方向,例如加入额外的输入特性和改善超参数配置等途径提高模型的表现。文中强调了时间序列的标准化和平稳检验,在样本划分阶段需要按时间序列顺序进行划分,并在训练阶段采取合适的手段预防过度拟合发生。 适合人群:对于希望学习和应用双向长短时记忆网络解决时序数据预测的初学者和具有一定基础的研究人员。尤其适用于有金融数据分析需求、需要做多一步或多步预测任务的从业者。 使用场景及目标:应用于金融市场波动预报、天气状况变化预测或是物流管理等多个领域内的决策支持。主要目的在于不仅能够提供精确的数值预计还能描绘出相应的区间概率图以增强结论置信程度。 补充说明:本教程通过一个由正弦信号加白噪构造而成的简单实例来指导大家理解和执行QRBiLSTM流程的所有关键步骤,这既方便于初学者跟踪学习,又有利于专业人士作为现有系统的补充参考工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值