Linux的学习之路:21、线程(1)

摘要:

本章说一下线程

目录

摘要:

一、回忆一下

二、如何理解线程

三、命令行看线程

四、利用函数进行使用

五、本章总结

1、线程的优点

2、线程的缺点

3、线程的异常

4、线程的用途


一、回忆一下

1、exe就是一个文件

2、我们的可执行程序本来就是按照空间方式进行编译的

3、可执行程序,其实就是按照区域也就是已经被划分成了以4kb为单位的大小

六字真言:先描述在组织,如下图就是先描述在组织,产生的stack_struct的结构体,这个存着虚拟地址,然后虚拟地址存着用户级页表,然后页表里面存着物理内存,然后物理内存存在磁盘内。

 那么数据如果很多该怎么存入呢?如下图在32位环境下,是通过前面十位0就是指向一级页表,然后中间十位指向二级页表,其中的一级页表也指向二级页表,然后两个都一样就是二级页表,然后二级页表指向物理内存,这时找到了变量存在的地址,然后后面12位就是指向物理内存的偏移地址,所以就可以得出

page start addr + 页内偏移

通过一级页表+二级页表找到对应的页,再通过最后12位找到准确的地址,也就是偏移量

二、如何理解线程

通过一定的技术手段,将当前进程的资源,以一定的方式划给不用的task_struct,不去申请地址空间,需要什么资源就直接向主线程要,线程在内部执行,是OS调度的基本单位

这个是Linux特有的方案:没有独立的结构体

在内核视角中:

进程:承担分配系统资源的基本实体

用户视角:该进程对应的代码+资源

内部只有一个执行流的进程,但是内部具有各个执行的进程就是线程

在CPU视角中:CPU其实不怎么关心是进程还是线程这样的概念,只认识tack_struct,CPU调度的基本单位就是“线程”

在Linux下的进程:统一称之为轻量级进程,Linux并不能直接给我们提供线程的接口,只能提位轻量级进程的接口,在用户层实现了一套用户层多线程方案,以库的方式提供给用户进行使用,pathred线程库——原生线程库

三、命令行看线程

如下图利用man手册进行查看指令,pthread_create这个函数就是创建一个线程,他的参数就是下面四个

1、pthread_t *thread:这是一个指向 pthread_t 类型变量的指针,用于接收新创建的线程的标识符。

2、const pthread_attr_t *attr:这是一个指向 pthread_attr_t 类型变量的指针,用于指定线程的属性。如果设置为 NULL,则使用默认属性。

3、void *(*start_routine) (void *):这是一个指向函数的指针,该函数将作为新线程的起始执行点。这个函数通常被称为线程函数或启动例程。它接受一个 void 指针作为参数,并返回一个 void 指针。

4、void *arg:这是一个 void 指针,用于向线程函数传递参数。

如下方代码 可以看出pid都是一个,代码如下

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;void *start_routine(void *arg)
{while (1){cout << "这时新进程pid: " << getpid() << " " << endl;sleep(1);}
}int main()
{pthread_t tid;pthread_create(&tid, nullptr, start_routine, (void *)tid);while (1){cout << "这时主进程,pid:" << getpid() << endl;sleep(1);}return 0;
}

四、利用函数进行使用

如下方代码所示就是当线程结束了,然后著进行进行打印新线程

__thread int g_val = 0;void *threadRoutine(void *args)
{pthread_detach(pthread_self());while(true){cout << (char*)args << " : " << g_val << " &: " << &g_val << endl;sleep(1);}pthread_exit((void*)11);
}int main()
{pthread_t tid; pthread_create(&tid, nullptr, threadRoutine, (void *)"thread 1");while(true){cout << "main thread" << " : " << g_val << " &: " << &g_val << endl;sleep(1);break;}int n = pthread_join(tid, nullptr);cout << "n :" << n << "errstring: " << strerror(n) << endl;return 0;
}

五、本章总结

1、线程的优点

1、创建一个新线程的代价要比创建一个新进程小得多

