【Linux】线程概念

📝前言:

这篇文章我们来讲讲Linux------线程概念:

  1. 线程的基本概念
  2. 线程的优缺点
  3. 线程与进程

🎬个人简介:努力学习ing

📋个人专栏:Linux

🎀CSDN主页 愚润求学

🌄其他专栏:C++学习笔记C语言入门基础python入门基础C++刷题专栏


这里写目录标题

  • 📝前言:
  • 一,线程的基本概念
    • [1. 基本概念](#1. 基本概念)
    • [2. 资源划分](#2. 资源划分)
    • [3. 线程资源划分与共享](#3. 线程资源划分与共享)
  • 二,线程的优缺点
    • [1. 优点](#1. 优点)
    • [2. 缺点](#2. 缺点)
    • [3. 线程的异常](#3. 线程的异常)
    • [4. 线程的用途](#4. 线程的用途)
  • 三,线程与进程
    • [1. 进程和线程](#1. 进程和线程)
    • [2. 进程的多个线程共享](#2. 进程的多个线程共享)

一,线程的基本概念

1. 基本概念

  • 进程:进程 == 内核数据结构 + 代码和数据
    • 进程是承担分配系统资源的基本实体
  • 线程:进程内部的一个执行分支
    • 在Linux下,线程就是轻量级的进程(但Windows不是,Windows有自己的实现方案)
    • 线程是CPU调度的基本单位(因为Linux下,线程是用进程模拟的,所以CPU的调度策略都可以用进程那一套!)
    • 线程这个说法是操作系统提供的(属于用户视角,但是对于Linux底层,线程就是轻量级进程)

2. 资源划分

  • 创建一个进程:我们要创建task_struct进程地址空间页表...
  • 但是对于一个线程,我们只需要创建task_struct + 资源划分
    • 对资源的划分,本质是对进程地址空间的划分(虚拟地址,就是资源的代表)
    • 一个执行流有多少资源,本质上就是:在合法的的情况下,拥有的虚拟地址
    • 而函数天然就是代码和数据的集合,所以我们通常让线程执行进程中不同的函数(把函数分给线程,就完成了资源的划分)
  • 多个线程的task_struct指向同一个进程的进程地址空间
  • 进程强调独占,部分资源共享(比如通信的时候)
  • 线程强调共享(因为线程都在同一个进程内),部分资源独占
  • 资源的划分和共享本质是对虚拟地址的划分和共享

3. 线程资源划分与共享

  • 线程进行资源划分:本质是划分地址空间,获得一定范围的合法虚拟地址。再本质:就是在划分页表
  • 线程进行资源共享:本质是对地址空间的共享,再本质:就是对页表条目的共享

二,线程的优缺点

以下优缺点是相较于进程的。

1. 优点

  • 创建⼀个新线程的代价要比创建⼀个新进程小得多
  • 切换方面 ,线程切换的代价也要更小
    • 切进程:要切硬件上下文,要切CR3的页目录...
    • 切线程:地址空间还是一样的,只用切task_struct,CR3也不用切...
    • 还有:进程缓存机制CacheTLB
    • 当硬件上下文切换的时候会扰乱进程的缓存机制,对于进程,因为直接换了,所以CacheTLB的内容都无效了。但是对于线程,还在同一个进程内,CacheTLB的失效面积小。
  • 线程占用的资源要比进程少很
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运⾏,将计算分解到多个线程中实现
  • I/O密集型应⽤,为了提⾼性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

2. 缺点

但是代码写的好,处理的好,都没有下面的问题

  • 性能损失
    • 当线程用于计算密集型,则线程数量不要大于CPU的数量。因为,计算密集型的线程往往没办法和其他线程共用CPU。如果太多线程,增加了额外的同步和调度开销(比如切线程上)
  • 健壮性降低
    • 不小心给一个线程共享了不属于它的东西,然后还被修改了,就会有问题
    • 线程如果有错(异常),会直接影响整个进程
  • 缺乏访问控制
    • 进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响
  • 代码编写更难

3. 线程的异常

  • 单个线程崩溃,导致整个进程崩溃,其他线程也退出

4. 线程的用途

  • 提高CPU密集型程序的执行效率
  • 提高IO密集型程序的用户体验

三,线程与进程

1. 进程和线程

  • 进程是资源分配的基本单位
  • 线程是调度的基本单位
  • 线程共享进程数据,但也拥有⾃⼰的⼀部分数据:
  • 线程ID
  • ⼀组寄存器,存放线程上下文数据
  • 独立的栈结构
  • errno
  • 信号屏蔽字
  • 调度优先级

2. 进程的多个线程共享

同⼀地址空间,因此Text Segment、Data Segment都是共享的,如果定义⼀个函数,在各线程中都可以调用,如果定义⼀个全局变量,在各线程中都可以访问到。

除此之外,各线程还共享以下进程资源和环境:

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

线程和进程的关系:


🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关推荐
pianmian11 小时前
3D Tiles高级样式设置与条件渲染(3)
linux·服务器·前端
maxruan1 小时前
docker环境添加安装包持久性更新
运维·docker·容器
清晨朝暮1 小时前
【Linux 学习计划】-- 命令行参数 | 环境变量
linux·运维·学习
聂 可 以1 小时前
Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)
linux·运维·nginx
Clownseven2 小时前
用Git管理你的服务器配置文件与自动化脚本:版本控制、变更追溯、团队协作与安全回滚的运维之道
运维·服务器·git
Joker 0072 小时前
Ubuntu 安装 FSL 及多模态脑MRI的去颅骨处理(含 HD-BET 深度学习方法)
linux·深度学习·ubuntu
Roki Zhang2 小时前
RustDesk 搭建自建服务器并设置服务自启动
运维·服务器
代码讲故事3 小时前
解决 xmlsec.InternalError: (-1, ‘lxml & xmlsec libxml2 library version mismatch‘)
linux·python·pip·lxml·xmlsec·libxml2
xiaofann_3 小时前
【数据结构】单链表练习
linux·前端·数据结构
神秘的土鸡3 小时前
Nginx网站服务:从入门到LNMP架构实战
运维·nginx·架构