【Linux】线程的概念以及与进程的区别

目录

背景知识

什么是线程?   

进程和线程的区别 

线程的优缺点


背景知识

        在了解线程前,我们要首先知道,OS是可以做到让进程进行细粒度划分的!

        比如我们所说的进程地址空间中的堆区,它在进程PCB中的mm_structz中有一个start和end来表示整个堆区起始和终止位置,但我们每次malloc在堆上申请一块空间时,会有一个名叫         vm_area struct结构体来表示这块空间,这个结构体里也包含了start和end,但表示的是申请的这块空间的起始和终止位置。然后申请多块空间后,它们之间会使用双链表组织起来。就如下图这样:


        我们要知道,我们平常所运行的exe可执行程序本质上是一个文件,它的内部时遵循如下规则的:

        可执行程序是按照进程地址空间的方式来进行编译的,如上图的右边部分,即编译时,各代码的地址就已经确定。

        可执行程序,内部按照区域被划分成了以4KB大小为单位的块,每个块叫做页帧.

        物理内存内部也被划分成了以4KB为大小的内存块,每个内存块叫做页框,用struct page结构体描述每个内存块的属性。

        在虚拟内存管理中,程序通常使用虚拟内存地址来访问数据,而虚拟地址空间被划分为固定大小的页面(一般是4KB,或称页帧),这些页面在需要时从磁盘上加载到物理内存中,形成连续的物理页框(Page Frame)。当程序在访问某个虚拟内存页面通过页表访问物理内存时,如果该页面当前不在物理内存中,就会触发缺页中断。

       此时操作系统会向物理内存申请一块空间,然后把磁盘中的数据读取到内存中的页框中,然后更新页表,将虚拟内存与物理页框的映射关系进行更新。这样,程序可以继续执行,并且操作系统可以根据需要进行页面置换和内存管理,以保证系统的性能和可用性。

        详细的流程可以下图:


什么是线程?   

        进程:进程是程序的一次运行实例。它是一个独立的、具有独立内存空间的执行环境,包含了程序的代码、数据和执行状态等。每个进程都运行在独立的内存空间中,相互之间不会直接共享内存。              

        线程:线程是进程的一部分,是进程内的一个执行单元。它共享进程的内存空间和资源,包括代码段、数据段和打开的文件等。

        

         Linux下没有真正意义上的线程,因为它是用进程的PCB结构(task_struct)模拟的!

        Linux中CPU视角下的一个PCB可能只是这个进程的一个执行流,而这个 进程可能有多个执行流,即多个线程(多个PCB),所以会更加轻量化。而别的OS是一个进程就享用一份独立的资源,Linux是多个线程共同享用资源。        

        所以,进程和线程统称为轻量级进程.

        虽然说统称为轻量级进程,但是必须得先有一个线程(进程),然后才能有其它的线程,这个线程便称为主线程,这个主线程可以理解为是个进程。

        主线程是进程中的一个特殊线程,通常是在进程创建时由操作系统自动创建的第一个线程。它负责执行程序的入口点,并且负责进行进程的初始化工作。主线程的上下文信息会被记录在该进程对应的 PCB 中。在该进程的 PCB(task_struct)中,除了包含主线程的上下文信息外,还包括了其他线程的上下文信息。

        在我们用户的角度来说,看到的只有进程(主线程),各个进程间包含独立的地址空间,代码数据等。

        但是在内核看来,一个进程内部是具有多个执行流(线程[task_struct])的,它也只认task_struct,所以它是OS运行调度的基本单位,而我们之前写的代码,内部只有一个执行流(task_struct),所以从内核角度上说,这只是进程的一种特殊情况。

        在Linux下,一个进程只有一个执行流  等价于其它OS下的进程

                一个进程有多个执行流  等价于其它OS下的多线程.


综上就是:

        线程是进程的一部分,共享进程资源。但也有自己的一部分数据。

        进程是资源分配的基本单位,线程是OS执行和调度的基本单位。


        这么说起来特别抽象,东西不好解释明白,下面我从网上寻找了一些区别,感觉对于区分线程和进程还是比较助于理解的.

        所以在 Linux 中,进程与线程的区分是基于它们在用户空间的执行环境以及它们共享的资源上。

  1. 执行环境进程是一个独立的执行环境,具有自己的地址空间和其他资源,包括全局变量、文件描述符表等。通过调用系统调用(如fork()exec()),可以创建一个新的进程,该进程使用 task_struct 描述,并有自己的地址空间。

            线程则是在同一个进程内创建的执行流,它与主线程共享相同的地址空间和大部分资源。线程通过调用 clone() 系统调用创建,并共享主线程所拥有的 task_struct 数据结构。每个线程有自己的栈空间和调度信息,但它们共享代码段、全局变量、文件描述符表等。

  2. 资源共享:线程之间共享相同的地址空间和大部分资源,包括全局变量、堆内存、打开的文件等。这也意味着线程之间的通信比进程之间更加高效,因为它们可以直接访问共享内存,无需通过进程间通信机制进行数据的拷贝和传递。


