Linux 线程与其他实现相同吗?
不。它们更好 -- 并且在很大程度上保持了相同的 API。如上所述,大多数多线程操作系统将线程与进程分开定义。Linus Torvalds 将线程定义为“执行上下文”(COE)。这意味着只需要一个进程/线程表和一个调度器。此外,调度器也经过优化,因此线程与任务之间的切换时间差异很小 -- 在 75MHz Pentium 处理器上,大约为 1.7 微秒(线程)和 1.8 微秒(fork)。
传统上,线程只是 CPU 的状态(以及一些其他最小状态),而进程包含其余部分(数据、堆栈、I/O、信号)。 这将有助于非常快速的切换,但会引起基本问题(例如,当线程执行“fork()”或“execve()”调用时,它们的含义是什么?)。
可以将 Linux 线程视为此功能的超集:它们仍然可以快速切换并共享进程部分,但它们也可以识别哪些部分被共享,并且在 execve() 调用方面没有问题。有四个 标志 决定共享级别
#define | CLONE_VM | 0x00000100 |
#define | CLONE_FS | 0x00000200 |
#define | CLONE_FILES | 0x00000400 |
#define | CLONE_SIGHAND | 0x00000800 |
#define | CLONE_PID | /* 未完全实现 */ |
关于“clone()”有很多讨论。系统调用(请注意:“底层”)clone() 是 fork() 的扩展。 实际上,clone(0) == fork()。 但是使用上面的 #define,VM、文件系统、I/O、信号处理程序和进程 ID 的任何组合都可以共享。
|
|
|
|
|
[上一页] | [首页] | [词典] | [电子邮件作者] | [下一页] |