【发布时间】:2011-09-07 22:39:54
【问题描述】:
如上所述的问题..从操作系统的角度来看,哪个更容易创建,线程还是进程?
【问题讨论】:
-
只是一个猜测,但它可能是线程。要创建一个进程,操作系统需要在特定于该进程的内存中创建空间。多个线程可以在一个进程中运行。
标签: process operating-system pthreads
如上所述的问题..从操作系统的角度来看,哪个更容易创建,线程还是进程?
【问题讨论】:
标签: process operating-system pthreads
传统上,线程被称为“轻量级进程”,所以我想它们更容易设置。
Linux 中的 IIRC 分叉和启动新线程 (clone(2)) 都是通过调用相同的函数 (do_fork) 来实现的,并且设置时间对于体面的数字来说是相当的。对于大量的分叉/克隆(想想数千个),它们开始加起来。
在 TLPI 中有一个很好的比较:
特别是clone 的一个非常好的特性是即使克隆的进程的大小增加,速度也保持不变。
线程的真正优势在于它们不需要IPC。
【讨论】:
新线程更容易创建,因为当创建新进程时,它需要比线程更多的设置,例如安全上下文、可继承句柄、当前目录等。
【讨论】:
创建新线程应该比创建新进程更快。
进程是一个重量级的系统结构。它拥有自己的虚拟内存空间,拥有所有句柄(互斥体、信号量、打开的文件),并受到其他进程的保护。跨进程通信必须经过操作系统。
线程是进程的“子”。线程只是一个执行上下文(寄存器、堆栈和线程本地状态),它可以在另一个硬件内核上运行,也可以与进程中的其他线程在同一内核上共同调度。多个线程共享单个进程的资源,包括进程拥有的地址空间和操作系统句柄。
有些结构甚至比在程序运行时实现多任务处理时动态创建线程更快。
某些系统或代码库支持具有线程池(轻量级线程)。在这种情况下,您告诉系统您要运行多少线程并预先创建它们。然后,您可以从这个池中分配和释放线程,而不是创建和销毁线程(这仍然是一个相对较慢的过程)。
Job Tasking 是另一种类似的轻量级多核结构,其中您有多个线程和一个任务队列来执行。他们在其作业队列中运行任务,然后在队列为空时休眠。
对于线程池和作业任务,除了创建和销毁全局池和队列时,不需要线程启动/关闭成本。
【讨论】:
线程和进程之间的主要区别是 1.线程共享进程的地址空间 创建它;进程有自己的地址。
2.线程可以直接访问其数据段 过程;进程有自己的数据段副本 的父进程。
3.线程可以直接与其他线程通信 其过程;进程必须使用进程间通信 与兄弟进程通信。
4.线程几乎没有开销;过程有 相当大的开销。
5.新线程很容易创建;新工艺需要 父进程的重复。
6.Threads 可以对 相同的过程;流程只能行使控制权 子进程。
7.主线程的变化(取消,优先级 更改等)可能会影响其他线程的行为 过程;对父进程的更改不会 影响子进程。
【讨论】:
线程必须与创建进程一样容易或更容易,因为创建进程意味着创建至少一个线程来运行进程代码。
Rgds, 马丁
【讨论】: