当前位置:文档之家› 操作系统基本知识

操作系统基本知识

➢在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU 执行级别就对应着内核态
➢用户态指相应的低级别执行状态,代码的掌控范围会受到限制,只能执行 CPU指令集的一个子集
➢举例:intel x86 CPU有四种不同的执行级别0-3,0级最高,3级最低,Linux只 使用了其中的0级和3级分别来表示内核态和用户态
fNilIeOC中ha的nnFeille.mChaapn(Fnielel.Cmhaapn(n)e方l.M法a其pM实o就de是.R采EA用D_了ON操LY作, 0系, fi统leC中ha的nn内e存l.si映ze(射)); 方式,将内核缓冲区的内存和用户缓冲区的内存做了一个地址映射。 它解决数据从磁盘读取到内核缓冲区,然后内核缓冲区的数据复制移 动到用户空间缓冲区。程序还是需要从用户态切换到内核态,然后再 进行操作系统调用,并且数据移动和复制了两次。
CR3寄存器
进程 1 的页表
虚拟页 0 1 2 3
物理页 3
null 1
null
进程 2 的页表
虚拟页 0 1 2 3
物理页 2
null 1
null
进程 3 的页表
虚拟页 0 1 2 3
物理页 null null 1 null
CPU负责查表(虚拟地址->物理地址),查表失败时触发缺页异常(14号); OS负责填充各个表的内容,并提供缺页中断的中断服务器程序。
• 采用页式管理,实现了进程的程序和数据非连续存放,对内存和外 存统一管理,得到更大的虚拟存储空间,可以同时容纳和运行更多
的进程,有利于系统整体性能的提高。缺点是增加了系统开销,而
且需要一定的硬件支持。由于虚拟空间是连续的,整个进程按照一
维地址顺序排列,同一个程序段在分页的过程中,可能分别位于不 同的页中,代码和数据的共享比较困难。
• b. 异常
• 当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的 内核相关程序中,也就转到了内核态,比如缺页异常。
• c后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去 执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态 到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
✓当物理内存不够时,虚拟内存管理模块会用外存空间模拟内存空 间,并且该模拟过程对应用程序是透明的。
用户地址空间与内核地址空间
1. Linux将每个进程的4GB的独立地址空间又划分为用户地址空间 (0x00000000 ~ 0xBFFFFFFF)和 内核地址空间(0xC0000000 ~ 0xFFFFFFFF)两部分。
操作系统的虚拟内存和虚 拟地址空间
虚拟存储器
• 计算机系统的存储器分为内存(主存)和外存(硬盘)。内存的 价格昂贵,速度高,存储容量有限;外存价格便宜,速度慢,存 储容量很大,适合于存放大量数据。为了使更多的用户进程合理、 充分地使用存储资源,操作系统统一管理内存和外存,即把内存 中暂时不用的内容放在硬盘上,内存中就可以腾出一部分空间, 可以从硬盘装入其他迫切需要的内容。因此,从效果上看,计算 机系统好像为用户提供了一个其存储容量比实际主存大得多的存 储器。人们称这个存储器为虚拟存储器。
• 这种内外存之间的数据交换对用户进程来讲是透明的。从用户进程的 角度来看,系统好像提供了一个很大的内存一样,整个进程都能装进 去而且正常运行,这种逻辑上的大容量存储空间就可以称为虚拟存储 器。实际上,是操作系统的存储管理起了作用,用多次内外存数据交 换的时间换来了大容量的并不真正存在的(虚拟的)内存。因此,可 以想象,访问虚拟存储器的速度要比访问真正内存的速度要慢(大型 手机APP大小最少几个G,实际手机内存没那么大)
利用分页技术将一维连续虚拟空间划分为一个个页,进程的虚拟地址 由两个部分组成:页号P和页内地址(偏移量)W。这两个部分的虚 拟地址经过地址变换后,映射到物理内存的对应单元。
• 页式内存管理地址变换示意图 •
页表
操作系统为每一个进程维护一个独立的页表,进程正在执行的时候, 页表信息记录在页表控制寄存器中,系统根据寄存器的值得到该进 程对应页表的地址,同时利用页号,就可以得到该页对应的页表项。 查找页表,获得了页表所映射的页面号,由页面号和页内地址,就 可以直接找到内存中的对应存储单元。
从宏观角度….
Linux的虚拟内存管理机制为应用程序和驱动 程序提供了两种服务:
✓使每个进程都拥有自己独立的内存地址空间;对于32位Linux而言, 每个任务可寻址的内存地址空间都为0x00000000 ~ 0xFFFFFFFF(232, 4GB);对于64位Linux而言,每个任务可寻址的内存地址空间都为 0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF (264, 17 179 869 184 GB 或者16777216 TB)
• 这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外 围设备中断则是被动的。
切换步骤
• 从触发方式上看,可以认为存在前述3种不同的类型,但是从最 终实际完成由用户态到内核态的切换操作上来说,涉及的关 键步骤是完全一致的,没有任何区别,都相当于执行了一个中断 响应的过程,因为系统调用实际上最终是中断机制实现的,而异 常和中断的处理机制基本上也是一致的,步骤如下:
方法直接将当前通道内容传输到另一个通道,没有涉及到Buffer的任何操作,NIO中的Buffer是 JVM堆或者堆外内存,但不论如何他们都是操作系统内核空间的内存。也就是说这种方式不会有 内核缓冲区到用户缓冲区的读写问题。 • transferTo()的实现方式就是通过系统调用sendfile()(当然这是Linux中的系统调用),根据我们上 面所写说这个过程是效率远高于从内核缓冲区到用户缓冲区的读写的。
• [1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
• [2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信 息保存起来,这个 过程也完成了由用户栈到内核栈的切换过程, 同时保存了被暂停执行的程序的下一 条指令。
• [3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入 相应的寄存器,开始 执行中断处理程序,这时就转到了内核态的 程序执行了。
用户态内核态应用
• Java NIO的技术核心:零拷贝技术,Kafka就是采用Java NIO零拷贝技术 提升文件读取性能。
• JavaNIO中的Channel(通道)就相当于操作系统中的内核缓冲区,有可 能是读缓冲区,也有可能是网络缓冲区,而Buffer就相当于操作系统中 的用户空间缓冲区。
• File file = new File("test.zip"); • RandomAccessFile raf = new RandomAccessFile(file, "rw"); • FileChannel fileChannel = raf.getChannel(); • MappedByteBuffer buffer =
连续的一维虚拟空间经过变换,映射到物理空间中不连续的页面中。 利用分页机制实现虚拟存储管理称为页式存储管理。管理过程中, 内外存的数据传递是以页为单位。页式管理采用请求调页或者预调 页技术实现内外存的统一管理,内存中同时只存放少量经常执行或 者即将执行的页,而其他不经常使用或暂时不会执行的页,存放在 外存中,等需要的时候再调入内存。
➢0xc0000000以上的内核地址空间只能在内核态下访问,0x00000000- 0xbfffffff的用户地址空间在两种状态下都可以访问
➢应用程序可以通过Linux系统调用由用户态进入内核态,c语言调用汇编语言: __asm+汇编
用户态切换到内核态的3种方式
• a. 系统调用
• 用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,系统调用的机制其核心还是使用了操作系统为用户 特别开放的一个中断来实现,例如Linux的int 80h中断。
在整个变换过程中,需要两次访问物理内存,第一次是查找页表,第 二次是获取数据。为了提高效率,硬件一般提供一个高速的联想寄 存器,构成一个快表(translation lookaside buffer),把当前进程中 经常使用的页表项放在快表中,地址变换过程中,首先访问快表, 如果该页表项存在于快表中,就可以直接得到对应的页面号,如果 不在快表中,再去查找页表得到页面号,快表的访问速度要比内存 快得多,这样就可以提高内存的访问速度。
局部性原理
实验证明,在几乎所有进程的执行过程中,某一个特定的时间段中, CPU不是随机地访问整个程序或数据,而是集中地访问程序或数据的 某一个部分。进程的这种访问特性称为局部性原理。
与CPU访问该局部内的数据和代码的次数相比,局部段的变化很缓慢, 正是基于这样的原理,我们才有可能实现虚拟存储管理。把进程的所 有内容划分为一个个小的部分,首先只把系统所必需的部分数据装入 内存,其余部分就放在外存中,开始运行之后,再把所需要的其他部 分换入内存,同时把不再需要的部分从内存中换到硬盘或者清除掉。 当然,与之相配合,实际的内存也要划分为对应的小部分。
• 这种方式适合读取大文件,同时也能对文件内容进行更改,但是如果 其后要通过SocketChannel发送,还是需要CPU进行数据的拷贝。
• processData(); • // 数据处理完成以后,打开一个SocketChannel • SocketChannel socketChannel = SocketChannel.open(new
逻辑地址 查表 转换 物理地址

• 把进程的虚拟地址空间划分为相等大小的部分,每个部分称为页 (page),同时把物理内存空间也按照页的大小划分为小的部分, 称为页面(page frame,也称为页架或页框)。对于80386体系,页 和页面的大小都为4K字节。
相关主题