架构师基础四

架构师基础四

一、 内存映射

 

将内存中某块地址空间和我们要指定的磁盘文件相关联,从而把我们对这块内存的访问转换为对磁盘文件的访问。

 

二、 直接 IO

 

内存映射和直接 IO 访问文件没有本质上差异,因为数据从进程用户态内存空间到磁盘都要经过两次复制,即在磁盘与内核缓冲区之间以及内核缓冲区与用户态内存空间。

 

对于复杂的应用如:数据库都是绕开内核缓冲区,自己在用户态空间实现并管理 IO 缓冲区。因为内核缓冲区本身也是使用了系统内存。 Linux open ()系统调用中增加参数选项 )O_DIRECT ,用它打开的文件便可以绕开内核缓冲区的直接访问,这样有效避免了 CPU 和内存多余时间开销。与 O_DIRECT 类似的一个选项是 O_SYNC ,后者只对写数据有效,它将写入内核缓冲区的数据立即写入磁盘,将机器故障时数据的丢失减少到最小,但是它仍然要经过内核缓冲区。

 

三、 sendfile

 

大部分请求服务器静态文件:图片、样式表等,磁盘文件的数据先要经过内核缓冲区,然后到达用户内存空间,因为是不需要任何处理的静态数据,所以他们又被送到网卡对应的内核缓冲区,接着再被送入网卡进行发送。

Linux 2.4 的内核中,尝试性地引入了一个称为 khttpd 的内核级 Web 服务器程序,它只处理静态文件的请求。引入它的目的在于内核希望请求的处理尽量在内核完成,减少内核态切换以及用户态数据复制的开销。

 

四、 同步 IO 和异步 IO 的区别

 

阻塞和非阻塞是指当进程访问的数据如果尚未就绪,进程是否需要等待,即未就绪时是直接返回还是等待就绪;而同步和异步是指访问数据的机制,同步一般指主动请求并等待 IO 操作完毕的方式,当数据就绪后在读写的时候必须阻塞,异步则指主动请求数据后便可以继续处理其他任务,随后等待 IO 操作完毕的通知,这可以使进程在数据读写时也不发生阻塞。

猜你喜欢

转载自he-wen.iteye.com/blog/1575967
今日推荐