2、与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多

3、线程占用的资源要比进程少很多

4、能充分利用多处理器的可并行数量

5、在等待慢速I/O操作结束的同时,程序可执行其他的计算任务

6、计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

7、I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

2、线程的缺点

1、性能损失
一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。

2、健壮性降低
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。

3、缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。

4、编程难度提高
编写与调试一个多线程程序比单线程程序困难得多

3、线程的异常

1、单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃

2、线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

4、线程的用途

1、合理的使用多线程,能提高CPU密集型程序的执行效率

2、合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

5、进程和线程

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

2、线程是调度的基本单位

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

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

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

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

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

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

相关文章

监控摄像机如何选购?

在选购监控摄像机时&#xff0c;需了解其基本知识&#xff0c;如分辨率、帧率、存储方式等。根据需求选择合适的产品&#xff0c;关注夜视功能、品牌和售后服务。预算和性价比同样重要。这样才能选到实用又安全的监控摄像机&#xff0c;提高生活品质。摘要由作者通过智能技术生…

JavaScript(四)

一、JavaScript变量 在 JavaScript 中&#xff0c;你可以使用几种不同的方式来声明变量。以下是主要的几种方式&#xff1a; 使用 var 关键字&#xff1a; 在 ES5 (ECMAScript 5) 及之前的版本中&#xff0c;var 是最常用的声明变量的方式。但是&#xff0c;var 有一个问题&am…

Scott Brinker:16年后,当前的(而非未来的)Martech已经出现,但分布不均。

杜克大学、德勤和美国营销协会共同开展的名为「CMO调查」 的两年一度的项目&#xff0c;是营销行业内的一项重要研究项目&#xff0c;已经持续了十多年。该调查的组织工作做得非常好&#xff0c;每次发布我都迫不及待地想要阅读。 我特别兴奋地阅读了刚刚发布的2024年春季版&a…

Elasticsearch内存占用分析

