Linux内核原理之进程管理

本文详细探讨了Linux内核中的进程管理,包括进程描述、创建、状态管理和终结。介绍了进程描述符的分配和存放,强调了线程在Linux中被视为特殊进程。阐述了fork()和vfork()的实现,特别是写时拷贝技术。同时讨论了内核线程的创建和进程终结的步骤,以及孤儿进程的处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程管理

进程

进程:处于执行期的程序以及相关资源(打开的文件、挂起的信号、内核内部数据、处理器状态等)的总称

线程:是在进程中活动的对象,每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程,不是进程

Linux不区分进程和线程,对它来说,线程只不过是一种特殊的进程而已

现代操作系统的两种虚拟机制

  • 虚拟处理器:给进程一种假象,让它觉得自己在独享处理器
  • 虚拟内存:让进程在分配和管理内存时觉得自己拥有整个系统的内存资源

注意:线程之间可以共享虚拟内存,但是都拥有自己的虚拟处理器

进程描述

内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项类型为task_struct,称为进程描述符的结构,描述了一个具体进程的所有信息

分配进程描述符

Linux通过slab分配器分配task_struct结构,这样能够对象复用缓存着色

每个任务的thread_info结构在它的内核栈尾端分配,其中task域存放的是指向该任务实际task_struct的指针

struct thread_info {
   
	struct task_struct *task;
    struct exec_domain *exec_domain;
    
    ...
};
进程描述符的存放

在内核中,访问任务需要获取指向task_struct结构的指针,通过current宏查找到当前进程的进程描述符,这个查找的速度很重要

有的硬件体系结构拿出一个专门的寄存器存放当前进程的task_struct指针,而有些像x86的体系结构(寄存器不太富余),就只能在内核栈的尾部创建thread_info结构,通过计算偏移量间接找到task_struct结构

进程状态

进程描述符中的state域描述了进程的当前状态。系统中进程的状态包括:

  • TASK_RUNNING(运行或就绪):进程是可执行的
  • TASK_INTERRUPTIBLE(可中断睡眠)
  • TASK_UNINTERRUPTIBLE(不可中断睡眠)
  • __TASK_TRACED:被其他进程跟踪的进程,例如ptrace调试的程序
  • __TASK_STOPPED:被暂停执行的任务,通常在接收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号时
设置当前状态

使用set_task_state(task,state)函数

进程家族树

所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值