当前位置: 首页 > news >正文

【Linux】Linux下进程Vs线程

进程和线程的创建

进程创建

用户态 fork() ---->内核态fork()------>kernel_clone() ---->copy_process()

线程创建

用户态pthread_create()---->do_clone()----->内核态clone()---->kernel_clone()---->copy_process()

进程Vs线程        

       和创建进程时使用的fork系统调用相比,创建线程的clone系统调用几乎和fork差不多,也一样使用的是内核的kernel_clone(),最后走到copy_process完成,但是区别是调用kernel_clone时传入的clone_flags里的标记不同

进程flag Vs 线程flag

进程flag

仅有一个SIGCHLD

线程flag

CLONE_VM/CLONE_FS/CLONE_FILES/CLONE_SIGNAL/CLONE_SETTLS/CLONE_PARENT_SETTID/CLONE_CHILD_CLEARTID/CLONE_SYSVSEM

创建线程时主要的三个flag

CLONE_VM:新task和父进程共享地址空间

CLONE_FS:新task和父进程共享文件系统信息

CLONE_FILES:新task和父进程共享文件描述符表

对于线程来说,因为创建的时候使用了这些flag,所以内核在创建线程时不在单独申请地址空间、目录信息、打开文件列表,新的线程和创建它的进程共享

对于进程来说,地址空间、挂载点、打开文件列表都是需要独立拥有的,都需要去申请内存并初始化

          Linux内核并没有对线程做特殊处理,还是使用task_struct来管理线程。从内核角度看,线程本质上和进程没有大的区别,只不过和普通进程相比,线程轻量一点,总统来说,进程和线程的相同的大于不同点

如何判断task是进程还是线程?

进程和线程最主要的区别是进程有独立的虚拟地址空间,而线程都是和创建它的进程共享的


http://www.mrgr.cn/news/49487.html

相关文章:

  • 【conda】创建、激活、删除虚拟环境
  • 【数据结构】关于环形队列库的改进办法
  • MySQL数据库管理
  • SQL基础练习题一
  • 【踩坑随笔】Failed to build pycocotools
  • k8s-资源管理、实战入门
  • 大数据治理:构建数据驱动的智能决策体系
  • 后端参数校验方式
  • vue的动态组件 keep-alive
  • Informer: Beyond Efficient Transformer for Long SequenceTime-Series Forecasting
  • Java中的Iterator接口,以及HashSet和TreeSet
  • 蓝桥备战国奖题后总结(2)
  • 关于multiprocessing使用freeze_support()方法
  • FastAPI中的流式响应:实现实时数据传输
  • 根据Vue对比来深入学习React 下 props 组件传值 插槽 样式操作 hooks 高阶组件 性能优化
  • 深入Semantic Kernel:插件开发与实践应用(进阶篇)
  • 【FFmpeg系列】:图片处理
  • AI开发-三方库-Hugging Face-Model
  • 自动化测试-selenium
  • Spring学习——SpringAOP