维普资讯 http://www.cqvip.com
维普资讯 http://www.cqvip.com
的内存空间,从而使得编程人员在写程 序时不用考虑计算机中的物理内存的实 际容量。 下文切换),内棱通过指向新进程地址 转换表的指针加载这些寄存器。MMU 寄存器是有特权的.只能在内核态才能 访问。这就保证了个进程只能访问自 己用F]空间内的地址.而不会访问和修 改其他进程的空间。当可执行文件被加 载时,加载器根据缺省的ld文件,把程 序加载到虚拟内存的个空间,因为这 个原因实际上很多程序的虚拟地址空间 是相同的,但是由于转换函数不同,所 实际所处的内存区域也不同。而对于 多进程管理当处理器进行进程切换并执 行个新任务时一个重要部分就是为 为r支持虚拟存储管理器的管理, Linux系统采用分页(paging)的方式 来载人进程 所谓分页是把实际的存储 器分割为相同大小的段.例如每个段 1024个字节.这样1024个字节大小的 段便称为一个页面(page)。 虚拟存储器由存储器管理机制及 一个大容量的快速硬盘存储器支持。它 的实现基于局帮l生原理,当一个程序在 运行之前,没有必要全部装入内存,而 是仗将那些当前要运行的那些部分页面 或段装入内存运行(copy-on-write), 其余暂时留在硬盘上。程序运行时如果 它所要访问的页(段)已存在,则程序 继续运行,如果发现不存在的页(段), 操作系统将产生一个页错误(pa g e fault),这个错误导致操作系统把需要 运行的部分加载到内存中。必要时操作 系统还可 把不需要的内存页(段)交 换到磁盘上。利用这样的方式管理存储 器,便可把个进程所需要用到的存储 新任务切换任务转换表。我们可 看到 Linux系统的内存管理至少实现了以下 功能: ◇运行比内存还要大的程序 理 想情况下应该可 运行任意大小的程序 ◇可 运行只加载了部分的程序, 缩短了程序启动的时间 ◇可 使多个程序同时驻留在内 存中提高CPU的利用率 嚣以化整为零的方式,视需求分批载 人,而核心程序则凭借属于每个页面的 页码来完成寻址各个存储器区段的工 作。 标准Linux是针对有内存管理单 元的处理器设计的。在这种处理器上, 虚拟地址被送到内存管理单元 (MMU),把虚拟地址映射为物理地址。 通过赋予每个任务不同的虚拟 ——物理地址转换映射,支持不同任务 之间的保护。地址转换函数在每一个任 务中定义,在一个任务中的虚拟地址空 间映射到物理内存的一个部分,而另一 个任务的虚拟地址空间映射到物理存储 器中的另外区域。计算机的内存管理单 元(RMU)一般有一组寄存器来标识 当前运行的进程的转换表。在当前进程 将CPE放弃给另一个进程时(一次上 上。8/ 开放幂甍世界/ 维普资讯 http://www.cqvip.com
。 , 螽 酾磐 馥 维普资讯 http://www.cqvip.com
能 跑”程序的环境。Linux系统提供 系统调用拷贝现行进程的内容, 产生 新的进程,调用fork的进程称为父进 程;而所产生的新进程则称为子进程。 子进程会承袭父进程的一切特性,但是 这样实际在vfork调用完成后父子进 程事实上共享同一块存储器(在子进程 调用e ̄ec或是exit之前),因此子进程 可 更改父进程的数据及堆栈信息, vfork系统调用完成后,父进程进入睡 眠,直到子进程执行eXSC 当子进程执 行e ̄ec时,由于exec要使用被执行程 它有自己的数据段,也就是说,尽管子 进程改变了所属的变量,却不会影响到 父进程的变量值。 序的数据,代码覆盖子进程的存储区 域,这样将产生写保护错误 (dowp page)(这个时候子进程写的实 _父进程和子进程共享一个程序段, 但是各自拥有自己的堆栈、数据段、用 户空间 及进程控制块 换言之,两个 进程执行的程序代码是一样的,但是各 际上是父进程的存储区域),这个错误 导致内棱为子进程重新分配存储空间。 当子进程正确开始执行后,将唤醒父 进程,使得父进程继续往后执行 有各的程序计数器与自己的私人数据 当内桩收到fork请求时,它会先 查棱三件事:首先检查存储器是不是足 够;其次是进程表是否仍有空缺;最后 则是看看用户是否建立了太多的子进 程。如果上述三个条件满足,那么操作 系统会给子进程一个进程识别码,并且 设定cpu时间、接着设定与父进程共享 的段,同时将父进程的inode拷贝一份 uCl1IlUX的多进程处理 uClinu ̄没有『lⅡnu管理存储器,在 实现多个进程时{fork调用生成子进 程)需要实现数据保护。 uClinux的fork和vfork uClinux 的fork等于vfork 实际上uClinux的 给子进程运用,最终子进程会返回数值 0队表示它是子进程,至于父进程,它 可能等待子进程的执行结束,或与子进 程各做各的。 exee系统调甩该系统调用提供一 多进程管理通过vfork来实现。这意味 着uClJnux系统fork调用完成后,要么 子进程代替父进程执行(此时父进程已 经sleep)直到子进程调用exit退出,要 么调用exec执行一个新的进程,这个时 候将产生可执行文件的加载,即使这个 进程只是父进程的拷贝,这个过程也不 能避免 当子进程执行exit或eXSC后, 子进程使用wakeup把父进程唤醒,父 进程继续往下执行。 uClinux的这种多进程实现机制同 个进程击执行另一个进程的能力, ec 系统调用是采用覆盖旧有进程存储器内 容的方式 所 原来程序的堆栈、数据 段与程序段都会被修改,只有用户区维 持不变。 vfork系统调甩由于在使用fork 时,内核会将父进程拷贝一份给子进 程,但是这样的做法相当浪费时间,因 为大多数的情形都是程序在调用fork 后就立即调用exec,这样刚拷贝来的 进程区域又立即被新的数据覆盖掉。 因此L …系坑提供一个系统调用 它的内存管理紧密相关。uClinux针对 ilommu处理器开发,所 被追使用一 种fiat ̄式的内存管理模式,启动新的 应用程序时系统必须为应用程序分配存 储空间,井立即把应用程序加载到内 存 缺少了MMU的内存重映射机制, uClinux必须在可执行文件加载阶段对 可执行文件reloc处理,使得程序执行时 能够直接使用物理内存。 vfork, fork假定系统在调用完成 vfork后会马上执行exec,因此vfork 不拷贝父进程的页面,只是初始化私 有的数据结构与准备足够的分页表。 —J_皿/ 开放幕境世再/
因篇幅问题不能全部显示,请点此查看更多更全内容