2016 - 2024

感恩一路有你

linux下多进程是如何实现的 linux进程调度详解?

浏览量:4029 时间:2023-07-15 12:11:57 作者:采采

linux进程调度详解?

Linux进程调度:

无论在批处理系统还是分时系统中,用户进程的数量一般都多于处理器的数量,这会导致它们争夺处理器。

此外,系统进程也需要使用处理器。

这就要求进程调度器根据一定的策略将处理器动态地分配给就绪队列中的一个进程来执行。

linux进程调度:的基本属性

1.从出生、操作到灭绝的多态性。

2.多个不同的进程可以包含同一个程序。

3.三种基本状态可以在它们之间转换。

4.并发的并发进程轮流占用处理器。

Linux进程调度原理:

当调度程序运行时,需要从所有可以运行的进程中选择最值得运行的进程并投入运行。

每个进程的task_struct结构中有四项:policy、priority、count

linux一个端口可以运行几个进程,比如我同时打开2个浏览器,那属于几个端口呢?

每个端口上可以运行很多进程,每个进程都可以调用同一个端口,但是当一个进程占用了端口,其他进程就会等到上一个进程释放了端口,才被下一个进程调用。

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 task 语言

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