Linux学习之路 -- 线程概念

news2024/9/20 22:31:32

本文主要介绍线程的相关概念与基础控制

什么是线程&&线程的相关知识

按照书本上的定义,线程就是进程内部的一个执行分支,而线程是cpu调度的基本单位。

如果直接按照书本上的定义理解,线程这个概念是比较模糊的,而且我们也没法看出其与进程的具体区别。下面以Linux操作系统为例,解释一下线程。

一般在单进程的程序中,我们一般是让正文区的代码依次串行运行,也就是从上到下依次运行(我们的代码是由一个一个函数组成的,我们运行函数的过程是从上至下的)。但是,这种方式的运行效率会比较低,所以我们就想让操作正文段的代码拆结多个部分,并行运行。就比如,我们需要在代码中执行四个函数,如果这四个函数没有必然的先后调用关系,我们就可以考虑把这四个函数分成两份,并发执行这两份代码,这样可以提高我们运行效率。前面我们使用多进程来实现类似的功能(实际上还是有点区别,这里暂时先这样认为)。不过多进程实现该功能还是有点缺陷的,因为使用多进程就需要创建task_struct、进程地址空间、页表等等一系列相关的数据结构。所以就有了线程的存在。

实际我们需要的就是多条执行流去执行一段代码,为了节约时间和空间成本,我们就可以创建多个task_struct,然后让这些task_struct指向同一份地址空间。同时,我们需要将地址空间中的正文区分成若干份,让每个task_struct 指向的正文区代码都是原来代码的一部分。而这种方式创建的进程就称为线程。

什么我们要这样设计linux的线程呢? 
        在OS存在很多的进程,进程中可能包含很多的执行流,也就是进程。那么OS要不要对这些线程进行管理呢?当然需要,为了方便对线程的管理,我们就需要用结构体对各个线程进行描述管理。我们一般称该结构体位struct TCB。线程作为进程的一个执行分支,肯定比进程多得多。如果对线程再单独设计调度算法和相关的数据结构,就会造成系统变得更加复杂,这无疑增加了系统的维护成本。为了避免上述缺点,linux的设计者采用了上面提到的线程创建方式,即复用进程的创建代码。这种方案可行,也是因为线程在很多方面其实和进程是非常相似的。当然,也有别的操作系统为线程创建了一套单独的运行体系,比如windows.

通过下面两个图,我们可以重新认识一下进程。以前我们说的进程都是只有一个线程的进程,而我们今天所说的进程,包含多个线程,也就是多个执行流。从内核的角度来看,进程就是承担分配系统资源的实体。

相关的调度问题
        在linux操作系统中,由于我们使用的是创建新的task_struct,共享地址空间的方式来建立线程。所以对于cpu而言,进程和线程并没有区别,cpu只需要根据task_struct对相应进程或线程进行调度即可。所以在linux中,是没有线程的概念的,我们统一称为轻量级进程。

如何对多执行流的代码进行划分?
        前面我们提到,线程作为进程的执行流,只会占有一部分的正文区代码。下面介绍一下执行流代码的划分,在此之前,我们需要简单了解一些地址空间的相关知识。

首先我们需要了解一个概念,那就是页帧或页框(这里两者之间的概念还是有点不同的,不过这里就不做区分了)。

一般情况下,物理内存都是以4kb为单位进行划分的,有些操作系统可以自行设定。为了管理这些数据和空间,我们就需要对其进行描述组织。我们这里用struct Page结构体对其进行描述,其中就包含了这个页帧的属性。比如使用状态,最后修改时间等等。不过这里我们重点关注的是使用状态,这里一般OS都会使用宏(整数)来标定其使用的状态。在4GB的内存中,我们可以将物理内存分成1048576份(1024*1024*1024 / 1024 /4) 。然后创建一个1048576大小的数组num,类型为 struct Page。这样我们对内存的管理就变成了对num数组的增删查改。struct Page的大小不会太大,num这个数组不会占据内存太多空间。

下面介绍一下页表
        页表的映射方式其实并不是像我们画的键值映射,如果我们采用键值来存储映射关系,每条指令都需要至少十几个字节进行存储,那么所需的内存将会是一个非常大的数字,这根本就不现实。其实页表分为页目录和页表。

以上图为例,我们将32位机器下的虚拟地址的存储字节分为三段。第一段10字节,页目录,这个页目录用于查询该指令所在页表,大小为1024;第二段10字节,用于查询该指令对应的物理内存在该张页表中的存储位置,大小为1024;第三段12字节,第二段中查询的物理内存地址为页帧的首地址,我们只是访问其中一段数据,那我们就需要通过加偏移量的方式来进行访问。而偏移量的大小正好等于4kb的大小,这也完美地覆盖了页帧内的所有地址,确保用户能访问所有的数据。

回到开始的问题,我们想让不同线程看到不同的代码段,本质上就是让不同的线程看到各自的页表即可。

以上就是所有内容,如果不对之处,还望各位大佬指正,谢谢!!!

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

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

相关文章

013.Python爬虫系列_re正则解析

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

BAPI作为SAP中的重要概念,在SAP系统的开发中几乎是必须的。 本章来学习一下BAPI 的直观印象,以及在ABAP代码中的调用。 目录 1, BAPI概述 1,从画面角度来直观体验一下BAPI 1-1,MM:購買依頼変更BAPI - …

日志服务管理

