LInux-多线程基础概念

文章目录

  • 前言
  • 预备
    • 页表详解
      • 缺页中断
      • 页表的映射
  • 一、多线程是什么?
    • 轻量级进程
  • 二、Pthread库
    • pthread_create


前言

从本章的多线程开始,我们开始进入Linux系统的尾声,所以,在学习多线程的过程中,我们也会逐步对之前的内容进行复习,以达到知识巩固的效果。


预备

页表详解

对于我们的已经被编译好的可执行程序,其实早已被按照区域被划分为了4KB为单位,我们称它为页帧

而内存其实也是被划分为了4KB为单位,且内存的IO基本单位也是4KB,我们称内存这样被划分的区域称之为页框

缺页中断

在程序刚开始被运行的时候,我们的数据刚开始都还在磁盘当中,这个时候我们页表所映射的其实是磁盘地址,如果用户这个时候访问一个还在磁盘中的数据,首先要经过页表,然后页表+MMU会发现该数据没有被加载到内存,就会发生缺页中断:先将磁盘的数据加载到内存,然后更改页表映射。

页表的映射

那么为什么页框和页帧为4KB呢? 这就要详细讲解页表是如何映射的。

首先提出一个数学问题,如果只有一个页表单纯地去映射所有地址至少需要多少空间?

在32位系统中,一个地址要占32个bit位并且有多达2^32个地址。
这样计算下来,居然至少多达32GB。所以页表肯定不是这样映射的。
在这里插入图片描述

页表其实被是被划分为N级页表的,在32位系统中,有一级页表和二级页表。

其中一级页表映射后10位bit位,二级页表映射中间的10位bit位。
在这里插入图片描述
通过这样的方式,我们就可以完成页表的映射,我们再来计算一次采用这样的方案需要多少空间。
在这里插入图片描述
这个时候就是MB为单位了,内存存储几十MB还是没有问题的。

一、多线程是什么?

之前我们所学习的信号知识里面,我们了解到了一个进程是可以拥有多个执行流的概念。 那么,一个进程拥有多个执行流有什么用呢? 答案是可以提高程序的工作效率 。

而在我们以往学习所写的代码程序,其实都是单进程单执行流程序。

那么多线程到底是什么? 我们又该如何理解多线程?
在这里插入图片描述
线程在进程内部执行,在进程中的每一个执行流都是一个线程,其中一个进程的每个线程都共享且运行同一份地址空间,在上面的图中,我们可以将一个task_struct理解为一个线程。

对于CPU而言,它的基本调度单位是线程,它调度的其实是线程。

为什么这样工作效率更高?

首先毋庸置疑的,多执行流在CPU中运行肯定比单执行流效率更高。
第二, 因为他们共享一部分数据,不像进程一样具有独立性,所以线程所占用的资源更少。
第三,CPU中有cache缓冲,它会根据局部性原理,会将可能用上的一部分内存数据(/4KB)都保存在CPU的cache区中,所以CPU调用多线程就会使得减少CPU的cache区频繁改变。

可以总结为

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

轻量级进程

需要注意的是,在Linux系统中,其实并没有真正的线程概念,像Windows其实才具有真正的线程,在Linux系统中,我们采用的是轻量级进程(LWP:Light Weight Process),相对于其他系统的进程内核数据结构更加轻量化,并且也能达到多线程的效果。
就像上图所展示的,CPU所调度的是task_struct,Linux操作系统并没有为线程写一个数据结构。

线程是OS调度的基本单位,进程是承担OS资源的基本实体。


二、Pthread库

pthread_create

pthread库是一个第三方库,我们可以用它库中的pthread_create函数来在Linux系统中创建多线程。

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Compile and link with -pthread.

参数 pthread_t *thread 是一个输出型函数,用于输出它创建出的线程的线程id。

typedef unsigned long int pthread_t;

参数 const pthread_attr_t *attr,也是一个输出型函数,用于输出该线程的属性数据。

参数 void* (*start_routine)(void *)是一个函数指针,是一个回调函数。

参数 void* arg 用于传递给void* (*start_routine)(void *)的参数。

