Linux进程“调度”

Linux进程“调度”

我已经看过很多次关于Linux调度程序调度进程的文章了。我正在教授多线程编程课程,并且想弄清楚我的术语。我想说一件事(写在下面),希望有人能帮助我清除最严重的错误:

这不是调度程序调度的进程,而是线 与该过程相关联。该进程只是一堆内存映射段,因此是静态的。我们可以清楚地看到这一点,当我们 pthread_create()或什至clone()(大多数情况下,但不完全一样),一个进程有多个线程,并且是那些被调度的线程(否则你只会调度进程线程(PID = TID) ,而不是任何其他的,我认为这种歧义是由于所有进程都至少有一个执行线程这一事实造成的。

这是正确的(尽管是简化的)图片吗?

答案1

尝试这样的事情:


所有进程都从一个线程开始,并且可以创建更多线程,pthread_create例如使用。 (以这种方式创建的所有进程的线程共享相同的地址空间。)内核的调度程序在这些线程上工作,无论它们是进程的“主”/初始线程还是其他线程 - 它们与调度程序的本质上没有区别观点看法。

Linux 最初根本没有线程,只有进程。因此,由于历史原因,操作系统中调度“CPU 工作”的部分通常称为进程调度程序。 (这不是 Linux 特有的,对于大多数(所有?) Unix 类型的系统来说也是如此。线程调度程序根本不是常用的词汇。)


我什至不会在这一点上提及clone(更不用说vfork),除非您已经解释了整个名称空间业务。

答案2

在Linux内核中,没有线程的概念,因为Linux将所有线程都实现为标准进程。

Linux 内核没有提供任何特殊的调度语义或数据结构来表示线程。

相反,线程只是一个与其他进程共享某些资源的进程。每个线程都有一个唯一的task_struct,并且在内核看来就像一个普通进程——线程只是碰巧与其他进程共享资源,例如地址空间。

对于 Linux 来说,线程只是进程之间共享资源的一种方式。例如,假设您有一个由四个线程组成的进程。在 Linux 中,只有四个进程,因此有四个正常的 task_struct 结构。这四个进程是为了共享某些资源而设置的。

就内核线程(仅存在于内核空间中)而言,内核线程与普通进程/线程之间的唯一区别是内核线程没有地址空间。它们仅在内核空间中运行,不会上下文切换到用户空间。

相关内容