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

news2024/10/5 16:31:28

目录

背景知识

什么是线程?   

进程和线程的区别 

线程的优缺点


背景知识

        在了解线程前,我们要首先知道,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.coloradmin.cn/o/860224.html

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

相关文章

动态规划解0-1背包问题(超详细理解)

前言: 好久没写0-1背包问题了,都有些不记得了,写这篇文章给自己以后做简单参考,如果能同时帮到读者,不胜荣幸。 正文 0-1背包问题是这样的一个问题,假设有一个背包,其容量为 capacity 。在地…

【Spring Boot 源码学习】自动装配流程源码解析(上)

自动装配流程源码解析(上) 引言往期内容主要内容1. 自动配置开关2. 加载自动配置组件3. 自动配置组件去重 总结 引言 上篇博文,笔者带大家从整体上了解了AutoConfigurationImportSelector 自动装配逻辑的核心功能及流程,由于篇幅…

算法竞赛入门【码蹄集新手村600题】(MT1140-1160)C语言

算法竞赛入门【码蹄集新手村600题】(MT1140-1160)C语言 目录MT1141 数字3MT1142 整除的总数MT1143 沙哈德数MT1144 整除MT1145 全部整除MT1146 孙子歌诀MT1147 古人的剩余定理MT1148 隐晦余8MT1149 余数MT1150 战死四五百MT1151 韩信生气MT1152 韩信又生气了MT1153 …

Python 如何获取图片中的文字----OCR安装使用

环境: windows10, anaconda3 背景:使用conda install pytesseract 安装失败 解决方法: 从Index of /tesseract (uni-mannheim.de)中下载最新的安装包 https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-5.3.1.20230401.exe 点击…

vscode搭建c语言环境问题

c语言环境搭建参考文章:【C语言初级阶段学习1】使用vscode运行C语言,vscode配置环境超详细过程(包括安装vscode和MinGW-W64安装及后续配置使用的详细过程,vscode用户代码片段的使用)[考研专用]_QAQshift的博客-CSDN博客 问题如下:…

利用MS-SAMR协议修改用户密码

本文为Windows RPC利用系列文章的第一篇,主要介绍关于MS-SAMR的部分利用,在后续的文章中将继续介绍RPC在渗透测试中的应用 在渗透测试过程中,经常遇到拿到用户的NTLM哈希但无法解密出明文密码的情况。本文介绍并分析一种在仅知道域用户密码哈…

作为非计算机专业的学生觉得 C 语言远比其他语言更易上手正常吗

作为非计算机专业的学生,觉得 C 语言相对其他编程语言更易于上手是很正常的。C 语言的简洁语法和贴近底层的特性使其更容易理解和掌握。相比其他语言,C 语言不涉及复杂的高级特性和抽象概念,更直接地与计算机硬件交互,这种直观性对…

学习Linux,要把握哪些重点?

不知道有没有想学习Linux,但又把握不住学习重点,找不到合适的学习方法的小伙伴,反正我刚开始学习Linux时就像无头苍蝇似的“乱撞”,没有把握住学习重点,不知道怎么去学,差点要放弃了,还好在慢慢…

KEIL自带的Jlink怎么升级更换版本

问题背景 V4.20以上的keil安装包中都自带Jlink驱动包,即当你安装了KEIL后,Debug或Download就是用的安装KEIL时附带安装的Jlink版本。 那如果存在这种情况,你正在开发的芯片比较新,只有比较新的Jlink驱动软件才能支持&#xff0c…

有答案:10个网络工程师面试常见问题

目录 1、交换机转发数据包的原理? 2. 数据包如果经过二层交换机转发后,那这个数据包的源MAC会变化吗?如果经过三层交换机理由转发,那源MAC会变成什么呢? 3. 如何查看PC的ARP表,如何清除ARP表&#xff0c…

什么是训练数据?

算法从数据中学习。算法从得到的训练数据中找到关系,形成理解,做出决策,并评估信心。训练数据越好,模型的表现就越好。 实际上,与算法本身一样,训练数据的质量和数量与数据项目的成功有很大关系。 现在&…

WordPress数据库一次性批量删除所有文章和删除指定分类文章技巧

在自己建网站时,有时需要将一个网站搬家到另一个空间里,只想保留网站的模板样式,而不需要里面的文章内容。这时我们可以在后台将已发布的文章删除掉。但如果文章很多时,我们就需要使用下面数据库操作进行一次性删除所有文章的方法。 wordpress批量删除文章步骤 进入网站空…

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型,包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例,以…

基于Python爬虫+词云图+情感分析对某东上完美日记的用户评论分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

线程池的创建和使用

目录 创建线程池 多线程用线程池的两种方式(一般用第二种) 注意:项目当中线程池尽量不要使用的时候再创建(不要再业务逻辑中创建),这样每次调用这个方法都会创建一个线程池,应该在项目启动的时候就创建好 创建线程池…

你不了解的Dictionary和ConcurrentDictionary

最近在做项目时,多线程中使用Dictionary的全局变量时,发现数据并没有存入到Dictionary中,但是程序也没有报错,经过自己的一番排查,发现Dictionary为非线程安全类型,因此我感觉数据没有写进去的原因是多线程…

在linux系统上部署Nginx

一、准备环境 1、关闭防火墙 systemctl disable firewalld.service 2、 安装Nginx相关依赖 yum install -y gcc-c zlib zlib-developenssl openssl-devel pcre pcre-devel 二、源码安装 1、上传压缩包并解压到目标文件 cd /usr/local tar -zxvf nginx-1.22.0.tar.gz 2、…

“深入解析Maven:安装、创建项目和依赖管理的完全指南“

目录 引言Maven的安装创建Maven项目之前的装备工作Eclipse创建新的Maven项目项目依赖管理 总结 引言 Maven是一个流行的项目管理工具,被广泛用于Java项目的构建、依赖管理和部署。它提供了一种简单而强大的方式来管理项目的各个方面,使开发人员能够更专…

Node 使用 MySQL

1、安装驱动 使用 npm 进行安装 mysql $ npm install mysql 2、连接数据库 在以下实例中根据你的实际配置修改数据库用户名、及密码及数据库名: test.js 文件 var mysql require(mysql); var connection mysql.createConnection({host : localhost…

这10个在线AI绘图工具太好用了,设计师们快来get!

无论你是一名专业的插画师,还是一个富有创造力、想随时随地记录生活灵感的人,现在只需要拿起平板或打开电脑浏览器,就能将头脑中的画面描绘出来。本篇文章,我们挑选了10款功能强大又方便好用的在线画图软件,其中一定有…