在学习线程,NIO等知识时都需要知道一些基础知识。
一、什么是同步或异步
同步:个人通俗理解多个人排队打饭一个窗口,只有前面一个人打完了,后面的人才能打。如果前面人因为什么原因一直站在那里不走,后面的人就一直需要等待。
如果有多个任务或事件要发生,多个任务或事件要逐个去执行,如果其中有一个事件或任务出现问题都会影响整个流程,其他任务都需要进行等待
异步:多个人排队打发多个窗口,每个人选择一个窗口不需要等待,一个人出现窗口占用,其他人不受影响。
多个任务或事件并发执行,一个任务或事件不会影响整个流程的暂时等待
示例1 典型的同步操作 方法在调用是从上到下依次执行, 只有fun1执行完成后,fun2才会被执行
void fun1(){
}
void fun2(){
}
main(){
fun1();
fun2();
}
示例2 主线程开启两个子线程 两个子线程调用互不影响 两个方法的调用也互不影响 fun1() 与 fun2()之间不需要等待
fun1(){}
fun2(){}
main(){
new Thread(){
public void run(){
fun1();
}
}.start();
new Thread(){
public void run(){
fun2();
}
}.start();
}
二、什么是阻塞 和非阻塞
阻塞:一个任务在执行过程中发出一个请求操作,由于请求的操作条件一直不满足,这个请求会一直等待,知道请求操作的条件满足后返回
非阻塞:一个任务在执行过程中发出一个请求操作,如果请求的操作条件一直不满租,会立即返回一个信息告知条件不满足,不会一直等待。
同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的暂时等待;
而阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的条件不满足是否会返会一个标志信息告知条件不满足。
理解阻塞和非阻塞可以同线程阻塞类比地理解,当一个线程进行一个请求操作时,如果条件不满足,则会被阻塞,即在那等待条件满足
三、什么是阻塞IO 和什么是非阻塞IO
IO操作:通过IO对磁盘或者SOCKET链接(也就是网络链接) 和外部设备的读写操作
当用户线程发出一个用户请求操作(以读取操作为例),内核要查看读取的数据是否就绪,对于阻塞IO来说,如果数据没有准备就绪,就会一直等待数据就绪,对于非阻塞IO来说,如果数据没有就绪,会反馈一个标志信息数据没有就绪,当数据就绪之后拷贝到用户线程。
IO读请求操作分为两个阶段:
1)查看数据是否就绪
2)内核将数据拷贝给用户线程
是否为阻塞IO 和非阻塞IO 区别在与第一个阶段 数据是否就绪 如果数据没有就绪是否一直等待,如果一直等待就为阻塞IO 如果返回一个信息标志 则为非阻塞IO
四、什么是同步IO 和什么是异步IO
同步IO和异步IO的区别关键在于数据拷贝阶段,是由用户线程完成的还是内核完成的,异步IO必须有操作系统底层支持。
同步IO:如果一个IO进行请求操作,那么在操作之前,该线程一定会被阻塞。
异步IO:如果一个IO请求操作,在操作完成之前,该线程一定不会被阻塞。
对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
五、参考模型
1)阻塞IO模型
2)非阻塞IO模型
3)多路复用IO模型
4)信号驱动IO模型
5)异步IO模型
参考博客:
http://www.cnblogs.com/dolphin0520/p/3916526.html