Linux内核之进程管理(学习笔记)

本文深入探讨了计算机系统中进程与线程的概念,阐述了进程作为资源分配的基本单位,线程作为调度的基本单位的特性。详细介绍了线程的三种实现方法,进程与进程描述符的一一对应关系,以及进程状态转移、上下文、当前进程的获取方式。通过解析Linux内核中进程描述符的任务状态段和当前进程获取机制,揭示了操作系统如何高效管理进程和线程。

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


    1、支持线程的计算机系统里面,进程作为资源分配的基本单位而存在,线程作为调度的基本单位而存在。线程仅拥有必不可少的一些资源,如:一组寄存器、堆栈信息等等和其他线程共享同一个进程的所有资源。所以,在同一个进程的线程切换时不需要大量的保存和恢复工作,同时由于共享同一个存储空间,不需要更新快表TLB,提高了系统性能。  

    线程的实现方法有三种:1、用户级线程;2、内核级线程;3、混合线程模型。Linux内核中的进程和线程都用相同的数据结构task_struct表示;线程是特殊的进程,共享同一地址空间、共同合作。

    2、进程与进程描述符是一一对应的关系。用数据结构task_struct来表示,(定义在 /Linux/sched.h 中),它包含了进程的详细信息,主要有进程标识符PID、进程占用的内存区域、相关文件的文件描述符、进程环境、信号处理、同步处理等。

    3、进程标识符PID。POSIX标准中规定一个多线程应用程序中的所有线程都必须有相同的PID,在linux内核引入线程机制时,采用了线程组机制,同一线程组中的线程有相同的线程组号(Thread Group ID),tgid.线程组组号放在进程描述符的成员变量tgid中.    

   4、进程的状态

   进程的转移关系如下图:

    深度睡眠和浅度睡眠进程得到它需要的资源被唤醒,通过schedule()进入执行态,深度睡眠的进程不能被信号或者定时中断唤醒,只有它申请的资源又有效是才能被唤醒。

    5、进程上下文

    在进程切换时,需要保存当前运行进程的执行状态,这些状态信息就是进程上下文。内核设计了一个更小巧的数据结构struct thread_struct 来保存内核使用的相关任务状态段内容,他们在进程描述符的成员变量thread中。

    6、当前进程

    Linux2.2内核开始采用宏定义current来获取当前进程的描述符。

    内核首先将当前进程的地址及需要快速访问的其他状态标记记录在数据结构struct thread_info中,然后将该数据结构保存到内核态栈栈空间中的最低地址位置。该数据结构在内核态的位置有数据结构union thread_union 决定,定义如下:

 

 

union thread_union {

                     struct thread_info thread_info;

                     unsigned long       stack[THREAD_SIZE/sizeof(long)];

}

     这里,内核态栈stack与数据结构thread_info共享同一块内存。由于内核态栈由高地址向地地址方向增长,且内核态栈占的空间比数据结构thread_info大得多,所以有效的防止他们互相覆盖和冲突。

宏定义current通过下面的函数获取

static inline struct task_struct * get_current(void)

{

    return current_thread_info()->task;

}

 

static inline struct thread_info * current_thread_info(void)

{

struct current_thread_info *ti;

__asm__(“andl %%esp, %0”;”:”=r” (ti) : “0” (~(THREAD_SIZE-1)));

return ti;

}

将当前指针%esp与数值~(THREAD_SIZE-1) 按位与运算,并将结果给ti。ti 保存的值恰好是内核态栈中的最低位地址,这里正是进程描述中成员变量thread_info所在的位置,也即当前进程描述符的成员变量thread_info的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值