文章目录
- 1.操作系统的特性
- 并发
- 共享
- 虚拟
- 异步
- 2. 微内核
- (1) 支撑功能
- 中断管理
- 时钟管理
- 原语操作
- (2)资源管理功能
- 进程管理
- 存储器管理
- 设备管理
- 3.零拷贝
- 什么是零拷贝
- 传统拷贝方式
- 零拷贝方式
- GatherCopy零拷贝
- mmap零拷贝
1.操作系统的特性
并发
并发:在宏观上,多个事件在同一个时间间隔内发生
并行:在微观上,多个事件在同一时刻发生
共享
资源复用,系统中的资源可供内存中,多个并发执行的进程共同使用。当系统中资源数量少于多个进程对资源的需求数量时,就会形成对共享资源的争夺。目前主要实现资源共享的方式有两种:
互斥共享
某些资源只能互斥访问,如打印机,在一段时间内,只允许一个进程访问该资源。这种互斥访问的资源,称为临界资源,或独占资源。同时访问
系统中还有一类资源,允许在一段时间内由多个进程同时访问。不过,对于这个“同时”需要注意,在单处理机环境中,其是宏观上的意义,微观上对这些资源的访问是交替进行,最典型的就是磁盘。
虚拟
将一个物理实体变为若干个逻辑上的对应物,如物理磁盘对应内存。
- 时分复用
复用“某设备为一用户服务的空闲时间”为其它用户服务,以达到充分复用设备的目的。使得看起来好像是多个用户在同时使用多台相同设备。这种虚拟技术称为时分复用技术。
- 空分复用
将一个频率范围比较宽的信道划分为多个频率范围较窄的信道(频带),其中的任何一个频带都仅供一对用户通话。这种频分复用技术就属于空分复用技术。
这种“虚拟化”思想,在开发中也经常用到,可以解决很多不方便解决的问题。
例如,Dubbo在采用一致性Hash算法实现负载均衡时会出现一个问题:提供者Server的增减,仅对某个提供者的负载状态有影响,对其它提供者没有任何帮助。Dubbo使用“虚拟化思想”对该算进行了优化,默认将一台物理提供者虚拟为了360个,解决了原来的问题。
异步
进程以不可预知的速度向前推进的特性,称为异步性。如Redis可以实现分布锁,实现分布式协调功能。
2. 微内核
微内核并非是一个完整的OS,而只是将操作系统中最基本、最核心的功能放入微内核。这些基本功能大体可以划分为支撑功能 与资源管理功能两大功能。
(1) 支撑功能
是内核提供给服务进程模块的基本功能,是服务进程实现功能的支撑,主要分为三方面:
中断管理
中断处理是内核最基本的功能,没有中断处理就没有OS的并发。当然,为了减少CPU中断的时间,提高程序执行的并发性,内核也只是对中断进行“短暂处理”,继而转入相关其它进程去完成后续工作。
时钟管理
时钟管理是内核的一项基本功能,例如,时间片轮转调度中,每当时间片用完,时钟管理就会产生一个中断信号,使调度程序重新进行调度。
原语操作
原语操作,由一组指令构成,用于完成某一特定功能。这组操作中的指令具有的一个特征是,要么全做,要么全不做,即原子性。它们的执行过程是不允许被中断的。原语操作在系统态下执行,常驻内存。
(2)资源管理功能
进程管理
OS内核可以实现对进程的基础化管理,这些基础化管理功能要么使用频率很高,要么属于可以为其它服务进程提供基础化功能。将这些功能放入到内核中,可以大大提高OS的性能。
存储器管理
OS中存储器管理相关进程的运行频率非常得高,将它们放入到内核中,可以大大提升存储器的运行效率,提高读写速度。
设备管理
由于设备管理与计算机硬件紧密相关,所以大部分功能都是常驻内核的。
3.零拷贝
什么是零拷贝
零拷贝指的是,从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是通过DMA总线技术实现的。零拷贝与具体的编程语言无关,完全依赖于OS,OS支持就可使用,不支持设置了也不起作用。
DMA(DirectMemoryAccess,直接内存访问)是一种计算机系统内部的数据传输技术,需要DMA总线(硬件的体系结构)的硬件支持。其整个数据传输过程是DMA控制器下完成的。
零拷贝在计算机内部数据拷贝及网络传输中都大量使用,用于减少CPU消耗和内存带宽占用,减少用户空间与内核空间的拷贝过程,减少用户态与内核态间的切换次数,提高系统效率,提升系统性能。例如远程服务器处理客户端浏览器的主页打开请求过程,就是一个零拷贝在网络传输中的典型应用。下面全部以该场景为例进行分析。
传统拷贝方式
站在服务器角度,服务器操作系统经历了以下过程:
该拷贝方式共进行了16次用户空间与内核空间的上下文切换,以及4次数据拷贝,其中两次拷贝存在CPU参与。
零拷贝方式
该拷贝方式共进行了14次用户空间与内核空间的上下文切换,以及3次数据拷贝,但整个拷贝过程均没有CPU的参与,这就是零拷贝。
GatherCopy零拷贝
该拷贝方式是由DMA完成,当然,需要当前主机的DMA支持GatherCopy方式。
该方式中没有数据拷贝到socketbuffer。取而代之的是只是将kernelbuffer中的数据描述信息写到了socketbuffer中。数据描述信息包含了两方面的信息:kernelbuffer中数据的地址及偏移量。
该拷贝方式共进行了14次用户空间与内核空间的上下文切换,以及2次数据拷贝,并且整个拷贝过程均没有CPU的参与。
mmap零拷贝
mmap,MemoryMap,存储映射。mmap零拷贝是对零拷贝的改进。当然,若当前主机的DMA支持GatherCopy,mmap同样可以实现GatherCopyDMA的零拷贝。
该方式与普通零拷贝的唯一区别是,应用程序与内核共享了Kernelbuffer。由于是共享,所以应用程序也就可以操作该buffer了。当然,应用程序对于Kernelbuffer的操作,就会引发用户空间与内核空间的相互切换。