FlyingMcdull

Linux内核-进程

前面《Linux内核学习笔记(一)》中简要介绍了一下内核的分类和Linux内核的特点。本文开始介绍内核的一些基础知识,从进程开始谈起。

进程的描述

进程就是处于执行状态的程序,包含可执行代码和其他资源。内核将进程的列表存放在任务队列中,这个任务队列是一种双向循环链表数据结构。链表中每个元素都是类型为task_struct,称为进程描述符的结构。进程描述符包含一个进程的全部信息,包括状态、堆栈信息、优先级、父子进程信息、pid等。进程通过唯一的标识符号pid来标识,pid是一个pid_t类型,其实就是int类型。这里的唯一是绝对的,其实在不同的用户空间中,是可能出现“相同”pid,这涉及到时下热门的容器虚拟化技术,以后再谈。

进程状态

往细了分,进程可以分为5种状态:

  • 运行,进程可以执行,或者正在执行。
  • 可中断,进程处于阻塞状态,等待IO或其他事件完成。
  • 不可中断,进程接收信号也不会被唤醒或准备投入运行。//用得少
  • 被跟踪,被其他进程跟踪的进程,例如通过ptrace对调试程序进行跟踪。//没用过这个
  • 停止,进程耗尽时间片或者被强制kill掉。

何为进程上下文

所谓上下文,从字面意思理解就是当前所处的环境。可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。频繁地进行上下文切换会导致严重的调度性能损耗。这也就是为什么调度时间片过小会导致应用性能下降的原因。

进程的组织

进程在Linux中采用进程树结构来统一组织管理,每个进程都有一个父进程,子进程可有可无。僵尸进程父进程创建子进程后,子进程运行至终止,会立刻清理出内存。但是进程描述符依旧会停留在内存中,子进程会发送SIGCHILD信号给父进程,父进程调用wait()来获取子进程退出状态和其他信息,之后便会将僵尸进程完全清理出内存。编程不合理父进程不调用wait来搜集清理僵尸进程,就会导致其常驻内存。

进程和线程

Linux中并没有严格区别进程和线程,仅仅被视为一个和其他进程共享某些资源的进程,很多内容可以和进程类比看,所以这里不多说了。

小结

这篇文章只是简要记录了一下进程的基本知识,对进程的调度将会是后续学习的重点。