linux线程与进程

简要

在Linux系统中,进程(Process)和线程(Thread)是操作系统中两个重要的概念,它们都是用于执行程序的执行单元,但有一些关键的区别。
在这里插入图片描述

在Linux系统中,可以使用fork系统调用创建新进程,而使用pthread_create函数创建新线程。在实际应用中,选择使用进程还是线程取决于应用程序的需求和性能要求。

进程(Process):

  • 独立性: 进程是独立的执行单位,拥有自己的地址空间和系统资源,不同进程之间的数据通常需要通过进程间通信(IPC)来共享。
  • 资源分配: 每个进程都有独立的系统资源,包括内存空间、文件句柄、设备等。
  • 稳定性: 进程之间相互独立,一个进程的崩溃通常不会影响其他进程。
  • 创建开销: 创建新进程的开销相对较大,因为需要为其分配独立的内存空间和系统资源。

组成:

进程是计算机系统中正在运行的程序的实例。以下是进程的主要组成部分:

  1. 程序代码(Code Section):进程的执行指令,它是由一系列二进制指令组成的。这些指令告诉计算机系统如何执行进程。
  2. 数据区域(Data Section)包含了进程运行时使用的全局变量和静态变量。这些数据在程序的整个生命周期中保持不变,直到进程结束。
  3. 堆区域(Heap):是动态分配内存的区域,用于存储程序运行时动态分配的数据。在C和C++等编程语言中,使用malloc、free等函数在堆中分配和释放内存。
  4. 栈区域(Stack):用于存储函数调用和局部变量。每个线程都有自己的栈,栈中的数据是临时的,随着函数的调用和返回而动态变化。栈的大小通常是有限的。
  5. 进程控制块(Process Control Block,PCB):包含了进程的重要信息,它是操作系统用于管理进程的数据结构。PCB 中包含了进程的标识符、状态、程序计数器、寄存器的值、内存管理信息、文件描述符等。
  6. 打开文件表(Open File Table):进程打开的文件列表,其中包含了文件描述符以及文件的状态信息。
  7. 进程状态(Process State):当前所处的状态,如运行、就绪、阻塞等。
  8. 进程间通信(Inter-Process Communication,IPC)机制:进程可能需要与其他进程进行通信,为此进程可能会使用各种 IPC 机制,如消息队列、信号量、共享内存等。

状态:

  • 运行态(running):进程占有 CPU 正在运行。
  • 就绪态(ready):进程具备运行条件,等待系统分配 CPU 以便运行。
  • 阻塞态 / 等待态(wait):进程不具备运行条件,正在等待某个事件的完成。
    在这里插入图片描述

数据结构task_struct

  1. 在Linux中,进程的内部结构由Linux内核通过一个名为task_struct的数据结构来管理。该结构表示为称为任务列表的动态列表,保存有关系统中所有正在运行的进程的信息。task_struct包括对进程的属性和状态进行分类的各种字段,例如调度参数、内存映像、信号、机器寄存器、系统调用状态、文件描述符和内核堆栈。
  2. 当一个新进程创建时,Linux内核会在内核内存空间中为新的task_struct分配内存。这个新创建的task_struct代表进程并包含管理和控制其执行的必要信息。
  3. 需要注意的是,作为 Linux 系统用户,我们并不直接创建或管理进程的内部数据结构。然而,了解task_struct的概念及其在表示Linux 进程中的作用可以深入了解Linux 操作系统中进程管理的底层机制。

Linux 进程的内部结构由几个有助于其功能和行为的组件组成。这些组件包括:

  1. 进程 ID (PID)
  2. 内存空间内存空间分为不同的段。这些段包括代码段(文本)、数据段和堆栈段。代码段包含程序的可执行指令。数据段存储全局变量和静态变量。堆栈段保存函数调用堆栈和局部变量。
  3. 进程状态
  4. 进程优先级:为每个进程分配一个优先级值,该值决定其相对重要性和调度偏好。与低优先级进程相比,高优先级进程会获得更多的 CPU 时间。执行top命令可以查看进程的优先级。
  5. 文件描述符:进程可以通过文件描述符访问文件和资源。文件描述符是表示打开文件或通信端点的整数。它有助于读取或写入文件、网络套接字和其他 I/O 操作。

