3 回答
TA贡献1875条经验 获得超3个赞
Linux使用1-1线程模型,(对内核)没有进程和线程之间的区别 - 一切都只是一个可运行的任务。*
在Linux上,系统调用clone克隆任务,具有可配置的共享级别,其中包括:
CLONE_FILES:共享相同的文件描述符表(而不是创建副本)CLONE_PARENT:不要在新任务和旧任务之间建立父子关系(否则,孩子的getppid()=父母的getpid())CLONE_VM:共享相同的内存空间(而不是创建COW副本)
fork()呼叫clone(最少共享)和pthread_create()呼叫clone(大多数共享)。**
forkpthread_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 关注
- 718 浏览
添加回答
举报
