Linux内核实现机制概述_第1页
Linux内核实现机制概述_第2页
Linux内核实现机制概述_第3页
Linux内核实现机制概述_第4页
Linux内核实现机制概述_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linux2.6内核分析linux内核主要由5个模块构成,分别是:进程调度模块、内存管理模块、虚拟文件系 统模块、进程间通信模块。linux经常使用散列表来实现高速缓存,高速缓存是需要快速访问的信息。、进程进程的模型包括进程控制块(pcb)、程序部分和数据集合三部分。1、进程控制块pcbpcb是进程存在的唯一标识。pcb按功能分主要包含以下四部分:进程标示符、处理机状态、进程调度信息、进程控 制信息。(1) 进程标示符:唯一标识一个进程。(2) 处理机状态:有处理机的各种寄存器中的内容组成,寄存器包括通用寄存器、指 令寄存器、程序状态字psw、和用户栈指针。当初立即被屮断时,进程运行信息必须保

2、存 在pcb中,以便运行时从断点继续执行。(3) 进程调度信息:存放进程状态、进程优先级、进程调度所需其他信息(如调度算 法,进程已运行时间,等待cpu时间)、时间或阻塞原因。(4) 进程控制信息:包拈程序和数据的内存或者外存地址,进程同步和通信机制,资 源清单(除cpu以外进程所需的全部资源以及已经分配的资源)、链接指针(下一进程pcb 地址)。linux的进程控制块pcb使用一个成为task_struct的结构体来描述。该结构体中定义了 进程的几种状态:(1) task_running状态。linux的进程运行状态包栝实际的运行和就绪状态,对两者 的区分是根据当前是否占有cpu,结构体屮c

3、urrent变量可以区分两者。(2) taskjnterruptible状态。即可屮断的等待状态,当进程在等待某个事件和某个 资源,可中断等待状态的进程可以被信号唤醒而进入就绪状态等待调度。(3) taskjjninterruptible状态。即不可屮断等待状态,该状态进程由于硬件不能满 足,不能被信号唤醒,必须等到得到所等待的资源之后才能被唤醒。(4) task_zombie状态。即僵死状态,终止进程所占有的资源全部释放之后,还保存 着pcb信息,这种占有pcb但已被撤销的进程处于僅死状态(如僅死进程)。(5) task_stopped状态。即暂停状态,一般都是有运行状态转换来,正等待某种特

4、殊 处理,如调试跟踪的程序。(6) task_dead状态。新增加的状态,指已经退出但是不需要父进程回收的进程。 linux內核创建一个进程时,首先会新建一个空的task_struct结构体,并将相应信息填入结构体屮,然后将该结构体的指针添加进task数组,这个数组大小由nr_task (默认一般 为512)指定。调度程序一直维持着一个current指针,它指向当前正在运行的程序。tasko 必须指向init_task进程(0号进程)。linux中,内核将所有struct_task结构体以两种方式组织:(1) 哈希表,将进程的pid作为哈希算法的输入,可以用一个给定pid快速查找到进 程,通过

