3 回答
TA贡献1875条经验 获得超3个赞
Linux使用1-1线程模型,(对内核)没有进程和线程之间的区别 - 一切都只是一个可运行的任务。*
在Linux上,系统调用clone
克隆任务,具有可配置的共享级别,其中包括:
CLONE_FILES
:共享相同的文件描述符表(而不是创建副本)CLONE_PARENT
:不要在新任务和旧任务之间建立父子关系(否则,孩子的getppid()
=父母的getpid()
)CLONE_VM
:共享相同的内存空间(而不是创建COW副本)
fork()
呼叫clone(
最少共享)
和pthread_create()
呼叫clone(
大多数共享)
。**
fork
pthread_create
由于复制表和为内存创建COW映射,成本只是一点点,但Linux内核开发人员已经尝试(并成功)降低了这些成本。
如果任务共享相同的内存空间和各种表,则在任务之间切换比不共享任务要便宜一点,因为数据可能已经加载到缓存中。但是,即使没有共享任何内容,切换任务仍然非常快 - 这是Linux内核开发人员试图确保(并成功确保)的其他内容。
实际上,如果您使用的是多处理器系统,则不共享可能实际上对性能有益:如果每个任务在不同的处理器上运行,则同步共享内存非常昂贵。
*简化。 CLONE_THREAD
导致信号传递被共享(需要CLONE_SIGHAND
,共享信号处理程序表)。
**简化。存在两个SYS_fork
和SYS_clone
系统调用,但在内核中,sys_fork
并且sys_clone
它们都是围绕同一do_fork
函数的非常薄的包装器,它本身就是一个薄的包装器copy_process
。是的,术语process
,thread
以及task
相当互换使用Linux内核...
- 3 回答
- 0 关注
- 601 浏览
添加回答
举报