示例代码如下

#include <cstdio>
#include <pthread.h>
#include <iostream>
#include <unistd.h>
#include <string>void *threadRun(void *args)
{const std::string name = (char*) args;while (1){std::cout << name << " : pid " << getpid() << "\n" << std::endl;sleep(1);}}
int main()
{char name[64];pthread_t tid[5];for (int n = 0; n < 5; n++){snprintf(name, sizeof name, "%s-%d", "thread", n + 1);pthread_create(tid + n, nullptr, threadRun,(void*)name);sleep(3);}while(1){std::cout << "Main thread : pid " << getpid() << std::endl;sleep(3);}return 0;
}

因为pthread是第三方库,所以我们需要链接它的库,我们需要使用

g++ -o mythread mythread.cc -std=c++11 -lpthread

如果我们没有加-lpthread,则会出现下图报错
在这里插入图片描述

通过 ps aL 来查看线程状态

在这里插入图片描述
LWP(light weight process 轻量级进程)就是线程id。 它们的pid相同!


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

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

相关文章

邮件营销新手必读指南?怎样做好邮件营销?

邮件营销的全流程及步骤&#xff1f;做好邮件营销有哪些注意点&#xff1f; 邮件营销作为一种传统却依然高效的推广手段&#xff0c;被众多企业所青睐。对于新手来说&#xff0c;如何开展邮件营销&#xff0c;却是一个值得探讨的话题。AokSend将为你提供一份邮件营销新手必读指…

国家妇女节放假是法定的假日

在这个充满活力和希望的春天&#xff0c;我们迎来了一个特殊的节日——国家妇女节。这是一个属于所有女性的节日&#xff0c;是一个庆祝女性成就、关爱女性权益的时刻。在这个特殊的日子里&#xff0c;我们不禁要问&#xff1a;国家妇女节放假是法定假日吗&#xff1f;让我们一…

Ps:辅助类工具组

工具箱里的辅助类工具为图像编辑和设计提供了重要的支持&#xff0c;能帮助用户更准确地测量、选取颜色或添加注释等。 快捷键&#xff1a;I 吸管工具 Eyedropper Tool 用于从图像中采样颜色。 用户可以通过点击屏幕上的任何点来选取那里的颜色&#xff0c;该颜色随即成为当前的…

Java+SpringBoot+Vue+MySQL实战:打造智能餐厅点餐系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

消息队列以及Kafka的使用

什么是消息队列 消息队列&#xff1a;一般我们会简称它为MQ(Message Queue)。其主要目的是通讯。 ps&#xff1a;消息队列是以日志的形式将数据顺序存储到磁盘当中。通常我们说从内存中IO读写数据的速度要快于从硬盘中IO读写的速度是对于随机的写入和读取。但是对于这种顺序存…

2024年:AI领航研发新纪元

导言&#xff1a; 在21世纪的科技巨浪中&#xff0c;人工智能&#xff08;AI&#xff09;已经崭露头角&#xff0c;成为研发领域的核心变革者。其强大的潜力和无所不在的应用正在改变人类解决问题的方式&#xff0c;为未来的发展开启了无限可能。随着机器学习、自然语言处理、计…

周立功USBCAN-E-mini分析仪的安装测试笔记

一、介绍 USBCAN-E-mini 智能 CAN 接口卡是系列 USBCAN 便携版本&#xff0c;与 USBCAN—E-U 单路智能 CAN 接口卡完全兼容。USBCAN-E-mini 智能 CAN 接口卡与 USB1.1 总线兼容的&#xff0c;集成 1 路 CAN 接口的智能型 CAN-bus 总线通讯接口卡。采用 USBCAN-E-mini 智能 CAN …

6、string字符串拼接

#include <iostream> using namespace std;void test01 () {string s1 "我";s1 "爱玩游戏";cout << s1 << endl;s1 :;string s2 "lol dnf";s1 s2;cout << s1 << endl;string s3 "i";s3.append(&q…

Vue 使用@别名

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import pat…

