Process CPU进程是否至少有一个线程?

Process CPU进程是否至少有一个线程?,process,cpu,Process,Cpu,我知道线程用于多任务,而且它们很轻。但我的疑问是,假设我需要一个没有任何多任务的过程。我刚刚创建了一个流程。现在,CPU是将单个线程与进程关联,还是在不需要线程的情况下单独执行进程 请澄清 问候,, Harish好吧,这取决于您所讨论的操作系统,但是,对于许多人来说,创建进程包括为该进程创建单个线程 然后,该线程可以自由地去创建属于该进程的其他线程 谈论一个没有线程的进程没有什么意义,因为这意味着没有为该进程运行的代码,所以它不能真正做任何有用的事情。如果您希望它执行任何有用的工作,它将无法为该

我知道线程用于多任务,而且它们很轻。但我的疑问是,假设我需要一个没有任何多任务的过程。我刚刚创建了一个流程。现在,CPU是将单个线程与进程关联,还是在不需要线程的情况下单独执行进程

请澄清

问候,,
Harish

好吧,这取决于您所讨论的操作系统,但是,对于许多人来说,创建进程包括为该进程创建单个线程

然后,该线程可以自由地去创建属于该进程的其他线程

谈论一个没有线程的进程没有什么意义,因为这意味着没有为该进程运行的代码,所以它不能真正做任何有用的事情。如果您希望它执行任何有用的工作,它将无法为该进程创建第一个线程:-)


例如,在Linux内核中,创建进程与创建新线程没有什么不同。这是因为内核调度线程而不是进程

进程现在被认为是具有相同线程组ID(TGID)的线程组,TGID是为该进程创建的第一个线程的线程ID(TID)

当您
fork
vfork
clone
(不带
clone\u-THREAD
)时,您将获得一个具有新TID的新线程,并且TGID设置为该TID-这是一个新进程

使用
clone\u-THREAD
进行
clone
时,您将获得一个具有新TID的新线程,但TGID与克隆器保持相同。这是同一进程中的不同线程

这就是Linux(作为一个例子)如何区分进程和线程,而不必使调度程序过于复杂。如果调度程序愿意,它可以选择完全忽略线程组。它实际上非常聪明

要在调度程序外部编码,具有相同TGID的一组线程被视为一个进程


这包括用户空间代码和内核的其他部分,因为,例如,线程如何分组到进程中与信号传递和退出代码等事项有关。

进程就是线程

当一个进程开始时,它从一个线程开始

在多线程时代之前,线程这个术语是不必要的,因为一个进程不能有多个线程

现在,您可以创建额外的线程,因此有一个多线程的进程


一个过程也是一堆其他的东西——内存、堆栈、你所拥有的东西;其中之一就是线程。线程共享进程中的一些其他内容(如内存),但有自己的其他实例(如堆栈)。

Ok。所以要完成一个任务,我们需要一个线程,对吗?仅使用一个没有线程的进程不可能完成单个任务(而不是多个任务)。是吗?@Harish,是的,一定有东西在运转。操作系统可能会区分可运行进程和可运行线程,但除了在用户模式线程中(操作系统根本不执行线程),我从未见过这种情况。通常,一个进程有一个或多个线程。@paxdiablo,我想知道这一部分:“调度器可以选择完全忽略线程组,如果它愿意的话。”我的印象是,由于上下文切换(确切地说是保存状态),调度器无法真正忽略线程组。你能再详细解释一下吗?@MK_Dev,上下文切换是发生在线程而不是线程组上的事情。调度程序只调度前者,不必担心线程可能位于哪个组。@paxdiablo,谢谢,明白了。由于需要保留和恢复更多的状态,所以在从不同的线程组切换线程时,性能不会受到更大的影响吗?我的理解是,由于同一组中的线程共享内存,因此切换这些线程的成本较低,因为只需要保留特定于特定线程的状态。