知乎上总结:

"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(共享地址空间(代码区、数据区)、页表、文件描述符、信号。。)

最新文章

  1. Nginx + Tomcat Windows下的负载均衡配置
  2. JQM (功能栏、导航条)
  3. JavaScript文件加载器LABjs API详解
  4. 游戏 scrollView
  5. ADO.net 扩展属性
  6. 滚动条--nicescroll插件(兼容各种浏览器,低至IE5)
  7. UI1_ViewController视图切换及Appdelegate
  8. 《SPFA算法的优化及应用》——姜碧野(学习笔记)
  9. 多线程08-Callable和Future
  10. 【iOS基础】iOS 网络请求
  11. MIT线性代数课程 总结与理解-第一部分
  12. 💈 A Cross-Thread Call Helper Class
  13. HTML5可以省略全部标记的元素
  14. 《重构》的读书笔记–方法列表
  15. CentOS6.5yum配置本地源
  16. CSS3中的3D动画实现(钟摆、魔方)--实现代码
  17. Redis-09.慢查询
  18. Xcode真机调试失败:The identity used to sign the executable is no longer valid
  19. 开源作业调度框架 - Quartz.NET - 实战使用2
  20. Vertica使用Database Designer创建完整的设计

热门文章

  1. HDU 2181 哈密顿绕行世界问题(DFS)
  2. 步步入佳境---UI入门(2)
  3. linux下yum安装jdk1.8(rpm包)和tomcat-8.5
  4. Jsonp的实现
  5. (4)logging(日志模块)
  6. JPEG文件格式
  7. Sublime Text3 使用
  8. vulcanjs schemas&& collections
  9. asp.net 导出excel的一种方法
  10. Java性能分析之线程栈详解与性能分析