手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>操作系统>Linux>列表

Linux 核心--5.Linux进程

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

Swap processes 
如果系统选择其他进程运行,则必须被挂起当前进程且开始执行新进程。进程执行时将使用寄存器、物理内存以及CPU。每次调用子程序时,它将参数放在寄存器中并把返回地址放置在堆栈中,所以调度管理器总是运行在当前进程的上下文。虽然可能在特权模式或者核心模式中,但是仍然处于当前运行进程中。当挂起进程的执行时,系统的机器状态,包括程序计数器(PC)和全部的处理器寄存器,必须存储在进程的task_struct数据结构中。同时加载新进程的机器状态。这个过程与系统类型相关,不同的CPU使用不同的方法完成这个工作,通常这个操作需要硬件辅助完成。 
 

进程的切换发生在调度管理器运行之后。以前进程保存的上下文与当前进程加载时的上下文相同,包括进程程序计数器和寄存器内容。 
  
如果以前或者当前进程使用了虚拟内存,则系统必须更新其页表入口,这与具体体系结构有关。如果处理器使用了转换旁视缓冲或者缓冲了页表入口(如Alpha AXP),那么必须冲刷以前运行进程的页表入口。 

4.3.1  多处理器系统中的调度
在Linux世界中,多CPU系统非常少见。但是Linux上已经做了很多工作来保证它能运行在SMP(对称多处理)机器上。Linux能够在系统中的CPU间进行合理的负载平衡调度。这里的负载平衡工作比调度管理器所做的更加明显。 

在多处理器系统中,人们希望每个处理器总处与工作状态。当处理器上的当前进程用完它的时间片或者等待系统资源时,各个处理器将独立运行调度管理器。SMP系统中一个值得注意的问题是系统中不止一个idle进程。在单处理器系统中,idle进程是task数组中的第一个任务,在SMP系统中每个CPU有一个idle进程,同时每个CPU都有一个当前进程,SMP系统必须跟踪每个处理器中的idle进程和当前进程。 

在SMP系统中,每个进程的task_struct结构中包含着当前运行它的处理器的编号以及上次运行时处理器的编号。 把进程每次都调度到不同CPU上执行显然毫无意义,Linux可以使用processor_mask来使得某个进程只在一个或者几个处理器上运行:如果N位置位,则进程可在处理器N上运行。当调度管理器选择新进程运行时,它 不会考虑一个在其processor_mask中在当前处理器位没有置位的进程。同时调度管理器将给予上次在此处理器中运行的进程一些优先权,因为将进程迁移到另外处理器上运行将带来性能的损失。 


4.4  文件



图4.1 进程所使用的文件 


图4.1给出了两个描叙系统中每个进程所使用的文件系统相关信息。第一个fs_struct包含了指向进程的VFS inode和其屏蔽码。这个屏蔽码值是创建新文件时所使用的缺省值,可以通过系统调用来改变。 

第二个数据结构files_struct包含了进程当前所使用的所有文件的信息。程序从标准输入中读取并写入到标准输出中去。任何错误信息将输出到标准错误输出。这些文件有些可能是真正的文件,有的则是输出/输入终端或者物理设备,但程序都将它们视为文件。每个文件有一个描叙符,files_struct最多可以包含256个文件数据结构,它们分别描叙一个被当前进程使用的文件。f_mode域表示文件将以何种模式创建:只读 、读写还是只写。f_pos中包含下一次文件读写操作开始位置。f_inode指向描叙此文件的VFS inode, f_ops指向一组可以对此文件进行操作的函数入口地址指针数组。这些抽象接口十分强大,它们使得Linux 能够支持多种文件类型。在Linux中,管道是用我们下面要讨论的机制实现的。 

每当打开一个文件时,位于files_struct中的一个空闲文件指针将被用来指向这个新的文件结构。Linux进 程希望在进程启动时至少有三个文件描叙符被打开,它们是标准输入,标准输出和标准错误输出,一般进程 会从父进程中继承它们。这些描叙符用来索引进程的fd数组,所以标准输入,标准输出和标准错误输出分别 对应文件描叙符0,1和2。每次对文件的存取都要通过文件数据结构中的文件操作子程序和VFS inode一起来完成, 


4.5  虚拟内存
进程的虚拟内存包括可执行代码和多个资源数据。首先加载的是程序映象,例如ls。ls和所有可执行映象一样,是由可执行代码和数据组成的。此映象文件包含所有加载可执行代码所需的信息,同时还将程序数据连接进入进程的虚拟内存空间。然后在执行过程中,进程定位可以使用的虚拟内存,以包含正在读取的文件内容。新分配的虚拟内存必须连接到进程已存在的虚拟内存中才能够使用。 最后Linux进程调用通用库过程,比如文件处理子程序。如果每个进程都有库过程的拷贝,那么共享就变得没有意义。而Linux可以使多个进程同时使用共享库。来自共享库的代码和数据必须连接进入进程的虚拟地址空间以及共享此库的其它进程的虚拟地址空间。 

任何时候进程都不同时使用包含在其虚拟内存中的所有代码和数据。虽然它可以加载在特定情况下使用的那些代码,如初始化或者处理特殊事件时,另外它也使用了共享库的部分子程序。但如果将这些没有或很少使用的代码和数据全部加载到物理内存中引起极大的浪费。如果系统中多个进程都浪费这么多资源,则会大大降低的系统效率。Linux使用请求调页技术来把那些进程需要访问的虚拟内存带入物理内存中。核心将进程页表中这些虚拟地址标记成存在但不在内存中的状态,而无需将所有代码和数据直接调入物理内存。当进程试图访问这些代码和数据时,系统硬件将产生页面错误并将控制转移到Linux核心来处理之。这样对于处理器地址空间中的每个虚拟内存区域,Linux都必须知道这些虚拟内存从何处而来以及如何将其载入内存以处理页面错误。 






图4.2 进程的虚拟内存 

Linux核心需要管理所有的虚拟内存地址,每个进程虚拟内存中的内容在其task_struct结构中指向的 vm_area_struct结构中描叙。进程的mm_struct数据结构也包含了已加载可执行映象的信息和指向进程页表 的指针。它还包含了一个指向vm_area_struct链表的指针,每个指针代表进程内的一个虚拟内存区域。 

此链表按虚拟内存位置来排列,图4.2给出了一个简单进程的虚拟内存以及管理它的核心数据结构分布图。 由于那些虚拟内存区域来源各不相同,Linux使用vm_area_struct中指向一组虚拟内存处理过程的指针来抽 象此接口。通过使用这个策略,所有的进程虚拟地址可以用相同的方式处理而无需了解底层对于内存管理的区别。如当进程试图访问不存在内存区域时,系统只需要调用页面错误处理过程即可。 

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!