linux进程与线程的区别【转】
知乎上总结:
"linux使用的1:1的线程模型,在内核中是不区分线程和进程的,都是可运行的任务而已。fork调用clone(最少的共享),pthread_create也是调用clone(最大共享).fork创建会比pthread_create多消耗一点点,因为要拷贝tables和cow mapping.但是其实差别真的很细微,这些在内核开发者的努力下已经变的很小了。
再来说说contex switch的cost吧。线程的context switch是要比process小一些,因为线程共享了大部分的memory和tables,当switch的时候这些东西已经在缓存中了。
但是其实差别也很细微。但是在multiprocessor的系统中不共享memory其实是会比共享memory要有一点优势的,因为当任务在不同的processor中运行的时候,同步memory带来的损耗是不可忽视的。"
linux 线程创建方式
linux提供的线程实际上是核外线程,即主要的线程机制是通过应用层面的库pthread提供的(线程的id分配、线程创建和管理,据说基本实现是pthread库为每一个进程维护一个管理线程,单调用 pthread_create等posix API时,调用者与该管理线程通过管道传递命令),
核内层面,线程几乎可以等同于进程。 这里贴一段从引用1 拷贝的内容:
Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和fork(),最终都用不同的参数调用do_fork()核内API。 do_fork() 提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用产生多进程时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境。当使用pthread_create()来创建线程时,则最终设置了所有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的”进程”拥有共享的运行环境,只有栈是独立的,由 __clone()传入。
即:Linux下不管是多线程编程还是多进程编程,最终都是用do_fork实现的多进程编程,只是进程创建时的参数不同,从而导致有不同的共享环境。Linux线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外pthread库中进行。pthread 库使用一个管理线程(__pthread_manager() ,每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程ID,发送线程相关的信号,而主线程pthread_create()) 的调用者则通过管道将请求信息传给管理线程。
上述内容基本可以这么表示:
创建进程= fork ——> do_fork(不使用共享属性)
创建线程= pthread_create——>__clone ——> do_fork(共享地址空间(代码区、数据区)、页表、文件描述符、信号。。)
最新文章
- Nginx + Tomcat Windows下的负载均衡配置
- JQM (功能栏、导航条)
- JavaScript文件加载器LABjs API详解
- 游戏 scrollView
- ADO.net 扩展属性
- 滚动条--nicescroll插件(兼容各种浏览器,低至IE5)
- UI1_ViewController视图切换及Appdelegate
- 《SPFA算法的优化及应用》——姜碧野(学习笔记)
- 多线程08-Callable和Future
- 【iOS基础】iOS 网络请求
- MIT线性代数课程 总结与理解-第一部分
- 💈 A Cross-Thread Call Helper Class
- HTML5可以省略全部标记的元素
- 《重构》的读书笔记–方法列表
- CentOS6.5yum配置本地源
- CSS3中的3D动画实现(钟摆、魔方)--实现代码
- Redis-09.慢查询
- Xcode真机调试失败:The identity used to sign the executable is no longer valid
- 开源作业调度框架 - Quartz.NET - 实战使用2
- Vertica使用Database Designer创建完整的设计