您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > linux/Unix相关 > Linux进程管理(补充)
Linux进程管理1进程和作业的概念2进程控制块3进程状态4进程的控制5有关进程控制系统调用1进程和作业的概念Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。什么是进程?Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理守护进程,都可以称之为进程。进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个单独的程序。Linux用分时管理方法使所有的任务共同分享系统资源。我们讨论进程的时候,不会去关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。作业、作业控制的概念进程和作业的概念也有区别,作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“manps.1|grepkill|more”这个作业就同时启动了三个进程。作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。一般而言,进程与作业控制相关联时,才被称为作业。在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令。但是使用作业控制,用户可以同时运行多个作业,并在需要时在这些作业间进行切换。这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。进程的类型Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。三种进程各有各的作用,使用场合也有所不同。交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程——这种进程和终端没有联系,是一个进程序列。监控进程(也称守护进程daemon)——Linux系统启动时启动的进程,并在后台运行。2进程控制块进程组成正文段存放进程要运行的程序,描述了进程要完成的功能用户数据段存放正文段在执行时所需要的数据和工作区系统数据段——进程控制块存放了进程的控制信息,其中最重要的数据结构是task_struct。进程控制块进程控制块是Linux系统最复杂的数据结构之一。Linux在内存空间中开辟了一个专门区域存放所有进程的进程控制块。系统初始化后,建立第一个task_struct数据结构INIT_TASK。新进程创建时,系统从内存分配新task_struct,占据1680个字节。进程状态和标志进程标识进程控制块进程的族亲关系进程控制块进程间链接信息进程调度信息进程控制块进程的时间信息进程的虚存信息进程控制块进程的文件信息与进程间通信有关的信息进程控制块其它信息进程控制块3进程状态R:处于可运行状态;S:处于休眠状态;T:处于终止运行状态;D:设备IO;Z:处于僵尸状态;进程状态——R运行态该状态实际包含了执行和就绪两种状态。进程到底是正在运行还是处于就绪状态准备运行,要靠当前是否占有CPU资源来区分。每一个CPU都有一个current指针,指向当前运行于这个CPU的进程,系统就依靠这个指针来区分进程的正在运行和运行就绪状态。所有处于运行状态的进程组成可运行队列,调度程序每次选择适当的时机,按照某种规则,从这个队列中选中一个进程投入执行。这个队列中的进程总是动态变化的,在其中的进程会由于某种原因(比如等待某种事件的发生)而退出可运行队列,而其他进程也会在拥有除CPU之外的全部资源之后进入这个队列。进程状态——S休眠态(等待态)linux系统把休眠态进一步细化为:可中断的等待态、不可中断的等待态、独占态。可中断的等待态可以被某个信息唤醒而进入就绪状态等待调度;不可中断等待状态的进程是因为硬件资源无法满足,不能被信号唤醒,必须等待所等待的资源得到之后由特定的方式唤醒;独占状态位于等待队列中,当等待的事件发生时,只有处于这种状态的进程被唤醒,其他处于可中断或不可中断等待状态的进程则继续等待。进程状态——T暂停态处于暂停态的进程一般都是由运行状态转换而来,等待某种特殊的处理。比如处于调试跟踪的程序,每执行到一个断点,就转入暂停状态,等待新的输入信号。进程状态——Z僵尸态由于某种原因进程被终止,这个进程所拥有的内存、文件等资源全部释放之后,还保存着PCB信息,这种占有PCB但已无法运行的进程就处于僵尸态。一个处于执行状态的进程调用退出函数exit之后,进程就会进入僵尸状态。僵态进程的父进程通过PCB了解到该进程所处的状态后,采取相应的处理措施,回收PCB,这个进程就完成了它的使命,从僵死走向彻底消亡。一直处于僵态的进程通常是由挂起或出现故障的父进程引起的。我们应尽量通过发送SIGHUP信号或其他信号确保不挂起任何父进程。如果父进程已被挂起,应尽量终止它。如果父进程在清理完子进程之前即被终止的话,init程序将成为其父进程,并将对其进行适当的处理,以便将其从进程表中清除。进程状态——D不可中断的休眠状态常用于设备I/O,内核程序正忙于该进程的某些I/O操作,不能被中断。唯一出现该状态的情况也许是运行NFSmount命令时出现网络故障时。进程状态之间的转换就绪暂停休眠执行僵尸事件发生,唤醒时间片耗尽调度跟踪等待事件,睡眠跟踪结束exit回收PCB进程消亡分配资源创建进程4进程的控制4.1进程的创建4.2进程的启动4.3进程的监视4.4进程优先级设置4.5进程挂起和激活4.6信号控制进程4.7终止进程4.1进程的创建初始进程创建系统启动时创建第一个进程(0号进程),此时,系统只有这一个进程:初始化进程,运行在核心态初始化结束时,初始进程启动一个核心进程:init进程,也称为1号进程,然后执行空闲循环。系统空闲时,调度程序运行这个空闲进程。这个空闲进程的task_struct是唯一一个不是动态分配而是在核心连接时静态定义的,为了不至于混淆,叫做init_task。子进程创建过程为新进程分配任务结构体内存空间把父进程任务结构体拷贝到子进程任务结构体为新进程在其虚拟内存建立内核堆栈对子进程任务结构体中部分进行初始化设置把父进程有关信息拷贝给子进程,建立共享关系把子进程的counter设为父进程counter值的一半把子进程加入到可运行队列中结束do_fork()函数返回PID值进程由do_fork()函数创建intdo_fork(unsignedlongclone_flags,unsignedlongusp,structpt_regs*regs){为新进程申请PCB空间;if(申请不到)返回错误,退出;为新进程申请核心堆栈;if(核心堆栈申请不到)返回错误,退出;为新进程在Task向量表中找到空闲位置;/*复制父进程currentPCB中的信息,继承资源*/;p=current;/*为防止信号、定时中断误唤醒未创建完毕的进程,将子进程的状态设成不可中断的*/p-state=TASK_UNINTERRUPTIBLE;/*跟踪状态和超级用户特权是没有继承性的,因为在root用户为普通用户创建进程时,出于安全考虑这个普通用户的进程不允许拥有超级用户特权。*/p-flags&=~(PF_PTRACED|PF_TRACESYS|PF_SUPERPRIV);/*将进程标志设成初建,但暂时不能运行,在进程第一次获得CPU时,内核将根据此标志进行一定操作*/p-flags|=PF_FORKNOEXEC;开始Task_struct的初始化工作,如初始化进程时钟、信号、时间等数据;继承父进程所有资源:拷贝父进程当前打开的文件;拷贝父进程在VFS的位置;拷贝父进程的信号量;拷贝父进程运行的内存;拷贝父进程的线程;初始化工作结束,父进程将其将其唤醒,挂入running队列中,返回子进程的pid;}4.2进程的启动键入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程。启动一个进程有两个主要途径:手工启动调度启动:事先进行设置,根据用户要求自行启动。主要介绍手工启动。手工启动——前台启动这是手工启动一个进程的常用方式。例如:用户键入一个命令“ls–l”,这就已经启动了一个进程,而且是一个前台的进程。这时候系统其实已经处于一个多进程状态。问题1:用户在键入“ls–l”命令以后,使用“ps–x”查看,能不能看到ls进程?问题2:如何才能看到一个前台进程?手工启动——后台启动直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。[例1]$find/-namefox.jpg&[1]4513$键入命令以后,出现一个数字,这个数字就是该进程的编号,也称为PID,然后就出现了提示符。用户可以继续其他工作。多个进程同时启动的例子例如:manps.1|grepkill|more这时候实际上是同时启动了三个进程。请注意是同时启动的,所有放在管道两边的进程都将被同时启动,它们都是当前shell的子程序,互相之间可以称为兄弟进程。4.3进程的监视如果我们能够在任何给定时间查看系统正在干什么,我们就能够判断出自己运行的进程对系统性能产生的影响,也能发现其它用户是否给系统造成了严重的负担。Linux系统具有高度的透明性,是一个多进程系统,系统管理员能操控每个进程。如果某个进程占用了过多的系统资源,可将其杀死,如果系统的负荷状态看上去很好,就可以启动更多的进程。经常需要对这些进程进行一些调配和管理;而要进行管理,首先就要知道现在的进程情况:究竟有哪些进程?进程情况如何?等等。所以需要进程查看方面的工作。对任何一位系统管理员,在其日常使用的所有命令中,ps可能是其中功能使用最广的命令。ps命令ps简介要对进程进行监测和控制,首先必须了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之,该命令的输出结果相当于在发出命令的那一刻对系统所作的快照,大部分信息都是可以通过执行该命令得到的。ps命令及其参数ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。该命令语法格式如下:ps[-][选项]ps的参数说明ps提供了很多的选项参数,常用的有以下几个:l:长格式输出;u:按用户名和启动时间的顺序来显示进程;j:用任务格式来显示进程;f:用树形格式来显示进程;a:显示所有用户的所有进程(包括其它用户);x:显示无控制终端的进程;r:显示运行中的进程;我们常用的选项是组合是aux或lax,还有参数f的应用;常用ps命令参数一般的用户只需掌握一些最常用的命令参数就可以了。最常用的三个参数是u、a、x,下面将通过例子来说明其具体用法。[例]以root身份登录系统,查看当前进程状况$psPIDTTYTIMECOMMAND5800ttyp000:00:00bash5835ttyp000:00
本文标题:Linux进程管理(补充)
链接地址:https://www.777doc.com/doc-7027414 .html