linux内核中创建进程和线程做了什么工作?

linux中fork可以用于创建一个子进程,fork和excv系统调用可以创建一个新的进程。

clone系统调用也可以创建进程。

本实验探究fork()和pthread_create()在linux内核中分别调用了什么函数。

首先 看一下linux内核在执行fork()的时候底层的系统调用

#include <sys/types.h>
#include <unistd.h>
int main(){int pid=fork();
}

编译之后运行strace查看系统调用链

execve("./test", ["./test"], 0x7fff16415f70 /* 37 vars */) = 0
brk(NULL)                               = 0x564f505a7000
.....
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb965888a10) = 4767
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4767, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0)                           = ?
+++ exited with 0 +++

可以看到有一行为

clone(child_stack=NULL,flags=CLONE_CH

ILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb965888a10) = 4767

然后看一下执行pthread_create函数linux内核的调用链。

#include <pthread.h>
#include <stdio.h>void *fun1(){printf("a");
}pthread_t p;
int main(){if (pthread_create(&p, NULL, fun1, NULL) != 0) {fprintf(stderr, "Error creating thread\n");return 1;}
}

编译后使用starce 追踪linux内核调用链。

execve("./test1", ["./test1"], 0x7ffe9aa808b0 /* 37 vars */) = 0
brk(NULL) = 0x56361cbb4000
............
clone3({flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, child_tid=0x7f4b39f51910, parent_tid=0x7f4b39f51910, exit_signal=0, stack=0x7f4b39751000, stack_size=0x7fff00, tls=0x7f4b39f51640} => {parent_tid=[21193]}, 88) = 21193

使用pthread_create创建线程时还是调用了clone函数。

所以可得结论无论是fork()还是pthread_create底层都是调用了clone函数,所以linux中线程是一个轻量级进程。

下面解析一下创建线程时clone各个参数的含义:

CLONE_VM 表示虚拟内存空间被共享。
CLONE_FS 表示文件系统信息被共享。
CLONE_FILES 表示打开的文件描述符被共享。
CLONE_SIGHAND 表示信号处理函数被共享。
CLONE_THREAD 表示这是一个线程而不是独立的进程。
CLONE_SYSVSEM 表示共享 System V IPC semaphores。
CLONE_SETTLS 允许设置线程本地存储(TLS)指针。
CLONE_PARENT_SETTID 允许父进程通过写入到一个给定的地址来设置子线程的 ID。
CLONE_CHILD_CLEARTID 允许子线程通过写入到一个给定的地址来清除其线程 ID。

stack=0x7f4b39751000: 这个地址是新线程栈的基地址。

stack_size=0x7fff00: 这个值通常表示栈大小,但在这个上下文中,它看起来像是一个无效的值(可能是输出解析的问题),因为栈大小应该是字节的数量。

tls=0x7f4b39f51640: 这个地址是 TLS 块的地址。

从上面可以看到在创建线程时,有一个标志时表示创建的是线程,然后创建的线程和父进程共享虚拟内存空间,文件描述符,但是每个线程都有自己一个栈和TLS块,在线程初始化的时候设置栈指针、栈大小和TLS地址。

所以不同线程之间共享同一个虚拟内存空间,但是每个线程都有自己的栈和TLS块。

实验结论:

在使用fork时子进程需要复制父进程的mm_struct结构,页表等结构,并采用写时复制的策略使父进程和子进程有不同的地址空间。但是线程由于共享了内存空间和其他一些资源,所以线程上下文切换的开销省去了复制父进程内存空间和其他一些资源的开销,所以使用线程可以有更高的并发度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EI征稿】第四届机器人、自动化与智能控制国际会议

【快速通道】 参会方式&#xff1a;担任会议committee成员、组建workshop 、参会报告、参会交流、审稿专家、投稿参会。 会议地点&#xff1a; 湖南 长沙 会议时间&#xff1a;12月6日-9日 会议检索&#xff1a;EI检索 会议官网&#xff1a;https://www.icraic.org/ 投稿链接&a…

