以下涉及到的进程都是在Linux环境下 什么是进程? 所谓进程就是程序的一个执行实例或者是能分配处理器并由处理器执行的实体。 Linux下所有的进程信息被放在了一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 进程控制块 每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux下进程控制块是task_struct结构体。这个结构体中包含了以下内容 标示符 : 描述本进程的唯一标示符,用来区别其他进程。 状态 :任务状态,退出代码,退出信号等。 优先级 :相对于其他进程的优先级。 程序计数器:程序中即将被执行的下一条指令的地址。 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针 上下文数据:进程执行时处理器的寄存器中的数据。 I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。 进程标识符 进程id(PID) 父进程id(PPID) getpid 获得当前进程的pid, get ppid父进程pid 进程状态 1. R (task_running) : 可执行状态 只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 2. S (task_interruptible): 可中断的睡眠状态 处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 3.D (task_uninterruptible): 不可中断的睡眠状态 不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。 4.T(task_stopped or task_traced):暂停状态或跟踪状态 此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。 5.Z (task_dead - exit_zombie):退出状态,进程成为僵尸进程 进程虽然已经终止,但由于某种原因,父进程还没有执行wait()系统调用,终止进程的信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。 6.(task_swapping)换入\换出状态 进程调度信息 调度程序利用这部分信息决定系统中哪个进程最应该运行,并结合进程的状态信息保证系统运转的公平和高效。这一部分信息通常包括进程的类别(普通进程还是实时进程)、进程的优先级等等。 need_resched->调度标志 Nice->静态优先级 Counter->动态优先级 Policy->调度策略 rt_priority->实时优先级 进程调度策略 SCHED_OTHER:其他调度,适合普通进程 SCHED_FIFO:先来先服务调度,适合实时进程 SCHED_RR:时间片轮转调度,适合实时进程 普通用户无法修改进程策略,只有root用户能通过sched_setscheduler()系统调用来改变调度策略。
//后续继续补充
