什么是IO,io接口io控制方式

626 阅读2分钟

N$ io接口可以看做一个芯片,集成在主板上,就暴露在外的接口等进行管理。

io控制方式:

1.程序查询

本质是CPU不断轮询查数据缓冲寄存器,有没有存满。数据就是从外部设备输入的。如果存满就取走(效率低)

2.中断IO方式

典型的就是键盘,输入一个字符就会触发,中断cpu运行进程,让cpu来取数据

3.DMA方式

交换单位是块,上面是缓冲寄存器。磁盘的存储单位就是块,这就是典型的DMA设备。

每次传完一个块,就会发送中断请求。告诉CPU数据传完了。

实际上他也是一个一个字节传输,只是传到主存大小到了一个块,才会中断CPU

上面的io只是把数据存到了内核空间,java中的io指的是数据从内核读到用户空间

从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。也就是说,我们的应用程序实际上只是发起了 IO 操作的调用而已,具体 IO 的执行是由操作系统的内核来完成的。

当应用程序发起 I/O 调用后,会经历两个步骤:

  1. 内核等待 I/O 设备准备好数据
  2. 内核将数据从内核空间拷贝到用户空间。

服务端的程序往往是io密集型应用,基本都是网络io或磁盘io

1. 网络IO的过程,就是操作系统接收到网卡的数据,缓存到一个buffer中,然后应用程序调用操作系统的函数,从对应的buffer中取出数据。

假设程序没有任何I/O(磁盘I/O或网络IUO),纯粹的CPU计算,如同一个最简单的、空的死循环,只需要一个线程就可以把一个CPU的核占满。

所以,多线程主要是为了应对I/O密集型的应用。多线程能带来两方面的好处:

(1)提高CPU利用率。通俗地讲,不能让CPU空闲着。当一个线程发生I/O时,会把该线程从CPU上调度下来,并把其他的线程调度上去,继续计算。

(2)提高I/O吞吐。典型的场景是,应用程序连接的Redis或者MySQL,它们提供的都是同步接口,一次只能处理一个请求。要想并发,办法是通过连接池和多线程,实现每个线程使用一个连接。好比在客户端和服务器之间开了多条通道,并行传输数据。