Linux进程管理
进程的基本概念
Linux是一个多用户、多任务的操作系统。在这样的环境中,各种计算机资源(如文件、内存、CPU等)的分配和管理都以进程为单位。为了协调多个进程对这些共享资源的访问,操作系统要跟踪所有进程的活动,以及他们对系统资源的使用情况,从而实施对进程和资源的动态管理。Linux系统中每个运行的程序至少由一个进程组成。程序和进程之间是有区别的:进程不是程序,虽然它由程序产生。程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。一个程序运行多次从而产生多个进程。
Linux操作系统包括以下3种不同类型的进程,每种进程都有其自身的特点和属性。
(1)交互进程:由一个shell启动的进程,交互进程既可以在前台运行,也可以在后台运行。前者称为前台进程,后者称为后台进程。前台进程可以通过shell与用户交互。
(2)批处理进程:这种进程和终端没有联系,是一个进程序列,由多个进程按照指定的方法执行。
(3)守护进程:Linux系统启动时的进程并没有在后台运行,它本身不在屏幕上显示任何信息,但是在后台悄悄地为用户服务,例如各种网络服务程序都是属于后台进程。
Linux系统中,进程的执行模式划分为用户模式和内核模式。当进程运行于用户空间时属于用户模式,如果用户程序运行过程中出现系统调用或发生中断事件,就要运行操作系统(即核心)程序,进程的运行模式就变为内核模式。在该模式下运行的进程可以执行机器的特权指令,而且,此时该进程的运行不受用户的干预。
当用户登录Linux操作系统后,打开终端,即建立一个shell进程,它接收用户的各种命令并创建子进程执行用户命令,当用户命令结束后,再返回当前shell进程,可接收用户新的命令。shell程序可以创建前台进程和后台进程,当输入命令时,在命令后面加上&符号,则进程在后台运行,否则在前台运行。在后台运行时,用户可继续输入其它命令执行;而在前台运行时,只有当该进程结束后,用户才能继续输入新的命令执行。
进程的创建和命令执行
在Linux操作系统中,通过fork()系统调用来创建子进程。
将执行fork操作的进程称为父进程,被fork()创建的进程称为该进程的子进程,当父进程执行fork操作时,操作系统内核执行如下任务完成进程的创建工作。
- 为子进程分配新的内存块和内核数据结构。
- 复制原来的进程的信息到新的进程,即子进程和父进程拥有相同的可执行代码。
- 向运行程序集添加新的进程。
- fork执行结束后,将控制返回给两个进程,此时,两个进程可独立执行,执行顺序取决于进程调度。
fork系统调用与其他调用的区别在于它会返回两次:一次返回到执行fork操作的父进程,一次返回到子进程,父子进程通过不同的返回值来区分。它在父进程中的返回值为新创建的子进程的PID号,而子进程的返回值为0。返回-1时,则表示出错。默认情况下,父子进程具有相同的代码,执行完成后,父子进程均从fork()代码之后的语句开始执行。