Linux——线程概念与线程的创建

目录

一、什么是线程

二、线程的创建

三、重新理解线程

四、进程和线程对比


一、什么是线程

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

我们知道,操作系统是软硬件的管理者,他需要去管理系统中的各种资源,那么进程作为操作系统中重要的一环,也必须被管理,管理的本质是先描述在组织,因此操作系统用PCB来进行描述进程,并使用链表将进程们组织串联起来。

那么一个进程是有他自己的task_struct(linux下的PCB),task_struct里存在指向虚拟内存的指针,再通过页表进行虚拟到物理的转化。这一系列的操作都是操作系统帮我们完成的,但是似乎创建进程的代价比较大

创建进程的目的,大部分都是让进程帮我们执行一个执行流解决不了的代码(比如当前进程需要下载,还需要一个进程帮我们播放),如果我将需要执行的代码写在一个程序中,在一个进程的条件下,让多个执行流分别执行不同的代码。这种就可以通过创建进程来实现

进程可以创建线程,每一个线程也有自己的task_struct,但是指向的进程地址空间是当前进程的,同样可以访问里面的数据,那就可以让各个线程分别跑不同的代码,这样就在代价不大的情况下实现了目的。

因此,我们可以说线程是比进程更加轻量化的执行流或者说线程是在进程内部执行的一种执行流。 

那么现在我们看待进程,不仅仅是只有这个进程了,还包括他创建的线程资源。创建进程,操作系统就会给他分配资源,进程是承担操作系统的基本实体

我们要将PCB放到CPU上进行调度,CPU不会区分你是进程还是线程,他只管你是不是一个PCB,是不是合法的内容,由于线程是<=进程的,那么我们可以说线程才是CPU调度的基本单位

讲个小故事:

有一个1家3口的家庭,他们每个人都有自己的事情要做,孩子好好学习,父母努力挣钱,目的就是让整个家庭过得更好。其中每个人相当于一个线程,整个家庭相当于进程,家里的资源共享,分工协作完成任务。

而之前我们学习的进程,相当于一个家庭只有一个人。独自完成任务,如果需要,可 以让其他家庭来帮助我完成,但是家庭与家庭之间是具有独立性的。

二、线程的创建

创建线程我们需要用到POSIX线程库

POSIX线程库

  • 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的
  • 要使用这些函数库,要通过引入头文件<pthread.h> 
  • 链接这些线程函数库时要使用编译器命令的“-lpthread”选项  

我们可以使用pthread.h头文件下的pthread_create函数创建线程 

功能:创建一个新的线程

  • 参数 thread:返回线程ID
  • attr:设置线程的属性,attr为NULL表示使用默认属性
  • start_routine:是个函数地址,线程启动后要执行的函数
  • arg:传给线程启动函数的参数
  • 返回值:成功返回0;失败返回错误码 

代码如下,我们使用创建一个线程,给他传递函数地址,让他去帮我们执行函数里面的内容。因为每个线程都是一个执行流,因此效果应该是两个while循环一起跑。

#include<iostream>
#include<unistd.h>
#include<pthread.h>
using namespace std;

void* TreadToutine(void *arg)
{
    const char* threadname = (const char*) arg;
    while(1)
    {
        cout<<"我是一个新线程"<<threadname<<endl;
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,NULL,TreadToutine, (void*)"thread 1");

    //主线程
    while(1)
    {
        cout<<"我是主线程"<<endl;
        sleep(1);
    }
    return 0;
}

 注意编译时需要链接pthread库,因此需要加上-lpthread 。

在命令行中输入ps -aL ,可以查看当前运行的轻量级进程,我们发现这两个线程PID是一样的,LWP(Light weight process)不一样。操作系统调度的时候其实看的也是LWP。从此,Linux下的所有执行流都可以把他叫做轻量级进程。

三、重新理解线程

  • 现在,我们知道的进程可以创建线程,线程是更加轻量化的执行流,同时CPU调度运行是看PCB的,进程有PCB,线程也有PCB。因此进程和线程都可以放到CPU上运行。
  • 操作系统还会根据你的PID来判断CPU调度运行时覆盖切换那些寄存器。因为一个进程,创建的线程他们的PCB是一样的,只是LWP不一样。
  • 因此当CPU调度PCB的时候,如果发现你是从A进程到了B进程,那么会将你的进程地址空间、页表、catch缓存等等都要更新,而如果发现你是从A进程的某个线程,切换到B进程的某个线程,那么只需要往部分寄存器做写入就可以了。

由此线程切换比进程切换效率更高

同时CPU会根据时钟中断来进行进程切换,比如时钟中断是1ms,A进程没有线程,那么他会独享这1ms,B进程加自己有5个线程,那么这5个线程会瓜分1ms。也是为了防止恶意进程创建很多线程独占CPU的资源。

四、进程和线程对比

进程是资源分配的基本单位

线程是调度的基本单位

线程共享进程数据,但也拥有自己的一部分数据:

  • 线程ID
  • 一组寄存器
  • errno
  • 信号屏蔽字
  • 调度优先级

总结就是线程有自己的硬件上下文和栈空间

进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程 中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境: 

文件描述符表

每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)

当前工作目录

用户id和组id

进程和线程的关系如下图:

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

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

相关文章

车道线中心线生成方法

车道线中心线生成方法 附赠自动驾驶学习资料和量产经验&#xff1a;链接 基于摄像头传感器输出车道线方程&#xff1a; (1) 其中&#xff1a;、、、为车道线方程系数。 1 车道宽度计算 当车辆直行时&#xff0c;车道宽度计算可根据如下公式计算&#xff1a; …

【BlossomRPC】手把手教你写一个RPC协议

