内核空间与用户空间
操作系统的核心是内核,内核可以访问受保护的内存空间,拥有底层任何的硬件设备的所有访问权限。为了保护内核的安全,操作系统把虚拟的内存空间划分成两个部分,一个是内核空间,一个是用户空间,用户空间是无法访问内核空间的。
针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
之所以说内存虚拟空间被划分成两部分,实际上是因为内存的物理空间其实是一个整体,并没有所谓的内核空间和用户空间之分,只是在系统层面需要对要内核所处的内存空间进行保护,保证内核的安全。
但凡是涉及到多个进程的,那肯定有进程切换这个概念,总而言之,进程的切换十分消耗CPU资源
文件描述符FD
文件描述符是一个专业术语,简称FD,在LINUX中一切皆文件
IO操作
每发生一次IO操作(读写),数据首先会被拷贝到内核的缓冲区中,然后再由内核拷贝到用户进程空间里,因此实际上一次IO操作实际上做了两次拷贝动作,首先是被拷贝到内核空间,然后由内核空间拷贝到用户空间
零拷贝
所谓的零拷贝并不是说不存在拷贝动作,而是尽量减少拷贝次数,让内核直接进行拷贝操作而不用经过用户空间,由此减少数据在内核空间和用户空间的拷贝次数。
早期IO:
- 用户进程发起read调用,内核读取file文件,此时file被拷贝到了内核空间,这是第一次拷贝
- 然后内核空间将file拷贝到用户空间,这是第二次拷贝
- 用户进程调用write,将file写出,file被拷贝到内核空间,这是第三次拷贝
- 内核将file拷贝到网卡,这是第四次拷贝。前前后后一共经历了4次拷贝动作
零拷贝:
- 用户进程发起sendfile调用,内核将file文件拷贝到内核空间,这是一次拷贝
- 内核直接将file文件拷贝到网卡,这是第二次拷贝