华为910b推理Qwen1.5-72b

前情提要&#xff1a;华为910b部署训练推理大模型&#xff0c;本人之前并没有接触过&#xff0c;所以&#xff0c;写此文档进行记录。 &#xff08;注意&#xff1a;版本适配很重要&#xff01;&#xff01;不然就像我一样走了好多坑~~~&#xff09; 首先&#xff0c;看一张图…

数学基础 -- 求解微分问题之乘法法则、商法则和链式求导法则

微分求解问题之乘法法则、商法则和链式求导法则 微分求解问题常用的三个基本法则是乘积法则、商法则和链式求导法则。下面是它们的公式和一些例子&#xff1a; 乘积法则 乘积法则用于求两个函数的乘积的导数。假设 u ( x ) u(x) u(x) 和 v ( x ) v(x) v(x) 是两个可微函数…

大鲸鱼—docker 基本概念及安装使用

目录 一、docker前言 1.什么是Docker&#xff1f; 2.Docker的宗旨 3.容器的优点 4.Docker与虚拟机的区别 5.Docker核心概念 镜像 容器 仓库 6.为什么要用容器 7.容器越来越受欢迎的原因 8.容器在内核中支持2种重要技术 二、Docker安装 三、Docker 镜像操作 1.搜…

旷视AI开源新突破:上传照片即可生成表情包视频!

日前&#xff0c;旷视科技发布了一项新的开源AI人像视频生成框架——MegActor。该框架让用户只需输入一张静态肖像图片和一段视频&#xff08;如演讲、表情包、rap&#xff09;&#xff0c;便可生成一段表情丰富、动作一致的AI人像视频。生成的视频长度取决于输入的视频长度。与…

API接口详解及其在电子商务中的应用研究

目录 引言 一、API接口概述 1.1 API接口定义 1.2 API接口的作用 二、API接口分类 2.1 根据使用对象分类 2.2 根据协议和数据格式分类 三、API接口设计原则 四、API接口在电子商务中的应用 4.1 数据交换与集成 4.2 个性化推荐与营销 4.3 库存管理与订单处理 4.4 数…

C++ 数据结构探索:构建高效程序的基础

C 数据结构探索&#xff1a;构建高效程序的基础 在C编程的广阔领域中&#xff0c;数据结构是理解和实现高效、可维护程序的核心。数据结构是计算机存储、组织数据的方式&#xff0c;它们使得数据访问和修改操作更加高效。本文将带您走进C中几种常见且重要的数据结构&#xff0…

数据湖仓一体(一) 编译hudi

目录 一、大数据组件版本信息 二、数据湖仓架构 三、数据湖仓组件部署规划 四、编译hudi 一、大数据组件版本信息 hudi-0.14.1zookeeper-3.5.7seatunnel-2.3.4kafka_2.12-3.5.2hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1flink-1.17.2apache-dolphinscheduler-3.1.9…

气膜仓储与传统仓储的成本优势对比—轻空间

随着物流和仓储需求的不断增长&#xff0c;企业对仓储设施的要求也日益提高。传统仓储设施虽然具有一定的优势&#xff0c;但在建设和运营成本上往往较高。近年来&#xff0c;气膜仓储作为一种新型仓储方式&#xff0c;以其独特的优势逐渐受到市场青睐。轻空间将详细探讨气膜仓…

Debian 12更新:12.6版本发布 2024年6月29日

Debian 12更新&#xff1a;12.6版本发布 2024年6月29日 Debian项目很高兴地宣布其稳定发行版Debian 12&#xff08;代号bookworm&#xff09;的第六次更新。这个点发布主要增加了对安全问题的修正&#xff0c;以及对一些严重问题的调整。安全警告已经单独发布&#xff0c;并且…

spring boot实现短信验证码功能

