【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.mzph.cn/news/31210.shtml

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

相关文章

re学习(30)攻防世界-hackme(代码复原2)

思路: 1.输出成功,v26不为0,说明关系式:v21((unsigned __int8)v24 ^ v20) →2.在汇编代码第37行,输入v16v20,所以求的值为v20 →3.根据关系式,求的值v20v21^v24 →4.v21在第汇编代码第36行也可以提取出来…

【时间格式引发的事故】

时间格式引发的事故 背景实战演示结论 背景 前不久写了一个删除数据接口,条件是根据时间删除时间后面的数据。入参是 时间字符串。后台的时间格式 是 yyyyMMdd。然后当时前端传参数的时候,随意的传了2023-07-31的时间,然后将该表的数据全部删…

servlet三大类HttpSevlet,HttpServletRequest,HttpServletResponse介绍

一、HttpServlet HttpServlet类是一个被继承的方法,可以看做一个专门用来响应http请求的类,这个类的所有方法都是为响应http请求服务的,要对一个某个路径谁知http响应时,需要写一个类来继承HttpServlet类,并重写里面的…

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度(multiresolution)和多尺度(multiscale) 多粒度(multiresolution)和多尺度(multiscale)都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…

ABPVNEXT-微服务框架基础入门

准备工作: 1.登录ABPvNext官网 网址 http://abp.io 2.跳转到商业版的说明文档,目前商业版没有中文,只能使用谷歌浏览器的内置翻译功能了 3.框架的相关环境要求,请自自行查看 适用于 Windows 的Visual Studio 2022 (v17.3) /…

战术的勤奋,弥补不了战略的重大缺陷

战术的勤奋,弥补不了战略的大缺陷 战略的懒惰,遍地都是 王兴说过:人为了逃避思考可以干任何事 趣讲大白话:局部优秀,改变不了整体 【趣讲信息科技252期】 **************************** 中小企业顶顶层设计薄弱 这也是…

最后一次模拟考试题解

哦我想这不用看都知道是为了水任务 T1 黑白染色 其实这题有原 什么手写体 md (指 markdown) 分析 首先这题如果你题目没看错的话 ,会发现其实他是 n m n \times m nm 让你求 n n n \times n nn 的区域内的点(不会只有我一个人题目看错了罢 然后我们会发现…

使用 prometheus client SDK 暴露指标

目录 1. 使用 prometheus client SDK 暴露指标1.1. How Go exposition works1.2. Adding your own metrics1.3. Other Go client features 2. Golang Application monitoring using Prometheus2.1. Metrics and Labels2.2. Metrics Types2.2.1. Counters:2.2.2. Gauges:2.2.3. …

MySQL中的索引

1.2.MySQL中的索引 InnoDB存储引擎支持以下几种常见的索引:B树索引、全文索引、哈希索引,其中比较关键的是B树索引 1.2.1.B树索引 InnoDB中的索引自然也是按照B树来组织的,前面我们说过B树的叶子节点用来放数据的,但是放什么数…

【JavaScript】一文详解事件循环机制

目录 一、是什么 二、同步任务和异步任务 三、宏任务和微任务 小结:微任务是跟屁虫,一直跟着当前宏任务后面代码执行到一个微任务就跟上,一个接着一个。 例子理解: 五、题目巩固 六、总结 一、是什么 首先JavaScript是一种…

使用自己的数据集预加载 Elasticsearch

作者:David Pilato 我最近在讨论论坛上收到一个问题,关于如何修改官方 Docker 镜像以提供一个现成的 Elasticsearch 集群,其中已经包含一些数据。 说实话,我不喜欢这个想法,因为你必须通过提 entrypoint.sh 的分叉版本…

UEFI: 模块和包概述

UEFI规范中有两个最重要的概念:模块(Module)和包(Package)。 模块 Module UEFI上最小的可单独编译的代码单元,或者是预编译的二进制文件比如efi执行文件。 包 Package 由模块、平台描述文件(DSC)和包声明…

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群

JenkinsDockerSpringCloud微服务持续集成项目优化和微服务集群 JenkinsDockerSpringCloud部署方案优化JenkinsDockerSpringCloud集群部署流程说明修改所有微服务配置 设计Jenkins集群项目的构建参数编写多选项遍历脚本多项目提交进行代码审查多个项目打包及构建上传镜像把Eurek…

数据库线程池可用线程分析

1.事情的起源 项目在跑的过程中,突然间报没有可用的连接数。这个时候,服务进程还在,但是只要涉及到数据库的操作都会报错。 2.排查的思路 事件发生后,我们重启服务,监控的Connections数是258个,某台机器…

Latex安装与环境配置(TeXlive、TeXstudio与VS code的安装)编译器+编辑器与学习应用

TeXlive 配置Tex排版系统需要安装编译器+编辑器。TeX 的源代码是后缀为 .tex 的纯文本文件。使用任意纯文本编辑器,都可以修改 .tex 文件:包括 Windows 自带的记事本程序,也包括专为 TeX 设计的编辑器(TeXworks, TeXmaker, TeXstudio, WinEdt 等),还包括一些通用的文本编…

行业追踪,2023-08-10

自动复盘 2023-08-10 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

【图像恢复】基于交替乘子方法(ADMM)图像恢复算法研究[固定点收敛和应用](Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

《Python入门到精通》函数详解

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 函数 1、函数的调用2、函数的参数2.1、变量的就近原则2.2、传递参数2.3、形参和实…

易服客工作室:7个优质WordPress LMS线上教育系统插件比较(优点和缺点)

您是否正在为您的 WordPress 网站寻找最好的 LMS 插件?在线学习管理系统 (LMS) 插件允许您使用 WordPress 创建和运行类似 Udemy 的在线课程。 一个完美的 WordPress LMS 插件包括管理在线课程内容、处理订阅、运行和评分测验、接受付款等功能。 在本文中&#xf…

yolov5代码解读之yolo.py【网络结构】

​这个文件阿对于做模型修改、模型创新有很好大好处。 首先加载一些python库和模块: 如果要执行这段代码,直接在终端输入python yolo.py. yolov5的模型定义和网络搭建都用到了model这个类(也就是以下图片展示的东西):(以前代码没…