Linux进程(二)系统中进程状态及运行模式详解

1.进程状态

在Linux系统中进程也被称为任务(task),两者的概念是一致的。

Linux的进程共有5种基本状态,包括:运行、就绪、睡眠(分为可中断与不可中断)、暂停和僵死。

Linux将这些基本状态归结为4种并加以命名和定义:

  • 可执行态:包括运行和就绪两种状态。处于可执行态的进程均已具备运行条件。

  • 睡眠态:即等待态。进程在等待某个事件或资源。可细分为可中断的(interruptible)和不可中断的(uninterruptible)。

    不可中断:睡眠过程中进程会忽略信号

    可中断:如果收到信号会被唤醒而进入可执行状态,待处理完信号后再次进入睡眠状态。

  • 暂停态:处于暂停态的进程一般是由运行态转换而来的,等待某种特殊处理。比如,调试跟踪的程序每执行到一个断点,就转入暂停态,等待新的输入信号。

  • 僵死态:进程运行结束或因某些原因被终止时,它释放除PCB以外的所有资源,这种占有着PCB但已经无法运行的进程就处于僵死态。

2 Linux进程的状态转换过程

Linux进程的状态转换过程是:

  • 新创建的进程处于可执行的就绪态,等待调度执行。
  • 处于可执行态的进程在就绪态和运行态之间轮回。就绪态的进程一旦被调度程序选中,就进入运行态。等待时间片耗尽之后,退出CPU,转入就绪态等待下一次的调度。处于此轮回的进程在运行与就绪之间不断告诉切换。
  • 运行态、睡眠态和就绪态形成一个回路。处于运行态的进程,有时需要等待某个事件或某种资源的发生,这是已经无法占有CPU继续工作,于是退出CPU,转入睡眠态。当等待的事件发生后,进程被唤醒,进入就绪态。
  • 运行态、暂停态和就绪态也构成一个回路。当处于运行态的进程接受到暂停执行信号时,它放弃CPU,进入暂停态,当暂停的进程获得恢复执行信号时,就转入就绪态。
  • 处于运行态的进程调用退出函数exit后,进入僵死态。父进程对该进程进行处理后,撤销其PCB。此时,这个进程就完成了它的使命,从僵死态走向消失。

2.1Linux的进程控制块

Linux系统的PCB用一个称为task_struct的结构体来描述。系统中每创建一个新的进程,就给他分配一个task_struct的结构体,并填入进程的控制信息,task_struct主要包括以下内容:

(1)进程标识号(PID):PID是标识该进程的一个整数,系统通过这个标识号来唯一表示一个进程。

(2)用户标识(UID)和组标识(GID):描述进程的归属关系,即进程的属主和属组的标识号。系统通过这两个标识号判断进程对文件和设备的访问权限。

(3)链表信息:用指针的方式记录进程的父进程、兄弟进程、子进程的位置(即PCB的地址)。系统通过链接信息确定进程的家族关系以及其在整个进程链中的位置。

(4)状态:进程当前的状态。

(5)调度信息:与系统调度相关的信息,包括优先级、时间片、调度策略。

(6)记时信息:包括时间和定时器。时间记录进程建立的时间以及进程占用CPU的时间统计,时进程调度、统计和监控的依据。定时器用于设定一个时间。时间到时,系统会发定时信号通知进程。

(7)通信信息:记录有关进程间信号量通信及信号通信的信息。

(8)退出码:记录进程运行结束后的退出状态,供父进程查询用。

(9)文件系统信息:包括目录,当前目录,打开文件以及文件创建掩码等信息。

(10)内存信息:记录进程的代码映像和堆栈地址,长度等信息。

(11)进程现场信息:保存进程放弃CPU时所有CPU寄存器及堆栈的当前值。

2.2 查看进程的信息

Linux系统中,查看进程的信息可以使用ps(process status),可查看记录在进程PCB中的几乎所有进程信息。

ps命令

【功能】查看进程的信息

【格式】ps[选项]

