从上图可知,一个看似简单的读数据、写数据的常规操作总共经历了以下的过程:
1、用户程序通过read()
方法(实际会转化为CPU指令)向系统发起系统调用,此时系统上下文从用户态切换为内核态;
2、从硬盘中拷贝数据到内核态中的读缓冲区;
3、CPU
通过调度把内核态读缓冲区的文件数据拷贝到用户态的用户缓冲区中,同时系统上下文切换为用户态;
4、经过逻辑处理后,用户程序需要将处理后的数据通过write()
方法进行系统调用,此时系统上下文切换为内核态;
5、CPU
通过调度将用户缓冲区的数据拷贝到socket
缓冲区中;
6、将socket
缓冲区中的数据拷贝至网卡io
,系统上下文切换为用户态。
内核主要的作用总结起来就是对硬件来说进行统一对硬件管理,对上层应用来说提供统一对系统调用。由于硬件资源很敏感需要被保护起来,那么内核就起到了用户程序与硬件交互的桥梁作用。通过区分内核空间和用户空间的设计,隔离了操作系统代码与应用程序代码。
通过以上的分析我们可以看出来,传统的IO
交互不仅有用户态内核态的多次切换,同时数据也是来回的复制,极其的繁琐以及耗费资源。
上文我们已经分析过传统的IO
交互模型中