【学习笔记】 深入理解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()
其他:重要性周期后台任务,如刷新缓存等