zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    第八章 多线程编程
    Linked List Cycle II
    Swap Nodes in Pairs
    Container With Most Water
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock II
    Linked List Cycle
    4Sum
    3Sum
    Integer to Roman
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6381224.html
Copyright © 2011-2022 走看看