【选项】-e 显示所有进程

  • f 已全格式显示
  • r 只显示正在运行的进程
  • o 以用户定义的格式显示

a 显示所有终端上的所有进程

u 以面向用户的格式显示

x 显示所有不控制终端的进程

【说明】

  • 默认时只显示在文本终端上运行的进程,除非指定了-e、a、x等选项

没有指定显示格式时,采用以下省略格式分PID

PID TTY TIME CMD 进程标识号 进程对应的终端; 进程累计使用的CPU时间 进程执行的命令 ?表示进程不占用终端

  • 指定-f选项时,以全格式,分8列显示

UID PID PPID C STIM TTY TIME CMD 进程属主的用户名 进程标识号 父进程标识号 进程最近使用的CPU时间 进程开始时间 进程对应的终端;

?表示进程不占用终端

进程累计使用的CPU时间 进程执行的命令

  • 指定u选项时,以用户格式,分11列显示:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 同UID 进程标识号 进程占用CPU的时间与进程总运行时间之比 进程占用的内存与总内存之比 进程虚拟内存的大小,以KB为单位 占用实际内存的大小,单位KB .. 当前进程状态 同STIM .. 同CMD STAT:用字母表示

R——执行态;

S——睡眠态;

D——不可中断睡眠态;

T——暂停态;

Z——僵尸态

2.3 Linux进程的组织

Linux系统采用了多种方式来组织PCB,主要用一下几种:

(1)进程链表

系统将所有的PCB链成一个双向循环列表,进程通过PCB中的list_head字段链入进程链表。遍历列表即可顺序的找到每个进程。

(2)进程数链表

Linux系统中,进程之间存在着父子关系。除init进程外,每个进程都有一个父进程,即创建了此进程的进程。一个进程可以创建多个进程,称为他的子进程。具有相同的父进程的进程称为兄弟进程。系统中所有的进程形成了一棵进程树,每个进程都是树种的一个节点,树的根是init进程。

在PCB中设置有父进程指针parent、子进程指针childr和兄弟进程指针sibling,它们构成了进程树的结构。进程可以通过这些指针直接找到他们的家族成员。

(3)可执行队列

为了方便进程的调度,系统把所有处于可执行状态的PCB组成一个可执行队列,处于可执行状态的进程通过PCB中的run_list字段链入队列。可执行队列中设置了一个curr指针,它指向正在使用CPU的进程,用来区别就绪态和运行态的进程,在切换进程时,进程调度程序从可执行队列中选择一个让其运行,并将curr指针指向它。

(4)等待队列

进程因不同的原因睡眠,系统将睡眠的进程分类管理,每类对应一个特定的事件,用一个等待队列链接。等待队列是一个双向循环链表,链表的节点中包含了指向进程PCB的指针。当某一事件发生时,内核会唤醒相应的队列中满足等待条件的队列,将唤醒的进程从队列中删除,加入到可执行队列。

3.进程的运行模式

 3.1操作系统的内核

完整的操作系统由一个内核和一些系统服务程序构成。内核(kernel)是操作系统的核心,负责基本的资源管理和控制工作,为进程提供良好的运行环境。

 Linix系统的层次体系结构,分为三层:

  • 最底层:系统硬件
  • 核心层:运行程序和管理基本硬件得到核心程序
  • 用户层:系统的核外程序和用户程序组成,它们都是以用户进程的方式运行在核心之上。

内核在系统引导时载入并常驻内存,形成对硬件的第一层包装。启动了内核的系统具备了执行进程的所有条件,使进程可以被正确地创建、运行、控制、和撤销。因此,内核应具备支撑进程运行的所有功能,包括对进程本身的控制及进程要使用的资源的管理。

Linux系统的内核主要由以下成分构成:

(1)进程控制子系统:负责支持、管理和控制进程的运行,包含以下模块:

    a.进程调度模块:负责调度进程的运行

    b.进程通信模块:实现进程间的本地通信

    c.内存管理模块:管理进程的地址空间

