• linux 文件io


    一:

    在linux下,fwrite和fread都是对一个file*(文件流指针)进行操作,这个指针指向一个文件流缓冲区,默认大小所所所所是是8192byte

    在读写的过程中,如果读10个字符,一个都读完或者是1次读取一个1个读10次,哪一种效率比较高,当然是前一种,这涉及到硬件性能的知识,我们在读取或者写入数据的时候,我们都采用一种探针寻址计数,这是一种硬性能(当然还有软性能),探针多次移动必然会耗费更多的性能

    首先,我们针对一个程序看看Windows和linux是如果执行的

    eg:   printf(“hello world”);

    那么这么一句话是如果显示到屏幕上的呢?

    在windows :

    1:首先处于应用层,我们执行fread、fwrite,操作file*,将字符串存在文件流缓冲区中,之后向底层传递

    2:传到kernel层,kernel层有一个内核缓冲区,于是字符串存在了内核缓冲区中,之后再次向底层传递,这里由文件流缓冲区到内核缓冲区发生了一次中转

    3:传到驱动层(硬件层),iowrite调用显示设备,将字符串输出到显示器上

    在linux:

    大体和windows相同,只不过linux没有文件流缓冲区,所以,在应用层到内核层转换中直接存到内核缓冲区了,不需要发生一次中转

    在效率上看

    从应用层看,Windows效率高,linux需要一个个写入,但是linux没有写入数量的限制,Windows限制8192

    从内核层看,linux效率高,因为少了一次中转,

    读写的时候,除了read时候Windows多了一次中转,别的说不好谁的效率高。最高的性能往往是和cpu有关的

    二:pcb的概念

    pcb(进程控制块)

    处于内核中,描述进程管理的,每一个进程都会存在一个自己的PCB

    主要包含两个结构体

    task_struct结构体,主要就是一个数据结构

    它记录了一下几个类型的信息:

    1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。

    2.性质,由于unix有很多变种,进程有自己独特的性质。

    3.资源,资源的链接比如内存,还有资源的限制和权限等。

    4.组织,例如按照家族关系建立起来的树(父进程,子进程等)。

    files_struct(一个point)指向一个文件描述符表,其实就是一个int类型的数组

    一个文件打开的时候默认打开3个文件描述符

    STDIN_FILENO     0

    STDOUT_FILENO   1

    STDERR_FILENO   2

    新产生的文件描述符默认未使用最小

    fd=open(argv[index],O_RDONLY| O_CREAT,0664)

    OPEN种flag值

    O_RDONLY

    O_WRONLY

    O_RDWR

    三:冗错处理

    perror(),把错误的信息输出出来,(内置错误处理)

    errno是处于进程用户区间的一个全局变量,当报错的时候errno会被赋值一个整数表示错的编号,

    perror找到errno的值,找对对应的错误信息(一个字符串),并输出

    四:

    对于touch的文件默认权限666,gcc后的可执行文件默认权限777,如果umask不为0

    那么则由默认权限&(~umask)

     首先要明确一点,在Linux系统中一切都可以看成是文件,你的文档是文件、程序是文件、设备也是文件、显示屏、键盘、网口都可以看做是文件,而且在linux中也确确实实是这样。而文件又可分为:普通文件、目录文件、链接文件和设备文件。
      文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都要通过文件描述符进行操作。
      一个进程默认打开3个文件描述符:

    STDIN_FILENO   0
    STDOUT_FILENO  1
    STDERR_FILENO   2

    POSIX标准规定:新打开文件返回文件描述符表中未使用的最小文件描述符。

     文件描述符表中的每一项,都对应一个file struct结构体,结构体的第一项flag,表示文件的属性(W,R,阻塞非阻塞),第二项pos是一个指针,指向磁盘文件,表示读写指针位置

    最大文件打开个数


      在编写文件操作的或者网络通信的软件时,可能会遇到“Too many open files”的问题。这主要是因为文件描述符是系统的一个重要资源,虽然说系统内存有多少就可以打开多少的文件描述符,但是在实际实现过程中内核是会做相应的处理的,一般最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制),查看系统级别的最大打开文件数可以使用cat /proc/sys/fs/file-max命令查看。
      相关命令介绍:
      查看当前系统允许打开最大文件个数

    cat /proc/sys/fs/file-max
    当前默认设置最大打开文件个数1024

      查看修改限制命令的使用方法

    ulimit -a

      修改默认设置最大打开文件个数为4096

    ulimit -n 4096

  • 相关阅读:
    C#屏幕截图
    WPF转换器用法示例
    WPF自定义数字输入框控件
    LINQ 用法,返回结果不是在定义时取值,而是在调用时实时取值,有意思!
    类泛型--必须继承接口
    wpf在异步中给前台赋值
    VS Code中Matlab插件安装设置
    Python 自动给数字前面补0
    Tensorflow (1)
    解决Keras在IDE集成环境中找不到nvcc
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6381224.html
Copyright © 2020-2023  润新知