最新嵌入式系统第六章嵌入式Linux操作系统PPT课件.ppt
-
资源ID:59525103
资源大小:1.01MB
全文页数:88页
- 资源格式: PPT
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
最新嵌入式系统第六章嵌入式Linux操作系统PPT课件.ppt
嵌入式系统第六章嵌入式嵌入式系统第六章嵌入式LinuxLinux操作系统操作系统5.1 与与Linux相关术语相关术语n nGNUn nGUNGUN项目项目(GNU Project)(GNU Project)开始于开始于19841984年,主要由自由软年,主要由自由软件基金(件基金(Free Software FoundationFree Software FoundationFSFFSF)资助的)资助的一个项目,目标是开发一个自由的、一个项目,目标是开发一个自由的、UNIXUNIX类型的操作类型的操作系统,称为系统,称为GNUGNU系统。系统。n nGNUGNU是是“GNUGNU s Not UNIXs Not UNIX”的首字母的递归缩写。的首字母的递归缩写。n nGPLn n所有的所有的GNUGNU软件和派生工作均遵循软件和派生工作均遵循GNUGNU通用公通用公共许可证,即共许可证,即GPLGPL。n n5.2.3 进程管理进程管理n n进程的基本概念进程的基本概念 进程就是运行中的程序。一个运行着的程序,可能有多个进程。进程就是运行中的程序。一个运行着的程序,可能有多个进程。对于进程来说,可以看成是一个具有独立功能的程序关于某个数据集对于进程来说,可以看成是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序合的一次可以并发执行的运行活动,是处于活动状态的计算机程序。n n进程的属性进程的属性 进程的定义:一个进程是一个程序的一次执行的过程;程进程的定义:一个进程是一个程序的一次执行的过程;程序是静态的,它是一些保存在磁盘上的可执行的代码和数序是静态的,它是一些保存在磁盘上的可执行的代码和数据集合;进程是一个动态的概念,它是据集合;进程是一个动态的概念,它是LinuxLinux系统的基本的系统的基本的调度单位。一个进程由如下元素组成:调度单位。一个进程由如下元素组成:程序读取的上下文,它表示程序读取执行的状态。程序读取的上下文,它表示程序读取执行的状态。程序当前执行的目录。程序当前执行的目录。程序服务的文件和目录。程序服务的文件和目录。程序访问的权限。程序访问的权限。内存和其他分配给进程的系统资源内存和其他分配给进程的系统资源。n nLinuxLinux进程中最知名的属性就是它的进程号(进程中最知名的属性就是它的进程号(Process Idenity Process Idenity NumberNumber,PIDPID)和它的父进程号()和它的父进程号(Parent Process IDParent Process ID,PPIDPPID)。)。PIDPID、PPIDPPID都是非零正整数。一个都是非零正整数。一个PIDPID唯一地标唯一地标识一个进程。一个进程创建新进程称为创建了子进程识一个进程。一个进程创建新进程称为创建了子进程(Child ProcessChild Process)。相反地,创建子进程的进程称为父进)。相反地,创建子进程的进程称为父进程。所有进程追溯其祖先最终都会落到进程号为程。所有进程追溯其祖先最终都会落到进程号为1 1的进程的进程身上,这个进程叫做身上,这个进程叫做initinit进程,是内核自举后第一个启动的进程,是内核自举后第一个启动的进程。进程。initinit进程扮演终结父进程的角色。因为进程扮演终结父进程的角色。因为initinit进程永远进程永远不会被终止,所以系统总是可以确信它的存在,并在必要不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。的时候以它为参照。n nLinuxLinux下进程的结构下进程的结构 代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。而数据段则存放程序一个程序,那么它们就可以使用同一个代码段。而数据段则存放程序的全局变量、常数及动态数据分配的数据空间。堆栈段存放的就是子的全局变量、常数及动态数据分配的数据空间。堆栈段存放的就是子程序的返回地址、子程序的参数及程序的局部变量。堆栈段包含在进程序的返回地址、子程序的参数及程序的局部变量。堆栈段包含在进程控制块程控制块PCBPCB(Process Control BlockProcess Control Block)中。)中。PCBPCB处于进程核心堆栈的处于进程核心堆栈的底部,不需要额外分配空间。底部,不需要额外分配空间。n n进程状态进程状态进程在生存周期中的各种状态及状态的转换进程在生存周期中的各种状态及状态的转换 。LinuxLinux系统的进程状态模型的各种状态:系统的进程状态模型的各种状态:用户状态:用户状态:用户状态:用户状态:进程在用户状态下运行的状态。进程在用户状态下运行的状态。内核状态:内核状态:内核状态:内核状态:进程在内核状态下运行的状态。进程在内核状态下运行的状态。内存中就绪:内存中就绪:内存中就绪:内存中就绪:进程没有执行,但处于就绪状态,只要内核调度它,就进程没有执行,但处于就绪状态,只要内核调度它,就可以执行。可以执行。内存中睡眠:内存中睡眠:内存中睡眠:内存中睡眠:进程正在睡眠并且进程存储在内存中,没有被交换到进程正在睡眠并且进程存储在内存中,没有被交换到SWAPSWAP设备。设备。就绪且换出:就绪且换出:就绪且换出:就绪且换出:进程处于就绪状态,但是必须把它换入内存,内核才能进程处于就绪状态,但是必须把它换入内存,内核才能再次调度它运行。再次调度它运行。睡眠且换出:睡眠且换出:睡眠且换出:睡眠且换出:进程正在睡眠,且被换出内存。进程正在睡眠,且被换出内存。被抢先:被抢先:被抢先:被抢先:进程从内核状态返回用户状态时,内核抢先于它做了上下文进程从内核状态返回用户状态时,内核抢先于它做了上下文切换,调度了另一个进程。原先这个进程就处于被抢先状态。切换,调度了另一个进程。原先这个进程就处于被抢先状态。创建状态:创建状态:创建状态:创建状态:进程刚被创建。该进程存在,但既不是就绪状态,也不是进程刚被创建。该进程存在,但既不是就绪状态,也不是睡眠状态。这个状态是除了进程睡眠状态。这个状态是除了进程0 0以外的所有进程的最初状态。以外的所有进程的最初状态。僵死状态(僵死状态(僵死状态(僵死状态(zombiezombie):进程调用:进程调用exitexit结束,进程不再存在,但在进程结束,进程不再存在,但在进程表项中仍有记录,该记录可由父进程收集。表项中仍有记录,该记录可由父进程收集。n n进程的创建与结束进程的创建与结束 在在LinuxLinux系统中,通常使用系统中,通常使用fork()fork()系统调用用来复制一个现有进程,从系统调用用来复制一个现有进程,从而创建一个全新的进程。被复制的进程被称为父进程,新产生的进程而创建一个全新的进程。被复制的进程被称为父进程,新产生的进程被称为子进程。被称为子进程。为了方便用户处理父进程与子进程之间的一些事物,为了方便用户处理父进程与子进程之间的一些事物,LinuxLinux允许父进程允许父进程在创建了进程之后,通过调用在创建了进程之后,通过调用wait()wait()先进入等待状态,以使子进程先先进入等待状态,以使子进程先运行,然后再决定自己的进一步行为,这成为父进程的阻塞方式。运行,然后再决定自己的进一步行为,这成为父进程的阻塞方式。进程的结束可以使用进程的结束可以使用exit()exit()系统调用,无论在执行到什么位置,只要执系统调用,无论在执行到什么位置,只要执行到行到exitexit系统调用,进程会停止所有操作并将其占用的资源释放掉。系统调用,进程会停止所有操作并将其占用的资源释放掉。n n进程的创建与结束进程的创建与结束有一个更简单的执行其他程序的函数有一个更简单的执行其他程序的函数systemsystem,参数,参数stringstring传递给一个命传递给一个命令解释器(一般为令解释器(一般为shsh)执行,即)执行,即stringstring被解释为一条命令,由被解释为一条命令,由shsh执行该执行该命令。命令。除了除了systemsystem之外,系统调用之外,系统调用execexec来执行一个可执行文件,来代替当前进来执行一个可执行文件,来代替当前进程的执行映像。程的执行映像。系统调用系统调用exitexit的功能是终止发出调用的进程。的功能是终止发出调用的进程。父进程和子进程的关系是管理和被管理的关系,当父进程父进程和子进程的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止时,父进程终止时,子进程也随之而终止。但子进程终止时,父进程并不一定终止。并不一定终止。n n进程的组成 n n在在LinuxLinux中,进程是以进程号中,进程是以进程号PIDPID(Process IDProcess ID)作为标示。)作为标示。任何对进程进行的操作都要给与其相应的任何对进程进行的操作都要给与其相应的PIDPID号。每个进号。每个进程都属于一个用户,进程要配备其所属的用户编号程都属于一个用户,进程要配备其所属的用户编号UIDUID。此外,每个进程都属于多个用户组,所以进程还要配备其此外,每个进程都属于多个用户组,所以进程还要配备其归属的用户组编号归属的用户组编号GIDGID的数组。的数组。n n进程运行的环境成为进程上下文。进程运行的环境成为进程上下文。LinuxLinux中进程的上下文由中进程的上下文由进程控制块进程控制块PCBPCB(Process Control BlockProcess Control Block)、正文段、数据)、正文段、数据段以及用户堆栈组成。其中,正文段存放该进程的可执行段以及用户堆栈组成。其中,正文段存放该进程的可执行代码,数据段存放进程中静态产生的数据结构,而代码,数据段存放进程中静态产生的数据结构,而PCBPCB包包括进程的编号、状态、优先级以及正文段和数据段中数据括进程的编号、状态、优先级以及正文段和数据段中数据分布的大概情况。分布的大概情况。n n一个称作进程表(一个称作进程表(Process TableProcess Table)的链表结构将系统中所)的链表结构将系统中所有的有的PCBPCB块联系起来块联系起来。n n启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。由用户输入命令,直接启动一个进行设置,根据用户要求自行启动。由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为很多种,根据启动程便是手工启动进程。但手工启动进程又可以分为很多种,根据启动的进程类型不同、性质不同,实际结果也不一样。的进程类型不同、性质不同,实际结果也不一样。n n(1 1)前台启动)前台启动前台启动是手工启动一个进程的最常用的方式。用户键入一个命令前台启动是手工启动一个进程的最常用的方式。用户键入一个命令“dfdf”,就已经启动了一个进程,而且是一个前台的进程。,就已经启动了一个进程,而且是一个前台的进程。n n(2 2)后台启动)后台启动直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果。时,且用户也不急着需要结果。n n进程的状态和调度进程的状态和调度 一般来说,所有进程都要经历三种状态,即运行态、就绪态和阻塞态一般来说,所有进程都要经历三种状态,即运行态、就绪态和阻塞态 在在LinuxLinux系统中将上述三种状态进行重新组织,得到了系统中将上述三种状态进行重新组织,得到了LinuxLinux进程的几进程的几个状态:个状态:n n进程的调度进程的调度 为了让为了让LinuxLinux来管理系统中的进程,每个进程用一个来管理系统中的进程,每个进程用一个task_structtask_struct数据结数据结构来表示(任务与进程在构来表示(任务与进程在LinuxLinux中可以混用)。数组中可以混用)。数组tasktask包含指向系统包含指向系统中所有中所有task_structtask_struct结构的指针。这意味着系统中的最大进程数目受结构的指针。这意味着系统中的最大进程数目受tasktask数组大小的限制,缺省值一般为数组大小的限制,缺省值一般为512512。创建新进程时,。创建新进程时,LinuxLinux将从系统将从系统内存中分配一个内存中分配一个task_structtask_struct结构并将其加入结构并将其加入tasktask数组。当前运行进程的数组。当前运行进程的结构用结构用currentcurrent指针来指示。指针来指示。n nLinuxLinux还支持实时进程。这些进程必须对外部时间作出快速反应(这就是还支持实时进程。这些进程必须对外部时间作出快速反应(这就是“实实时时”的意思),系统将区分对待这些进程和其他进程。虽然的意思),系统将区分对待这些进程和其他进程。虽然task_structtask_struct数据结数据结构庞大而复杂,但它可以分成一些功能组成部分:构庞大而复杂,但它可以分成一些功能组成部分:StateState 进程在执行过程中会根据环境来改变进程在执行过程中会根据环境来改变statestate。SchedulingSchedulingInformationInformation 调度器需要这些信息以便判定系统中哪个进程最迫切需要运行。调度器需要这些信息以便判定系统中哪个进程最迫切需要运行。IdentifiersIdentifiers 系统中每个进程都有进程标志。进程标志并不是系统中每个进程都有进程标志。进程标志并不是tasktask数组的索引,它仅仅是个数字。数组的索引,它仅仅是个数字。Inter-ProcessInter-ProcessCommunicationCommunication LinuxLinux支持经典的支持经典的Unix IPCUnix IPC机制。机制。LinksLinks LinuxLinux系统中所有进程都是相互联系的。系统中所有进程都是相互联系的。TimesTimesandandTimersTimers 核心需要记录进程的创建时间以及在其生命期中消耗的核心需要记录进程的创建时间以及在其生命期中消耗的CPUCPU时间。时间。FileFilesystemsystem 进程可以自由地打开或关闭文件,进程的进程可以自由地打开或关闭文件,进程的task_structtask_struct结构中包含一个指向每个打开文件描叙结构中包含一个指向每个打开文件描叙符的指针以及指向两个符的指针以及指向两个VFSVFSinodeinode的指针。的指针。VirtualVirtualmemorymemory 多数进程都有一些虚拟内存(核心线程和后台进程没有),多数进程都有一些虚拟内存(核心线程和后台进程没有),LinuxLinux核心必须跟踪虚拟内存与核心必须跟踪虚拟内存与系统物理内存的映射关系。系统物理内存的映射关系。ProcessorProcessorSpecificSpecificContextContext 进程可以认为是系统当前状态的总和。进程可以认为是系统当前状态的总和。n nLinuxLinux使用用户和组标志符来检查对系统中文件和可执行映使用用户和组标志符来检查对系统中文件和可执行映象的访问权限。象的访问权限。LinuxLinux系统中所有的文件都有所有者和允许系统中所有的文件都有所有者和允许的权限,这些权限描叙了系统使用者对文件或者目录的使的权限,这些权限描叙了系统使用者对文件或者目录的使用权。基本的权限是读、写和可执行,这些权限被分配给用权。基本的权限是读、写和可执行,这些权限被分配给三类用户:文件的所有者,属于相同组的进程以及系统中三类用户:文件的所有者,属于相同组的进程以及系统中所有进程。每类用户具有不同的权限,例如一个文件允许所有进程。每类用户具有不同的权限,例如一个文件允许其拥有者读写,但是同组的只能读而其他进程不允许访问。其拥有者读写,但是同组的只能读而其他进程不允许访问。n ntask_structtask_struct结构中有四对进程和组标志符:结构中有四对进程和组标志符:n nuid,uid,gidgid 表示运行进程的用户标志符和组标志符。表示运行进程的用户标志符和组标志符。n neffectiveeffectiveuiduidandandgidgid 有些程序可以在执行过程中将执行进程的有些程序可以在执行过程中将执行进程的uiduid和和gidgid改成其程序自身的改成其程序自身的uiduid和和gidgid(保存在描叙可执行映象的(保存在描叙可执行映象的VFSVFSinodeinode属性中)。这些程序被称为属性中)。这些程序被称为setuidsetuid程程序,常在严格控制对某些服务的访问时使用,特别是那些为别的进程而运行序,常在严格控制对某些服务的访问时使用,特别是那些为别的进程而运行的进程,例如网络后台进程。有效的进程,例如网络后台进程。有效uiduid和和gidgid是那些是那些setuidsetuid执行过程在执行时变化执行过程在执行时变化出的出的uiduid和和gidgid。当进程试图访问特权数据或代码时,核心将检查进程的有效。当进程试图访问特权数据或代码时,核心将检查进程的有效gidgid和和uiduid。n nfilefilesystemsystemuiduidandandgidgid 它们和有效它们和有效uiduid和和gidgid相似但用来检验进程的文件系统访问权限。如运行在用户相似但用来检验进程的文件系统访问权限。如运行在用户模式下的模式下的NFSNFS服务器存取文件时,服务器存取文件时,NFSNFS文件系统将使用这些标志符。此例中只文件系统将使用这些标志符。此例中只有文件系统有文件系统uiduid和和gidgid发生了改变(而非有效发生了改变(而非有效uiduid和和gidgid)。这样可以避免恶意用)。这样可以避免恶意用户向户向NFSNFS服务器发送服务器发送KILLKILL信号。信号。n nsavedsaveduiduidandandgidgid POSIXPOSIX标准中要求实现这两个标志符,它们被那些通过系统调用改变进程标准中要求实现这两个标志符,它们被那些通过系统调用改变进程uiduid和和gidgid的程序使用。当进程的原始的程序使用。当进程的原始uiduid和和gidgid变化时,它们被用来保存真正的变化时,它们被用来保存真正的uiduid和和gidgid。n n进程调度机制的设计,还对系统复杂性有着极大的影响,进程调度机制的设计,还对系统复杂性有着极大的影响,常常会由于实现的复杂程度而在功能和性能方面做出必要常常会由于实现的复杂程度而在功能和性能方面做出必要的权衡和让步。另外,进度调度的机制还要考虑到的权衡和让步。另外,进度调度的机制还要考虑到“公正公正性性”,让系统所有进程都有机会向前推进,尽管其进度各,让系统所有进程都有机会向前推进,尽管其进度各有不同,并最终受到有不同,并最终受到CPUCPU速度和负载的影响。更重要的是,速度和负载的影响。更重要的是,还要防止死锁的发生,以及防止对还要防止死锁的发生,以及防止对CPUCPU能力的不合理使用,能力的不合理使用,也就是说要防止也就是说要防止CPUCPU尚有能力且有进程等执行,却由于某尚有能力且有进程等执行,却由于某种原因而长时间得不到执行的情况。一旦这些情况发生,种原因而长时间得不到执行的情况。一旦这些情况发生,调度机制还能识别与化解。调度机制还能识别与化解。n n调度器必须选择最迫切需要运行而且可以执行的进程来执调度器必须选择最迫切需要运行而且可以执行的进程来执行。可运行进程是一个只等待行。可运行进程是一个只等待CPUCPU资源的进程。资源的进程。LinuxLinux使用使用基于优先级的简单调度算法来选择下一个运行进程。当选基于优先级的简单调度算法来选择下一个运行进程。当选定新进程后,系统必须将当前进程的状态,处理器中的寄定新进程后,系统必须将当前进程的状态,处理器中的寄存器以及上下文状态保存到存器以及上下文状态保存到task_structtask_struct结构中。同时它将重结构中。同时它将重新设置新进程的状态并将系统控制权交给此进程。为了将新设置新进程的状态并将系统控制权交给此进程。为了将CPUCPU时间合理的分配给系统中每个可执行进程,调度管理时间合理的分配给系统中每个可执行进程,调度管理器必须将这些时间信息也保存在器必须将这些时间信息也保存在task_structtask_struct中。中。n n在每个进程的在每个进程的task_structtask_struct结构中有以下四项:结构中有以下四项:policypolicy、prioritypriority、countercounter、rt_priorityrt_priority。这四项是选择进程的依据。这四项是选择进程的依据。其中,其中,policypolicy是进程的调度策略,用来区分实时进程和普是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;通进程,实时进程优先于普通进程运行;prioritypriority是进程是进程(包包括实时和普通括实时和普通)的静态优先级;的静态优先级;countercounter是进程剩余的时间片,是进程剩余的时间片,它的起始值就是它的起始值就是prioritypriority的值;由于的值;由于countercounter在后面计算一个在后面计算一个处于可运行状态的进程值得运行的程度处于可运行状态的进程值得运行的程度goodnessgoodness时起重要时起重要作用,因此,作用,因此,countercounter也可以看作是进程的动态优先级。也可以看作是进程的动态优先级。rt_priorityrt_priority是实时进程特有的,用于实时进程间的选择。是实时进程特有的,用于实时进程间的选择。n n进程调度的核心在几个位置调用调度管理器。如当前进程进程调度的核心在几个位置调用调度管理器。如当前进程被放入等待队列后运行或者系统调用结束时,以及从系统被放入等待队列后运行或者系统调用结束时,以及从系统模式返回用户模式时。此时系统时钟将当前进程的模式返回用户模式时。此时系统时钟将当前进程的countercounter值设为值设为0 0以驱动调度管理器。每次调度管理器运行时将进以驱动调度管理器。每次调度管理器运行时将进行下列操作行下列操作:n nkernelkernelworkwork 调度管理器运行底层处理程序并处理调度任务队列。调度管理器运行底层处理程序并处理调度任务队列。n nCurrentCurrentprocessprocess 当选定其他进程运行之前必须对当前进程进行一些处理。当选定其他进程运行之前必须对当前进程进行一些处理。n n如果当前进程的调度策略是时间片轮转,则它被放回到运如果当前进程的调度策略是时间片轮转,则它被放回到运行队列。如果任务可中断且从上次被调度后接收到了一个行队列。如果任务可中断且从上次被调度后接收到了一个信号,则它的状态变为运行态。如果当前进程的状态是信号,则它的状态变为运行态。如果当前进程的状态是RunningRunning,则状态保持不变。那些既不处于,则状态保持不变。那些既不处于RunningRunning状态又状态又不是可中断的进程将会从运行队列中删除。这意味着调度不是可中断的进程将会从运行队列中删除。这意味着调度管理器选择运行进程时不会将这些进程考虑在内。管理器选择运行进程时不会将这些进程考虑在内。n n调度器在运行队列中选择一个最迫切需要运行的进程。如调度器在运行队列中选择一个最迫切需要运行的进程。如果运行队列中存在实时进程(那些具有实时调度策略的进果运行队列中存在实时进程(那些具有实时调度策略的进程),则它们比普通进程更多的优先级权值。程),则它们比普通进程更多的优先级权值。n n在存在多个相同优先级进程的平衡系统中,每个进程被依在存在多个相同优先级进程的平衡系统中,每个进程被依次执行,这就是次执行,这就是RoundRoundRobinRobin策略。然而由于进程经常需策略。然而由于进程经常需要等待某些资源,所以它们的运行顺序也常发变化。要等待某些资源,所以它们的运行顺序也常发变化。n n如果系统选择其他进程运行,则必须被挂起当前进程且开如果系统选择其他进程运行,则必须被挂起当前进程且开始执行新进程。进程执行时将使用寄存器、物理内存以及始执行新进程。进程执行时将使用寄存器、物理内存以及CPUCPU。每次调用子程序时,它将参数放在寄存器中并把返。每次调用子程序时,它将参数放在寄存器中并把返回地址放置在堆栈中,所以调度管理器总是运行在当前进回地址放置在堆栈中,所以调度管理器总是运行在当前进程的上下文。程的上下文。n n进程的切换发生在调度管理器运行之后。以前进程保存的进程的切换发生在调度管理器运行之后。以前进程保存的上下文与当前进程加载时的上下文相同,包括进程程序计上下文与当前进程加载时的上下文相同,包括进程程序计数器和寄存器内容。如果以前或者当前进程使用了虚拟内数器和寄存器内容。如果以前或者当前进程使用了虚拟内存,则系统必须更新其页表入口,这与具体体系结构有关。存,则系统必须更新其页表入口,这与具体体系结构有关。如果处理器使用了转换旁视缓冲或者缓冲了页表入口如果处理器使用了转换旁视缓冲或者缓冲了页表入口(如如AlphaAlphaAXP)AXP),那么必须冲刷以前运行进程的页表入口。,那么必须冲刷以前运行进程的页表入口。n n5.2.4 存储管理存储管理在在这这里里所所说说的的存存储储管管理理一一般般指指的的是是内内存存管管理理,在在计计算算机机业业界界,内内存存这这个个名名词词被被广广泛泛用用来来称称呼呼 RAMRAM(随随机机存存取取内内存存),计计算算机机使使用用随随机机存存取取内内存存来来储储存存执执行行作作业业所所须须的的暂暂时时指指令令以以及及数数据据,以以使使计计算算机机的的 CPUCPU能够更快速读取储存在内存的指令及数据。能够更快速读取储存在内存的指令及数据。下面介绍下面介绍LinuxLinux存储器管理几个基本概念存储器管理几个基本概念 :n n存储管理的任务存储管理的任务 存储管理是存储管理是LinuxLinux中负责管理内存的模块。存储管理的任务有以下几点:中负责管理内存的模块。存储管理的任务有以下几点:屏蔽各种硬件的内存结构,并向上层返回同意的访问界面。屏蔽各种硬件的内存结构,并向上层返回同意的访问界面。LinuxLinux支持支持各种各样的硬件体系结构。对每种硬件结构,其内存的组织形式各不各种各样的硬件体系结构。对每种硬件结构,其内存的组织形式各不相同。然而,对于用户的应用程序来说,总是希望提供一个同意的界相同。然而,对于用户的应用程序来说,总是希望提供一个同意的界面以供调用。这样,存储模块就自然要担负这个屏蔽和转化的任务。面以供调用。这样,存储模块就自然要担负这个屏蔽和转化的任务。解决进程状态下内存不足的问题,按需调页。随着硬件的发展,内存解决进程状态下内存不足的问题,按需调页。随着硬件的发展,内存的增大,软件业相应地向着大规模方向发展。在一个多进程系统中,的增大,软件业相应地向着大规模方向发展。在一个多进程系统中,所有进程所占用的内存总和往往会超过物理内存容量。这样就需要存所有进程所占用的内存总和往往会超过物理内存容量。这样就需要存储管理实现能够利用副存储器(比如硬盘)进行辅助存储的功能。存储管理实现能够利用副存储器(比如硬盘)进行辅助存储的功能。存储管理机制甚至还能够处理单个进程所占用内存超过主存大小的情况。储管理机制甚至还能够处理单个进程所占用内存超过主存大小的情况。阻止进程肆意访问其他进程的地址空间和内核地址空间。由于并发执阻止进程肆意访问其他进程的地址空间和内核地址空间。由于并发执行的进程所在的地址空间都不能冲突,而进程太多,物理内存空间根行的进程所在的地址空间都不能冲突,而进程太多,物理内存空间根本不够,故需要模拟出一个更大的虚拟逻辑空间提供给上层应用程序,本不够,故需要模拟出一个更大的虚拟逻辑空间提供给上层应用程序,并通过一个可靠的机制建立起逻辑空间到物理空间的映射关系。并通过一个可靠的机制建立起逻辑空间到物理空间的映射关系。为进程中通信所需要的共享内存提供必要的基础。对于上层用户来讲,为进程中通信所需要的共享内存提供必要的基础。对于上层用户来讲,共享内存和普通内存是两种概念;然而对于存储管理系统来讲,这两共享内存和普通内存是两种概念;然而对于存储管理系统来讲,这两者却都是内存中的一部分,所有内存空间的任一部分都可被划为共享者却都是内存中的一部分,所有内存空间的任一部分都可被划为共享内存使用。因此,实现共享内存的任务就需要由存储管理模块来实现内存使用。因此,实现共享内存的任务就需要由存储管理模块来实现 n n虚拟内存 虚拟内存是现代操作系统的重要特征。对于一个多进程的虚拟内存是现代操作系统的重要特征。对于一个多进程的操作系统来说,每个进程都要占据自己唯一的内存地址空操作系统来说,每个进程都要占据自己唯一的内存地址空间。虚拟内存的基本原理是将内存中一部分近期不需要的间。虚拟内存的基本原理是将内存中一部分近期不需要的内容移出到外存上,从而让出一块内存空间,以供其他需内容移出到外存上,从而让出一块内存空间,以供其他需要的内存使用。当要访问到那些已经被调出到外存的数据要的内存使用。当要访问到那些已经被调出到外存的数据时,存储管理要将内存中一部分不常被访问的数据调出,时,存储管理要将内存中一部分不常被访问的数据调出,让出一块空间以供需要的数据调入内存。让出一块空间以供需要的数据调入内存。n n页面模式 页面为存储管理中调入调出的基本单位。在存储管理中,页面为存储管理中调入调出的基本单位。在存储管理中,将内存划分为长度相等的页面。将内存划分为长度相等的页面。LinuxLinux将每个用户进程将每个用户进程4GB4GB长度的虚拟内存划分成固定大小的页面。其中,长度的虚拟内存划分成固定大小的页面。其中,03GB03GB是是用户态空间,由各进程独占;用户态空间,由各进程独占;34GB34GB是内核态空间,由所是内核态空间,由所有进程共享,但只有内核态的进程才能访问。有进程共享,但只有内核态的进程才能访问。n n按需调页 当进程访问到某个虚存地址,却发现该地址所对应的物理当进程访问到某个虚存地址,却发现该地址所对应的物理页面已经被换出内存时,系统会自动产生一个硬件中断,页面已经被换出内存时,系统会自动产生一个硬件中断,即缺页中断。在中断产生后,系统会自动调用相应的中断即缺页中断。在中断产生后,系统会自动调用相应的中断处理程序,来将所需的页面从外存调入,或者干脆新建一处理程序,来将所需的页面从外存调入,或者干脆新建一个空白页面。这个过程就叫做按需调页。个空白页面。这个过程就叫做按需调页。n n对换 对于虚拟内存页面来说,总是要将其改动过的内容写回到对于虚拟内存页面来说,总是要将其改动过的内容写回到外存中,才能够将其丢弃。一个被更改过的内存页面,但外存中,才能够将其丢弃。一个被更改过的内存页面,但还没有将其内容写到外存中,就称之为还没有将其内容写到外存中,就称之为“脏页面脏页面”。在换。在换入页面时,首先考虑的肯定是将入页面时,首先考虑的肯定是将“干净的干净的”页面直接丢弃,页面直接丢弃,然后将外存数据写进来,因为这样不会破坏数据的完整性。然后将外存数据写进来,因为这样不会破坏数据的完整性。然而这是一个矛盾,内存调用者希望尽可能少地进行外存然而这是一个矛盾,内存调用者希望尽可能少地进行外存的刷新,这个结果造成内存中的刷新,这个结果造成内存中“脏页面脏页面”不断增加,而换不断增加,而换入程序又希望尽可能多一些入程序又希望尽可能多一些“干净干净”页面,以便使它们可页面,以便使它们可以很方便地将数据调入。于是,收拾垃圾的工作就由一个以很方便地将数据调入。于是,收拾垃圾的工作就由一个被称作被称作“对换对换”(swapswap)的程序来完成。)的程序来完成。Linux中存储器管理的相关概念及实现中存储器管理的相关概念及实现 n n伙伴算法伙伴算法LinuxLinux的伙伴算法把所有的空闲页面分为的伙伴算法把所有的空闲页面分为1010个块组,每组中块的大小个块组,每组中块的大小是是2 2的幂次方个页面。的幂次方个页面。工作原理:工作原理:工作原理:工作原理:如果要求要求分配一个大小为如果要求要求分配一个大小为MM个页面的块,伙伴算法会先到与要个页面的块,伙伴算法会先到与要求分配的求分配的MM个页面大小最接近的空闲块链表中查找,看是否有这样个页面大小最接近的空闲块链表中查找,看是否有这样的一个空闲块。如果有,就直接分配;如果没有,该算法就会到下的一个空闲块。如果有,就直接分配;如果没有,该算法就会到下一个更大的空闲块链表中查找一个空闲块,如果有,就将该空闲块一个更大的空闲块链表中查找一个空闲块,如果有,就将该空闲块分为两等份,一份分配出去,另一份就挂入下一级的空闲块链表中;分为两等份,一份分配出去,另一份就挂入下一级的空闲块链表中;如果没有,就继续向更大的空闲块链表中查找,直到查找完所有更如果没有,就继续向更大的空闲块链表中查找,直到查找完所有更大的空闲块链表都没找到空闲块为止(空闲块链表最大为大的空闲块链表都没找到空闲块为止(空闲块链表最大为512512个页个页面),如果没有的就放弃分配,并发出出错信息。面),如果没有的就放弃分配,并发出出错信息。以上过程的逆过程就是块的释放过程,这也是该算法名字的来由。以上过程的逆过程就是块的释放过程,这也是该算法名字的来由。满足以下条件的两个块称为伙伴:满足以下条件的两个块称为伙伴:(1)(1)两个块的大小相同;两个块的大小相同;(2)(2)两个块的物理地址连续。两个块的物理地址连续。n nslab SlabSlab是是LinuxLinux操作系统的一种内存分配机制。操作系统的一种内存分配机制。SlabSlab中引入了对象这个概中引入了对象这个概念,所谓对象就是存放一组数据结构的内存区,其方法就是构造或析念,所谓对象就是存放一组数据结构的内存区,其方法就是构造或析构函数,构造函数用于初始化数据结构所在的内存区,而析构函数收构函数,构造函数用于初始化数据结构所在的内存区,而析构函数收回相应的内存区。回相应的内存区。实际上,实际上,LinuxLinux中对中对SlabSlab分配模式有所改进,它对内存区的处理并不需分配模式有所改进,它对内存区的处理并不需要进行初始化或回收。出于效率的考虑,要进行初始化或回收。出于效率的考虑,LinuxLinux并不调用对象的构造或并不调用对象的构造或析构函数,而是把指向这两个函数的指针都置为空。析构函数,而是把指向这两个函数的指针都置为空。LinuxLinux中引入中引入slabslab的丰要目的是为了减少对伙伴算法的调用次数。的丰要目的是为了减少对伙伴算法的调用次数。缓冲区就是主存中的一片区域,把这片区域划分为多个块,每块就是缓冲区就是主存中的一片区域,把这片区域划分为多个块,每块就是一个一个SlabSlab,每个,每个SlabSlab由一个或多个页面组成,每个由一个或多个页面组成,每个SlabSlab中存放的就是对中存放的就是对象。象。对于小对象,就把对于小对象,就把slabslab的描述结构的描述结构slab_tslab_t放在该放在该slabslab中;对于大对象,则中;对于大对象,则把把slabslab结构游离出来,集中存放。关于结构游离出来,集中存放。关于slabslab中的着色区再给予具体描述。中的着色区再给予具体描述。n n缓冲区每个缓冲区还有一个轮转锁每个