LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

Linux内核内的task-struct结构表示的结构分析

2023年7月20日 180点热度

在Linux内核内,进程是由相当大的一个称为task_struct的结构表示的。此结构包含所有表示此进程所必需的数据redhat linux 下载,再者,还包含了大量的其他数据拿来统计(accounting)和维护与其他进程的关系(父和子)。下边给出了task_struct的一小部份。task_struct坐落./linux/include/linux/sched.h。

structtask_struct{

volatilelongstate;

void*stack;

unsignedintflags;

intprio,static_prio;

structlist_headtasks;

structmm_struct*mm,*active_mm;

pid_tpid;

pid_ttgid;

structtask_struct*real_parent;

charcomm[TASK_COMM_LEN];

structthread_structthread;

structfiles_struct*files;

...

};

在task_struct中,可以看见几个意料之中的项,例如执行的状态、堆栈、一组标志、父进程、执行的线程(可以有好多)以及开放文件。对其做简单申明如下

state变量是一些表明任务状态的比特位。常见的状态有:

1.TASK_RUNNING表示进程正在运行,或是排在运行队列中正要运行

2.TASK_INTERRUPTIBLE表示进程正在休眠

3.TASK_UNINTERRUPTIBLE表示进程正在休眠但不能吵醒

4.TASK_STOPPED表示进程停止

注:这种标志的完整列表可以在./linux/include/linux/sched.h内找到。

flags定义了好多指示符,表明进程是否正在被创建(PF_STARTING)或退出(PF_EXITING),或是进程当前是否在分配显存(PF_MEMALLOC)。

每位进程就会被赋于优先级(称为static_prio),但进程的实际优先级是基于加载以及其他几个诱因动态决定的。优先级值越低,实际的优先级越高。

tasks数组提供了链接列表的能力。它包含一个prev表针(指向前一个任务)和一个next表针(指向下一个任务)。

进程的地址空间由mm和active_mm数组表示。mm代表的是进程的显存描述符永久免费linux服务器,而active_mm则是前一个进程的显存描述符(为改进上下文切换时间的一种优化)。

可执行程序的名称(不包含路径)占用comm(命令)主键。

thread_struct则拿来标示进程的储存状态。此元素依赖于Linux在其上运行的特定构架,在./linux/include/asm-i386/processor.h内有这样的一个反例。在此结构内,可以找到该进程自执行上下文切换后的储存(硬件注册表、程序计数器等)。

在好多情况下,进程都是动态创建并由一个动态分配的task_struct表示。其实init进程例外,它总是存在并由一个静态分配的task_struct表示。

Linux内所有进程的分配有两种方法。第一种方法是通过一个哈希表,由PID值进行哈希估算得到;第二种方法是通过双链循环表。循环表十分适宜于对任务列表进行迭代。因为列表是循环的,没有头或尾;并且因为init_task总是存在,所以可以将其用作继续往前迭代的一个锚点。

任务列表未能从用户空间访问,但该问题很容易解决,方式是以模块方式向内核内插入代码。比如通过如下代码,它会迭代任务列表并会提供有关每位任务的少量信息(name、pid和parent名)。

structtask_struct*task=&init_task;

/*Walkthroughthetasklist,untilwehittheinit_taskagain*/

do{

printk(KERN_INFO"***%s[%d]parent%sn",

task->comm,task->pid,task->parent->comm);

}while((task=next_task(task))!=&init_task);

注意,还可以标示当前正在运行的任务。Linux维护一个称为current的符号,代表的是当前运行的进程(类型是task_struct)。因此可使用如下代码:

