一:用户空间和内核空间
学习Linux时经常可以看到User space(用户空间)和Kernel space(内核空间)。
简单来说,kernel space是Linux内核的运行空间,User space是用户程序的运行空间。为了安全,他们是隔离的,即使用户的程序崩溃了也不受影响。
虚拟内存操作系统划分成两块:内核空间和用户空间,内核空间是内核代码运行的地方,用户空间是用户程序代码运行的地方。当进程运行在内核空间时就处于内核态,当进程运行在用户空间时就属于用户态。
Kernel space可以执行任意命令,调用系统的一切资源;user space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(system call)才能向内核发出指令。
示例:
str = "aaa"; //用户空间
int a = 2;
file.write(str); //切换到内核空间
b = a + 5; //切回用户空间
二:PIO与DMA
简单说明慢速I/O设备和内存直接的数据传输方式。
- PIO:拿磁盘来说,很早之前,磁盘和内存之间的数据传输是需要cpu控制的,也就是说 如果我们读取磁盘文件到内存中,数据要经过cpu存储转发,这种方式称为PIO。显然这种方式非常不合理,需要占用大量的cpu时间来读取文件,造成文件访问时系统激活停止响应。
- DMA(直接内存访问,Direct Memory Access):DMA取代了PIO,它可以不经过cpu而直接进行磁盘和内存(内核空间)的数据交换,在DMA模式洗,cpu只需要向DMA控制器下达命令,让DMA控制器来处理数据的传送即可,DMA控制器通过系统总线来传输数据,传输完毕再通知cpu,这样就在很大程度上降低了cpu占有率,大大节省了系统资源,而它的传输速度与PIO的差异其实并不十分明显,因为这主要取决于慢速设备的速度。
可以肯定的是,PIO的设计模式的计算机我们现在已经很少见到了。
三:缓存IO和直接IO
- 缓存IO:数据从磁盘先通过DMA copy到内核空间,再从内核空间通过cpu copy到用户空间。
- 直接IO:数据从磁盘通过DMA copy到用户空间。
四:IO的访问方式
1:磁盘IO
具体步骤:
当应用程序调用read接口时,操作系统检查在内核的高速缓存有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,如果没有则从磁盘中读取,然后缓存在操作系统的缓存中。
2:网络IO
操作系统将数据从磁盘复制到操作系统内核的页缓存中
应用将数据从内核缓存复制到应用缓存中
应用将数据写回内核的socket缓存中
操作系统将数据从socket缓存区复制到网卡缓存,然后将其通过网络发出
五:磁盘IO和网络IO对比
磁盘IO主要延时是由(以15000rpm硬盘为例)机械转动延时(机械磁盘的主要性能瓶颈,平均为2ms)+寻址延时(2~3ms)+块传输延时(一般4k每块,40m/s的传输速度,延时一般为0.1ms)决定()平均为5ms
网络延时主要是由 服务器响应延时+宽带限制+网络延时+跳转路由延时+本地接收延时 决定(一般为几十到几千毫秒,受环境干扰极大)