当仅调度线程时(Windows 和 Linux),进程如何具有状态?
- 假设我们创建流程磷
- 线T1现在也已分配
- T1现在处于可运行状态
- 调度程序选择T1并将其设置为可与磷
- 新线程T2已创建并标记为可运行
- 调度程序选择T2并将其交给另一个CPU核心
- 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 行为的调用。这是最接近等级制度的。
**为了描述清楚起见,我忽略了线程的许多其他属性及其共享的内容,以及进程层次结构及其共享的内容来解释线程和进程的基本性质。