进程管理和调度

2019-06-20  本文已影响0人  食梦狸猫

进程优先级

进程可以分为实时进程和非实时进程。

在抢占式多任务处理中,每个进程都会分配到一定时间去执行,当时间到期后会被内核收回控制权让别的进程运行,其运行环境如寄存器内容和页表会被保存起来,在之后对进程环境可完全恢复。

进程的几种状态:


3.54.38.png
  1. 如果进程必须等待一个事件发生,状态从运行到睡眠(或者叫阻塞)。
  2. 如果进程等待的事件发生了,状态从睡眠到等待(或者叫就绪)。
  3. 当进程被授予CPU事件后,状态就从等待到运行。
  4. 当进程调度器从该进程收回CPU资源时,状态就从运行到等待。
  5. 当进程执行终止,状态从运行到终止。
    在task_struct的成员state中指明了进程的当前状态,可选用值:

当进程终止时,父进程必须调用wait系统调用,使得内核可以释放子进程保留的资源。否则会产生僵尸进程。

用户态和核心态

进程通常处于用户态,只能访问自身的数据,不会干扰也不会察觉到系统的其他进程。如果进程想访问系统数据和功能,那就必须转换为核心态,一种方法是系统调用,另一种方法是中断。系统调用是程序主动的,中断是不可预测的。处理中断的操作一般与正在执行的进程无关,例如进入系统的网络数据包是通过中断通知,但当前运行的进程不会察觉。因为中断触发后需要快速处理,所以中断具有最高级别,可以暂停处于用户态和核心态的进程。
若系统处于核心态并处理系统调用,那么其他进程是无法夺取CPU资源的(中断可以)。

Linux提供资源限制机制,对进程使用系统资源施加限制。是task_struct中的rlim数组。其数据项为rlimit

<resource.h>
struct rlimit{
               unsigned long rlim_cur;
               unsigned long rlim_max;
}

rlim_cur是进程在当前的资源限制,称为软限制。
rlim_max是该限制的最大容许值,称为硬限制。
系统调用setrlimit来增减当前限制,但不能超出rlim_max指定的值。(可以通过setrlimit手册页来看详情限制。)

在Linux中,很多资源是全局的。如所有进程都是用PID标识的,所以内核必须管理一个全局PID列表。

命名空间建立了系统的不同视图


11.55.06.png

心动命名空间可以用两种方式创建:

进程ID

全局ID:是在内核本身和初始命名空间中唯一的ID号,在整个系统中是唯一的。

局部ID:属于某个特定的命名空间,不具备全局有效性,只在所属的命名空间内。

全局PID和TGID直接保存在task_struct中,都是为__kernel_pid_t类型。会话和进程组ID直接保存在用于信号处理的结构中。

进程复制

Linux提供的execve系统调用用于新代码替换现存程序,启动新程序。该系统调用点是sys_execve函数。

内存中保存了进程的唯一描述,并使用若干数据结构与其他进程连接起来。调度器需要完成的是调度策略和上下文切换。在多处理器系统上要避免调度器自相干扰。

上一篇 下一篇

猜你喜欢

热点阅读