Linux中进程和线程区别

进程在内核中的描述符 task_struct 结构:

struct task_struct {// 进程idpid_t    pid;// 用于标识线程所属的进程 pidpid_t    tgid;// 进程打开的文件信息struct files_struct  *files;// 内存描述符表示进程虚拟地址空间struct mm_struct  *mm;.......... 省略 .......
}

在进程描述符 task_struct 结构中,有一个专门描述进程虚拟地址空间的内存描述符 mm_struct 结构,这个结构体中包含了前边几个小节中介绍的进程虚拟内存空间的全部信息。

每个进程都有唯一的 mm_struct 结构体,也就是前边提到的每个进程的虚拟地址空间都是独立,互不干扰的。

通过  fork() 函数创建子进程:

copy_mm  函数首先会将父进程的虚拟内存空间 current->mm 赋值给指针 oldmm。然后通过 dup_mm 函数将父进程的虚拟内存空间以及相关页表拷贝到子进程的 mm_struct 结构中。最后将拷贝出来的 mm_struct 赋值给子进程的 task_struct 结构。

通过 fork() 函数创建出的子进程,它的虚拟内存空间以及相关页表相当于父进程虚拟内存空间的一份拷贝,直接从父进程中拷贝到子进程中。

通过 vfork 或者 clone 系统调用创建出的子进程:

首先会设置 CLONE_VM 标识,这样来到 copy_mm 函数中就会进入  if (clone_flags & CLONE_VM)  条件中,在这个分支中会将父进程的虚拟内存空间以及相关页表直接赋值给子进程。这样一来父进程和子进程的虚拟内存空间就变成共享的了。也就是说父子进程之间使用的虚拟内存空间是一样的,并不是一份拷贝。

进程和线程:

子进程共享了父进程的虚拟内存空间,这样子进程就变成了我们熟悉的线程,是否共享地址空间几乎是进程和线程之间的本质区别。Linux 内核并不区别对待它们,线程对于内核来说仅仅是一个共享特定资源的进程而已

内核线程和用户态线程:

内核线程和用户态线程的区别就是内核线程没有相关的内存描述符 mm_struct ,内核线程对应的 task_struct 结构中的 mm 域指向 Null,所以内核线程之间调度是不涉及地址空间切换的。

当一个内核线程被调度时,它会发现自己的虚拟地址空间为 Null,虽然它不会访问用户态的内存,但是它会访问内核内存,聪明的内核会将调度之前的上一个用户态进程的虚拟内存空间 mm_struct 直接赋值给内核线程,因为内核线程不会访问用户空间的内存,它仅仅只会访问内核空间的内存,所以直接复用上一个用户态进程的虚拟地址空间就可以避免为内核线程分配 mm_struct 和相关页表的开销,以及避免内核线程之间调度时地址空间的切换开销。

父进程与子进程的区别,进程与线程的区别,以及内核线程与用户态线程的区别其实都是围绕着这个 mm_struct 展开的。

参考:一步一图带你深入理解 Linux 虚拟内存管理

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

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

相关文章

NewspaceGPT带你玩系列之美人鱼图表

这里写目录标题 注册一个账号,用qq邮箱,然后登录选一个可用的Plus,不要选3.5探索GPT今天的主角是开始寻梦美人鱼图表我选第一个试一下问:重新回答上面的问题,一切都用汉语重新生成一个流程图:生成一个网站登…

OpenAI“跌倒”,国产大模型“吃饱”?

大数据产业创新服务媒体 ——聚焦数据 改变商业 在AI的世界里,OpenAI就像是一位高高在上的霸主,它的一举一动,都能引发行业里的地震。然而,就在不久前,这位霸主突然宣布了一个决定,自7月9日起,…

2024热门骨传导蓝牙耳机怎么选?超全的选购攻略附带好物推荐!

对于很多喜欢运动健身的小伙伴,在现在市面上这么多种类耳机的选择上,对于我来说的话还是很推荐大家去选择骨传导运动耳机的,相较于普通的入耳式蓝牙耳机,骨传导耳机是通过振动来传输声音的,而入耳式耳机则是通过空气传…

以Bert训练为例,测试torch不同的运行方式,并用torch.profile+HolisticTraceAnalysis分析性能瓶颈

以Bert训练为例,测试torch不同的运行方式,并用torch.profileHolisticTraceAnalysis分析性能瓶颈 1.参考链接:2.性能对比3.相关依赖或命令4.测试代码5.HolisticTraceAnalysis代码6.可视化A.优化前B.优化后 以Bert训练为例,测试torch不同的运行方式,并用torch.profileHolisticTra…

requests 库

快速上手 import requests# 定制请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, # 标识浏览器的详细信息,包括名称、版本、操作系统等Accept: */*, # 指…

TypeScript 基础

