线程是什么

news2024/11/27 19:43:50

目录

一、教材观点

二、简述进程是如何运行的

简述进程切换原理:

三、线程是什么

线程底层是如何被管理的

四、重讲线程概念理解


一、教材观点

教材观点:

  • 线程是一个执行分支,执行分支更细,调度成本更低。
  • 线程是进程内部的一个执行流。

内核观点:线程是cpu调度的基本单位,进程是承担分配系统资源的基本实体。

大部分小伙伴应该理解不了,执行分支是什么、执行颗粒更细、调度成本为什么更低、线程为什么是进程的执行分支、和父子进程有什么区别……这一系列问题,看完了这篇文章就这些问题就能影迎刃而解。

二、简述进程是如何运行的

我们先要了解一下在内核角度,进程是如何执行一个程序的。

 task_struct就代表了一个进程,每个进程都有自己的虚拟地址空间,一个虚拟地址空间又对应一个页表,这个页表会将这个虚拟地址空间映射都物理内存。

当然我们物理内存也是将磁盘上的数据导入进来,因为cpu看到代码或者数据的前提是将数据加载进物理内存。 

 这就是一个完整的进程运行需要的硬件了。

简述进程切换原理:

一台电脑不可能只有一个进程需要处理,但是cpu一次又只能处理一个进程,因此每个进程占用cpu的时间是有限的,每隔一段很短很短的时间就会有os(操作系统)强制切换一次进程,cpu先将目前进程处理进度记录下来,等下一次再处理这个进程就继续执行。

其实我们也可以充这张图看出来,每次切换进程的话,要跟着一起换的就不只是一个task结构体这么简单,要跟着一起换的还有mmu页表以及后面这一套的对应关系。

知识点补充:

进程控制块(Process Control Block,PCB)和任务结构体(Task Struct)是操作系统中用于表示进程的两个数据结构。

进程控制块(Process Control Block,PCB)是操作系统中用于管理和控制进程的一种数据结构。每个进程在操作系统中都有一个对应的 PCB,PCB 中包含了进程的状态信息、所需的系统资源(如 CPU 时间、内存、文件等)、程序计数器、栈指针、进程优先级等内容。当操作系统需要对进程进行调度、阻塞、唤醒等操作时,就需要通过修改相应进程的 PCB 来实现。其中,PCB 的结构和具体内容可能会因操作系统的不同而有所差异。

task_struct是Linux操作系统中用于描述进程和线程的数据结构。它是PCB的一种具体实现,包含了进程的ID、状态、进程命令行参数、内存信息、文件描述符、信号处理函数、调度信息等。Linux中一个进程对应一个task_struct结构体。

因此,PCB和task_struct实际上就是在不同操作系统中表示进程的不同数据结构而已。它们都是用来描述和管理进程的信息,是操作系统中非常重要的数据结构。

这也就是线程调度成本低的其中一个原因,线程是不需要通过多余的系统调用切换资源

讲完上面的知识铺垫,我们再来聊聊

三、线程是什么

这是一个进程地址空间

 我们现在浅显的认为代码段是由很多个函数组成的,

不同的线程就当成是一个个小的执行流,分别负责执行这段代码的不同函数, 

 中间那些小框框都是该进程创建的一个个线程,这些线程负责处理给他们分配的函数,并且在处理这些函数的同时,他们也共享着地址空间的一切

os要不要像管理进程一样管理线程呢?答案是要的。

线程底层是如何被管理的

操作系统离不开一句话:先描述,再组织———— 描述:通过一个结构体将我们要储存的东西封装起来,然后再看通过一个数据结构储存起来以便管理。

进程就是通过task_struct和PCB这两种数据结构管理的。那么关于线程要怎么管理不同的操作系统有不同实现方式 。

Windows操作系统:

给线程专门创造一个新的数据结构然后再通过某种数据结构管理起来。这其实就是一般的思路,但相较于windows,Linux操作系统的实现方式就优雅很多。

Linux操作系统:

你进程不也需要先描述再组织吗,进程间不是也要相互切换吗,和我的线程实现除了不需要切换至资源不是一模一样吗?于是Linux操作系统就直接复用了进程的task_struct和PCB这两种结构以及算法。