创建流程

  • Fork:进程创建通常以 fork 系统调用开始。fork 系统调用通过复制现有进程(父进程)来创建新进程。新进程称为子进程。
  • Copy-on-Write:fork后,子进程通过一种称为copy-on-write的机制与父进程共享相同的内存空间。这意味着最初,两个进程共享相同的内存页。如果任一进程修改共享页面,则会为修改进程创建该页面的单独副本。
  • Exec:一旦 fork 完成,子进程就可以使用 exec 系统调用执行不同的程序。exec系统调用用指定程序的代码和数据替换子进程的内存空间。
  • PID分配:内核为每个进程分配一个唯一的进程标识符(PID)。PID用于识别和管理进程。
  • 父子关系:父进程维护对其子进程的引用,允许子进程监视和管理其执行。父级可以使用 wait 系统调用等待子级完成其执行。
  • 进程终止:进程可以自愿终止或由于外部事件而终止。当进程完成执行或遇到错误时,可以使用 exit 系统调用退出。然后内核释放分配的资源并通知父进程。
    在这里插入图片描述

知识点补充

在 Linux 中,进程以称为进程树的分层结构进行组织。进程树表示父进程和子进程之间的关系,形成树状结构。以下是进程树的主要特征:

  • 根进程:进程树以根进程开始,该进程通常是系统引导期间创建的第一个进程,称为init或systemd。
  • 父子关系:除根进程外,每个进程都有一个创建它的父进程。发起创建新进程的进程称为父进程,而新创建的进程称为子进程。
  • 进程组:具有共同祖先(称为会话领导者)的进程形成进程组。进程组对于管理相关进程集并集体控制它们的行为非常有用。
  • 信号:进程可以向进程树中的其他进程发送信号。信号用于进程间通信,允许进程通知、中断或终止其他进程。
  • 终端进程:在终端会话中,进程组领导者称为终端进程。它管理关联终端的输入和输出,允许与用户进行交互式通信。

进程树反映了进程创建的层次结构,提供了Linux系统中组织和管理进程的方式。

线程(Thread):

  • 共享资源: 线程是进程的一部分,它们共享相同的地址空间和系统资源,可以更方便地进行数据共享。
  • 轻量级: 相对于进程,线程是轻量级的执行单元,创建和销毁的开销较小。
  • 相互影响: 线程之间的数据共享相对容易,但也需要注意同步和互斥来避免数据竞争。
  • 稳定性: 一个线程的崩溃可能会影响整个进程,因为它们共享相同的地址空间和资源。
  • 线程是一个轻量级进程,也称为 LWP,通过clone创建轻量级进程(LWP)或内核级线程,以实现用户级别的线程。

组成:

线程的内部结构由三个主要组成部分组成:

  1. 堆栈:堆栈为线程执行分配的内存区域。它保存线程的局部变量、函数调用和返回地址。每个线程都有自己的堆栈,允许独立执行。
  2. 寄存器集:寄存器集包含线程的执行上下文,包括CPU寄存器的值。这些寄存器存储重要信息,例如程序计数器(程序计数器指示了线程当前正在执行的指令的位置)、堆栈指针和其他处理器特定的寄存器。
  3. 线程特定数据:允许每个线程保持其唯一状态。它可以包含特定于线程的变量,例如线程 ID 或特定于线程的存储。

进程与线程的比较:

  • 通信方式: 进程之间通信的开销较大,而线程之间可以更方便地共享数据。
  • 创建销毁开销: 线程的创建和销毁开销较小,而进程的创建和销毁开销相对较大。
  • 并行性: 多个线程可以并行执行,而进程通常需要更复杂的并发控制机制。
  • 资源需求: 进程拥有独立的资源,而线程共享相同的资源。

疑问解答

