实验五进程线程控制.ppt
实验五进程线程控制 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望实验五 进程(线程)控制v预备知识Linux进程及其属性Linux进程派生关系Linux线程v实验指导Linux进程管理命令Linux进程控制函数Linux守护进程v实验目的、内容1.1 Linux进程及其属性(1)vLinux中对各种资源的分配和管理都以进程为单位v操作系统需要跟踪所有进程的活动,以及它们对系统资源的使用情况,从而实施对进程和资源的动态管理vLinux系统的进程类型交互进程:Shell启动的进程,可在前台或后台运行批处理进程:进程序列,不与特定终端关联守护进程(Daemon):后台服务进程,独立于控制终端,常在系统引导装入时启动,在系统关闭时终止1.1 Linux进程及其属性(2)v进程的描述信息PID:进程的ID号,内核按进程创建顺序逐一分配。init进程PID为1,其他进程的PID依次增加PPID:父进程号。现有进程需克隆自身创建一个新进程(init进程除外),被克隆的进程称为父进程,克隆出的副本进程称为子进程PGID:进程组号。主进程(初始的父进程)创建的所有进程拥有相同的进程组号PGIDUID:进程的真实用户号EUID:进程的有效用户号。用于确定进程在给定时刻对哪些资源和文件具有访问权限。多数情况下EUID和UID相同GID:进程用户组号FGID:有效进程用户组号1.2 Linux进程派生关系Linux用进程树进行进程管理v0号进程(也称交换进程)完成进程调度和让进程在主存与磁盘上进行交换v1号进程(内核态)负责执行内核的部分初始化工作及系统配置,并创建若干个用于高速缓存和虚拟主存管理的内核线程v1号进程调用execve()运行可执行程序init,演变成用户态1号进程,即init进程,完成系统启动工作v1.3 Linux线程(1)v从Linux2.6开始,Linux kernel才有真正的thread支持Linux2.6线程库叫NPTL(Native POSIX Thread Library),基于进程实现,但创建线程的效率非常高核内的轻量级进程形式:拥有独立的进程表项,而所有操作都在核外pthread库中进行核外的1:1线程模型:一个核心进程对应一个线程,将线程调度等同于进程调度,交给核心完成,而其它工作都在核外线程库中完成1.3 Linux线程(2)vLinux线程分为内核线程和用户线程两种线程模型内核线程更利于并发使用多处理器的资源用户线程更多考虑上下文切换开销内核线程没有独立的地址空间,只在内核空间运行用户线程在用户空间中实现内核线程的调度由内核负责,内核线程处于阻塞状态时不影响其他的内核进程用户线程的调度由线程运行库来组织线程的调度,进程中的用户线程阻塞时整个进程会切换为等待状态,其他线程不能运行实验五 进程(线程)控制v预备知识Linux进程及其属性Linux进程派生关系Linux线程v实验指导Linux进程管理命令Linux进程控制函数Linux守护进程v实验目的、内容2.1 Linux进程管理命令进程查看vps命令:报告进程标识、用户、CPU时间消耗以及其他属性命令单独使用可以看到前台执行的进程;后台进程可以使用带参数的ps命令(如ps-ax)提供进程的一次性查看,结果不连续结果数据很精确,但数据量庞大vtop命令:显示CPU占用率为前几位的进程动态显示,输出结果连续消耗较多的系统资源vpstree命令:列出当前的进程,以及它们的树状结构将当前的执行程序以树状结构显示,弥补ps命令的不足支持指定特定程序(PID)或使用者(USER)作为显示的起始2.1 Linux进程管理命令进程终止v终止一个进程或终止一个正在运行的程序kill命令:根据PID向进程发送信号,缺省操作是停止进程如果进程启动了子进程,只终止父进程,子进程运行中将仍消耗资源成为“僵尸”进程,可用kill-9强制终止退出pkill命令:终止同一进程组内的所有进程。允许指定要终止的进程名称,而非PIDKillall命令:与pkill应用方法类似,直接杀死运行中的程序数据库服务器的父进程不能用这些命令杀死(容易产生更多的文件碎片导致数据库崩溃)2.1 Linux进程管理命令进程优先级设置v进程优先级nice值进程在计划执行时被赋予默认值为0,范围从20(最有利的调度优先级)到19(最不利的调度优先级)v进程优先级设置nice命令:使用比默认nice值更高或者更低的优先级运行进程 renice命令:调整已经运行的进程的优先级 root用户可以提高或降低任意进程的nice值,普通用户只能增加进程优先级的值(降低优先级)2.2 Linux进程控制函数创建进程vfork()产生当前进程的 拷贝2.2 Linux进程控制函数修改进程v函数族exec():启动另外的进程取代当前的进程#include int execl(const char*path,const char*arg,.);int execlp(const char*file,const char*arg,.);int execle(const char*path,const char*arg,const char*envp);int execv(const char*path,const char*argv);int execve(const char*path,const char*argv,const char*envp;int execvp(const char*file,const char*argv);2.2 Linux进程控制函数进程属性操作v设置进程属性nice():改变进程执行的优先级setpgid():将指定进程的组进程设为指定的组识别码setpgrp():将目前进程的组进程识别码设为目前进程的进程识别码,等价于setpgid(0,0)setpriority():设置进程、进程组和用户的执行优先权v获取进程属性getpid():获取目前进程的进程标识getpgid():获得参数pid指定进程所属的组识别码getpgrp():获得目前进程所属的组识别号,等价于getpgid(0)getpriotity():获得进程、进程组和用户的执行优先权2.2 Linux控制函数进程退出v正常退出:在main()函数中执行return、调用exit()函数或_exit()函数v异常退出:调用abort()函数、进程收到信号而终止v区别exit是一个函数,有参数,把控制权交给系统return是函数执行完后的返回,将控制权交给调用函数exit是正常终止进程,abort是异常终止exit中参数为0代表进程正常终止,为其他值表示程序执行过程中有错误发生exit()在头文件stdlib.h中声明,先执行清除操作,再将控制权返回给内核_exit()在头文件unistd.h中声明,执行后立即返回给内核2.3 Linux守护进程v独立启动(stand_alone)守护进程常驻内存,一直占用系统资源外界有要求时响应速度较快放在/etc/init.d/目录下v超级守护进程系统启动时由超级守护进程xinet负责管理,当相应请求到来时通过xinet的转接唤醒被xinet管理的进程最初只有xinet占有系统资源,其他的内部服务不占有系统资源,只有数据包到来时才被唤醒放在/etc/xinit.d/目录下2.3 Linux守护进程守护进程的编写(1)创建子进程,退出父进程脱离控制终端:子进程变成1号进程(init)的子进程(2)在子进程中创建新会话摆脱其他进程的控制(函数setsid)(3)改变当前目录为根目录脱离父进程文件系统控制(函数chdir)(4)重设文件权限掩码设置为0,增强守护进程的灵活性(函数umask)(5)关闭文件描述符关闭文件描述符为0、1和2的三个文件(输入、输出和报错文件)实验五 进程(线程)控制v预备知识Linux进程及其属性Linux进程派生关系Linux线程v实验指导Linux进程管理命令Linux进程控制函数Linux守护进程v实验目的、内容3.1 实验目的v加深对进程概念的理解,明确进程与程序的区别v掌握Linux进程创建及撤销的方法,进一步认识并发执行的实质v掌握Linux系统下守护进程的创建方法3.2 实验内容v获取进程信息编写程序,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等,并以树状结构打印所有系统进程v创建进程编写程序,父进程创建子进程,父子进程分别循环输出字符串“I am parent/child.”5次,每输出一次延时1秒,循环输出 将程序改为父子进程同步执行:子进程循环输出字符串5次,然后父进程再循环输出字符串5次v创建守护进程该守护进程创建日志文件/tmp/cpu.log,并每隔10秒记录cpu的利用率