一、什么是流
一组有序、有起始标记和结束标记的字节数据序列
二、作用
根据数据传输的各种特性,定义各种类,来操作传输的数据,使得输入输出独立于设备
三、分类
- 按照流向的不同可分为:输入流(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.用户态和内核态
- 进程执行了系统调用,执行内核代码的时候,该进程处于内核态
- 进程执行了自己的代码,该进程处于用户态
网友评论