Linux是如何记录进程资源的?你能从C语言源代码层面分析下吗?
谢邀。
其实简单来说,进程无非就是处于运行期的程序及其相关资源的总和。这里读者应该注意“相关资源”一词,Linux 在内核中是如何记录进程的资源的呢?
Linux内核如何记录进程的资源?
首先应该明白,Linux 内核大都是采用C语言编写的,因此要弄清楚内核如何记录进程资源,只需要查看相关的C语言代码就可以了。事实上,Linux 内核是使用 task_struct 结构体描述进程的资源的,它的C语言部分代码如下,请看:
task_struct 结构体很长,在我手中的 Linux 内核C语言源代码中,它占用了280行。当然了,这其中包含很多条件编译部分,在 32 位机器上,task_struct 大约要占用 1.7 KB 的内存空间,不过考虑到它可以管理完整的进程,1.7kB 其实并不算大了。
鉴于 task_struct 结构体过长,这里不可能将其成员一一介绍清楚。如果读者和我一样好奇,粗略的浏览 task_struct 结构体,应该能够发现一些比较令人熟悉的成员,例如:
通过C语言注释以及成员的变量名,能够看到 task_struct 结构体包含了文件系统,线程结构体,以及进程打开的文件等信息,这就与上一节文章的内容对应上了。其他成员在我之后的文章中会涉及到,这里暂不赘述。
在创建进程时,Linux 通过 slab 分配器分配 task_struct 结构,这样可以避免动态分配和释放带来的开销,提高内存的使用效率。
那么创建 task_struct 结构后,内核如何访问它呢?
根据我手上的内核C语言源代码,Linux 中还有一个结构体 thread_info,它的其中一个成员 task 指针正好适合用于索引 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()->task 索引。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
Python有多难?可以自学吗?
100天,python从新手变成大师,我是如何做到的?
看到很多回答,逻辑都不够清晰,看完之后云里雾里,这还怎么学?
这个python学习项目从上线以来,收到了8W+星标,而且还有视频讲解。
我猜,你肯定也想了解一下,如何用100天让自己学会。
先说python在各方面的应用,来坚定一下你学习的信心吧。
后端开发,数据采集,数据处理,机器学习,自动化,可别再问python能干啥了!
首先,给初学者2个建议:熟能生巧,让英语成为你的工作语言。
熟能生巧这个我就不说了,来说说英语,大家也都知道,编程讲究的是思维逻辑,并不是英语水平,但是如果英语水平太差也不行,起码得看得懂基本单词吧。
1、15天基础学习
主要讲一些基础概念和常规用法,千万别大意,这就是地基,一定一定要好好学,不然后面难起来还得回头查看多麻烦。
这个阶段多尝试去理解。
如果安装错了python版本,那么找到网页上对应版本下载的安装包
这阶段,你肯定会遇到语言报错的问题,调整好心态,好好检查就行。
如图所示,python错误提示最后一行SyntaxError: invalid syntax,表示语法错误:无效的语法。
Python语言异常错误提示还是非常人性化的,它会帮你检测哪里出现了问题。
哦对了,在这15天里,你还会遇到python做一个小游戏这种有趣的项目,哈哈,相信你会感兴趣。
2、python进阶
打起精神,这部分会讲到数据结构与高级用法了。
还有算法的生动案例。
如果这阶段过去,你已经是一个半年经验的python工程师了。
3、系统入门
前端入门,这里有可视化的知识:vue、html、css
linux系统
数据库知识:MySQL的安装和使用、在Python中操作MySQL、NoSQL、Redis等
4、实战开始!!!
Django、Flask、爬虫、数据处理和机器学习实战、团队项目开发
这其中,数据处理和机器学习是历时最长的,为什么要这么安排呢?
和真实的工作有关,而且你看,和我之前讲过的一些基础概念是不是差不多,这些我都在文章、问答里详细解释过。
看着这些项目的名字,熟悉我的人应该都学过吧。
5、一些面试题
附上整个0-100天学习的地址:jackfrued/Python-100-Days
明确回答你,Python不难,入门很快
个人总结主要有3点:
第一,Python最大的功劳
就是直接拉低了编程门槛和使用难度
相比于C, C#,JAVA这些早轮子语言
学习Python完全就是直接开车的节奏
稍微努力一下,一周就能写出像样的东西
第二,Python学习越来越普及
目前Python课程已发展到儿童编程领域
很多中小学开设Python教学,统一考试
很多国外学校,比如美国日本
更是将Python编程写入K12教育体系
能作为基础编程课程,入门难度自然很低
第三,Python资源特别丰富
Python开放的环境和社区文化,相关课程、书籍,论文非常丰富。无论是入门级,还是高级进阶,我们都可以找到优秀的资源供学习参考。就连微软都推出免费Python课程,巨头都在推广它。
所以,想自学Python,难度低入门快,无需那么多顾虑,最后给个建议直接学习py3,py2停服了。