首页 > 代码库 > 【学习笔记】 深入理解Linux内核第三版 —— 第三章 进程

【学习笔记】 深入理解Linux内核第三版 —— 第三章 进程

何为进程

进程(分享资源 单位)/线程(执行的单位)/轻量级进程(共享部分资源)

Linux中线程通过pthead 标准库实现,其中存在实现轻量级进程的方法,方法也可针对线程组执行。

静态:进程如何描述

进程描述符:task_struct数据类型

技术分享

进程与进程描述符一一对应。进程描述符指针指向进程描述符地址,内核由此来引用进程。

PID(process id)可用来标识进程(linux维护pidbitmap-array位图来管理分配PID),同一个线程组的线程使用相同的PID(与第一个线程的值相同)。

进程执行状态:硬件层将thread_info和进程内核栈数据(中存放进程描述符,原始使用双向链表维护进程链表,多个可运行进程链表对应不同优先级)放在一起,可通过硬件取位获取CPU正在运行进程的thread_info数据。

技术分享

 进程间关系:散列表(散列冲突由双向链表解决)维护进程间不同关系,(Linux需要针对进程组等不同单元进行操作)

技术分享

进程等待队列:双向链表进程链表,进程描述符指针,说明可被唤醒方式

进程使用中的最大资源限制:由rlimit结构体存储

动态:进程相关操作(切换/创建/删除)

切换(上下文context/进程process/task 切换)

需要将进程执行所依赖的部分数据存入寄存器(TSS或内核态堆栈中),此部分称为硬件上下文。Linux为每个CPU维护一个TSS,只存储运行进程的硬件上下文,不运行时存储到对应进程地址空间。switch_to函数

技术分享

创建

传统unix:子进程拷贝父进程整个地址空间

现代unix:

技术分享

clone()/copy_process()/do_fork()

撤销进程

进程终止,exit(),释放C函数库分配资源。分为终止线程组(do_group_exit)和终止某个线程(do_exit)两种方式。

删除进程:父进程需要知道子进程执行结果(死没死);如果父进程先死,孤儿进程成为init进程的子进程,由init进程wait()后删除处理。

技术分享

 

内核线程

技术分享

 

线程0:Linux初始化阶段从无到有创建的进程,idle进程

线程1:线程0创建,共享内核数据结构,init()

其他:重要性周期后台任务,如刷新缓存等

【学习笔记】 深入理解Linux内核第三版 —— 第三章 进程