5、find_task_pid()来定位相应进程。(2) 双向循环链表,这样可以使系统很容易遍历所有的进程。通过调用f0r_each_tasko 来实现遍历。tasktruct结构体屮的变g list_head的作用就是将进程通过双向链表将进程连 接起来。链表的首部和头部都是init_task进程。task structtask structtask struct2、进程的创建linux提供了三种创建新进程的方法:fork、vfork(、clone()三者分别对应系统调用的sys_fork()> sys_vfork()> sys_clone(),最终三者都是通过do_fork()调用完

6、成的。目前linux在创建进程吋,采用“写吋拷贝”技术,即在创建进程吋并不将父进程所有 的资源都复制给子进程,而是需要吋冰进行资源的拷贝,可以大大提高linux的性能。(1) fork()函数调用fork后,系统会创建一个子进程,子进程和父进程不同的只有它的进程id和父进 程id,其他都一样。地址空间不共享,由于采用“写时拷贝”技术,子进程并不完全拷贝 父进程的数据段和栈、堆等的复制,这些区域作为父子进程的共享区域,而且内核将他们访 m权限设置力只读,如果父子进程任何一个试图修改此区域,内核就为那块內存拷贝制作一 个副本。之所以采用“写时拷贝”是因为一般fork后会调用exec调用其他的执行体

7、。父子进程的执行顺序不确定。fork函数被调用一次,但是返回两次值。两次返回值的区别是,子进程的返回值是0, 父进程返回值是子进程的进程id。调用失败的话返回-1。(2) vfork(>函数该函数与fork基本一致,只不过父子进程共享父进程的地址空间。对于vfork创建新进程后,父进程会阯塞,子进程借用父进程的地址空间运行,直到子 进程退出或者调用exedexec函数族的作用是启动另一个程序的执行),父进程才可以运行。vfork和fork返回值相同。(3) clone()函数clone函数和fork、vfork不同,它接受一个指叫函数的指针和该函数的参数,在创建子 进程成功时就调用这个函

8、数执行。3、进程终止分为a愿终止和被动终止。(1) 自愿终止a. 显式自愿终止:在进程中调用exit()函数b. 隐式自愿终止:进程从某个程序的主函数退山(2) 被动终止a. 当进程接收到一个它既不能处理也不能忽略的信号和异常b. 进程接收到sigabrt或者其他终止信号。上述进程终止主要分为两步来完成:(1) 首先通过调用do_exit()函数释放掉与进程相关的大部分资源,并使进程处于僵死 状态,但是进程描述符不释放。(2) 然后对进程的处理应看子进程与父进程谁先终止。子进程先终止的话,则子进 程一直处于僵死状态,直到父进程调用waito或者waitpid(。调用完成后则完全 释放。父进程先

9、终止,则a核必须为子进程找到新的父进程,方法是首先给子 进程在当前组内找一个线程最为父进程,不行就让init做父进程。wait()函数的两个作用:获取内核发送來的子进程终止消息和淸除子进程的所有独享资源。 wait函数会首先挂起调用它的进程,知道该进程的一个子进程终止,此时阁数会返回该子进 程的pid给父进程。4、线程的实现linux内核巾没有专门的实现线程的机制,而是通过用户级程序库來实现的,例如 pthread库,以便将所有的线程映射到一个单独的内核级进程中。linux提供的一种不区分进 程和线程的方案:通过使用一种类似于solaris轻量级进程的方法,用户级线程被映射到内 核级进程上,组

10、成一个用户级进程的多个用户级线程被映射到共享同一个id的多个linux 内核级进程上。这使得这些进程可以共享文件和内存等资源,使得同一组中的进程调度切换 时不需要切换上下文。5、linux进程调度linux是一个抢占式多任务系统,高优先级的可以抢占低优先级的cpu运行。linux优先 级分为静态优先级和动态优先级。linux进程分为普通进程和实时进程两类。实时进程创建时静态优先级就已经分配而且 不会改变,不为实时进程计算动态优先级,实时进程的优先级范围为099都高于普通进程 100139。普通进程优先级同样有静态优先级,但是没有作用,内核为普通进程计算动态优 先级,并根据优先级分配时间片,来调

11、度进程。linux提供了三种调度策略:(1) sched_normal面向普通进程的时间片轮转策略。时间片用完后再选择一个优先 级相对较高的进程进程调度。(2) sched_fifo而句对响应时间要求比较、运行所需时间较短的实时进程。(3) sched_rr面向对响应时间要求比较高、运行所需时间较长的实时进程。总结调度,根据进程的分类调度可分为实时调度和非实时调度。(1)实时调度一针对实时进程静态优先级。对于实时进程,静态优先级决定了对cpu的抢占,当高优先级的进程到达时,会抢占 低优先级进程的cpu,同样可以知道实时进程总是能抢占普通进程的cpu。对于同一优先级 的实时进程则又可采用两种调度

12、算法:fifo (先來先服务)和rr (时间八轮转)。例如,当前进程有a (30),b (20),c (20), d(5且b早于c到达,括号内为进程的静 态优先级。则采用fifo为:d优先级最高先执行b,然后是b和c优先级相同,由于b罕 到达,所以先执行b再c,最后是优先级最低的a。执行顺序为dbca.采用rr则仍然 是先运行d,完毕后则交换运行b和c,运行完毕后是a。顺序为dbc一bc一a。(2)非实时调度一普通进程动态优先级。内核为普通进程计算动态优先级,根据此优先级为进程分配不同的时间片(rr),此优 先级只作为分配时间片的基础,不能够通过动态优先级商低抢占cpu。每次当进程的时间片 使

13、用完后都会为其重新计算动态优先级及分配的时间片。二、系统调用linux的每个系统调用都是通过一些宏、一张系统调用表、一个系统调用入口来完成。(1) 宏linux为每个系统调用定义了一个唯一的编号,成为系统调用号。通过宏定义方式定义, 例如 #define _nr_setupo。linux中系统调用号一旦分配就不可以再进行更改,否则已经编译好的木块将不能正常 使川。即使删除的系统调川,也不可以把之前己经分配的系统调川号重新分配,删除的系统 调用有相应的空处理。(2) 系统调用表系统调用表是一个函数指针数组,跳转时以系统调用号作为数组下表,找到相应的函数 指针。(3) 系统调用入li系统调用入口其

14、实是由系统调用入口函数实现。功能是将系统调用号放入eax寄存器后 移用int $0x80使处理器转昀系统调用入口,查找系统调用表,进而执行核调用真正的函 数。linux系统调用实际是软中断。系统调用过程中,linux首先通过执行相应的机器代码指 令int $0x80产生一个软中断的异常处理信号,使系统自动从用户态切换到内核态。三、中断机制linux中断主要分为硬中断(irq)和软中断两类。irq主要分为:短类型irq和长类型irq。短类型irq需要很短的吋间,在此期间机器 的其他部分被锁定,而且不能发生其他中断被处理。长类型irq耑要较长的时间,期间可能 发生其他中断。当用户程序被来自外部信号

15、中断后,立即保存现场工作,包桮保存返回地址和用户寄存 器等数据,然后查找屮断向量表,找出相应的屮断处理程序。系统将中断分为三种:捕俘、 系统调用和外中断。捕俘:通过捕俘处理程序入口表查找到用户编写的处理程序执行。系统 调用:软中断,通过系统调用表找到操作系统核心提供的服务例程。外中断:直接调川核心 提供的外中断处理程序运行。1、硬中断过程linux中,若一个硬件想向cpu发送中断信号,必须首先获得一个可用的“中断请求线” (即巾断前必须获得一个可川的irq号),产生一个中断信号后以电信号发送给中断控制器(硬件芯片),接着cpu根据中断控制器的状态位判定中断的来源,获得中断号,根据中断 号查找中

16、断向量表,从表中获得中断处理函数的地址,然后跳转到中断函数入口地址处,执 行这个函数。2、中断处理程序一硬中断屮断处理程序主要做的工作:a. 保护未被硬件保护的一些必须的寄存器b. 识别各个中断源,分析产生中断的原因c. 处理发生的中断事件d. 恢复正常的工作linux规定屮断处理程序是不可重入的,指的是同一屮断线上不可以再发生新的屮断, 因为所有的处理器都将原中断所在的中断线已经屏蔽。linux中同样规定了同一中断程序不能够并行,这样同一个中断处理程序不可以被同吋 调用來处理嵌套的中断。linux中将中断处理程序分为两部分:上半部和下半部。上半部主要用来处理那些具有严格时限要求的任务。上半部

17、可以看做是一个用来“登记 中断”功能的函数,将中断例程的下半部挂到下半部执行队列中。上半部要求执行很快,主 要是因为上半部完全屏蔽中断下执行,即不可中断。下半部主要用于处理那些可以稍后执行的任务。下半部是可中断的,当发生其他中断时, 下半部可中断等待另外一个中断的上半部执行完毕后再继续执行。3、下半部机制linux中提供了三种机制来实现下半部机制。(1) 软中断软中断是一组静态定义的下半部结构,使用数组来组织软中断结构体,共有32个。两 个相同的软屮断可以同时执行,必须在编译期间进行静态注册。软中断机制一般都保留给系统中对时间要求最严格以及重要的下半部来使用。linux2.6 中只有两个子系统

18、是通过软中断来实现的:网络子系统和scsi。(2) tasklettasklet要比软中断机制方便且简单,而且它本身也是基于软中断实现,属于软中断,既 可以静态的创建tasklet,也可以动态的创建tasklet。linux中tasklet分为两类:hi_softirq和taskletjrq,前者比后者的优先级要高,优 先调用前者。在中断数组irq_desc】中会分配两项给tasklet,即两种类型各占数组中一项。 两者分别以一个链表来组织。(3) 工作队列(work queue)工作队列与前两者最大的不同之处是它是唯一一个能在进程上下文中运行的下半部机 制,意味着它能允许睡眠。工作队列的实质

19、是将推后的工作交给一个内核线程来完成,核心思想即吋创建一个内核 线程,linux中已经默认提供了一种命名为enents 一类工作者线程來实现工作队列。4、中断的数据结构linux p、j核中定义了一个数纟11 irq_desc数组来管理屮断。数纟11中的每一项对应一个中断 源。数组中的每个成员都为irq_desc_t结构体,即数组中的每一项对应着中断向量表中的一 项。(1) irq_desc_t 结构体irq_desc_t结构体用来描述屮断源。其屮结构体屮的handler指向hw_interrupt_type结 构体的指针,action变量指向巾irqaction结构体组成的单向链表的头的指针

20、。(2) irqaction 结构体该结构体中指明內核接收到特定irq后该才去的动作。结构体屮变:w: handler指向屮断 处理程序。(3) hw_interrupt_type 结构体用來描述中断控制器,是一个抽象的中断控制器。5、中断上下文当一个屮断处理程序正在执行时,内核处于中断上下文中。中断上下文是不可以睡眠的。 与进程上下文是不同的,进程上下文即使睡眠了也可以重新调度将其唤醒,中断上下文不可 以被重新调度。中断处理程序没有自己的堆栈,它会共亨被它中断的那个进程的堆栈,如果没有进程正 在执行,则占用idle进程的堆栈(每个处理器都有自己的运行队列,队列屮都有idle进程, 当前运行队

21、列都dequeue时则运行idle进程)。ui内核同步机制内核同步主要是同步各执行单元对共享数据的访问,尤其是多处理器的同步。unux2.6中内核同步机制主要包括以下几种:原子操作、信号量(semaphore)、读写信号量(rw_semaphore)、自旋锁(spinlock)、大内核锁(bkl)等。(1)原子操作原子操作就是指某一个操作在执行过程中不可以被打断,要么全部执行,要不就一点也 不执行。原子操作需要硬件的支持,与体系结构相关,使用汇编语言实现。原子操作主要川于实现资源计数,很多引用计数就是通过原子楝作实现。linux屮提供 了两种原子操作接口,分别是原子整数操作和原子位操作。原子整

22、数操作只对atomic,!类型的数据进行操作,不能对c语言的int进行操作,使用 atomic_t只能将其作为24位数据处理,主要是在sparc体系结构中int的低8为中设置了一 个锁,避免对原子类型数据的并发访问。原子位操作是针对由指针变量指定的任意一块内存区域的位序列的某一位进行操作。它 只是针对普通指针的操作,不需要定义一个与该操作相对应的数据类型。(2)自旋锁linux自旋锁保证了任意吋刻只能有一个执行线程进入临界区,其他试图进入临界区的 线程将一直进行尝试(即自旋),直到获得该锁。自旋锁主要应川在加锁时间不长并且不会 睡眠的情况。自旋锁的本质是对内存区域的一个整数的操作,任何线程进入

23、临界区之前都必须检査该 整数,可用则进入,都则一直忙循环等待。自旋锁机制让试图获得该锁的线程一直进行忙循环(占用cpu),因此自旋锁适合于断 时间内进行轻量级加锁。而且自旋锁绝对不可以递归使川,否则会被自己锁死。linux自旋锁主要应用与多核处理器中,单cpu中不会进行自旋锁操作。 linux上的自旋锁有三种实现:a. 在单cpu,不可抢占内核中,自旋锁为空操作。b. 在单cpu,可抢占内核中,自旋锁实现为"禁止内核抢占,并不实现"自旋。c. 在多cpu,可抢占|a)核屮,自旋锁实现为"禁止内核抢占 + "自旋。其中,禁止内核抢占只是关w"可抢

24、占标志,而不是禁止进程切换。显式使用schedule或进 程阻塞(此也会导致调用schedule)时,还是会发生进程调度的。(3)读/写自旋锁linux巾规定,读/写自旋锁允许多个线程同时以只读的方式访问临界资源,只有当一个 线程想更新数据时,才会互斥访问资源。读写自旋锁包括一个24位读者计数和一个解锁标记来实现的。(4)信号量linux中提供了两种信号量:a. 内核信号量,由内核程序使用b. system v i pc信号量,由用户进程使用当一个线程去请求以不可用的信号量时,和自旋锁不同,该进程会进入睡眠(不再占用 cpu),加入到等待队列屮,直到被唤醒,所以只有可睡眠的状态才可以使用信号量

25、。信号量实现的结构体semphore中有一变量count计数。根据count取值的设定,信号 量可以分为二元信号量和计数信号量,当count初值为1时,则力二元信号量。计数信号量 允许任意数量的锁持有者,这点和自旋锁是不同的(自旋锁只允许一个)。(5)读/写信号量读写信号量实际上对于读者使用的是一个计数信号量,写者使用的是二元信号量。读写 信号量同读写自旋锁一样提高了内核的并发度。linux内核时按照先进先出(fifo)的顺序來处理等待读写信号量的进程。具体过程是 如果一个进程试图获取一个不可用的信号量时,加入到等待队列的末尾,当信号m可用时, 内核首先唤醒等待队列的第一个进程,如來该进程为写

26、进程,那么该进程获得信号m。如果 该进程如果为一个读进程,那么其后的所有的读进程都可以被唤醒并获得信号量,但是中间 不能跳跃。(6) bkl (big kernel lock)bkl即全局内核锁,也称大内核锁,它是一个全局自旋锁。大内核锁也是用来保护临界 区资源的,避免出现多个处理器上的进程同时访m同一区域,整个内核中只有一个大内核锁。bkl是一个名为kernel_flag的a旋锁,持有该锁的进程仍w以睡眠,当睡眠时持有的锁 将被动释放,该进程被唤醒时重新持有该锁。linux允许一个进程可以递归的持有bkl, bkl是一个递归锁。它的设计思想是,一旦某个内核路径获取了这把锁,那么其他所有的内核

27、路径都不能再 获収到这把锁。自旋锁加锁的对象一般是一个全局变量,大内核锁加锁的对象是一段代码, 里面可能包含多个全局变量。那么他带来的问题是,虽然a只需要互斥访问企局变量a, 但附带锁了全局变量b,从而导致b不能访问b 了(7) 屏障屏障或称内存屏障,是用来解决内存同步问题的,具体力对由于编译器的优化和缓存的 使用,导致对内存的写入操作不能及时的反应出来,也就是说当完成对内存的写入操作之后, 读取出来的可能是旧的内容的一种解决机制。内存屏障分类:a. 编译器引起的内存屏障b. 缓存引起的内存屏障c. 乱序执行引起的内存屏障五、内存管理机制内存管理主要负责完成当进程请求内存时给进程分配可用的内存

28、,当进程释放内存吋, 回收相应的内存,同时负责跟踪系统中相应内存的使川状态。linux采用页式内存管理,页是物理内存管理的基本单位。但严格來说linux采用的是 段页式內存管理,既分段也分页。内存映射的时候,先确定对应的段,确定段基地址,段内 分页,再找到对应的页表项,确定页基地址,再由逻辑地址的低位确定的页偏移:w:就能找到 最终的物理地址。但linux中的所有段地址都是0,即所有的段是相同的,之所以有段的概 念是因为linux为了符合硬件体系。所以linux实际采用的是页式内存管理,但段的概念在 内核中确实存在。1、物理内存的管理linux中首先将内存分为若干个节点,每个节点下面又可分为1

29、3个区,每个区下面会 有若干个页。(1) 节点內存节点主要是依据cpu访问代价不同而划分的。一个cpu对应一个节点。闪核数组 node_data形式姐织节点,存储的为struct page_data_t指针来描述p、j存分区。(2) 区内核以struct_zone來描述内存分区。内核将所有的物理页分力3个区:zone_dma、 zone_normal、zone_highmemozone_dma区屮包含的页可以用来进行dma操作,即直接闪存访问操作,通常为物理 内存的起始16m。zone_normal区包含的页是可以进行正常的a存映射的页物理闪存为 16896m。zone_highmem区称为“

30、高端内存”,该区所包含的页不可以进行永久映射,即 不可以永久映射到内核地址,物理内存896m以后的。高端内存的边界为896m的原因:32为linux系统中虚拟内存空间为0-4g, 3g-4g为内 核态。为了应对核映射超过1g,linux采収的策略:内核地址空间的896m采用固定映射, 映射方法:虚拟地址-3g=物理地址,只能映射896m,即3g3g+896m,剩余的128m (3g+896m4g)采用动态映射。linux下以struct zone结构体来表示一个区,在该结构体中变量struct page *zone_mem_map用来管理该ix下的内存映射表。(3)页每一个物理页框都使用一个数

31、据结构struct page來描述,该结构体中的iru变量构建用 于lru页而置换的链表。在页框空闲惜况下,该成员变量用于构建伙伴算法、链表同等大 小的空闲內存块。大多数32bit的操作系统的页大小为4kb。2、伙伴算法unux采用的是伙伴(buddy)算法对物理内存进行管理。伙伴机制是操作系统的一种动 态存储管理算法,该算法通过不断平分较大的空闲内存块来获得较小的空闲内存块,直到获 得所盂的闪存块。当内存释放时,该算法尽可能的合并空闲块。该算法要求内存块的分配和 合并都是以2的幂次方为单位。在“区”内存结构体struct zone中有一 struct free_area类型的数组free_a

32、rea,数组最 大为12个元素。数组的下标k对应着固定大小21个页框空闲内存区域的双向链表头。当 需要空闲块为4(即2a2)个页框时则查找free_area2,如果没有合适的,则查找free_area3, 直到找到合适的。3、slab分配器linux中引入slab是为了减少对伙伴算法的调用,采用slab分配器来减少频繁分配和释 放内存数据结构的开销,同时减少了碎片的产生。slab分配机制是基于伙伴算法之上实现。 slab是基于一组对象缓存,把不同对象划分为caches (物理内存),每个cache保存一种类型的对象,每个cache巾一个或者多个slab组成,每个slab包含一个或者多个page

33、组 成。a对象-a每个slab处于3中状态之一,即full、partial和empty (分别是满、部分满、空),其中 满状态的slab没有任何可分配的空闲对象。当请求空闲对象时则从部分满和空的slab屮分 配。linux lal核屮的cache以结构体kmem_cache_s来表示,结构体巾变量lists中存储的力 三个链表分别对应于slab的三种状态。总结来说,当为一对象中请内存时,首先查找到该对象的cache,然后查找cache中的 slab列表,分配空闲闪存。当释放该对象内存时,则返回给该对象对应的slab。这样伙伴算 法就不需要频繁的进行分配和合并操作。4、虚拟内存(1)逻辑地址-线

34、性地址-物理地址的转换过程 逻辑地址即程序指令的地址,线性地址指页式转换前的地址(虚拟地址),物理地址则是物理内存中的地址。一个逻辑地址由两部份组成,段标识符:段内偏移量。段基址确定它所在的段居于整个 存储空间的位置,偏移量确定它在段内的位置。linux屮由于段基址都是0,所以逻辑地址和 线性地址相同。线性地址再通过mmu进行转换到物理地址,这个过程下面重点讲下。linux也是内存管理使用三级表结构:页目录、页屮间目录、页表。一个活动任务都有 一个页目录,大小一般为一页,页目录必须在内存中。页中间目录可以跨越多个页。页表同 样可以跨越多个页,对应具体的页框。具体过程如下图:li mix的三级分

35、页管理(2)页面置换算法linux中页结构体的组织方式为双向循环链表。linux中页面置换算法基于时钟算法机制 实现,页结构体page中有一变量count专门用来计算页而被引用的次数。每当页而被访问 一次时,count加1。在unux后台,unux周期性地扫描全局页池,并j1当它在内存屮的所 有页间循环时,将扫描的每一页的count减1。age越大则使用频率越高。s终内核通过最 近未使用(lru)算法进行页面置换。6、高速缓存linux使用了一系列的高速缓存相关的内存管理技术来提高性能。此处的高速缓存并非 是物理缓存,而是软件方法。linux屮主要包括以下几个缓存:(1)buffer cache,包括了用于块设备驱动程序的数据缓冲区。这些缓存区固定(一般 512b),包拈从块设备要读取的数裾和要写入块设备的数据。操作时先查看缓冲区。(2)page cache,用来加快对磁盘上映像和数据的访问。用来缓存文件的逻辑內容,一次缓存一页。(3)swap cache,只有改动过的(或脏)页才存在交换文件屮,只要交换文件没有再 次修改,下次这些页需要交换出时就不需要再写到交换文件中。(4)hardware cache,常见方法是在处理器中pte的高速缓存。这种怙下处理器不需 要直接读取页表,需要时把页表放在缓存区屮。cpu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论