printk(KERN_INFO,"Currenttaskis%s[%d]”,current->comm,current->pid);

查看进程的linux命令_linux 查看运行进程_linux查看进程在干什么

Linux创建用户空间进程的情况与内核空间进程类似。两者底层机制是一致的,由于终还会依赖于一个名为do_fork的函数来创建新进程。

在创建内核线程时,内核会调用一个名为kernel_thread的函数(参见./linux/arch/i386/kernel/process.c)linux 查看运行进程,此函数执行个别初始化后会调用do_fork。

在用户空间,一个程序会调用fork,这会造成对名为sys_fork的内核函数的系统调用(参见./linux/arch/i386/kernel/process.c)。

do_fork是进程创建的基础。可以在./linux/kernel/fork.c内找到do_fork函数(以及相关函数copy_process)。

do_fork函数首先调用alloc_pidmap,该调用会分配一个新的PID。接出来,do_fork检测调试器是否在跟踪父进程。若果是,在clone_flags内设置CLONE_PTRACE标志以做好执行fork操作的打算。以后do_fork函数都会调用copy_process,向其传递这种标志、堆栈、注册表、父进程以及新分配的PID。

新的进程在copy_process函数内作为父进程的一个副本创建。此函数能执行除启动进程之外的所有操作,启动进程在以后进行处理。copy_process内的第一步是验证CLONE标志以确保那些标志是一致的。若果不一致,都会返回EINVAL错误。接出来,寻问LinuxSecurityModule(LSM)看当前任务是否可以创建一个新任务。

接出来,调用dup_task_struct函数(./linux/kernel/fork.c),这会分配一个新task_struct并将当前进程的描述符复制到其内。在新的线程堆栈设置好后,一些状态信息也会被初始化,但是会将控制返回给copy_process。控制回到copy_process后,不仅其他几个限制和安全检测之外,就会执行一些常规管理,包括在新task_struct上的各类初始化。以后,会调用一系列复制函数来复制此进程的各个方面,例如复制开放文件描述符(copy_files)、复制符号信息(copy_sighand和copy_signal)、复制进程显存(copy_mm)以及终复制线程(copy_thread)。

以后,这个新任务会被指定给一个处理程序,同时对容许执行进程的处理程序进行额外的检测(cpus_allowed)。新进程的优先级从父进程的优先级承继后,执行一小部份额外的常规管理,并且控制也会被返回给do_fork。在此时,新进程存在但仍未运行。do_fork函数通过调用wake_up_new_task来修补此问题。此函数(./linux/kernel/sched.c)初始化个别调度程序的常规管理信息linux 查看运行进程,将新进程放置在运行队列之内,之后将其唤起便于执行。后,一旦返回至do_fork,此PID值即被返回给调用程序,进程完成。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: fork linux系统 优先级 函数调用
最后更新:2023年7月20日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
如何在Linux系统中查看CPU信息使用lscpu命令行 linux服务器搭建ftp的6下安装vsftpd步骤及步骤 贵州工业职业技术学院求职意向期望工作地--诚聘英才 实验1Linux安装实验掌握虚拟机的使用 Linux系统tar命令的使用方法及使用命令教程 linux 开源nas系统 杰和科技NAS服务器媒体见面会在京召开 Android与Linux开发大不同 Linux系统软件安装包:自己动手,安装不用愁 车市新战局:汽车操作系统会复制智能手机的历史吗? Linux文件系统种类 如何卸载用源码包安装的软件?在线视频教程推荐 「职位」ASP.、PHP、Linux服务器集群开发 Torvalds:Linux内核开发的创新前景充满了热情 Linux文件系统的结构从终端窗口探索Linux目录树结构 卸载软件命令Linux.You linux软件开发如何入门?学习Linux步骤及学习方法介绍 14年Linux发行版的有趣历史观点 Linux中不像Windows可以直接在控制面板中卸载? 2018年波及众多Linux发行版的性能对比会更加深入 如何用源码包安装的软件?name的方法总结
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
VMwareUbuntuserver系统安装教程系统镜像下载地址—> 【1024】后端技术学习路线思维导图,看这一篇就够了! U盘做系统非常简单的步骤,之后自己去研究! Linux中如何查看分区的文件系统类型的方法-乐题库 Linux中国荣誉研究生申请之cron定时器 【Linux基础知识】Linux下的共享库和动态库 sudo编辑sudo权限的配置账号登录系统账号做了什么操作 linux修改权限 你知道哪个操作系统是世界上最受欢迎的操作系统吗? mkfsext3devhdbfdisk命令查看当前Linux分区情况可输入这条Linux命令 ToradexColibri61计算机模块工业产品级EmbeddedLinux源代码下载 驱动开发:通过ReadFile与内核层通信详细介绍如何使用应用层 在多用户多任务中对每个用户运行环境的设置十分重要 主频93.75MHz的MIPS64NECVR4300处理器在N64上运行 Linux下高效开发必备:配置Tomcat和JDK 5yw红软基地驱动完美支持windows、mac、linux系统 CentOS6.5中安装和配置IP地址的步骤和基本步骤 升级Linux内核版本的步骤及注意事项(详细介绍) 【每日一题】Linux内核源码/kernel/pid.c 如何吸引厂商开发更多更丰富的Linux软件问题 (Linux基础知识)文件压缩、打包命令解析
标签聚合
命令 文件目录 linux服务器 虚拟机 内核 linux系统 操作 软件 应用 文件
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 78篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.