redis自学(13)用户空间和内核空间
服务器大多采用Linux系统,所以以Linux为例:
任何Linux发行版,其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互。
用户应用是无法直接访问计算机硬件,只能访问内核,基于内核操作计算机硬件
为了避免用户应用导致冲突甚至内核崩溃,用户应用与内核是分离的:
l 进程的寻址空间会划分为两部分:内核空间、用户空间(32位的系统,它的寻址空间是2的32次方,也就是4GB)
l 用户空间只能执行受限的命令(Ring3),而且不能直接调用系统资源,必须通过内核提供的接口来访问
l 内核空间可以执行特权命令(Ring0),调用一切系统资源
Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓冲区:
l 写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备
l 读数据时,要从设备(磁盘或网卡,或者说本地或网络)读取数据到内核缓冲区,然后拷贝到用户缓冲区
IO读写效率不好就因为这个,读要用户态切换到内核态,然后等待硬件的数据存入内核态的缓冲区,然后内核态的缓冲区要复制到用户态的缓冲区。反过来,写要先写入用户态的缓冲区,然后存到内核态的缓冲区,最后存入硬件。
因此提高IO的效率,主要是两个点
- 减少无效等待的时间
- 减少用户态和内核态缓冲区的数据拷贝