这样做的好处就是:相较于windows,线程更好维护、效率更高、也更安全。你可别小看了一个区区线程,一款操作系统除了os本身,使用的最平凡的就是就是进程了,所以我们可以看到一种现象——linux系统是可以一直运行的不用关机,但是Windows能开机一个礼拜不管他试试。正是因为Linux对于很多细节的死扣不放,造成了这样的结果😁。

给大家看看我们能接触到的线程长啥样🙂:

 大的分类就是一个个进程,然后进程下面的小分支就是一个个线程,每个线程各司其职,比如微信就有负责窗口的、有负责数据io的、有链接硬件的等等

四、重讲线程概念理解

大部分小伙伴应该理解不了,执行分支是什么、执行颗粒更细、调度成本为什么更低、线程为什么是进程的执行分支、和父子进程有什么区别……这一系列问题,接下来我们会一个一个解释。

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

五、实例操作

光说了这么多,就来见见猪跑吧:

#include<iostream>
#include<pthread.h>
#include<unistd.h>


using namespace std;

void *threadRun1(void *args)
{
    while(1)
    {
        cout<<"thread1..."<<getpid()<<endl;
        sleep(1);
    }

}

void *threadRun2(void *args)
{
    while(1)
    {
        cout<<"thread1..."<<getpid()<<endl;
        sleep(1);
    }
}


int main()
{
    pthread_t t1,t2;
    pthread_create(&t1,nullptr,threadRun1,nullptr);
    pthread_create(&t2,nullptr,threadRun2,nullptr);


    while(1)
    {
        sleep(1);
        cout<<"main thread..."<<getpid()<<endl;
    }
    return 0;
}

 执行结果:

 

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

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

相关文章

Android SystemServer 启动流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、SystemServer 启动的服务有哪些二、SystemServer启动总体流程概述三、SystemServer 如何启动&#xff0c;是谁启动的&#xff1f;四、 SystemServe…

解决哈希冲突

1、HashMap引入了链式寻址法来解决hash冲突&#xff0c;冲突的key&#xff0c;HashMap把这些key组成一个单向链表&#xff0c;然后采用尾插法把key保存到链表的尾部。 使用二次扰动函数&#xff08;hash函数&#xff09;来降低哈希冲突的概率&#xff0c;使数据平均分布。 pu…

【VUE】Unterminated template literal:拼接字符串包括<script></script>时报错误

vue拼接字符串包括时报错误提示Unterminated template literal vue拼接字符串包括script标签时报错误提示Unterminated template literal解决方法加反斜杠就可以&#xff0c;在script结束标签里边加反斜杠<\/script> 代码 htmlData: <div id"b0e5c00cc51e4a4…

svg图标颜色随父元素变换

给svg加上一下样式 fill: currentColor;注&#xff1a;为什么有的svg设置了fill: currentColor;还是一样不生效&#xff1f; 用电脑自带的txt或者代码开发工具&#xff08;如&#xff1a;HbuilderX&#xff09;打开svg文件 全局搜索 fill 把fill指定颜色去掉 保存就OK了

存储函数,存储过程的应用

查看触发器 mysql> show triggers \G *************************** 1. row ***************************Trigger: student_insert_triggerEvent: INSERTTable: studentStatement: BEGINupdate student_total set totaltotal1;ENDTiming: AFTERCreated: 2023-07-11 16:13:51…

msvcp71.dll丢失怎样修复,msvcp71.dll丢失的三个解决方法

在运行游戏&#xff0c;软件程序的时候&#xff0c;电脑提示msvcp71.dll丢失怎样修复&#xff1f;下面小编就开始介绍msvcp71.dll在电脑系统中的的目录&#xff0c;作用&#xff0c;以及丢失后三个解决方法。 目录 msvcp71.dll通常位于系统目录里&#xff1a; msvcp71.dll丢失…

本地git 提交代码时 报错 [session-4d40e187] Access denied

1、首先执行以下命令查看本地是否绑定仓库 git remote -v2、如果没有执行以下命令添加 git remote add name(仓库名) git地址 // 添加成功后执行git remote -v 检查3、提交代码到新仓库&#xff0c;执行以下代码即可 git add . git commit -m fix:init git push name(于第二…

有趣的命令——————用shell脚本实现(石头剪刀布)小游戏