在Linux中,线程相互共享的有哪些具体的资源?
在Linux中,线程是轻量级的执行单元,它们在同一个进程内运行,并且共享相同的资源。以下是Linux中线程相互共享的主要资源:

  • 地址空间(Address Space):所有线程在同一个进程中共享相同的地址空间。这包括代码段、数据段、堆和栈等。因此,一个线程对地址空间的修改会影响其他线程。
  • 文件描述符(File Descriptors): 所有线程共享相同的文件描述符表。当一个线程打开或关闭文件时,这些更改对其他线程也是可见的。
  • 信号处理器(Signal Handlers): 信号处理器是在进程级别注册的,因此所有线程都共享相同的信号处理器。当进程接收到信号时,所有线程都会受到影响。
  • 进程 ID 和用户 ID: 所有线程共享相同的进程 ID 和用户 ID。这意味着它们属于同一个进程,有相同的权限和标识。
  • 共享库(Shared Libraries): 所有线程共享相同的动态链接库。这些库包括在程序运行时加载的共享对象,被所有线程共享以提高效率。
  • 文件系统相关信息: 所有线程共享相同的当前工作目录、根目录和umask等文件系统相关的信息。

需要注意,尽管线程在这些方面是共享的,但线程拥有独立的线程 ID、寄存器集合、栈空间和局部变量等。

当内存资源空间不足时,应该使用线程还是进程呢?

  • 当内存资源空间不足时,通常来说,使用线程相对于使用进程可能更为合适。这是因为线程共享相同的地址空间,因此相对于创建新的进程,创建新的线程的开销较小。

不是说线程是通过pthread_create创建的吗?怎么LWP是通过clone创建的?

  • POSIX线程库提供了pthread_create等函数,用于在用户空间创建线程。这些线程是用户级别的,而在用户级别线程之上,内核可能会使用轻量级进程(LWP)来实现线程的调度和管理。

线程也称为轻量级进程,也称为LWP,那pthread_create创建进程与LWP有什么关系吗?或者是不是同一个?

  • 是同一个,并且是pthread_create创建的线程,也称为LWP。
  • 在一些系统中,pthread_create函数可以用来创建轻量级进程(LWP)或内核级线程,这些是由clone系统调用实现的。在这种情况下,pthread_create用于在用户级别创建线程,而实际的线程实现是由内核级别的LWP支持的。

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

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

相关文章

Vue3-30-路由-嵌套路由的基本使用

什么是嵌套路由 嵌套路由 &#xff1a;就是一个组件内部还希望展示其他的组件&#xff0c;使用嵌套的方式实现页面组件的渲染。 就像 根组件 通过路由渲染 普通组件一样&#xff0c;嵌套路由也是一样的道理。 嵌套路由的相关关键配置 1、<router-view> 标签 声明 被嵌套组…

在 Spring 中操作 Redis

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿 目录 1、引入依赖 2、对 Redis 的配置文件进行书写 3、S…

kivy PageLayout 的说明及例子

PageLayout 是 Kivy GUI 框架中的一个布局管理器&#xff0c;它允许开发者在同一个窗口中放置多个页面&#xff0c;用户可以通过滑动来浏览这些页面。PageLayout 的工作方式类似于一个可以滑动的标签页&#xff08;TabbedPanel&#xff09;&#xff0c;但其页面可以自由调整大小…

Linux常用命令大全总结及讲解(超详细版)

前言&#xff1a; Linux 是一个基于Linux 内核的开源类Unix 操作系统&#xff0c;Linus Torvalds于 1991 年 9 月 17 日首次发布的操作系统内核。Linux 通常打包为Linux 发行版。 Linux 最初是为基于Intel x86架构的个人计算机开发的&#xff0c;但此后被移植到的平台比任何其…

K8S 中对 Windows 节点的利用

目录 漏洞概述 漏洞详情 ​编辑 漏洞验证 补丁分析 在集群中探索 参考资料 在许多组织中&#xff0c;所运行的很大一部分服务和应用是 Windows 应用。Windows 容器提供了一种封装进程和包依赖项的方式&#xff0c;从而简化了 DevOps 实践&#xff0c;令 Windows 应用程序…

【xdma】 pcie.bar设置

FPGA优质开源项目– PCIE通信 xdma 两者保持一致 FPGA开源项目 – PCIE I/O控制卡 xdma PCIe的XDMA应用 读写部分分为两种&#xff0c;一种是数据的读写&#xff0c;另一种是配置数据的读写&#xff0c;在数据读写部分&#xff0c;DMA通过MIG控制DDR完成数据读写。配置数据…

使用 Tkinter 制作一个进制转换工具,好用!

