第1页Linux进程和线程编程第2页1、Linux中的进程相关概念2、Linux中的进程的创建3、Linux中的进程的管理和守护进程第3页6.1进程的概述•时间和空间是计算机的两个概念,操作系统将者两个概念实现为文件和进程。•进程是一个可以独立的可有OS调度的活动。•进程是一个抽象实体,当它执行的时候需要OS分配资源。•进程是一个正在执行的程序。•进程是一个程序的一次执行。•进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元进程正文段用户数据段系统数据段内核栈程序第4页6.1进程的概述•进程的概念主要有两点:•第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。•第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。•进程是操作系统中最基本、重要的概念。•是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。原因原因原因原因操作系统引入进程的概念的原因:从理论角度看,是对正在运行的程序过程的抽象;从实现角度看,是一种数据结构,目的在于清晰地刻划动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。第5页6.1.1进程的描述•进程的种类•交互进程:由一个Shell启动的进程,交互进程既可以在前台运行,也可以在后台运行。•批处理进程:这种进程和终端没有联系,是一个进程序列。•监控进程:也称守护进程,Linux系统启动是启动的进程,并在后台运行。•进程不但包括程序指令和数据,还包括程序计数器和CPU的所有寄存器及其存储临时数据的进程堆栈。•Linux是一个多进程OS,其他进程必须等到当前正在执行的进程交出CPU的控制权后才能被内核调度执行。•当正在运行的进程等待其他系统资源时,linux内核获得CPU的控制权,并将CPU分配给其他正在等待的进程,内核中的调度算法决定将CPU分配给那个进程。第6页•内存是计算机的敏感资源,熟练掌握对内存的操作是一个程序员的必备素质。•数据的内部存储方式:大小端法•在c中,不同的数据类型占用的空间是不同的,例如char类型占用1个字节,而int占用4个字节高785634低12345612786.1.1进程的描述-进程内存管理-数据内部存储第7页•时间和空间是计算机的两个基本的概念,操作系统将这两个概念实现未进程和文件,。•进程ID是一个进程的基本属性,其作用类似与人的身份证号,根据进程ID用户可以精确的定位一个进程,一个标识符对应于一个进程,,多个进程标识符可以对应于一个程序。进程标识符的类型是pit_t,他是一个无符号整数。进程标识符1进程标识符2进程标识符3进程1进程2进程3程序2程序16.1.1进程的描述-进程标识符进程ID第8页•使用PS查看当前进程•ps-u[用户名]•第一列是进程id最后一列是对应的程序名称6.1.1进程的描述-进程标识符进程ID第9页•Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。•交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行(人机交互)。•批处理进程——这种进程和终端没有联系,是一个进程序列(多个进程)。•监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。6.1.1进程的描述-Linux进程分类第10页•运行状态:此时进程或者正在运行或者准备运行•等待状态:此时进程在等待一个事件的发生或者某种系统资源•停止状态:此时进程已经被终止•死亡状态:这是一个停止的进程,但是在进程向量数组中占有一个task_struct结构•R(TASK_RUNNING),可执行状态•S(TASK_INTERRUPTIBLE),可中断的睡眠状态。•D(TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。•s进程的领导者•+前台进程6.2.1Linux进程运行状态第11页•每一个进程有6个重要的ID,分别是进程ID、父进程ID、有效用户ID、有小组ID、实际用户ID和实际组ID。这六个ID保存在内核中的数据结构中,有些时候用户程序需要用到这些ID。•例如在/proc文件系统下每个进程有一个目录,里面存放进程的相关信息,当进程要读取这些文件时,应该先得到当前进程的ID才能确定进入那一个进程相关的子目录,由于这些ID存储在内核之中,因此linux提供一组专门的接口函数访问这些ID值。•Linux环境下使用getpid和getppid函数获得进程和父进程的ID,其函数原型如下:•#includeunistd.h•Pid_tgetpid(void)pid_tgetppid(void)•函数成功返回进程的id,失败返回-1,6.2.1Linux进程标识符第12页•Linux环境下使用getuid和geteuid函数获得进程用户ID,其函数原型如下:•#includeunistd.h•uid_tgetuid(void)uid_tgeteuid(void)•函数成功返回进程的用户id,失败返回-1.•Linux环境下使用getgid和getegid函数获得进程用户组ID,其函数原型如下:•#includeunistd.h•gid_tgetgid(void)gid_tgetegid(void)•函数成功返回进程的用户id,失败返回-1,•Pid_t类型参看/usr/include/bits/types.h实际就是int类型6.2.1Linux进程标识符第13页•每6.2.1Linux进程标识符第14页•启动进程和调度进程•1手动启动:用户直接输入shell命令后回车直接启动进程•前台启动:用户输入一个shell命令后按回车就启动给一个前台进程•后台启动:在shell命令后加入一个“&”符号再按回车键就可以启动一个后台作业。6.2.2Linux进程标识符启动第15页•进程的前后台切换•1bg命令(background)•格式bg[作业号]•功能:将前台作业切换到后台运行,若没有指定的作业则将当前作业切换到后台•例如使用vi编辑文件f1然后用ctrl+Z组合挂起vi再切换到后台6.2.2Linux进程进程前后台切换第16页•3.Fg挂起程序•作用:fg命令使一个被挂起的进程在前台执行。•格式:fg-[job-spec]•[job-spec]:后台任务号码。•说明:fg命令和bg命令是相对应的。如果想查看后台程序运行情况,可以使用fg命令把它调回前台查看。bg命令可以使多个进程放到后台中执行。6.2.2Linux进程进程命令第17页•作用:ps命令主要查看系统中进程的状态。•格式:ps[选项]•主要选项如下。•-A:显示系统中所有进程的信息。•-e:显示所有进程的信息。•-f:显示进程的所有信息。•-l:以长格式显示进程信息。•-r:只显示正在运行的进程。•-u:显示面向用户的格式(包括用户名、CPU及内存使用情况等信息)。•-x:显示所有非控制终端上的进程信息。•-p:显示由进程ID指定的进程的信息。•-t:显示指定终端上的进程的信息。6.2.2Linux进程进程命令-ps第18页•说明:要对进程进行监测和控制,首先要了解当前进程的情况,也就是需要查看当前进程。ps命令就是最基本、也是非常强大的进程查看命令。根据显示的信息可以确定哪个进程正在运行、哪个进程被挂起、进程已运行了多久、进程正在使用的资源、进程的相对优先级,以及进程的标志号(PID)。所有这些信息对用户都很有用,对于系统管理员来说更为重要。使用ps-aux命令可以获得终端上所有用户的有关进程的所有信息,下面结合图4-8讲解进程的基本信息6.2.2Linux进程进程命令-ps第19页•USER表示启动进程用户。PID表示进程标志号。%CPU表示运行该进程占用CPU的时间与该进程总的运行时间的比例。%MEM表示该进程占用内存和总内存的比例。VSZ表示占用的虚拟内存大小,以KB为单位。RSS为进程占用的物理内存值,以KB为单位。TTY表示该进程建立时所对应的终端,?表示该进程不占用终端。STAT表示进程的运行状态,包括以下几种代码:D,不可中断的睡眠;R,就绪(在可运行队列中);S,睡眠;T,被跟踪或停止;Z,终止(僵死)的进程,Z不存在,但暂时无法消除;W,没有足够的内存分页可分配;高优先序的进程;N,低优先序的进程;L,有内存分页分配并锁在内存体内(实时系统或I/O)。START为进程开始时间。TIME为执行的时间。COMMAND是对应的命令名。6.2.2Linux进程进程命令-ps第20页•top命令显示进程•top命令用来显示系统当前的进程状况。•格式:top[选项]•主要选项如下。•d:指定更新的间隔,以秒计算。•q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。•c:显示进程完整的路径与名称。•S:累积模式,会将已完成或消失的子进程的CPU时间累积起来。•s:安全模式。•i:不显示任何闲置(Idle)或无用(Zombie)的进程。•n:显示更新的次数,完成后将会退出top。6.2.2Linux进程进程命令-top第21页•nice命令改变权限优先级•作用:nice命令可以改变程序执行的优先权等级。•格式:nice[-n优先等级][--help][--version][命令]•主要选项如下。•-n优先等级或-优先等级或--adjustment=优先等级:设置欲执行的命令的优先权等级。等级的范围从-20~19,其中-20为最高,19为最低。•--help:在线帮助。•说明:应用程序优先权值的范围从-20~19,数字越小,优先权就越高。一般情况下,普通应用程序的优先权值(CPU使用权值)都是0,如果让常用程序拥有较高的优先权等级,自然启动和运行速度都会快些。需要注意的是普通用户只能在0~19之间调整应用程序的优先权值,只有超级用户有权调整更高的优先权值(从-20~19)。•例如:nice–n1ls1.txt6.2.2Linux进程进程命令-nice第22页•renice命令修改优先级•作用:renice命令允许用户修改一个正在运行的进程的优先权。•格式:renicepriority[[-p]pids][[-g]pgrps][[-u]users]•主要选项如下。•priority:优先等级•-ppids:改变该程序的优先权等级,此参数为预设值。•-gpgrps:使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。•-uuser:指定用户名称,修改所有隶属于该用户的程序的优先权。•说明:renice命令可重新调整正在执行的程序的优先权等级。默认是以程序识别码指定程序,调整其优先权,也可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20~19,只有超级用户可以改变其他用户程序的优先权和设置负数等级。普通用户只能对自己所有的进程使用renice命令。•应用实例如下:将进程PID为987及32的进程与进程拥有者为daemon及root的优先级别号加1:•#renice+1987–udaemonroot–p326.2.2Linux进程进程命令-Renice第23页•sleep命令暂停进程•作用:sleep命令的功能是使进程暂停执行一段时间。•格式:sleepnumber[选项]•主要选项如下。•number:时间长度,后面可接s、m、h或d。•s:以秒为单位。•m:以分钟为单位。•h:以小时为单位。•d:以天为