【ICCV】AIGC时代下的SOTA人脸表征提取器TransFace,FaceChain团队出品

一、论文 本文介绍被计算机视觉顶级国际会议ICCV 2023接收的论文 "TransFace: Calibrating Transformer Training for Face Recognition from a Data-Centric Perspective" 论文链接&#xff1a;https://arxiv.org/abs/2308.10133 开源代码&#xff1a;https://an…

GAMMA电源维修高压直流电源ES30P-5W ES系列

美国Gamma高压电源维修型号&#xff1a;D-ES30R-10N-5W/M&#xff0c;LXR30-1N&#xff0c;XRM5N-100W&#xff0c;ES50P-10W/DDPM&#xff0c;ES60P-10W/DDPM&#xff0c;RR20-20P/DDPM&#xff0c;ES30P-10W&#xff0c;ES60P-10W DDPM&#xff0c;RR60-18P/220V&#xff0c;…

快看!提高效率,还得看工作流表单引擎

经常有客户会问我们&#xff1a;究竟用什么样的工具才能打破信息孤岛&#xff0c;让大家互联联络起来&#xff1f;其实&#xff0c;说到这&#xff0c;有不少人会联想到低代码技术平台。不错&#xff0c;在快节奏的发展社会中&#xff0c;高效率的办公目的已经是大家的追求和发…

java的参数传递机制(引用类型)

1.除了非引用类型的形参传递&#xff0c;还有引用类型的变量形参传递&#xff0c;但引用类型的形参变量传递与非引用类型是不同的&#xff01;&#xff01;&#xff01; public class MethodDemo2 {public static void main(String[] args) {int[] arr new int[]{10,20,30,9}…

未来仓储解决方案:深入了解自动码垛托盘分配技术

在现代物料处理过程中&#xff0c;自动码垛托盘&#xff08;栈板&#xff09;分配机扮演着至关重要的角色。这类设备被广泛应用于制造业、物流仓储等领域&#xff0c;凭借其高效、准确且可靠的性能&#xff0c;成为提高生产效率和降低运营成本的关键工具。 自动码垛托盘分配机…

0-超详细基础安装linux系统-kali

软件以及kali镜像获取 vm 链接&#xff1a;https://pan.baidu.com/s/1u5Kfc6FVc_1awIHECVXh-Q?pwde963 提取码&#xff1a;e963 kali 链接&#xff1a;https://pan.baidu.com/s/1TeGXkwFKrpz9aUL8k2ff2g?pwdhu3v 提取码&#xff1a;hu3v 1.打开虚拟机选择新建虚拟机 安…

MySQL常见的存储引擎介绍

我将为您详细讲解 MySQL 常见的存储引擎&#xff0c;以及它们的使用场景、特点、区别和优势。MySQL 支持多种存储引擎&#xff0c;每种存储引擎都有其特定的优势和局限性。了解这些存储引擎的特点和适用场景对于选择合适的存储引擎以及优化数据库性能至关重要。 1. InnoDB 存储…

pytorch续写tensorboard

模型训练到一半有 bug 停了&#xff0c;可以 resume 继续炼&#xff0c;本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例&#xff0c;参考 [1-3]&#xff0c;只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

【算法刷题】Day30

1. 汉诺塔问题 原题链接 题干&#xff1a; 算法原理&#xff1a; 利用递归算法 将x柱子上的一堆盘子&#xff0c;借助 y柱子&#xff0c;转移到z 柱子上面 递归函数流程&#xff1a; 当前问题规模为 n1 时&#xff0c;直接将 A 中的最上面盘子挪到 C 中并返回递归将 A 中最…

C++ Qt开发:QFileSystemModel文件管理组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QFileSystemModel组件实现文件管理器…

开关电源安规测试标准与测试要求

安规测试是对开关电源进行电气性能、安全性能等检测&#xff0c;确保开关电源符合规定并且安全可靠&#xff0c;为开关电源的质量把关。那么开关电源安规测试有哪些测试要求和标准呢&#xff1f; 开关电源安规测试要求 一、测试前 1. 首先&#xff0c;要检查测试环境&#xff0…