1、到阿里云网站申请 https://market.aliyun.com/products/5700000 2/cmapi00046920.html2、配置文件&#xff0c;可申请测试 sms:app-code: xxxxxxxxxtemplate-id: xxxxxxx3、使用restTemplate用于第三方接口调用 package com.example.rsocketclient.config;import org.spr…

Altium Designer输出Gerber文件步骤

参考链接 技术指导&#xff1a;Altium Designer输出Gerber文件步骤 (jlc.com)https://www.jlc.com/portal/server_guide_10171.html 特此记录 anlog 2024年7月12日

springboot 程序运行一段时间后收不到redis订阅的消息

springboot 程序运行一段时间后收不到redis订阅的消息 问题描述 程序启动后redis.user.two主题正常是可以收到消息的&#xff0c;发一条收一条&#xff0c;但是隔一段时间后&#xff1b;就收不到消息了&#xff1b; 此时如果你手动调用发送另外一个消息订阅redis.user.two2&…

豆包AI智能助手:知识库整理与智能检索的双重应用

引言 抖音豆包&#xff0c;作为字节跳动开发的AI智能助手&#xff0c;不仅仅是一个简单的虚拟角色&#xff0c;而是集成了深度学习和自然语言处理技术的复杂系统&#xff0c;专门设计来增强用户在抖音平台上的体验。同时&#xff0c;豆包的应用示范了AI智能助手在知识库管理和…

华为HCIP Datacom H12-821 卷38

1.多选题 下面关于 BGP中的公认属性的描述&#xff0c;正确的是 A、公认必遵属性是所有BGP路由器都识别&#xff0c;且必须存在于Updata消息中心 B、BGP必须识别所有公认属性 C、公认属性分为公认必遵和可选过渡两种 D、公认任意属性是所有BGP造由器都可以识别&#xff0c…

怎么拿下Android开发Android面试题?(一)

Hello&#xff0c;之前更新了面试中的Android的Java面试部分&#xff0c;这里会更新关于Android部分的面试题。 怎么拿下Android开发Android面试题&#xff1f;&#xff08;二&#xff09; 第一节 Android 四大组件相关1.1 Activity 与 Fragment 之间常见的几种通信方式&#x…

编程参考 - 在C++移动构造函数声明中使用noexcept

在 C 中&#xff0c;noexcept 是用于表示函数不抛出异常的指定符。它既可用于常规函数&#xff0c;也可用于特殊成员函数&#xff0c;包括构造函数和析构函数。使用 noexcept 可以帮助编译器进行优化&#xff0c;提高代码的安全性和正确性。 In C, noexcept is a specifier use…

设计模式的七项原则

文章目录 设计模式的七项原则单一职责原则接口隔离原则依赖倒置里氏替换原则开闭原则迪米特法则复用合成原则 设计模式的七项原则 分别为 单一职责原则接口隔离原则依赖倒置里氏替换原则开闭原则迪米特法则复用合成原则 单一职责原则 一个类负责一个职责&#xff0c;不可以…

解决configure: error: Unexpected output of ‘arch‘ on OSX

最近很好高兴用上了新版的macbook&#xff08;芯片&#xff1a;Apple M3 Pro&#xff0c;操作系统&#xff1a;14.3&#xff09;。 不高兴的是遇到了不兼容的问题。所以选型还是成熟的技术是关键。 电脑里用pyenv 工具管理多个版本的python。 命令&#xff1a;pyenv install x…

FX110网:香港证监会对Yomaex等多家虚拟资产交易平台发出警告

近日&#xff0c;香港证券及期货事务监察委员会&#xff08;香港证监会&#xff0c;SFC&#xff09;对虚拟资产交易平台Yomaex发出警告&#xff0c;运营网址为yomaexd.com.该平台曾多次被FX110网发文曝光。相关阅读 《Yomaex平台“高额回报”是“高级陷阱”&#xff0c;公务员也…