在平时工作学习当中&#xff0c;我们经常会编写一些简单的 Python GUI 工具&#xff0c;以此来完成各种各样的自动化任务&#xff0c;比如批量处理文件&#xff0c;批量处理图片等等。当我们进行这些工具的编写之时&#xff0c;往往只关注了功能的实现&#xff0c;而忽略了页面…

基于Docker的软件环境部署脚本,持续更新~

使用时CtrlF搜索你想要的环境&#xff0c;如果没有你想要的环境&#xff0c;可以评论留言&#xff0c;会尽力补充。 本文提供的部署脚本默认参数仅适合开发测试&#xff0c;请根据实际情况调节参数。 数据库 MySQL version: 3.9 services:mysql:image: mysql:8.0.35container…

【Unity美术】Unity工程师对3D模型需要达到的了解【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

一元函数微分学——刷题(8

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 先看A&#xff0c;既然存在&#xff0c;那么f(x)和x属于同阶无穷小&#xff0c;所以f(0)0&#xff0c;没问题 再看C&#xff0c;结…

UntiyShader(七)Debug

目录 前言 一、利用假彩色图像 二、利用Visual Studio 三、帧调试器 前言 Debug&#xff08;调试&#xff09;&#xff0c;是程序员检查问题的一种方法&#xff0c;对于一个Shader调试更是一种噩梦&#xff0c;这也是Shader难写的原因之一——如果效果不对&#xff0c;我们…

ubuntu22.04安装anacoda遇到的坑

这几天把用了3年的windows10换成了ubuntu22.04 各种环境都得配置&#xff0c;本文记录下遇到的坑。 1、anacoda在ubuntu上也可以用官方也提供了安装包&#xff0c;但是没有图形界面&#xff0c;需要以命令行的方式安装和运行配置 1.1 安装&#xff1a;官网下载后&#xff0c;…

极速文件搜索工具Everything结合内网穿透实现远程搜索本地文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

ShuffleNet V2:高效CNN架构设计实用指南

摘要 目前&#xff0c;神经网络架构设计主要以计算复杂度的间接指标&#xff08;即 FLOPs&#xff09;为指导。然而&#xff0c;直接指标&#xff08;如速度&#xff09;还取决于其他因素&#xff0c;如内存访问成本和平台特性。因此&#xff0c;这项工作建议在目标平台上评估…

1 - 数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型

数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型 数据库服务概述构建mysql服务安装mysql软件包连接mysql服务器 修改密码 密码管理修改密码策略&#xff08;需要登陆&#xff09;破解数据库管理员root密码&#xff08;数据库服务处于运行状态但是root忘记了密…

win/linux 环境查看动态库包含的函数

我们打包了动态库&#xff0c;还要查看是否包含一些函数&#xff0c;需要导出这些函数 在win 环境下可以使用 .def 格式的文件进行操作 ######################################################### 跳过这一步&#xff0c;回到主题&#xff0c;在两个系统平台如何查看动态库包…

时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测

时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现SSA-CNN-GRU麻雀算法优化卷积门控循环单元时间序…

机器学习---降维与度量学习

1. 度量学习 现有的大部分算法对图像进行特征提取后化为向量的表达形式&#xff0c;其本质是把每一幅用于训练的图像 通过某种映射到欧氏空间的一个点&#xff0c;并利用欧氏空间的良好性质在其中进行学习器的训练。但定义 图像特征之间的欧氏距离未必能很好反映出样本之间的…

Resnet BatchNormalization 迁移学习

时间&#xff1a;2015 网络中的亮点&#xff1a; 超深的网络结构&#xff08;突破1000层&#xff09;提出residual模块使用Batch Normalization加速训练&#xff08;丢弃dropout&#xff09; 层数越深效果越好&#xff1f; 是什么样的原因导致更深的网络导致的训练效果更差呢…

自行车服务PEDALWAYS 网站bootstrap5模板

一、需求分析 自行车服务网站的作用是为骑行爱好者和自行车用户提供便捷的信息、工具和服务&#xff0c;以满足他们的需求。以下是一些常见的自行车服务网站的功能&#xff1a; 自行车租赁&#xff1a;提供自行车租赁服务&#xff0c;用户可以在线预订自行车并选择租赁期限&am…