Linux内核设计与实现 进程管理1: 基本数据结构

进城描述符及基本数据结构 

        内核把各个进程存储在一个双向链表(图3-1)之中。在该链表里,每个进程由进程描述符(process descriptor)代表。进程描述符与进程一一对应。一个进程描述符实际上就是一个数据结构,其原型存储在<linux/sched.h>中,声明为:struct task_struct{};其包含了足以描述特定进程的全部信息,例如:打开文件, 进程地址空间, 等待信号队列和进程状态等等。


进程描述符构成的双向链表

        因为内核会为每个进程同时在内核空间用户空间分配一定的内存。通常在内核空间分配的大小为两个页大小(4KB ~ 8KB),且是固定不变的。而上述的 task_struct 结构则存储在每个进程的内核栈的末端。提供该结构的好处是便于寻址,操作系统不必使用额外的寄存器去存储进城描述符的内存地址,而简单地使用栈指针即可。关于task_struct的详解内容,可阅读Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)这篇博客。

        除了该数据结构以外,Linux系统还在<asm/thread_info>中定义了一个新的数据结构:struct thread_info,用于进程管理。当进城运行时,这个数据结构存储在内核栈的下方,代码如下:


struct thread_info;

        那么在源代码中,内核是如何表示内核栈的呢?在<linux/sched.h> 定义了一个联合:


union thread_union;

        这个联合就是代码级的内核栈表示方式。值得注意的是,因为联合的特性,thread_info 与 stack 两个成员分配在同一个内存区段中,之间并无明显的界限。通常来说,内核栈中的数据不会太多,但是如果用户的行为或是某些恶意行为,导致对进程内核栈的利用率过高,最终将会覆盖thread_info中的数据,将导致不可预知的后果。以下图片仅供参考。


内核栈布局

        Q: 那么 task_struct 存在于内存中的什么地方呢?在内核栈还是用户地址空间?


进程描述符内容

      PID

      操作系统为每个进程都分配了一个独一无二的进程ID,类似于人类的身份证。在内核中这个ID被称为PID,数据类型为pid_t,通常情况下等同于int。但为了兼容以往的Unix和Linux版本,PID的最大值为32768,相当于short int。也就是说系统中的进程数最多为32768。当然你也可以通过修改/proc/sys/kernel/pid_max来修改这个值,不过也许会带来兼容性问题。

      Current

      有时候内核需要快速地寻找到当前进程的task_struct结构,已完成许多工作。所以提供了一个宏(macro)叫做current,这个宏在任何运行Linux的体系上都应被实现。

      在x86机器上,current宏通过计算栈指针的13个标志位去获得thread_info结构。进行实际寻找工作的是current_thread_info()函数:

            movl  $-8192,%eax

            andl  %esp, %eax

      转而再得到task_struct:

              current_thread_info()->task;

进程状态

        Linux为每个进程提供了五种状态,也就是说进程必须为五种状态之一。

        TASK_RUNNING:    在这种状态下的进程是可运行的,不是正在运行中,就是处于进程调度的运行队列里等待调度。如果一个进程在用户空间中运行,那么该状态是它唯一可能处于的状态。当然,对于在内核空间运行的进程,也可能处于该状态。

        TASK_INTERRUPTIBLE:  进程处于睡眠中,也可以说正在阻塞(Block),并且是可唤醒的,当其接收到一个恰到的信号就回切换到TASK_RUNNING状态。

        TASK_UNINTERRUPTIBLE:    与TASK_INTERRUPTIBLE类似,但区别在于不可被信号唤醒。该状态被应用于一个进程试图不被中断地等待某一事件的发生。 ???

        TASK_ZOMBLE:    进程已经终止,但其父进程没有调用wait4()系统调用去获取其相关信息。所以内核将保留其进程标识符与内核空间中,直到父进程做出一定动作。这也是我们俗称的僵尸进程

        TASK_STOPPED:    进程的执行停止了,既不执行也不适合去执行。(???) 当进程接收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOUT信号时就会陷入这状态。(??? 回去查阅一下信号章节)


进程状态间转换
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,124评论 0 23
  • 如果你看完书中的所有例子,你很可能已经做完你的实验和在已经越狱的iPhone上的研究。因为和许多人一样,几乎所有的...
    fishmai0阅读 15,994评论 2 42
  • 1. 进程标识 1.1 进程ID 由于每个进程ID都是唯一的,Unix使用进程ID作为进程的标识。使用ps命令可以...
    伤口不该结疤阅读 1,838评论 0 51
  • 今天我副部跟我讲说要退出部门,其实我是感觉她自己也比较懈怠,整体来说我自己也是,感觉没有那种动力但是总觉得这是自己...
    leeali阅读 176评论 0 0
  • 十二、经脉流注 二十三难曰∶经脉十二,络脉十五,何始何穷也?然经脉者,行血气,通阴阳,以荥于身者也。其始从中焦注手...
    妙瑜的记事本阅读 463评论 0 1