⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000005.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;coolzhang&nbsp;(coolzhang),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;linux&nbsp;bible&nbsp;第四章&nbsp;进程管理&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Mon&nbsp;Oct&nbsp;25&nbsp;17:47:31&nbsp;1999)&nbsp;<BR>&nbsp;<BR>发信人:&nbsp;coolzhang&nbsp;(coolzhang),&nbsp;信区:&nbsp;UNIX&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;linux&nbsp;bible&nbsp;第四章&nbsp;进程管理&nbsp;<BR>发信站:&nbsp;武汉白云黄鹤站&nbsp;(Mon&nbsp;Oct&nbsp;25&nbsp;14:53:06&nbsp;1999),&nbsp;站内信件&nbsp;<BR>&nbsp;<BR>第四章&nbsp;进程管理&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>本章重点讨论Linux内核如何在系统中创建、管理以及删除进程。&nbsp;<BR>&nbsp;<BR>进程在操作系统中执行特定的任务。而程序是存储在磁盘上包含可执行&nbsp;<BR>机器指令和数据的静态实体。进程或者任务是处于活动状态的计算机程序。&nbsp;<BR>&nbsp;<BR>进程是一个随执行过程不断变化的实体。和程序要包含指令和数据一样,&nbsp;<BR>进程也包含程序计数器和所有CPU寄存器的值,同时它的堆栈中存储着如&nbsp;<BR>子程序参数、返回地址以及变量之类的临时数据。当前的执行程序,或者&nbsp;<BR>说进程,包含着当前处理器中的活动状态。Linux是一个多处理操作系统。&nbsp;<BR>进程具有独立的权限与职责。如果系统中某个进程崩溃,它不会影响到其&nbsp;<BR>余的进程。每个进程运行在其各自的虚拟地址空间中,通过核心控制下可&nbsp;<BR>靠的通讯机制,它们之间才能发生联系。&nbsp;<BR>&nbsp;<BR>进程在生命期内将使用系统中的资源。它利用系统中的CPU来执行指令,在&nbsp;<BR>物理内存来放置指令和数据。使用文件系统提供的功能打开并使用文件,&nbsp;<BR>同时直接或者间接的使用物理设备。Linux必须跟踪系统中每个进程以及资&nbsp;<BR>源,以便在进程间实现资源的公平分配。如果系统有一个进程独占了大部&nbsp;<BR>分物理内存或者CPU的使用时间,这种情况对系统中的其它进程是不公平的。&nbsp;<BR>&nbsp;<BR>系统中最宝贵的资源是CPU,通常系统中只有一个CPU。Linux是一个多处理&nbsp;<BR>操作系统,它最终的目的是:任何时刻系统中的每个CPU上都有任务执行,&nbsp;<BR>从而提高CPU的利用率。如果进程个数多于CPU的个数,则有些进程必须等&nbsp;<BR>待到CPU空闲时才可以运行。多处理是的思路很简单;当进程需要某个系统&nbsp;<BR>资源时它将停止执行并等待到资源可用时才继续运行。单处理系统中,如&nbsp;<BR>DOS,此时CPU将处于空等状态,这个时间将被浪费掉。在多处理系统中,&nbsp;<BR>因为可以同时存在多个进程,所以当某个进程开始等待时,操作系统将把&nbsp;<BR>CPU控制权拿过来并交给其它可以运行的进程。调度器负责选择适当的进程&nbsp;<BR>来运行,Linux使用一些调度策略以保证CPU分配的公平性。&nbsp;<BR>&nbsp;<BR>Linux支持多种类型的可执行文件格式,如ELF,JAVA等。由于这些进程必&nbsp;<BR>须使用系统共享库,所以对它们的管理要具有透明性。&nbsp;<BR>&nbsp;<BR>4.1&nbsp;&nbsp;Linux进程&nbsp;<BR>&nbsp;<BR>为了让Linux来管理系统中的进程,每个进程用一个task_struct数据结构&nbsp;<BR>来表示(任务与进程在Linux中可以混用)。数组task包含指向系统中所有&nbsp;<BR>task_struct结构的指针。&nbsp;<BR>&nbsp;<BR>这意味着系统中的最大进程数目受task数组大小的限制,缺省值一般为512。&nbsp;<BR>创建新进程时,Linux将从系统内存中分配一个task_struct结构并将其加入&nbsp;<BR>task数组。当前运行进程的结构用current指针来指示。&nbsp;<BR>&nbsp;<BR>Linux还支持实时进程。这些进程必须对外部时间作出快速反应(这就是&nbsp;<BR>“实时”的意思),系统将区分对待这些进程和其他进程。虽然task_struct&nbsp;<BR>数据结构庞大而复杂,但它可以分成一些功能组成部分:&nbsp;<BR>&nbsp;<BR>State&nbsp;进程在执行过程中会根据环境来改变state。Linux进程有以下状态:&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Running&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程处于运行(它是系统的当前进程)或者准备运行状态(它在&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等待系统将CPU分配给它)。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Waiting&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程在等待一个事件或者资源。Linux将等待进程分成两类;可&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中断与不可中断。可中断等待进程可以被信号中断;不可中断等&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;待进程直接在硬件条件等待,并且任何情况下都不可中断。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stopped&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程被停止,通常是通过接收一个信号。正在被调试的进程可能&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处于停止状态。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Zombie&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是由于某些原因被终止的进程,但是在task数据中仍然保留&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task_struct结构。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它象一个已经死亡的进程。&nbsp;<BR>&nbsp;<BR>Scheduling&nbsp;Information&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调度器需要这些信息以便判定系统中哪个进程最迫切需要运行。&nbsp;<BR>&nbsp;<BR>Identifiers&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统中每个进程都有进程标志。进程标志并不是task数组的索引,它仅&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仅是个数字。每个进程还有一个用户与组标志,它们用来控制进程对系&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;统中文件和设备的存取权限。&nbsp;<BR>&nbsp;<BR>Inter-Process&nbsp;Communication&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Linux支持经典的Unix&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPC机制,如信号、管道和信号灯以及系统V中IPC机制,包括共享内存、&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;信号灯和消息队列。我们将在IPC一章中详细讨论Linux中IPC机制。&nbsp;<BR>&nbsp;<BR>Links&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Linux系统中所有进程都是相互联系的。除了初始化进程外,所有进程&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;都有一个父进程。新进程不是被创建,而是被复制,或者从以前的进&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程克隆而来。每个进程对应的task_struct结构中包含有指向其父进程&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和兄弟进程(具有相同父进程的进程)以及子进程的指针。我们可以使&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用pstree命令来观察Linux系统中运行进程间的关系:&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init(1)-+-crond(98)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-emacs(387)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-gpm(146)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-inetd(110)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-kerneld(18)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-kflushd(2)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-klogd(87)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-kswapd(3)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-login(160)---bash(192)---emacs(225)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-lpd(121)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-mingetty(161)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-mingetty(162)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-mingetty(163)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-mingetty(164)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-login(403)---bash(404)---pstree(594)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-sendmail(134)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-syslogd(78)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`-update(166)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外,系统中所有进程都用一个双向链表连接起来,而它们的根是&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init进程的task_struct数据结构。这个链表被Linux核心用来寻找&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统中所有进程,它对ps或者kill命令提供了支持。&nbsp;<BR>&nbsp;<BR>Times&nbsp;and&nbsp;Timers&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;核心需要记录进程的创建时间以及在其生命期中消耗的CPU时间。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;时钟每跳动一次,核心就要更新保存在jiffies变量中,记录进程&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在系统和用户模式下消耗的时间量。Linux支持与进程相关的interval&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定时器,进程可以通过系统调用来设定定时器以便在定时器到时后向&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它发送信号。这些定时器可以是一次性的或者周期性的。&nbsp;<BR>&nbsp;<BR>File&nbsp;system&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程可以自由地打开或关闭文件,进程的task_struct结构中包含一个&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指向每个打开文件描叙符的指针以及指向两个VFS&nbsp;inode的指针。每个&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VFS&nbsp;inode唯一地标记文件中的一个目录或者文件,同时还对底层文&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;件系统提供统一的接口。Linux对文件系统的支持将在filesystem一章&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中详细描叙。这两个指针,一个指向进程的根目录,另一个指向其当&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前或者pwd目录。pwd从Unix命令pwd中派生出来,用来显示当前工作目录.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这两个VFS&nbsp;inode包含一个count域,当多个进程引用它们时,它的值&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将增加。这就是为什么你不能删除进程当前目录,或者其子目录的原因。&nbsp;<BR>&nbsp;<BR>Virtual&nbsp;memory&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;多数进程都有一些虚拟内存(核心线程和后台进程没有),Linux核心&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;必须跟踪虚拟内存与系统物理内存的映射关系。&nbsp;<BR>&nbsp;<BR>Processor&nbsp;Specific&nbsp;Context&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进程可以认为是系统当前状态的总和。进程运行时,它将使用处理器&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的寄存器以及堆栈等等。进程被挂起时,进程的上下文-所有的CPU相&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关的状态必须保存在它的task_struct结构中。当调度器重新调度该进&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程时,所有上下文被重新设定。&nbsp;<BR>&nbsp;<BR>4.2&nbsp;&nbsp;Identifiers&nbsp;<BR>&nbsp;<BR>和其他Unix一样,Linux使用用户和组标志符来检查对系统中文件和可执行&nbsp;<BR>映象的访问权限。Linux系统中所有的文件都有所有者和允许的权限,这些&nbsp;<BR>权限描叙了系统使用者对文件或者目录的使用权。基本的权限是读、写和可&nbsp;<BR>执行,这些权限被分配给三类用户:文件的所有者,属于相同组的进程以及&nbsp;<BR>系统中所有进程。每类用户具有不同的权限,例如一个文件允许其拥有者读&nbsp;<BR>写,但是同组的只能读而其他进程不允许访问。&nbsp;<BR>&nbsp;<BR>Linux使用组将文件和目录的访问特权授予一组用户,而不是单个用户或者&nbsp;<BR>系统中所有进程。如可以为某个软件项目中的所有用户创建一个组,并将其&nbsp;<BR>权限设置成只有他们才允许读写项目中的源代码。一个进程可以同时属于多&nbsp;<BR>个组(最多为32个),这些组都被放在进程的task_struct中的group数组中。&nbsp;<BR>只要某组进程可以存取某个文件,则由此组派生出的进程对这个文件有相应&nbsp;<BR>的组访问权限。&nbsp;<BR>&nbsp;<BR>task_struct结构中有四对进程和组标志符:&nbsp;<BR>&nbsp;<BR>uid,&nbsp;gid&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表示运行进程的用户标志符和组标志符。&nbsp;<BR>effective&nbsp;uid&nbsp;and&nbsp;gid&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有些程序可以在执行过程中将执行进程的uid和gid改成其程序自身的&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid和gid(保存在描叙可执行映象的VFS&nbsp;inode属性中)。这些程序被&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;称为setuid程序,常在严格控制对某些服务的访问时使用,特别是那些&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为别的进程而运行的进程,例如网络后台进程。有效uid和gid是那些&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setuid执行过程在执行时变化出的uid和gid。当进程试图访问特权数&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;据或代码时,核心将检查进程的有效gid和uid。&nbsp;<BR>file&nbsp;system&nbsp;uid&nbsp;and&nbsp;gid&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它们和有效uid和gid相似但用来检验进程的文件系统访问权限。如运行&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在用户模式下的NFS服务器存取文件时,NFS文件系统将使用这些标志符。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此例中只有文件系统uid和gid发生了改变(而非有效uid和gid)。这样&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以避免恶意用户向NFS服务器发送KILL信号。&nbsp;<BR>saved&nbsp;uid&nbsp;and&nbsp;gid&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POSIX标准中要求实现这两个标志符,它们被那些通过系统调用改变进&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程uid和gid的程序使用。当进程的原始uid和gid变化时,它们被用来保&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存真正的uid和gid。&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -