进程状态逻辑

进程状态逻辑

当仅调度线程时(Windows 和 Linux),进程如何具有状态?

  1. 假设我们创建流程
  2. 线T1现在也已分配
  3. T1现在处于可运行状态
  4. 调度程序选择T1并将其设置为可与
  5. 新线程T2已创建并标记为可运行
  6. 调度程序选择T2并将其交给另一个CPU核心
  7. T1现在等待用户输入T2仍在其他其他核心上运行

是什么状态阻塞/运行?

确定进程状态背后的逻辑是什么?

答案1

线程不共享传统进程的相同继承属性。

至少在 POSIX 中,线程被视为彼此的对等体*。当您从单个进程创建线程时,您现在有两个线程 T1 和 T2,它们绑定在名为 P1 的容器中的同一内存区域(和记帐空间)中。

这实际上可能会导致程序设计者感到困惑,特别是当信号到达时,所有或任何线程都可以接收信号,而不仅仅是最初创建的第一个线程,因为它们在层次结构上都处于“同一级别”其他。

在您给出的示例中,您实际上有三个线程。 T1(即 P1)、T2 和 T3(创建的两个线程)。

P1 (T1) 的状态是不确定的,因为除非它以某种方式专门等待任何其他线程,否则它可以是可运行、睡眠、运行或任何其他状态。

要了解线程和进程的关系,请参见下图。

                         pthread_create()
   ┌──Pid┼P1──┐                                   ┌──Pid┼P1──┐
   │          │     clone(...CLONE_THREAD...)     │          │
   │ Thread T1│     clone(...CLONE_THREAD...)     │ Thread T1│
   │          │     ...                           │ Thread T2│
   │          │     clone(...CLONE_THREAD...)     │ ...      │
   │          │  ─────────────────────────────►   │ Thread TN│
   └──────────┘                                   └──────────┘

─────────────────────────────────────────────────────────────────

                       fork()
   ┌──Pid┼P1──┐                      ┌──Pid┼P1──┐
   │          │     clone()          │ Thread T1│    ...
   │ Thread T1│     clone()          └──────────┘
   │          │     ...
   │          │     clone()          ┌──Pid┼P2──┐ ┌──Pid┼PN──┐
   │          │  ───────────►        │ Thread T1│ │ Thread T1│
   └──────────┘                      └──────────┘ └──────────┘

PID 实际上只是一个容器,用于记录和描述所有在其中共享相同资源的线程。**

您运行的大多数 PID 内部都有一个线程(技术上是一个可运行上下文)。当您创建新线程时,您只是在同一个 PID 容器内声明两个可运行上下文。

如果执行 a,fork()您将获得一个全新的容器和其中的一个新线程。


*有一个“主”线程(进程的初始线程),仅允许进行某些重新描述整个 PID 行为的调用。这是最接近等级制度的。

**为了描述清楚起见,我忽略了线程的许多其他属性及其共享的内容,以及进程层次结构及其共享的内容来解释线程和进程的基本性质。

相关内容