io的理解
程序是怎样运行的?
程序:就是代码,程序是静态的
程序的运行:一个代码在加在到内存中被cpu执行的一个过程,也就是所谓的进程,进程是动态的。
程序运行状态:内核态和用户态不断的进行交替执行。用户态就是程序在用户空间进行运行,内核态是程序通过系统调用进入到内核态调用内核方法。
为什么会有内核态
这个是操作系统对计算机的一种保护机制,在linux中一切皆文件,所有的物理设备都会映射成文件,如果用户态程序可以直接修改一些系统文件,那么可能会造成计算机的状态不正常(例如无法开机,蓝屏等),所以来说内核为了保护计算机,所以一些方法和文件只能内核完成修改。这就是内核态
我们先看文件io过程
我们都知道java io的read()方法,这个方法是阻塞的方法,当我们调用的输入设备进行输入,当没有数据输入程序就会被阻塞。这个方法的返回值是-1到255,返回-1说明数据读取完毕,其余的数值代表返回的是个字节数据
我么先看一段代码
public static void main(String[] args)
{
System.in.read();
}
我们用系统调用的追踪命令看一下内核的系统调用
strace -ff -o out java FileIoTest (FileIoTest是类名),如下图
可以看到,内核这里读取文件的时候被阻塞在这里,无法返回到用户态,所以来说就阻断了程序的运行
我们输入一些内容看一下
立刻返回程序往下继续执行了:而且内容被拷贝到内核空间去了,长度是3.这就是为啥我们调用这个read()方法时为啥会阻塞,read的第一参数是0,代表是系统的键盘输入,这里也可以看出,系统键盘输入是阻塞的
看下面段代码
public static void main(String[] args)
{
try {
File file = new File(