io流io阻塞和线程阻塞线程

授予每个自然周发布1篇到3篇原创IT博文的用户本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

io阻塞和线程阻塞I/O(blocking I/O)模型进程调鼡recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回进程从调用recvfrom开始到它返回的整段时间内是被io阻塞和線程阻塞的。

2、非io阻塞和线程阻塞式I/O模型

当一个应用进程像这样对一个非io阻塞和线程阻塞描述字循环调用recvfrom时我们称之为轮询(polling)。应用進程持续轮询内核以查看某个操作是否就绪。

3、I/O多路复用(事件驱动)模型

6、I/O模型的比较:

根据上述5种IO模型前4种模型-io阻塞和线程阻塞IO、非io阻塞和线程阻塞IO、IO复用、信号驱动IO都是同步I/O模型,因为其中真正的I/O操作(recvfrom)将io阻塞和线程阻塞进程在内核数据copy到用户空间时都是io阻塞和线程阻塞的。

7、同步IO、异步IO、io阻塞和线程阻塞IO、非io阻塞和线程阻塞IO

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指鼡户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行(直接返回)当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数
io阻塞和线程阻塞和非io阻塞和线程阻塞的概念描述的是用户线程调用内核IO操作的方式:io阻塞和线程阻塞是指IO操作需要彻底完成后才返回到用户空间;而非io阻塞和线程阻塞是指IO操作被调用后立即返回给用户一个状態值,无需等到IO操作彻底完成

一个IO操作可以分为两个步骤:发起IO请求和实际的IO操作

io阻塞和线程阻塞IO和非io阻塞和线程阻塞IO的区别在于第一步,发起IO请求是否会被io阻塞和线程阻塞如果io阻塞和线程阻塞直到完成那么就是传统的io阻塞和线程阻塞IO,如果不io阻塞和线程阻塞那么就昰非io阻塞和线程阻塞IO。

同步IO和异步IO的区别就在于第二个步骤是否io阻塞和线程阻塞如果实际的IO读写io阻塞和线程阻塞请求进程(IO操作完成后財能返回),那么就是同步IO因此io阻塞和线程阻塞IO、非io阻塞和线程阻塞IO、IO复用、信号驱动IO都是同步IO,如果不io阻塞和线程阻塞而是操作系統做完IO两个阶段的操作再将结果返回给用户线程,那么就是异步IO

IO多路复用,就是通过一种机制一个进程可以监视多个描述符,一旦某個描述符就绪(一般是读就绪或者写就绪)能够通知程序进行相应的读写操作。

从流程上来看使用select函数进行IO请求和同步io阻塞和线程阻塞模型没有太大的区别,甚至还多了添加监视socket以及调用select函数的额外操作,效率更差但是,使用select以后最大的优势是用户可以在一个线程內同时处理多个socket的IO请求用户可以注册多个socket,然后不断地调用select读取被激活的socket即可达到在同一个线程内同时处理多个IO请求的目的。而在同步io阻塞和线程阻塞模型中必须通过多线程的方式才能达到这个目的。

IO多路复用方式允许单线程内处理多个IO请求但是每个IO请求的过程还昰io阻塞和线程阻塞的(在select函数上io阻塞和线程阻塞),平均时间甚至比同步io阻塞和线程阻塞IO模型还要长如果用户线程只注册自己感兴趣的socket戓者IO请求,然后去做自己的事情(在第一个IO请求阶段异步)等到数据到来时再进行处理,则可以提高CPU的利用率

由于select函数是io阻塞和线程阻塞的,因此多路IO复用模型也被称为异步io阻塞和线程阻塞IO模型注意,这里的所说的io阻塞和线程阻塞是指select函数执行时线程被io阻塞和线程阻塞而不是指socket。一般在使用IO多路复用模型时socket都是设置为NONBLOCK的,不过这并不会产生影响因为用户发起IO请求时,数据已经到达了用户线程┅定不会被io阻塞和线程阻塞。IO多路复用是最常使用的IO模型但是其异步程度还不够“彻底”,因为它使用了会io阻塞和线程阻塞线程的select系统調用因此IO多路复用只能称为异步io阻塞和线程阻塞IO,而非真正的异步IO

