linux task_struct结构总结

这篇博客详细介绍了Linux操作系统中task_struct数据结构,它是描述进程信息的核心组件。内容包括task_struct的状态字段,如TASK_RUNNING、TASK_INTERRUPTIBLE等,并讨论了如何通过set_task_state宏设置这些状态。此外,还提到了thread_info结构、内核栈的大小以及如何通过current_thread_info()函数获取thread_info结构体的基地址。

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

task_struct描述符描述了进程的所有信息,所以task_struct非常复杂, 该数据结构定义在linux/sched.h头文件.

task_struct数据结构中第一个字段是state, 它描述了当前进程的状态.

  • TASK_RUNNING(准备执行或者正在cpu执行)
  • TASK_INTERRUPTIBLE(可中断的睡眠(即可以通过中断来唤醒进程, 包括软中断))
  • TASK_UNINTERRUPTIBLE(该标志和上述标志类似, 但是不能通过信号来改变状态)
  • TASK_STOPPED(进程的执行被暂停, 例如进程收到SIGSTOP信号)
  • TASK_TRACED(进程的执行已经被调试器暂停)
  • EXIT_ZOMBIE(进程的执行被终止.顾名思义该状态只有当进程被终止的时候, 进程才会变为该状态)
  • EXIT_DEAD

该字段通常用ptask->state = TASK_*来使用或者通过set_task_state和set_current_state宏.

set_task_state宏定义如下定义:

/* linux/sched.h */
#define set_task_state(tsk, state_value) set_mb((tsk)->state, (state_value)) 

/* asm/system.h */
#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)

/* asm/cmpxchg.h */
/* xchg宏并不是简单的数据交换指令而是调用了__xchg函数 */
/* __typeof__ 是GNU C的扩展类型类似于C++的decltype, 自动推导出数据类型 */
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr)))

#define __xg(x) ((volatile long *)(x))

/* 该函数根据字节自动匹配, 将ptr的值赋给x, 返回x的值 */
static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
{
    switch (size) {
        case 1:
            __asm__ __volatile__("xchgb %b0,%1"
                :"=q" (x)
                :"m" (*__xg(ptr)), "0" (x)
                :"memory");
&n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值