进程和线程的区别 

我总结一下,进程和线程的区别:

  • 进程是资源分配的基本单位,线程是操作系统执行和调度的基本单位.
  • 进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)
  • 线程间有更为方便的通信机制,由于线程间共享数据空间,所以一个线程的数据可以直接为其它线程所用。而进程间是独立的空间,需要各种通信方式来共享。

线程的优缺点

优点:

  • 创建:创建一个新线程的代价要比创建一个新进程小得多,因为不需要创建独立的内存空间。
  • 占用资源:线程占用的资源要比进程少很多.
  • 效率:线程在同一进程内共享相同的资源,包括内存空间、全局变量等。这样可以减少资源的重复分配,提高资源利用率
  • 并发性:线程的并发性使得在多个任务之间能够实现同时进行,从而可以提高应用程序的并发能力和性能。

缺点:

  • 缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响
  • 性能损失:很少被外部事件阻塞的线程往往无法与共它线程共享同一个处理器。即加了额外的同步和调度开销,而可用的资源不变。
  • 编程难度:编写与调试一个多线程程序比单线程程序困难得多

这里只是大概讲解了下线程的概念以及进程和线程的区别,具体的使用,线程控制等等我们下一章再讲解。

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

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

相关文章

62.不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 动态规…

分页查询从接口到实现,统一对日期类型进行格式化处理

编写Service实现类编写Mapper的sql&#xff0c;但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…

【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的方法&#xff0c;它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制&#xff0c;神经网络能够自动地学习并选择性地关注输入中的重要信息&#xff…

JAVA基础之放弃使用Random

随机是日常生活中经常遇到的非常有趣的东西&#xff0c;比如说抛硬币&#xff0c;他的不可预知性总是让我们特别着迷&#xff0c;在拿不定主意时&#xff0c;有些人就喜欢用抛硬币的方式来帮助我们做决定。体育领域也喜欢用喜欢用抛硬币的方式来猜先。随机数功能是Java非常非常…

跳跃游戏 II——力扣45

文章目录 题目描述解法一 贪心题目描述 解法一 贪心 int jump(vector<int>& nums){in

Python-OpenCV中的图像处理-图像平滑

Python-OpenCV中的图像处理-图像平滑 图像平滑平均滤波高斯模糊中值模糊双边滤波 图像平滑 使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分&#xff08;比如&#xff1a;噪音&#xff0c;边界&#xff09;。所以边界也会被模糊…

Annotorious.js 入门教程:图片注释工具

theme: smartblue 本文简介 【今天我必须发一个封面&#xff01;放文末&#xff01;】 最近有工友问我前端怎么给图片做标注。使用 Fabric.js 或者 Konva.js 等库确实可以实现&#xff0c;但多少觉得有点大炮打蚊的感觉&#xff0c;好奇有没有专门做图片标注的工具呢&#xff1…

AI量化模型预测挑战赛 第二次学习笔记

有关竞赛信息以及基础baseline代码解读请看我的上一篇文章 AI量化模型预测——baseline学习笔记_寂ღ᭄秋࿐的博客-CSDN博客 在经过baseline进行详细的分析之后&#xff0c;接下来的方向肯定是奔着提分去的&#xff0c;下面我就从五个方面进行一一列出提分思路 提取更多的特征…

Java多线程(九)

目录 一、synchronized基本特点 二、synchronized加锁工作过程 2.1 无锁 2.2 偏向锁 2.3 轻量级锁 2.4 重量级锁 三、synchronized其他优化操作 3.1 锁消除 3.2 锁粗化 一、synchronized基本特点 开始是乐观锁&#xff0c;如果锁冲突频繁就会转换成悲观锁开始是轻量级锁&#x…

Kubernetes(K8s)从入门到精通系列之十:使用 kubeadm 创建一个高可用 etcd 集群

Kubernetes K8s从入门到精通系列之十&#xff1a;使用 kubeadm 创建一个高可用 etcd 集群 一、etcd高可用拓扑选项1.堆叠&#xff08;Stacked&#xff09;etcd 拓扑2.外部 etcd 拓扑 二、准备工作三、建立集群1.将 kubelet 配置为 etcd 的服务管理器。2.为 kubeadm 创建配置文件…

MySQL事务:ACID特性实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面&#xff0c;是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念&#xff0c;然后介绍事务的ACID特性&#xff0c;并分析其实现原理。 MySQL博大精深&#xff0c;文章疏漏之处在所难免&#xff0c;欢迎批评指…

qt creater运行按钮灰色,问题记录

第一次安装还没运行就出了三个错误&#xff1a; 1.F:\wei\Qt\Tools\CMake_64\share\cmake-3.24\Modules\CMakeTestCXXCompiler.cmake:62: error: The C compiler "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/amd64/cl.exe" is not able to compil…