Typescript的好处是什么? TypeScript :是JavaScript 的超集(ts是微软开发的开源编程语言,vue3的底层代码也是ts),即包含JavaScript 的所有元素,能运行JavaScript 的代码,并扩展了Jav…

列出R包中的函数

要列出R包中的所有函数,可以使用几个R内置函数。以下是几个常用的方法来列出特定R包中的所有函数: 方法1:使用ls和getNamespaceExports 这种方法通过列出包的命名空间导出对象来获取所有函数: # 替换pkg为你感兴趣的包名 pkg &…

QT QML 界面设计教程10——复选框样式

MyComboBox.qml import QtQuick 2.12 import QtQuick.Templates 2.12 as Template1 import QtQuick.Controls 2.12 import QtQuick.Controls.impl 2.12Template1.ComboBox {id:controlproperty color themeColor: "darkCyan" //主题颜色property color indicatorCo…

Java中将字符串写入文件中的几种方式

以下是几种不同的实现方法将字符串写入文件中的 Java 代码: 1、使用 BufferedWriter 类 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException;public class Main {public static void main(String[] args) {String content &…

正则表达式阅读理解

这段正则表达式可以匹配什么呢? ((max|min)\\s*\\([^\\)]*(,[^\\)]*)*\\)|[a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\))(\\s*[-*/%]\\s*([a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-…

GitHub国内使用方法

1、登录验证: 在火狐中添加插件“身份验证器”。此款插件对应的主页地址为:https://github.com/Authenticator-Extension/Authenticator 2、加速: 安装工具:https://gitee.com/XingYuan55/FastGithub/releases/tag/2.1.4 工具…

Charls数据库+预测模型发二区top | CHARLS等七大老年公共数据库周报(6.19)

七大老年公共数据库 七大老年公共数据库共涵盖33个国家的数据,包括:美国健康与退休研究 (Health and Retirement Study, HRS);英国老龄化纵向研究 (English Longitudinal Study of Ageing, ELSA);欧洲健康、…

一位NVIDIA芯片工程师繁忙的一天

早晨:开启新的一天 7:00 AM - 起床 早晨七点准时起床。洗漱、吃早餐后,查看手机上的邮件和公司消息,以便提前了解今天的工作安排和任务优先级。 7:30 AM - 前往公司 开车前往位于加州圣克拉拉的NVIDIA总部。在车上,习惯性地听一…

HashMap第5讲——resize方法扩容源码分析及细节

put方法的源码和相关的细节已经介绍完了,下面我们进入扩容功能的讲解。 一、为什么需要扩容 这个也比较好理解。假设现在HashMap里的元素已经很多了,但是链化比较严重,即便树化了,查询效率也是O(logN),肯定没有O(1)好…

IDEA注释快只有一行时不分行的设置

在编写注释时,有时使用注释块来标注一个变量或者一段代码时,为了节约空间,希望只在一行中显示注释快。只需要按照下图将“一行注释不分行”勾选上即可。

M Farm RPG Assets Pack(农场RPG资源包)

🌟塞尔达的开场动画:风鱼之歌风格!🌟 像素参考:20*20 字体和声音不包括在内 资产包括: 1名身体部位分离的玩家和4个方向动画: 闲逛|散步|跑步|持有物品|使用工具|拉起|浇水 6个带有4个方向动画的工具 斧头|镐|喙|锄头|水壶|篮子 4个NPC,有4个方向动画: 闲逛|散步 �…

连接智慧未来:ChatGPT与IoT设备的交互探索

🤖 连接智慧未来:ChatGPT与IoT设备的交互探索 🌐 在当今数字化时代,物联网(IoT)设备正变得越来越普及,它们无声地融入我们的生活和工作中,从智能家居到工业自动化,IoT设…

LSH算法:高效相似性搜索的原理与Python实现II

局部敏感哈希(LSH)是一种高效的近似相似性搜索技术,广泛应用于需要处理大规模数据集的场景。在当今数据驱动的世界中,高效的相似性搜索算法对于维持业务运营至关重要,它们是许多顶尖公司技术堆栈的核心。 相似性搜索面…

去掉window11设备和驱动器中的百度网盘图标

背景 window系统设备驱动器中显示百度网盘图标,个人强迫症,要去掉!!! 去掉window11->设备和驱动器->百度网盘 的图标 登录百度网盘点击”同步“ 点击设置 在基本设置里面去掉勾选“在我的电脑中显示百度网盘…

麒麟桌面操作系统上使用命令行添加软件图标到任务栏

原文链接:麒麟桌面操作系统上使用命令行添加软件图标到任务栏 Hello,大家好啊!今天给大家带来一篇在麒麟桌面操作系统上使用命令行添加软件图标到任务栏的文章。通过命令行添加软件图标到任务栏,可以快速、便捷地将常用的软件固定…