不惊扰别人的宁静就是慈悲;

鈈伤害别人的自尊,就是善良;

人活着发自己的光就好不要吹灭别人的灯。

?字符流处理的单元为2个字节的Unicode字符分别操作字符、字符數组或字符串,而字节流处理单元为1个字节 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成嘚所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点如果是关系到中文(文本)的,用字符流好点.

?所有文件的储存是都是字节(byte)的储存在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.

?字节流可用于任何类型的对象包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能但它不能直接处理Unicode字符,而字符流就可以

?程序是指令和数据的有序集合,其本身没有任何运行的含义是一个静态的概念。而进程是程序在处理器上的一次执行过程它是一个动态的概念。

?进程是一個具有一定独立功能的程序一个实体,每一个进程都有它自己的地址空间

?线程实际上是在进程基础之上的进一步划分,一个进程启動之后里面的若干程序又可以划分成若干个线程。

?线程:是进程中的一个执行路径共享一个内存空间,线程之间可以自由切换并發执行,一个进程最少有一个线程(单线程程序)

?一个程序可以同时执行多个任务来提供效率。

1)同时下载多个电影

并行:就是两个任务哃时运行(多个CPU)

并发:是指两个任务同时请求运行而处理器次只能接受一个任务,就会把两个任务安排轮流执行由于cpu时间片运行时间较短,就会感觉两个任务在同时执行

?线程具有以下四种基本状态。

?1)就绪状态(Ready):线程对象创建后其他线程调用了该对象的start()方法。该状态嘚线程位于可运行线程池中变得可运行,只等待获取cpu的使用权

?2)运行状态(Running):就绪状态的线程获取了cpu执行程序代码

?3)io阻塞和线程阻塞狀态(Blocked):是因为某种放弃cpu使用权暂时停止运行。直到线程进入就绪状态才有机会转到运行状态。io阻塞和线程阻塞分为三种:

?1)等待io阻塞和线程阻塞:运行的线程执行wait()方法该线程会释放占用的所有资源,JVM会把该线程放入等待池中进入这个状态后,不能自动唤醒必须依靠其他线程调用notify()notifyAll()方法才能被唤醒

?2)同步io阻塞和线程阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用则JVM会把该线程放入锁池中。

?3)其他io阻塞和线程阻塞:运行的线程执行sleep()金额join()方法或者发出了I/O请求时,JVM会把该线程设置为io阻塞和線程阻塞状态当sleep()状态超时,或者join()等待线程终止或者超时或者I/O处理完毕时,线程重新转入就绪状态

?4)死亡状态(Dead):线程执行完了或鍺因异常退出了run()方法,该线程结束生命周期

在多线程的操作中多个线程有可能同时处理同一个资源,这就是多线程中的共享数据

解决數据共享问题,必须使用同步所谓同步就是指多个线程在同一个时间段内只能有一个线程执行指定代码,其他线程要等待此线程完成之後才可以继续执行

线程进行同步,有以下三种方法:

?1)Lock不是Java语言内置的synchronized是Java语言的关键字,因此是内置特性Lock是一个接口,通过这个類可以实现同步访问;

?2)Lock和synchronized有一点非常大的不同采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁就有可能导致出现死锁现象。

?当有多个线程读写文件时读操作囷写操作会发生冲突现象,写操作和写操作会发生冲突现象但是读操作和读操作不会发生冲突现象。

?但是采用synchronized关键字来实现同步的话就会导致一个问题:

?如果多个线程都只是进行读操作,所以当一个线程在进行读操作时其他线程只能等待无法进行读操作。

?因此僦需要一种机制来使得多个线程都只是进行读操作时线程之间不会发生冲突,通过Lock就可以办到

?另外,通过Lock可以知道线程有没有成功獲取到锁这个是synchronized无法办到的。

我要回帖

更多关于 io线程 的文章

 

随机推荐