task_struct结构体
来源:互联网 发布:电脑游戏录制视频软件 编辑:程序博客网 时间:2024/06/15 19:17
task_struct是Linux内核的一种数据结构,它会被装载到RAM里并且包含着进程的信息。 每个进程都把它的信息放在 task_struct 这个数据结构里,task_struct 包含了这些内容: 标示符 : 描述本进程的唯一标示符,用来区别其他进程。
状态 :任务状态,退出代码,退出信号等。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使⽤用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
保存进程信息的数据结构叫做 task_struct,并且可以在 include/linux/sched.h 里找到它。 所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。
进程的信息可以通过 /proc 系统文件夹查看。要获取PID为400的进程信息,你需要查看 / proc/400 这个⽂文件夹。大i多数进程信息同样可以使用top和ps这些用户级工具来获取
tast_struct结构描述
1、进程状态(state)
进程执行时,它会根据具体情况改变状态 。进程状态是调度和对换的依据。一个进程可以有好几个状态
下⾯面的状态在 fs/proc/array.c 文件里定义:
static const char * const task_state_array[] = {
"R (running)", /* 0 */ 可运行
"S (sleeping)", /* 1 */ 休眠 可中断的等待状态 状态可被杀死
"D (disk sleep)", /* 2 */ 磁盘休眠
"T (stopped)", /* 4 */ 暂停
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */ }; 僵死
运行状态(running)并不意味着进程⼀一定在运行中,它表明进程要么是在运行中 要么在运 行队列里。系统中有一个运行队列(run_queue),用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行。
睡眠状态(sleeping)意味着进程在等待事件完成(这里的睡眠有时候也叫做可 中断睡眠(interruptible sleep))。
磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状 态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
暂停状态 (stoped)此时的进程暂时停止运行来接受某种特殊处理,例如,正接受调试的进程就处于这种状态。
kill -SIGSTOP <pid> 发送SIGSTOP停止(T)进程
kill -SIGCONT <pid> 发送SIGCONT 让进程继续运行
可以使用僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调 用)没有读取到子进程退出的返回代码时就会产生僵死进程。僵死进程会以终止状态保持 在进程表中,并且会一直在等待父进程读取退出状态代码。这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。
gdb终止进程来实现跟踪终止状态
一个进程不在running状态,不占有CPU内存
2、进程调度信息
这一部分信息通常包括进程的类别(普通进程还是实时进程)、进程的优先级等等。
need_resched 调度标志 “下一次调度机会”调用调度程序schedule()、 counter代表进程剩余的时间片,是进程调度的主要依据
Nice 静态优先级 代表进程的时间片 用于对counter赋值 可被nice()改变
Counter 动态优先级
Policy 调度策略 实时进程与普通进程的调度策略不同
rt_priority 实时优先级 只对实时进程有意义,它是实时进程调度的依据
三种调度策略(名称 解释 适用范围)
SCHED_OTHER 其他调度 普通进程
SCHED_FIFO 先来先调度服务 实时进程
SCHED_RR 时间片轮转调度 实时进程
进程调度的策略
只有root用户能通过sched_setscheduler()系统调用来改变调度策略。
3、标识符每个进程都有一个唯一的标识符,内核通过这个标识符来识别不同的进程,同时,进程标识符PID也是内核提供给用户程序的接口,用户程序通过PID对进程发号施令。PID是32位的无符号整数,它被顺序编号:新创建进程的PID通常是前一个进程的PID加1。在Linux上允许的最大PID号是32767
Pid 进程标识符
Uid、gid 用户标识符、组标识符
Euid、egid 有效用户标识符、有效组标识符
Suid、sgid 备份用户标识符、备份组标识符
Fsuid、fsgid 文件系统用户标识符、文件组标识符
每个进程都属于某个用户组。task_struct结构中定义有用户标识符和组标识符。它们同样是简单的数字,这两种标识符用于系统的安全控制。系统通过这两种标识符控制进程对系统中文件和设备的访问,
4、进程邻接信息
在Linux系统中,除了初始化进程init,其他进程都有一个父进程(parent process)或称为双亲进程。可以通过fork()或clone()系统调用来创建子进程,除了进程标识符(PID)等必要的信息外,子进程的task_struct结构中的绝大部分的信息都是从父进程中拷贝,或说“克隆”过来的。系统有必要记录这种“亲属”关系,使进程之间的协作更加方便,例如父进程给子进程发送杀死(kill)信号、父子进程通信等,就可以用这种关系很方便地实现。
每个进程的task_struct结构有许多指针,通过这些指针,系统中所有进程的task_struct结构就构成了一棵进程树,这棵进程树的根就是初始化进程init的task_struct结构(init进程是Linux内核建立起来后人为创建的一个进程,是所有进程的祖先进程)。
5、文件系统信息进程可以打开或关闭文件,文件属于系统资源,Linux内核要对进程使用文件的情况进行记录。task_struct结构中有两个数据结构用于描述进程与文件相关的信息。其中,fs_struct中描述了两个VFS索引节点(VFS inode),这两个索引节点叫做root和pwd,分别指向进程的可执行映象所对应的根目录(home directory)和当前目录或工作目录。file_struct结构用来记录了进程打开的文件的描述符(descriptor)。
定义形式
Struct fs_struct *fs 进程可执行影像所在的文件系统
Struct files_struct *files 进程打开的文件
在文件系统中,每个VFS索引节点唯一描述一个文件或目录,同时该节点也是向更低层的文件系统提供的统一的接口。
6、页面管理信息
当物理内存不足时,Linux内存管理子系统需要把内存中的部分页面交换到外存,其交换是以页为单位的。
定义形式 解释
Int swappable 进程占用的内存页面是否可换出
Unsigned long min_flat,maj_flt,nswap 进程累计的次(minor)缺页次数、主(major)次数及累计换出、换入页面数
Unsigned long cmin_flat,cmaj_flt,cnswap 本进程作为祖先进程,其所有层次子进
- task_struct结构体
- task_struct结构体
- 【linux】task_struct结构体
- 浅析task_struct结构体
- 浅析task_struct结构体
- task_struct结构体详解
- task_struct结构体字段
- task_struct结构体注释
- task_struct结构体
- 进程task_struct结构体
- Task_struct结构体
- task_struct结构体
- task_struct结构体
- 浅析task_struct结构体
- linux的task_struct结构体
- Linux中的task_struct结构体
- task_struct结构体成员详解
- linux PCB task_struct结构体
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)
- 51nod 1069 Nim游戏
- mysql5.7解压版安装
- 一行代码改进NMS
- 在 Android 上使用 VIPER 架构
- task_struct结构体
- NUC1019 数素数【素数筛选法】
- Retrofit使用入门
- nginx的安装与配置(linux)
- 清除 thinkphp跟php的 X-Powered-By
- HDU3966 树链剖分
- Android setPixel抛出java.lang.IllegalStateException
- Codeforces Round #400 (Div. 1 + Div. 2, combined)C. Molly's Chemicals
- reactNative底部导航菜单栏实现