IO 学习笔记

Posted RelievedAbility

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO 学习笔记相关的知识,希望对你有一定的参考价值。

虚拟文件系统、文件描述符、IO重定向

一切皆文件,进程隔离

操作系统宏观介绍

  1. 常用的IO设备有哪些? 磁盘、网卡

  2. Linux 中物理盘是怎么映射到操作系统中的? Kernel 中VFS(Virtual File System)

  3. 在Linux中如果两个程序都去加载同一个文件,那么内存中会有几份?1份。文件在打开的时候会有一个inode id,程序在访问文件的时候VFS首先会判断当前文件有没有在pagecache中被加载过,没有的话触发缺页就会加载对应inode id 对应的源数据,然后再内存中开辟pagecache(默认4k) 给当前文件,后续的如果发现pagecache里面已经加载了就直接返回了。

  4. 延伸:

    1:当多个程序操作同一个文件,其中一个程序修改了文件,对应pagecache的变化和什么时候会同步到磁盘?
    1)首先会吧pagecache里面标记为dirty状态
    2)然后会通过flush同步到磁盘(flush的方式取决于IO模型,OLD IO flush后并非直接刷新到磁盘,而是需要等待kernel调度, NIO 调用了flush 则是会直接调用kernel将数据刷新到磁盘)
    2:程序最终是通过什么访问文件的?
    1)fd (file descriptor) 文件描述符
    2)指针seek (偏移量)对应文件的不同位置
    

虚拟文件系统

  1. Linux 中如何查看kernel维护的目录树结构? df 命令

  2. Linux 中swap 分区的作用? 当系统运行当前进程内存不足时会把暂时用不到的进程转移到swap 分区,然后把当前需要执行的进程资源放入内存。

  3. Linux 中常见的文件类型有哪些?

    • -:普通文件 lsof 中TYPE 为REG

    • d:目录

    • b:块设备 延伸 : 如何创建块文件,使用dd 命令

      dd  if=/dev/zero of=mydisk.img bs=1048576 count=100
      
    • c:字符文件 lsof 中TYPE 为CHR

    • s:socket

    • p:pipeline

    • l:链接

      ln  #创建硬链接
      ln -s #创建软链接延伸  
      软链接和硬链接区别?
      共同点:
      修改链接文件和源文件中任何一个互相都能看到修改后的内容。
      不同点
      硬链接类似java里面的多个引用指向一个对象,删除其中一个对另一个并没有影响。
      软链接更像是windows 中应用的桌面快捷方式,如果删除源文件,则软链接就会报错,类似windows 中应用程序被删了,桌面快捷方式没有被清理,然后点击桌面快捷方式的情景。
      

文件描述符nodeid、脏读

Linux 中一切皆文件,进程对应的文件目录是哪里?

/proc
/proc/$$ #当前bash的目录

KaTeX parse error: Can't use function '$' in math mode at position 15: 当前bash的pid,它和$̲BASHPID 有什么区别? 的优先级高于管道,$BASHPID 则没有管道优先级高,所以下面两个命令执行的结果会不同

echo $$ | cat
echo $BASHPID | cat
  1. Linux 中如何查看一个进程打开了多少文件?(查看所有的文件描述符)

    lsof -op $$ #查看所有的文件描述符细节
    /proc/$$/fd #查看所有的文件描述符
    

    延伸:开发过程中如何查看8080端口被那个进程占用

    lsof -i :8080
    
  2. 每个程序都会有标准输入输出吗?

    是的,那么对应的文件描述符是什么? 0 标准输入,1标准输出,2标准错误输出 u 表示可以读写

    当前进程的用到的文件描述符目录是什么?

    cd /proc/$$/fd #查看所有的文件描述符
    ls -al
    
  3. 如何查看一个文件的Inode 号

    stat /test.txt
    

    延伸命令,read 只会读到换行符

    exec 8< test.txt
    read a 0<& 8
    

socket pipeline

  1. 如何查看进程使用pagecahe 的情况

    pcstat -pid $$
    
  2. 如何查询当前脏页

    cat /proc/vmstat | grep dirty
    #延伸,查询当前脏页的刷新时间
    sysctl -a | grep dirty
    
  3. Socket 文件怎么创建?

    exec 8<> /dev/tcp/www.baidu.com/80
    cd /proc/$$/fd
    ll
    lsof -op $$
    
  4. 重定向是什么?

    重定向是一种机制,注意不是命令。< 输入重定向 > 输出重定向

    ls . 1> ~/test/t.txt #将当前目录的文件列出,重定向输出到t.txt中
    cat 0< text.txt 1> cat.out   #将cat的输入,输出分别重定向
    ls ./ /dddosl 1>04.txt 2>& 1 #文件描述符的时候一定是2>& 1 要带&,如果是文件名则不需要
    

以上是关于IO 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE 学习笔记之IO流(二十二)

Nginx学习笔记——理解IO模型

TensorFlow学习笔记 补充1——InteractiveSession

JAVA NIO学习笔记

WebSocket协议 学习笔记

WebSocket协议 学习笔记