文章目录 新的开始什么是RPC?设计一个RPC需要些什么&#xff1f; 新的开始 经常会遇到一些项目&#xff0c;看着看着就发现看不懂文档了&#xff0c;也就是会出现一些跳过讲解的文章&#xff0c;使得自己很难了解某种中间件的开发全貌&#xff0c;所以想着自己先设计一个比较…

编程实现黄金分割法、平分法和不精确一维搜索等最优化算法

解&#xff1a; 1、黄金分割法 思想&#xff1a; 黄金分割法是通过不断缩短搜索区间的长度来寻求一维函数的极小点&#xff0c;这种方法的基本原理是&#xff1a;在搜索区间[a,b]内按如下规则对称地取两点a1和a2 a1a0.382(b-a); a2a0.618(b-a); 黄金分割法的搜索过程是&#x…

代码随想录算法训练营第二十五天| 回溯算法理论基础、LeetCode77.组合

一、216.组合总和III 题目链接/文章讲解/视频讲解&#xff1a; https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 状态&#xff1a;已解决 1.思路 做过77题&#xff08;上篇博客&#xff09;后&#xff0c;这道题也就不难了&#xff0c;无非是多…

数字化转型导师坚鹏:BLM新质生产力发展方法论

BLM新质生产力发展方法论 ——新质生产力发展之知行果合一 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道如何理解新质生产力&#xff1f; 不清楚如何发展新质生产力&#xff1f; 不知道新质生产力发展案例&#xff1f; 课程特色&#xff1a; 原创…

echarts统计图占满整个容器

原先的统计图表没有占满容器&#xff0c;感觉整个被压缩了 网上查阅相关资料后发现需要设置grid一个配置项&#xff08;有些数值需要根据实际情况进行调整&#xff09; grid:{top:"0px",left:"0px",right:"0px",bottom:"0px"} 对于gr…

用户登录.java

分析&#xff1a; 1&#xff0c;用String来定义两个变量&#xff0c;记录正确的用户名和密码----->直接赋值得来 2&#xff0c;键盘录入用户名和密码------>new开辟空间得来&#xff0c;存的是地址值 他们直接用比较大小,必定不相同&#xff0c;需要用到String里面的方…

沙箱安全机制

Java安全模型的核心就是Java沙箱(sandbox)&#xff0c; 什么是沙箱&#xff1f; 沙箱是一个 限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM) 特定的运行范围中&#xff0c;并且严格限制代码对本地系统资源访问&#xff0c;通过这样的措施来保证 对代码的 有效隔…

QT中的文件操作QFile、QDataStream、QTextStream、QBuffer

文件操作概述 1、Qt中IO操作的处理方式 &#xff08;1&#xff09;、Qt通过统一的接口简化了文件与外部设备的操作方式 &#xff08;2&#xff09;、Qt中的文件被看做是一种特殊的外部设备 &#xff08;3&#xff09;、Qt中的文件操作与外部设备操作相同 2、IO操作中的关键…

基于协同过滤算法的图书推荐系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于协同过滤算法的图书推荐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能需求…

C语言例1-11:语句 while(!a); 中的表达式 !a 可以替换为

A. a!1 B. a!0 C. a0 D. a1 答案&#xff1a;C while()成真才执行&#xff0c;所以!a1 &#xff0c;也就是 a0 原代码如下&#xff1a; #include<stdio.h> int main(void) {int a0;while(!a){a;printf("a\n");} return 0; } 结果如…

Soot入门学习笔记

Soot 适合参考的文档和教程如下&#xff1a; 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料&#xff1a; 南京大学《软件分析》课程笔记 比较好的入门作业或者案例&#xff1a; CSCE710 Assignmen…

vue3如何二次封装el-upload组件进行图片上传及删除

实现功能&#xff1a; 1、封装el-upload组件&#xff0c;父组件可以控制图片上传框的宽高 2、父组件可以传入提示信息&#xff0c;利用具名插槽 3、上传前的校验 4、实现删除功能 不同配置下的效果&#xff1a; 下边案例是图片上传的时候没有掉接口&#xff0c;在整体提交的时…

省级-能源结构数据(电力消费水平)(2000-2022年)

能源结构指能源总生产量或总消费量中各类一次能源、二次能源的构成及其比例关系。它是能源系统工程研究的重要内容&#xff0c;直接影响着国民经济各部门的最终用能方式&#xff0c;并反映了人民的生活水平。能源结构主要由生产结构和消费结构组成。 本数据通过电力消费水平来…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

Python之Opencv教程(3):人脸识别

1、人脸识别代码 直接上代码&#xff1a; import cv2# 加载训练数据集文件 recogizer cv2.face.LBPHFaceRecognizer_create()recogizer.read(trainer/trainer.yml)# 准备识别的图片 img cv2.imread(images/lisa.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_dete…

Linux文件系统权限

文件的一般权限 每个文件针对每类访问者定义了三种主要权限&#xff1a; r&#xff1a;read 读 w&#xff1a;write 写 x&#xff1a;execute 执行 所属者/组/其他用户权限的字符表示二进制表示八进制表示---0000--x0011-w-0102-wx0113r--1004r-x1015rw-1106rwx1117 文件/目…

企业培训系统功能介绍

在当今知识经济时代&#xff0c;企业的竞争力在很大程度上取决于员工的专业能力和综合素质。为了适应不断变化的市场需求和技术进步&#xff0c;企业需要对员工进行持续有效的培训。一个高效的企业培训系统对企业人才培训至关重要。以下介绍一下企业培训系统的主要功能&#xf…

《操作系统导论》第15章读书笔记:机制:地址转换(address translation)

《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09; —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09;1.前…