腾讯加面:进程的那些数据结构(一)

326次阅读  |  发布于2年以前

开始之前,大白友情提示:这篇文章结合前几篇文章一起看效果更佳哦!

  1. [计算机是怎样工作的]
  2. [操作系统具体做了什么]
  3. [源代码是怎样转化为进程的]
  4. [进程是如何创建的]

一个周末,大白在腾讯大厦。

‍ 大白:面试官,你们不是周末还上班吧?要是周末还上班,那我不来了。

‍ 面试官:周末上班不是因为你吗?每次面试问你问题你都能引申出一堆新知识,这段时间周内光顾着面试你了,我活都没干完。今天就把之前提过但没问到的简单问下,就结束面试了啊!

--------------------当日下午,腾讯大楼,面试开始--------------------

1进程的构成

‍ 面试官:第一个问题,进程是由哪几部分组成的?

‍ 大白:其实每种操作系统在实现进程时是会有一点差别的,不过进程一般由以下几个部分组成:

进程中 PCB 是重点。PCB 是系统为每个进程定义的一个数据结构,作用是使程序能独立运行;PCB 主要作用是保证程序并发执行。创建进程实质就是创建进程的 PCB。为了能起到上述作用,PCB 要能展示进程身份和关系,标记任务状态,标记权限,帮助任务调度等等。

2进程的状态

‍ 面试官:可以,下一个问题,进程有哪几种状态?

‍ 大白:按五态的进程模型来说,分别为创建、就绪、执行、阻塞、终止几种状态。进程转换图如下图所示:

各个状态具体情况如下:

3进程源码

‍ 面试官:兄弟,你这背的够溜的啊,八股文功底不错。

‍ 大白:什么叫背的?我这是有很深入的理解好吧?你居然说我是背的,来来来,今天给你上源码,我对着源码给你讲进程!打开这个页面,https://elixir.bootlin.com/linux/v5.10.23/source/include/linux/sched.h#L640 ,Linux 实现进程数据结构的源码就在这里。其实 Linux 内核中是把进程和线程统一当作任务来实现的,实现的数据结构叫做 task_struct。因为之前还没讲线程,咱们这次不关注进程和线程区别,就把 task_struct 当作进程来讲。

‍ 面试官:(坏了,我不该多嘴,这家伙有那面试牛逼症)。结合源码讲啊...那你简单讲讲吧,就对应刚才进程的各个状态那个功能。

‍ 大白:好,我给你详细讲讲。讲进程的各个状态以前,进程首先要有一个功能,就是要可以标识自己的身份,这是能找到这个进程的前提。在前面面试中讲到了进程是一个树状的结构,除了 0 号进程外,所有的进程都是由父进程创建的,所以对父进程的操作很容易就会影响到子进程。所以进程的数据结构中自然要显示出进程有哪些父子进程以及兄弟进程。我们来看下面这段代码:

我们来解释下这些字段:

pid_t pid;    //展示自己进程的 id
pid_t tgid;  //进程主线程的id
struct task_struct *group_leader;  //指向主线程地址

在 Linux 中内核中,统一把进程和线程都视为任务,统一用 task_struct 这个结构体表示。每个进程都会创建一个主线程,所以如果只是单独一个进程,以及进程默认创建的主线程,那么 pidtgid 都会是自己。如果是一个进程创建的子线程,那么 pid 就是自己的 idtgid 就指向进程主线程的 id。

接着看下面:

struct task_struct __rcu * real_parent;
struct task_struct __rcu * parent;   //指向父进程
struct list_head children;   //父进程的所有子进程都在子进程链表中,这里指向链表的头部。
struct list_head sibling;  //连接兄弟进程

‍ 面试官:牛逼!

‍ 大白:咱们再来看 Linux 中标志各个状态的源码。

通过每个状态后跟着的 16 进制数可以看出,这里状态标记很明显的用了 bitset。bitset 你可以把他想象成一个数组,每个数组只有 0 和 1 两个状态。这么多状态总共用 12 位就可表示,是哪个状态哪一位就是 1。bitset 是一个很重要的数据结构,准备面试的同学一定要掌握,适用于很多场景。

上面说进程一开始应该是就绪态,但 Linux 源码第一个却是 TASK_RUNING ,其实 TASK_RUNING 这个字段既对应了进程的就绪态又对应了进程的运行态。

注释中 tsk->state again 以下的可以理解为唤醒状态。就比如 TASK_WAKEKILL 用于在接收到致命信号时唤醒进程。

‍ 面试官:牛逼!(我怕我再多说话他还要给我讲)

‍ 大白:说到这了,咱们继续说下源码中控制权限的字段还有进程调度吧?

‍ 面试官:大哥,今天是周末啊,我还要送孩子去学打篮球,要不?

‍ 大白:那行,咱们下次再讲,讲完了你再给我通过面试啊!

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8