vim games。sh 输入以下内容&#xff1a;#!/bin/bash echo "这是一个小游戏(石头0 剪刀1 布2)&#xff0c;放松一下:" pc$(expr $RANDOM % 3) read -p "请输入你的选择:" user if [ $pc -eq 0 -a $user -eq 2 ] || [ $pc -eq 1 -a $user -eq 0 ] || [ $pc …

单个电源模块带电感的直流压降仿真(三)

单个电源模块带电感的直流压降仿真(三) 接单个电源模块带电感的直流压降仿真(二) 设置负载Sink,按照向导逐步设置

C++好难(9):C++的多态

目录 1.多态的概念 2.多态的定义及实现&#xff1a; &#x1f349;多态的构成条件 &#x1f349;虚函数 &#x1f349;虚函数的重写 &#x1f349;虚函数重写的三个例外 &#x1f352;子类虚函数可以不加vector &#x1f352;析构函数的重写 &#x1f352;协变&#xf…

开源铸剑,五载匠心!Zilliz Cloud云服务盛装登场,引领向量数据库云时代!

2023 年注定是属于大模型和向量数据库的巅峰时刻。国内大模型的发展也迎来前所未有之机遇&#xff0c;“百模”激战正酣。在刚闭幕的世界人工智能大会上&#xff0c;国内外科技公司全线加入&#xff0c;三十余款大模型集中亮相&#xff0c;“国家队”尘埃落定&#xff0c;并正式…

接口测试(二) 优化项目分层及cookies值带入

整个项目分层如图 然后上代码 #data_test.py from openpyxl import load_workbook import json import osclass Date_test():filepath os.path.dirname(os.path.dirname(__file__))def __init__(self):self.case_id Noneself.url Noneself.data Noneself.Method Noneself…

模拟实现C++的string库的改进

之前写过&#xff0c;(8条消息) 模拟实现C的string库_Qianxueban的博客-CSDN博客 比较简单&#xff0c;我就直接截图的。我要改进一下。 1.改进string类中可以在字符串中存储\0 但我写的没有这项功能&#xff0c;究其根本就是代码我用的都是strcpy等等函数&#xff0c;应该用…

5G理论概述

文章目录 SA组网架构及协议栈4-5G核心网侧融合交互5G与4G用户标识5G网络网元和设备类型&#xff0c;接口1、AMF(Access and Mobility Management Function)&#xff0c;接入和移动管理功能2、SMF&#xff08;Session Management function&#xff09;&#xff0c;会话管理功能3…

MQTT快速入门

官网文档 前言&#xff1a; MQTT 是用于物联网连接的 OASIS 标准&#xff0c;它是一种基于发布订阅模式的、轻量级的消息传输协议&#xff0c;专为受限设备和低带宽、高延迟和不可靠的网络设计&#xff0c;并且能够提供一定的消息可靠性保证。得益于这些特性&#xff0c;MQTT…

在vite创建的vue3项目中使用Cesium标记地点(基于加载建筑样式,划分区域)

在vite创建的vue3项目中使用Cesium标记地点&#xff08;基于加载建筑样式&#xff0c;划分区域&#xff09; 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件&#…

通过平均列比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构中有6个1, 行分布是0&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;2列分布是2&#xff0c;2&#xff0c;2.统计迭代次…

Java-多线程编程——基础篇及相关面试题

这里写目录标题 一、前言二、进程与线程的基本概念三、为什么Java中引入多线程&#xff1f;3.1 并行处理3.2 提高性能3.3 提高响应能力3.4 资源共享3.5 异步编程 四、Java多线程-创建多线程的类和接口4.1 Thread类4.2 Runnable接口 五、示例代码5.1 使用Thread类创建多线程六、…

【Django学习】(十二)GenericAPIView_过滤_排序_分页

上篇文章初步接触了GenericAPIView&#xff0c;这次来更加深入的学习它&#xff0c;了解里面的一些使用和方法 get_object&#xff1a;源码中&#xff1a;处理查询集&#xff0c;并含有所需要得pk值,lookup_fieldget_queryset&#xff1a;源码中&#xff1a;先判断queryset是否…

全志F1C200S嵌入式驱动开发(linux移植)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面完成了uboot移植,下面就要进行linux移植。当然,理论上uboot只是为后续的os准备好了一个基础运行环境,实际运行的操作系统是不是选择linux,也不一定。如果为了实际生产的需要…