系统日志管理 sysklogd 系统日志服务 在 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。 sysklogd 服务有两个模块: klogd: 用于记录 linux kernel 相关的日志 syslogd:用于记录用户空间应用日志…

OCC开发_箱梁梁体建模

概述 OCC(全称OpenCascade)是一个近年来比较受欢迎的开源三维CAD建模平台,曲线、曲面、实体、渲染等方面功能强大,并且在机械、航空、船舶等许多领域应用广泛。基于OCC的强大功能考虑,本人尝试将其引入桥梁领域。桥梁设计中,比较常…

Nginx核心配置文件结构

一、简单介绍 源码安装的Nginx的核心配置文件默认是放在/usr/local/nginx/conf/nginx.conf yum安装的Nginx的核心配置文件默认是放在/etc/nginx/nginx.conf 使用命令:nginx -t,可以检查测试nginx的配置文件(nginx.conf)语法是否…

6.1排序——插入排序与希尔排序

本篇博客来梳理两种常见排序算法:插入排序与希尔排序 常见的排序算法如图 写排序算法的原则:先写单趟,再写整体 一、直接插入排序 1.算法思想 先假定第一个数据有序,把第二个数据插入;再假设前两个数据…

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrlv 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Univer…

2024整理 iptables防火墙学习笔记大全_modepro iptables

Iptables名词和术语 2iptables表(tables)和链(chains) 2表及其链的功能 2  Filter表 2  NAT表 2  MANGLE表 2iptables的工作流程 3iptables表和链的工作流程图 3 二、 iptables实战应用 4iptables命令参数详解 4  iptable…

Python基础part1

Python基础 语法 字面量 数字 整数浮点复数布尔 字符串列表 list元组 Tuple集合 Set字典 Dictionary 注释 单行# 单行注释的内容多行“”“ 多行注释的内容 ”“” 单行注释#后要加一个空格再写注释 变量 变量无类型,但数据有类型 语法: 变量名 …

java黑马微项目

1 飞机票 代码实现: import java.util.Scanner; public class F1 {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("请输入票价: ");double jia input.nextDouble();System.out.print(&…

培训第九周(部署k8s基础环境)

一、前期系统环境准备 1、关闭防火墙与selinux [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-o…

快速格式化和格式化的区别有哪些?

磁盘通常需要格式化才能正常使用,通过格式化,磁盘结构才能被操作系统正确识别。磁盘格式化分为快速格式化和格式化(完全格式化),它们都是格式化的方法,下面是它们的详细区别。 磁盘快速格式化和格式化的区别…

2024 年高教社杯全国大学生数学建模竞赛B题第三问详细解题思路(终版)

示例代码: import numpy as np import pandas as pd# 参数设定 params {m: 8, # 零配件数量n: 2, # 半成品数量p: [0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10], # 零配件次品率c: [2, 8, 12, 2, 8, 12, 8, 12], # 购买单价d: [1, 1, 2, 1, 1, 2, 1, 2]…

个性化阅读体验:Spring Boot驱动的图书推荐系统

1 绪论 1.1研究背景 随着网络不断的普及发展,图书个性化推荐系统依靠网络技术的支持得到了快速的发展,首先要从学生的实际需求出发,通过了解学生的需求开发出具有针对性的首页、图书信息、好书推荐、留言反馈、个人中心、后台管理功能&#x…

文本分类场景下微调BERT

How to Fine-Tune BERT for Text Classification 论文《How to Fine-Tune BERT for Text Classification?》是2019年发表的一篇论文。这篇文章做了一些实验来分析了如何在文本分类场景下微调BERT,是后面网上讨论如何微调BERT时经常提到的论文。 结论与思路 先来看…

19:HAL—-DAC

一&#xff1a;介绍 1&#xff1a;简历 2&#xff1a;简图 F1,F4,F7的DAC框架图都一样。 触发源&#xff1a; 宏定义补全及解释 #define DAC_TRIGGER_NONE 0x00000000UL /*!< 转换是自动的&#xff0c;一旦DAC1_DHRxxxx寄存器被加载&#xff0c;不由外部触发 */ #define …

ctfshow-php特性(web123-web150plus)

​web123 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!preg_match("/\\\\|\/|\~|…

AI模型的未来之路:全能与专精的博弈与共生

人工智能(AI)领域正迅速发展,伴随着技术的不断进步,AI模型的应用范围也在不断扩展。当前,AI模型的设计和使用面临两个主要趋势:全能型模型和专精型模型。这两者之间的博弈与共生将塑造未来的AI技术格局。本文将从以下七个方面探讨AI模型的未来之路,并提供实用的代码示例…

软考-高级架构师Keywords(上半部分)

概述 本文用于备考时自查知识点掌握情况&#xff0c; 知识点只以关键词方式提点出来&#xff0c;算是对照考纲的细碎化转化。 太简单的知识点不会收录。特别适合 通过中级-软件设计师的同学 / 八股文爱好者 / 408选手 计算机硬件 码距&#xff1a;改变n位成为另一个编码所需要…

业务资源管理模式语言09

示例&#xff1a; 图13 表示了QuoteTheMaintenance 模式的一个实例&#xff0c;在汽车修理店系统中&#xff0c;其中“Vehicle”扮演“Resource”&#xff0c;“Repair Quotation”扮演“Maintenance Quotation”&#xff0c;“Repair shop branch”扮演“Source-party”&…