【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函数会对整个进程造成影响
  • 性能损失:很少被外部事件阻塞的线程往往无法与共它线程共享同一个处理器。即加了额外的同步和调度开销,而可用的资源不变。
  • 编程难度:编写与调试一个多线程程序比单线程程序困难得多

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习关键要素:数据集汇总与分享

引言 在深度学习的应用中,数据被认为是最重要的因素之一。因此,选择一个好的数据集对于深度学习的成功至关重要。在选择数据集时,不仅需要关注数据量的大小、多样性以及质量,还要考虑数据集是否代表了所研究问题的真实情况。本文…

SpringBoot对接OpenAI

SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深…

IDEA 设置字体大小无效

设置字体大小,一般都是从file>settings>editor>font>Size里设置,一般都有效。 但是,如果是更换了主体,则需要从主体颜色菜单那里这是,你看这个页面,上面黄色三角也提示你了,要去颜色…

5.内置构造函数

在JavaScript中最主要的数据类型有6种: 1.基本数据类型: 字符串、数值、布尔、undefined、 null 2.引用类型:对象 但是,我们会发现有些特殊情况: //普通字符串 const str andy console.1og(str.length) // 4其实字符串、数值、布尔、等基本类型也都有…

易服客工作室:WordPress 6.3 Lionel发布

WordPress 6.3 Lionel已经发布,它以美国著名爵士乐艺术家莱昂内尔汉普顿 (Lionel Hampton)的名字命名。汉普顿是一位多产的爵士颤音琴演奏家、钢琴家和打击乐演奏家,因与查尔斯明格斯、昆西琼斯等伟大人物合作以及作为同名莱昂内尔汉普顿管弦乐团的乐队领…

【ARM Cache 系列文章 9 -- ARM big.LITTLE技术】

文章目录 big.LITTLE 技术背景big.LITTLE 技术详解big.LITTLE 硬件要求 big.LITTLE 软件模型CPU MigrationGlobal Task SchedulingGlobal Task Scheduling比CPU Migration的优势 转自:https://zhuanlan.zhihu.com/p/630981648 如有侵权,请联系删除 big.L…

C++ 字符串类 string

文章目录 前言一、string 类型概括二、字符串流总结 前言 在C中,字符串是一种常见的数据类型,用于存储和操作文本数据。C标准库中提供了std::string类,它是一个功能强大的字符串类,提供了丰富的方法和操作符,使我们能…

香港大学余涛组推出开源XLANG Agent!支持三种Agent模式

作者 |小戏、ZenMoore 一个新的未来又逐渐开始从理论走向现实走到我们身边了。 语言的意义在于使用,而从 ChatGPT 以来这些大规模语言模型的意义,也必然绝不止于 Chat,在四个月前,我们介绍了清华大学关于工具学习的综述《清华发布…

2021年06月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分别为保留2位小数输出的F,以及整数N,以…

【数学建模】--主成分分析

本讲将介绍主成分分析(Principal Component Analysis,PCA),主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能…

【Linux的开胃小菜】常用的RPM软件包与YUM仓库包管理器使用

一、系统初始化进程 systemd与System V init的区别以及作用: System V init运行级别systemd目标名称systemd目标作用0poweroff.target关机1rescue.target单用户模式2multi-user.target多用户的文本界面3multi-user.target多用户的文本界面4multi-user.target多用户…

FiboSearch Pro – Ajax Search for WooCommerce 商城AJAX实时搜索插件

FiboSearch Pro是最受欢迎的WooCommerce 产品搜索插件。它为您的用户提供精心设计的高级 AJAX 搜索栏,并提供实时搜索建议。默认情况下,WooCommerce 提供非常简单的搜索解决方案,没有实时产品搜索,甚至没有 SKU 搜索。FiboSearch&…

DAY21

题目一 给定三个字符串str1、str2和aim, 如果aim包含且仅包含来自str1和str2的所有字符,而且在aim中属于str1的字符 之间保持原来在str1中的顺序,属于str2的字符之间保持原来在str2中的顺序,那么称aim是str1和str2的交错组成。实…

三个月从零入门深度学习,保姆级学习路线图!

小伙伴们大家好,这里是长沙图灵教育,我们从2001年开始进入教育行业,立足泛IT类职业教育,以打造新兴高新技术人才为宗旨,致力于成为优质的职业教育内容提供商;于2017年正式成立图灵, 在线教育有限公司。 到…

测试开发探索:“WeTalk“网页聊天室的测试流程与自动化

目录 引言: 测试开发目标: "WeTalk"项目背景 关于登录测试用例的设计 测试开发策略与流程 集成测试:Selenium JUnit 接口测试:Postman 测试用例的设计与实现 自动化测试演示: 用例一:登…

多线程进阶

多线程进阶 本章博客主要是围绕一些多线程相关的面试题,讨论的内容都是往年同学遇到的原题,以后面试也大概率会遇到的!!! 常见的锁策略 锁策略指的不是某个具体的锁,是一个抽象的概念,描述的…

使用cloud-int部署nginx

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口,高级中使用自定义数据,初始化虚拟机,安装nginx 连接CLI,验证是否安装成功 访问虚拟机IP查看是否部署成功 参考文档: https://learn.microsoft.com/zh-cn…

11款UML/SysML建模工具更新(2023.7)Papyrus、UModel……

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有: 工具最新版本:drawio-desktop 21.6.5 更新时间:2023年7月22日 工具简介 开源绘图工具,用Electron编写,…

Skeleton-Aware Networks for Deep Motion Retargeting

Skeleton-Aware Networks for Deep Motion Retargeting解析 摘要1. 简介2. Related Work2.1 运动重定向(Motion Retargeting)2.2 Neural Motion Processing 3. 概述(Overview)4. 骨骼感知深度运动处理4.1 运动表征4.2 骨架卷积4.3…

23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

springboot日志使用入门 ★ 典型的Spring Boot日志依赖: spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包)-- logback(core、classic)-- log4j-to-slf4j.jar-- jul-to-slf4j.jar就是springboo…