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

【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.kler.cn/news/353226.html

相关文章:

  • 深入解析Python数据容器
  • 【ROS2】Qt和ROS混合编程:多继承QObject和rclcpp::Node
  • ANSYS Workbench纤维混凝土3D
  • 理解JVM里的栈信息
  • 漏洞挖掘 | 基于mssql数据库的sql注入
  • 如何在Linux中找到MySQL的安装目录
  • 【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)
  • fiber的原理
  • CTFHUB技能树之SQL——报错注入
  • 算法专题七: 分治归并
  • 【C#】WPF MVVM 简单示例代码
  • 深入了解Spring重试组件spring-retry
  • 【python】极简教程4-接口设计
  • 开源影像tif切图工具gdal2tiles部署以及切图
  • 给定数组找出出现次数超过数组长度一半的数
  • ETL转换:金蝶云和旺店通数据集成全流程
  • 详解23种设计模式
  • MySQL新手向:对比常用存储引擎
  • 人工智能正在扼杀云计算的可持续性
  • gitlab的基本用法之创建用户和组
  • Python基础07_推导式函数
  • 电子电气架构---汽车OEM敏捷式集成方案简介
  • 第5天:视图和控件-补充材料——`MainActivity.kt`解读
  • 【力扣150Golang】除自身以外数组的乘积
  • SketchUp Pro 2024 for Mac 3D建模 草图设计大师软件安装【保姆级教程,简单小白轻松上手】
  • 箭头函数语法及书写规则。