I/O模型

来源:互联网 发布:csgo优化指令 编辑:程序博客网 时间:2024/06/06 15:50

一、什么是同步?什么是异步?

同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;
异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。

例如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。

//典型的同步代码void fun1(){}void fun2(){}void function(){fun1();fun2();...}

在方法function中,fun1在执行的过程中会导致后续的fun2无法执行,fun2必须等待fun1执行完毕才能执行。

//异步的例子void fun1(){}void fun2(){}void function(){    new Thread(){        public void run(){            fun1();        }    }.start();    new Thread(){        public void run(){            fun2();        }    }.start();    ...}

fun1的执行不会影响fun2的执行,并且fun1和fun2的执行不会导致其后续的执行过程处于暂时的等待。

事实上,同步和异步是一个非常广的概念,它们的重点在于多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。同步和异步与Java中的synchronized关键字可以联系类比起来。当多个线程同时访问一个变量时,每个线程访问该变量就是一个事件,对于同步来说,就是这些线程必须逐个地来访问该变量,一个线程在访问该变量的过程中,其它线程必须等待;而对于异步来说,就是多个线程不必逐个地访问该变量,可以同时进行访问。

一般来说,可以通过多线程的方式来实现异步,但是不要将多线程和异步画上等号,异步只是宏观上的一个模式,采用多线程来实现异步只是一个手段,并且通过多进程的方式也可以实现异步。

二、什么是阻塞?什么是非阻塞?

阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足;

非阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直在那等待。

也就是说阻塞和非阻塞的区别关键在于当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标识信息。

举个简单的例子:假如我要读取一个文件中的内容,如果此时文件中没有内容可读,对于同步来说就是会一直在那等待,直至文件中有内容可读;而对于非阻塞来说,就会直接返回一个标识信息告知文件中暂时无内容可读。

同步和异步分别与阻塞和非阻塞是两组完全不同的概念。同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的暂时等待;而阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的条件不满足是否会返回一个标志信息告知条件不满足。理解阻塞和非阻塞可以同线程阻塞类比理解,当一个线程进行一个请求操作时,如果条件不满足,则会被阻塞,即在那等待条件满足。

三、什么是阻塞IO?什么是非阻塞IO?

通常来说,IO操作包括:对硬盘的读写,对Socket的读写以及外设的读写。

当用户线程发起一个IO请求操作时,内核会去看要读取得数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪;对于非阻塞IO,如果数据没有就绪,则会返回一个标识信息告知用户线程当前要读的数据没有就绪。当数据就绪之后,便将数据拷贝到用户线程,这样才完成了一个完整的IO读请求操作,也就是说一个完整的IO读请求,也就是说一个完整的IO读请求操作包括两个阶段:

1)查看数据是否就绪

2)进行数据拷贝(内核将数据拷贝到用户线程)

阻塞IO和非阻塞IO的区别在于第一个阶段,如果数据没有就绪,在查看数据是否就绪的过程中是一直等待,还是直接返回一个标识信息。

Java中传统的IO都是阻塞IO,比如通过socket来读数据,调用read()方法之后,如果数据没有就绪,当前线程就会一直阻塞在read方法调用那里,直到有数据才返回。如果是非阻塞IO的话,当数据没有就绪,read()方法应该返回一个标志信息,告知当前线程数据没有就绪,而不是一直在那里等待。

四、什么是同步IO?什么是异步IO?

五、五种IO模型

0 0
原创粉丝点击