Linux进程管理
Posted chenying66
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux进程管理相关的知识,希望对你有一定的参考价值。
本章节为《Linux操作系统基本原理与应用》的笔记。
- 进程管理是对并发程序的运行过程的管理,即对处理器的管理。其功能是跟踪和控制所有进程的活动,为分配和调度CPU,协调进程的运行步调。
- 程序在并发执行时会导致执行结果的不可再现性,这是多道程序系统必须解决的问题。
- 在Linux系统中,要查看进程的信息可使用ps(process status)命令,该命令可查看记录在进程PCB中的几乎所有信息。
- 进程控制块process control block, PCB,是系统为管理进程设置的一个数据结构,用于记录进程的相关信息。当创建一个进程时,系统为它生成PCB;进程完成后,撤销它的PCB。因此,PCB是进程的代表,在进程的生存期中,系统通过PCB来了解进程的活动情况,对进程实施控制和调度。PCB中记录了下述信息,
a. 进程描述信息:记录一个进程的特征和基本情况,从而识别该进程、了解该进程的归属信息,以及确定这个进程与其他进程之间的关系。进程标识号PID,以及进程的家族关系。
b. 进程控制和调度信息。PCB记录了进程的当前状态、调度信息、计时信息等。系统依据这些信息确定进程的状态,实施进程控制和调度。
c. 资源信息:资源包括:该进程使用的存储器空间、打开的文件以及设备等。通过这些信息,进程就可以得到运行需要的相关程序段和数据段、使用文件和设备等资源。
d. 现场信息:包括CPU的内部寄存器和系统堆栈等,它们的值刻画了进程的运行状态。退出CPU的进程必须保存好这些现场状态,以便在下次被调度时继续运行。当一个进程被重新调度运行时,要用PCB中的现场信息来恢复CPU的运行现场。现场一旦被切换,下一个指令周期CPU将精确的接着上次运行的断点处继续执行下去。 - 进程的组织:管理进程就是管理进程的PCB,所有PCB都存放在内存中。实际的系统中通常会结合采用数组、索引和链表的方式以求达到最好的效率。
默认只显示在本终端上运行的进程,除非指定了-e, a, x等选项。
%CPU:进程占用CPU的时间与进程总运行时间之比。
%MEM:进程占用的内存与总内存之比。 - 现在,系统中所有异步发生的事件都是通过中断机制来处理的,包括I/O设备中断、系统时钟中断、硬件故障中断、软件异常中断等。每个中断都对应一个中断处理程序。
其中,进程映像是指进程所执行的程序代码及数据。 - 进程无论以何种方式结束,都会调用一个exit()系统调用,通过这个系统调用种植自己的运行,并及时通知父进程回收本进程。
- shell命令的执行过程:
子进程诞生后立即更换进程映像为要执行的命令的映像文件,运行该命令至结束。如果命令行后面没有带后台运行符&,则子进程在前台开始运行。 - 进程之间通过传送信号来通信,通知进程发生了某事件。子进程在结束时也会用信号通知父进程。
信号可以发给一个或多个进程。进程PCB中含有几个用于信号通信的域,用于记录进程收到的信号以及各信号的处理方法。发送信号就是把一个信号送到目标进程的PCB的信号域上。如果目标进程正在睡眠(可中断睡眠状态),内核将唤醒它。
- 系统调用是系统内核提供的一组特殊的函数,用户进程通过系统调用来访问系统资源。与普通函数的不同之处在于,普通函数是由用户或函数库提供的程序代码,它们的运行会受到系统的限制,不能访问系统资源。系统调用是内核中的程序代码,它们具有访问系统资源的特权。当用户进程需要执行涉及系统资源的操作时,需要通过系统调用,让内核来完成。
- fork()函数,如果调用成功,则它向父进程返回子进程的PID,并向新建的子进程返回0。fork函数是一次调用,两次返回。
- exec()函数是一次调用,零次返回,因为调用成功后,进程的映像已经被替换,无处可以返回了。
- Linux将进程分为实时进程与普通进程两类,分别采用不同的调度策略。实时进程是那些对响应时间要求很高的进程,如视频与音频应用、过程控制和数据采集等,系统优先响应它们对CPU的要求;对普通进程则采用优先级+时间片轮转的调度策略,以兼顾系统的响应速度、公平性和整体效率。进程的调度策略和优先级等是在进程创建时从父进程那里继承来的。实时优先级rt_priority是指实时进程的优先级,标志实时进程优先权的高低,取值范围1(最高)-99(最低)。静态优先级static_prio,进程在创建之初被赋予了一个表示优先程度的nice数,100(最高)-139(最低)。动态优先级prio表示普通进程的实际优先级,它是对静态优先级的调整,随进程的运行状况而变换,取值范围为100(最高)-139(最低)。
- Linux系统中的调度函数和队列。
a. Linux中用于实现进程调度的程序是内核函数schedule()。该函数按照预定的策略在可执行进程中选择一个进程,切换CPU现场使之运行。
b. 调度程序中最基本的数据结构是可执行队列runqueue。每个CPU都有一个自己的可执行队列,它包含了所有等待该CPU的可执行进程。runqueue结构中设有一个curr指针,指向正在使用CPU的进程。进程切换时,curr指针也跟着变换。
新版本的调度程序:此时runqueue队列结构中实际包含了多个进程队列,将进程按优先级划分,相同优先级的链接在一起,成为一个优先级队列。所有优先级队列的头地址都记录在一个优先级数组中,按优先级顺序排列。实时进程的优先级队列在前1-99,普通进程的优先级队列在后100-139。当进程调度选择进程时,只需在优先级数组中选择当前最高优先级队列中的第1个进程即可。因此,无论进程的多少,这个操作总可以在固定的时间内完成,因而是O(1)级别的。
影响调度算法效率的另一个操作是为进程重新计算时间片。新调度函数将每个优先级队列分为两个:活动队列和过期队列。其中,活动队列中包含了那些时间片未用完的进程,过期队列包含了那些时间片用完的进程。相应的,在runqueue中设置了两个优先级数组:一个是活动数组active,它记录了所有活动队列的指针;另一个是过期数组expired,它记录了所有过期队列的指针。当一个进程进入可执行态时,它被按照优先级放入一个活动队列中;当进程的时间片耗完时,它会被赋予新的时间片并转移到相应的过期队列中。当所有活动队列都为空时,只需将active和expired数组的指针互换,过期队列就成为活动队列。这个操作也是O(1)级别的。 - 时间片轮转算法注重优先级顺序,只有在每级内采用轮转;而NORMAL普通调度算法注重的是轮转,在每轮中采用优先级顺序。
- 按通信的同步方式来分,进程通信分为同步通信和异步通信两类。同步通信:通信双方进程共同参与整个通信过程,步调协调的发送和接收数据,双方必须同时在线、同步的交换;异步通信:通信的发送方不必考虑对方的状态,发送完就继续运行,接收方也不关心发送方的状态,在自己适合的时候接收数据。管道和共享内存等都属于同步通信,而信号、消息则属于异步通信。
- Linux系统支持的几种IPC机制:
a. 信号量:用于传递进程对资源的占有状态信息,从而实现进程的同步与互斥
b. 信号:一般只是几个字节的数据,用于通知进程有某个事件发生。系统通过一组预定义的信号来控制进程的活动,用户也可以定义自己的信号来通告进程某个约定事件的发生。
c. 管道:管道的信息传输量大,速度快,内置同步机制,使用简单。管道的容量是有限的(一个内存页面大小),管道所传送的是五个十字节流,使用管道的双方必须事先约定好数据的格式。
d. 消息队列:与管道不同,这是一种异步的通信方式,相比信号来说,消息队列传递的信息量更大,能够传递格式化的数据。更主要的是,消息通信是一部的,适合于在异步运行的进程间交换信息。
e. 共享内存:通过在内存中开辟一段存储空间,将这个区域映射到多个进程的地址空间中,使得多个进程能够共享这个内存区域。共享内存的效率在所有IPC中是最高的,特别适用于传递大量的、实时的数据。但它没有内置的同步机制,需要配合使用信号量实现进程的同步。因此,较之管道,共享内存的使用较复杂。
以上是关于Linux进程管理的主要内容,如果未能解决你的问题,请参考以下文章