进程管理
进程是处于执行期的程序。但进程并不仅仅局限于一段可执行程序代码。通常进程还包括其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还包括用来存放全局变量的数据段等。实际上,进程就是正在执行的程序代码的实时结果。内核需要有效而又透明的管理所有细节。
线程是进程中活动的对象。每个线程都拥有一个独立的程序计数器,进程栈和一组进程寄存器。内核调度的对象是线程,而不是进程。
在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。虽然上可能是许多进程正在分享一个处理器,但虚拟处理器个进程一个假象,让这些进程觉着自己在独享处理器。而虚拟内存让进程在分配和管理内存时觉着自己拥有整个系统的所有内存资源。有趣的是,注意在线程之间可以共享虚拟内存,但每个都拥有各自的虚拟处理器。
进程被创建后,就准备变为运行进程。这就意味着内核已经为CPU执行进程建立起所有的结构,并获取所有必要的信息。当一个进程准备变为运行进程但还没有被选中运行时,它处于就绪状态。当它变为运行进程后,就能够:
- 被“取消”,被调度程序置为就绪状态;
- 被中断,并转入等待或阻塞状态;
- 变为僵死状态,踏上进程消亡之路。这可以通过exit()来实现。
当进程被创建时,子进程收到父进程的数据副本,包括数据空间、堆、栈和进程描述符。
在内核中,进程描述符是一个名为task_struct的结构体,用于存放进程的属性和信息,与进程相关的所有内核信息都存储在这个结构体中。在其生命周期内,进程要与内核的很多方面——如内存管理和进程调度的打交道,因此,进程描述符除了记录UNIX进程的标准属性外,还要记录上述交互过程的相关信息。内核采用循环双向链表task_list来存放所有进程描述符,并借助全局变量current来存放当前运行进程的task_struct的引用。进程可能由一个或多个线程组成,每个线程都对应一个task_struct,其中包括一个唯一的线程ID.
调度进程通过给每个进程分配一个时间片和优先级来实现公平。高效的调度。时间片定义了一个进程被切换掉,运行另一个进程之前允许运行的时间长度。
linux允许任意用户能够以与另一个用户相同的权限来运行一个特殊的程序。
在linux中,一个用户可以是多个组的成员。这些组可以拥有不同的访问系统和存取数据的权限。
一般来说,UNIX系统通过为每个给定进程赋予特权级(超级用户或UID=0的用户)或非特权级(其他任何进程),从而对特定的访问和操作提供与进程相关的保护。在linux中,引入权能来划分以前只有超级用户才能执行的操作,换句话说,权能就是能授予进程的一种或多种特权,这种“授予”彼此相互独立且不依赖于进程的UID。这样一来,特殊的进程可以获得一些权限来执行某些特殊的管理任务,而不必取得所有特权,也无需成为超级用户的进程。因此,权能被定义为给定的管理操作。
posted on 2013-03-16 19:19 qiaoshanzi 阅读(150) 评论(0) 编辑 收藏 举报