目录 1. 堆内存 (Heap Memory) 2. 索引缓存 (Index Cache) 3. 段缓存 (Segment Cache) 4. 文件系统缓存 (File System Cache) 5. 分片和副本 (Shards and Replicas) 6. 分析器和令牌器 (Analyzers and Tokenizers) 7. 过度配置 (Over-Allocation) 8. 垃圾回收 (Garbage…

MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解

目录 前言语法示例代码运用 前言 mysql中内置函数date_add 和 date_sub能对指定的时间进行增加或减少一个指定的时间间隔&#xff0c;返回的是一个日期。 语法 添加时间间隔 DATE_ADD(date,INTERVAL expr type)SELECT DATE_add(NOW(),INTERVAL -7 DAY);//获取7天前的日期 S…

java基础郎波版chapter4习题

文章目录 1.试说明Java语言是如何支持多重继承的。2.类的构造方法和成员方法之间有什么区别?构造方法&#xff1a;成员方法&#xff1a; 3.编写程序片段,定义表示课程的类Course。4.编写程序创建习题3中的Course类的对象,设置并打印输出该对象的课程名、编号以及先修课号。5.J…

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些&#xff0c;然后再动手操作 用Python写了一个简单数组类&#xff0c;首先思考下都写哪些功能&#xff1a; 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

ffplay支持mac/iOS硬解码实践

1. ffmpeg编译开启videotoolbox的支持。 ./configure --enable-videotoolbox --enable-hwaccels 2. stream_component_open方法中开启硬件解码器。 int FSPlay::stream_component_open(VideoState *is, int stream_index) {//...codec avcodec_find_decoder(avctx->code…

Python自学篇3-PyCharm开发工具下载、安装及应用

一、Python开发工具 自学篇1中讲到了安装Python之后出现的几个应用程序&#xff0c;其中IDLE、Python.exe都可以用来编写python程序&#xff0c;也可以进行调试&#xff1b;但是比较基础&#xff0c;比较原始&#xff0c;调试不方便&#xff0c;界面也不友好&#xff0c;需要更…

Unity List底层源码剖析

文章目录 前言一、List源码二、Add接口三、Remove接口四、Insert接口五、其他接口1、[]接口2、Clear接口3、Contains接口4、ToArray接口5、Find接口6、Enumerator接口7、Sort接口 六、线程安全总结 前言 没有扎实的基础&#xff0c;很多编写的程序会随着软件规模的扩大或扩展而…

(06)vite与ts的结合

文章目录 系列全集package.json在根目录创建 tsconfig.json 文件在根目录创建 vite.config.ts 文件index.html额外的类型声明 系列全集 &#xff08;01&#xff09;vite 从启动服务器开始 &#xff08;02&#xff09;vite环境变量配置 &#xff08;03&#xff09;vite 处理 c…

R语言 数据整理篇之结构重塑

《Cookbook for R》Manipulating Data ~ Restructuring 数据整理篇之数据结构重塑 Converting between data frames and contingency tables 在数据框和列联表之间转换 表示同样的内容但是三种不同的表现形式&#xff1a; 1、呈现个案观测值的数据框 cases &#xff1a;每行代…

【报错】Could not autowire. No beans of ‘SysUserRoleService‘ type found

1.查看对应service层是否添加Service 2.可以修改成Resource注入&#xff0c; Autowired和Resource区别一个是默认按照类型&#xff0c;一个默认按照名字 3.解决办法是&#xff1a;降低Autowired检测的级别&#xff0c;将Severity的级别由之前的error改成warning或其它可以忽略…

【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

http1.1和http2.0的同源请求数限制

判断协议版本 :scheme: 在请求头中表示使用的是HTTP/2协议。即 出现 :开头的请求头Chrome 只支持查看 HTTP/1.x 的 Raw Headers&#xff0c;对这种请求&#xff0c;会给出 view source 选项。HTTP2.0不给出。可继续学习 https://www.cnblogs.com/kirito-c/p/10360868.html抓包…

App在某个页面静止造成卡死假象

今天遇到一个bug记录下来,供后续积累经验。 预期结果:App在冷启动时会加载一个“广告页”,“广告页”有个定时器,定时器结束后会自动跳转到App首页;然而当用户开启指纹或人脸识别登录之后,App直接进入验证界面,验证通过后直接进入App首页。 bug场景:进入App需要指纹识别…

用什么模型算法可以预测足球胜平负

预测足球胜平负的模型算法有很多种&#xff0c;每种算法都有其特点和适用场景。以下是一些常见的模型算法&#xff1a; Elo预测法&#xff1a; 这是一种通过研究主客场球队在比赛前的积分情况来预测胜负的方法。Elo预测法通过计算两队之间的积分差&#xff0c;根据特定的公式&…

uTorrent Pro一款轻量级的Torrent磁力下载工具去广告绿色版 v3.6.0.47044

01 uTorrent Pro v3.6.0.47044 Torrent是一款俄罗斯号称全球排名第一的免费BT下载工具,海外最受欢迎的BT下载客户端软件。支持UPnP&#xff0c;支持流行的 BT 扩展协议&#xff0c;磁力链接(Magnet Links)&#xff0c;IPv6&#xff0c;用户来源交换&#xff0c;DHT和uTP&#…

【python】python基础-常用方法

通用方法&#xff1a; del obj&#xff1a;删除对象&#xff0c;不能删除可变对象的元素 li [1,2,3,4,5] del li :删除列表 del li[0]:删除列表中第一个元素 max(obj):返回对象中的最大值 字符串方法&#xff1a; 语法&#xff1a;字符串.方法名([参数]) str.upper():将字符…

计算机科学与技术就业方向和前景怎么样

计算机科学与技术专业的就业方向极为广泛&#xff0c;方向可以是软件开发与工程、网络与信息安全、数据科学与大数据分析等&#xff0c;几乎渗透到现代社会的每一个角落。以下是上大学网 &#xff08;www.sdaxue.com)对计算机科学与技术专业一些主要的就业方向及其前景分析&…