2016 - 2024

感恩一路有你

linux查询进程有几种方式 linuxtop查看的是进程还是线程?

浏览量:2516 时间:2023-04-20 13:02:20 作者:采采

linuxtop查看的是进程还是线程?

top命令的每一行显示一个进程,后缀-H(Thr

Linux是如何记录进程资源的?你能从C语言源代码层面分析下吗?

谢谢邀请我。

其实简单来说,一个进程无非就是正在运行的程序及其相关资源的总和。读者应该注意单词 "相关资源 "给你。Linux如何在内核中记录进程的资源?

Linux内核如何记录一个进程的资源?首先我们要明白,Linux内核大部分都是用C语言编写的,所以要搞清楚内核是如何记录进程资源的,我们只需要看看相关的C语言代码就可以了。事实上,Linux内核使用task_struct结构来描述进程的资源。它的C语言代码如下。请看:

Task_struct结构很长,占了我手里Linux内核C语言源代码的280行。当然还有很多有条件的编译部分。在32位的机器上,task_struct大约占用1.7kB的内存空间,但考虑到它可以管理一个完整的进程,1.7 KB并不算大。

鉴于task_struct的结构比较长,这里不可能把它的成员介绍清楚。如果读者和我一样好奇,粗略浏览一下task_struct结构,应该能找到一些熟悉的成员,比如:

通过C语言中的注释和成员的变量名可以看到,task_struct结构中包含了文件系统、线程结构、进程打开的文件等信息,与上一篇文章的内容相对应。其他成员会在我后面的文章中涉及,所以我赢了 这里暂时不细说。

Linux在创建进程时,通过slab分配器分配task_struct结构,可以避免动态分配和释放带来的开销,提高内存使用效率。

那么在task_struct结构创建之后,内核是如何访问它的呢?根据我手里的内核C语言源代码,Linux中还有一个结构thread_info,它的一个成员任务指针正好适合索引task_struct结构。在X86_64平台上,thread_info的相关C语言代码如下。请看:Linux通常把thread_info结构放在内核栈的底部或顶部,内核栈的大小通常是已知的,所以每个进程都可以很容易地从自己的栈中找到thread_info结构,然后找到task_struct结构。

要找到当前进程的thread_info结构,可以调用current_thread_info()函数,其C语言代码如下,请看:

可以看出,current_thread_info()函数实际上是通过进程栈来计算的,所以它的实现与平台架构有关。上面的C语言代码其实只是arm平台的实现方法,读者可以自己查看其他平台的实现方法。

此时,要获取当前进程的资源,可以使用current_thread_info()-gttask索引。

欢迎在评论区一起讨论提问。这些文章都是手工原创的。每天都有最简单的C语言、linux等嵌入式开发介绍。如果你喜欢我的文章,请关注一波。你可以看到最新的更新和以前的文章。

进程 结构 语言 struct

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。