(2)文件子系统:为进程提供I/O环境,包括以下模块和成分:

    a.文件系统模块:管理文件和设备

    b.网络接口模块:实现进程间的网络通信

    c.设备驱动程序:驱动和控制设备的运行

    1.系统调试接口:提供进程与内核的接口,进程通过此接口调用内核的功能

    2.硬件控制接口:是内核与硬件的接口,负责控制硬件并响应和处理中断事件

3.2 中断与系统调用

由上图可以看出,内核与外界的接口是来自用户层的系统调用和来自硬件层的中断,而系统调用本身也是一种特殊的中断,因此可以说内核是中断的驱动,它的主要作用就是提供系统调用和中断的处理。

3.3 中断

早期计算机系统中,CPU与各种设备时串行工作。当需要设备传输数据时,CPU向设备发出指令,启动设备执行数据传输操作,CPU不断测试设备的状态,知道它完成操作。在这期间,CPU处于原地踏步的循环中,对CPU资源是极大的浪费。

中断的技术出现改变了计算机系统的操作模式。现在,CPU与各种设备时并发工作的。在中断方式下,CPU启动设备操作后,它不是空闲等待,而是继续执行程序。当设备完成I/O操作后,向CPU发出特定的中断信号,打断CPU的运行。CPU响应中断后暂停正在执行的程序,转去执行专门的中断处理程序,然后再返回原来的程序继续执行。

中断的概念是因实现CPU与设备并行操作而引入的。然而,这个概念后面被打达地扩大了。现在,系统中所有的异步发生的事情都是通过中断机制来处理的,包括I/O设备中断、系统时钟中断、硬件故障中断、软件异常中断等。这些中断分为硬件中断和软件中断(异常)两个大类,每个中断都对应一个中断处理程序,中断发生后,CPU通过处理程序来处理中断事件。

3.4系统调用

系统调用是系统内核提供的一组特殊函数,用户进程通过系统调用来访问系统资源。与普通函数不同之处在于,普通函数是由用户或函数可提供的程序代码,它们的运行会受到系统的限制,不能访问系统资源,系统调用是内核中的程序代码,他们具有访问系统资源的权限。当用户进程需要执行涉及系统资源的操作时,需要通过系统调用,由内核来完成。

系统调用是借助中断机制来实现的,他是软中断的一种,称为“系统调用”中断。当进程执行到一个系统调用时,就会产生一个系统调用中断。CPU将响应此中断,转入到系统调用入口程序,然后调用内核中相应的系统调用处理函数,执行该系统调用对应的功能。

3.5 进程的运行模式

3.5.1 CPU的执行模式

CPU的基本功能就是执行指令。通常,CPU指令集中的指令可以划分为两类:特权指令和非特权指令。

特权指令:指具有特殊权限的指令,可以访问系统中所有的寄存器和内存单元,修改系统的关键设置。比如清理内存、设置时钟、执行I/O操作等都是由特权指令完成的。

非特权指令:指一般性的运算和处理的指令,这些指令只能访问用户程序直接的内存地址空间

3.5.2 进程的运行模式

进程在运行期间常常被中断或系统调用打断,因此CPU也进程在用户态与核心态之间切换。在进行通常的计算和处理时,进程运行在用户态;执行系统调用或中断处理程序时进入核心态,执行内核代码。调用返回后,回到用户态继续运行

A期间,进程运行在用户态,执行用户程序代码。运行到某一时刻时发生了中断,进程随即“陷入”核心态运行。在B期间,CPU运行在核心态,执行的时内核程序代码。此时有两种情况:

  1. 如果程序时被中断打断的,则B期间执行的时中断处理程序,它时随机插入的,与进程本身无关;
  2. 如果进程时因调用了系统调用而陷入内核空间的,则B执行的是内核的系统调用程序代码,他是作为进程的一个执行环节,由内核代理用户进程继续执行的,在中断或系统调用返回后的C期间中,进程在用户继续运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dola_Pan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值