IO流2.基础

作者: ygxing | 来源:发表于2019-06-11 10:29 被阅读0次

    一、什么是流

    一组有序、有起始标记和结束标记的字节数据序列

    二、作用

    根据数据传输的各种特性,定义各种类,来操作传输的数据,使得输入输出独立于设备

    三、分类
    • 按照流向的不同可分为:输入流(InputStream)和输出流(OutputStream)
    • 按照处理类型的不同可分为:字节流和字符流
    1.输入输出流
    • 输入和输出都是相对于应用程序而言的
    • 输入流:
      • 数据源输入到应用程序
      • 应用程序主动去读取的流,例如读取文件
      • 往应用程序输入的流,例如键盘输入
    • 输出流:程序中的数据输出到外界
      • 应用程序主动输出的流,例如写入文件,发送网络包

    2.字节和字符流

    • 字节流
      • 每次操作处理一个字节
      • 可以用来处理所有的流
    • 字符流
      • java中字符使用了Unicode编码,每个字符占用两个字节
      • 字符流默认处理两个字节
      • 字符流只能用来处理字符或者字符串

    四.应用程序如何操作IO

    关于这个问题,我们需要了解操作系统内核,用户空间和内存空间,应用程序运行过程中的用户态和内核态,操作系统的内存分配等知识

    1.内核态和用户态
    • 有些CPU指令是非常危险的,用错的话,可能会导致系统崩溃
    • 所以CPU指令分为特权指令和非特权指令
    • 例如Intel的CPU将特权等级分为4个级别Ring0~Ring3
    • 不过linux系统只使用了Ring0和Ring3两个级别
    • 当进程运行Ring3级别的指令时,就称为运行在用户态
    • 当进程运行Ring0级别的指令时,就称为运行在内核态
    2.操作系统内核
    • 操作系统的核心和内核(kernel)
    • 内核可以访问受保护的内存空间和底层硬件设备
    • 为了保证内核的安全,操作系统一般不允许用户直接操作内核,而是通过接口访问
    • Ring0级别的指令由操作系统内核执行
    3.用户空间和内核空间

    为了保证进程不能直接操作内核,操作系统将虚拟地址划分为两部分,用户空间和内核空间,以32位操作系统为例

    • 32位操作系统寻址空间为2^32B,也就是4GB
    • 内核空间
      • 高位的1G内存作为内核空间
      • 内核空间中存放的是内核代码和数据
      • 各个进程调用内核接口,进入内核
    • 用户空间
      • 低位的3G内存作为用户空间
      • 供各个进程访问
    • 进程操作IO流程
      • 所有的资源管理都是在内核空间完成的,例如磁盘读写,网络数据读写
      • 当进程需要进行IO读写的时候,通过一个特殊的指令,让进程进入内核空间
      • 进程读取IO到内核空间
      • 进程再将IO拷贝到用户空间
    4.用户态和内核态
    • 进程执行了系统调用,执行内核代码的时候,该进程处于内核态
    • 进程执行了自己的代码,该进程处于用户态

    相关文章

      网友评论

        本文标题:IO流2.基础

        本文链接:https://www.haomeiwen.com/subject/hssffctx.html