【Linux】线程的概念理解,从感知理解到全面深入

1.初始线程概念

在伟大的”计算机哲学“操作系统这本书中,一般给出线程的概念为:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细腻和轻量化。大家对这一概念一看而过既可以,不必特别纠结!下面我将带大家深入理解线程的概念!

2.Linux线程是什么?

2.1由Windows线程到Linux线程

我们一般学过Windows开发的都知道,在Windows中存在单独的线程TCB。但是,Linux中没有专门为线程设计TCB,而是用进程的PCB来模拟线程。

Linux之所以采用这样的设计:不用维护复杂的进程和线程的关系,不用单独为线程设计任何算法,直接使用线程的一套相关方法。OS只需要聚焦在线程间的资源分配上就可以了!

2.2如今的进程VS之前的进程

话不多说,先来上一张图片,加入大家对Linux系统中轻量级进程的理解,如下所示:
在这里插入图片描述
之前的进程,内部只有一个执行流的进程。今天的进程,内部可以具有多个执行流。
创建进程的”成本“非常高,要使用的资源非常多(由1到1)成本:时间+空间。现在有了轻量级进程后,从内核视角来看:进程是承担分配系统资源的基本实体。线程是CPU调度的基本单位,承担进程资源的一部分的基本实体。进程划分资源给线程!

3.Linux线程与接口关系的认识

Linux PCB 小于等于传统意义上的进程PCB。Linux进程即为轻量级进程。在Linux中线程由OS创建,CPU调度

Linux因为是用进程模拟的,所以Linux下不会给我们提供直接操作线程的接口,而是给我们提供,在同一个地址空间内部创建PCB的方法,分配资源给指定PCB的接口。Linux本身不会提供线程操作的接口,这对用户来说操作不是特别友好,所以系统级别的工程师,开发了一套可以让用户直接使用的接口,原生线程库(用户层)

4.再谈线程概念

线程在进程的地址空间内运行!CPU调度的时候只看PCB,每一个PCB曾经被指派过指向方法和数据,CPU可以直接的调度,线程属于进程的一部分。从以下几点理解之句话:

  • 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是”一个进程内部的控制序列。“
  • 一切进程至少都有一个执行线程。
  • 线程在进程内部运行,本质是在进程地址空间内运行。
  • 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。
  • 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

5.线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

6.线程的缺点

  • 性能损失: 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低: 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控制: 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高: 编写与调试一个多线程程序比单线程程序困难得多

7.线程的异常

  • 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
  • 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

8.线程和进程之间的联系

8.1

  • 进程是资源分配的基本单位
  • 线程是调度的基本单位
  • 线程共享进程数据,但也拥有自己的一部分数据:
    1)线程ID
    2)一组寄存器
    3)栈
    4)errno
    5)信号屏蔽字
    6)调度优先级

8.2

进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
1)文件描述符表
2)每种信号的处理方式(SIG_IGN,SIG_DFL或者自定义的信号处理函数)
3)当前工作目录
4)用户id和组id

8.3

在这里插入图片描述

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

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

相关文章

Vuex快速上手

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如:购…

C语言--每日练习题--Day38

第一题 1. 下列代码的运行结果() short i 65537; int j i 1; printf("i%d,j%d\n", i, j); A:i 65537,j 65538 B:i 1,j 2 C:i -1,j 0 D:i 1&#xff…

使用JSON-Server快速搭建RESTful API接口

​​​​​​​ 概要 随着前端技术的快速发展,前后端分离已经成为了一种趋势。在前后端分离的架构中,前端需要与后端进行数据的交互,这就需要后端提供RESTful API接口。而在开发过程中,我们常常需要模拟后端数据接口&#xf…

交友系统:打造独具魅力的社交平台!APP小程序H5三端源码交付,支持二开!

随着社交媒体的兴起,交友系统成为了现代社会不可或缺的一部分。人们希望通过网络结识新朋友,拓展社交圈,寻找志同道合的伙伴,甚至找到自己的爱情。本文将为您介绍交友系统的定义、功能以及如何打造一个独具魅力的社交平台。 一个成…

SQL中的三值逻辑:TRUE、FALSE 和 UNKNOWN。

在SQL中,通常采用三值逻辑处理条件表达式的真值。这种逻辑是基于三种可能的真值状态:TRUE、FALSE 和 UNKNOWN。 TRUE(真): 表示条件为真或成立。 FALSE(假): 表示条件为假或不成立。…

全局代理IP的工作原理和实现方法

目录 前言 一、全局代理IP的工作原理 1.代理服务器 2.代理协议 二、全局代理IP的实现方法 1.构建代理服务器 2.实现数据转发 3.使用代理服务器 4.启动代理服务器 三、全局代理IP的代码实现 四、总结 前言 在网络中,代理服务器是一种获取网络资源的方式。…

万界星空科技电子装配行业MES解决方案

电子电器装配属于劳动密集型、科技含量较高的行业,产品零部件种类繁多,生产组装困难,生产过程存在盲点,同时也决定了生产流水线多且对自动化水平要求较高。 万界星空科技提供的电子行业MES解决方案,提供从仓储管理、生…

源码级详解Spring的三级缓存,循环依赖的处理流程

一.什么是三级缓存 1.一级缓存:存放已经初始化完成的Bean 2.二级缓存:存放半成品Bean,既实例化完成未初始化的Bean。 3.三级缓存:存放bean工厂 二.为什么是三级缓存 一级缓存是必须的,这个我们没有什么疑问。那为…

Flutter的BuildContext简介

文章目录 BuildContext 简介BuildContext的主要作用 BuildContext 简介 BuildContext是Flutter中的一个重要概念,表示当前Widget在树中的位置上下文。它是一个对Widget树的一个位置的引用,用于查找、访问和操作该位置上的相关信息。每个Widget都有一个关…

MSSQL存储过程的功能和用法:解密数据库编程的神秘面纱

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

充分发挥SQL能力之数列

SQL数列 1、数列概述2、SQL数列2.1、简单递增序列2.2、等差数列2.3、等比数列3、SQL数列的应用3.1、连续问题3.2、多维分析1、数列概述 数列是最常见的数据形式之一,实际数据开发场景中遇到的基本都是有限数列。常见的数列例如:简单递增序列、等差数列、等比数列等 如何充分…

图形化编程:开启儿童创新思维的新篇章

随着科技的飞速发展,少儿编程已经成为了当今社会的一项重要技能。越来越多的家长和教育者开始关注如何让孩子从小接触编程,培养他们的创新思维和解决问题的能力。6547网认为图形化编程作为一种简单易学、趣味性强的编程方式,正逐渐成为儿童编…