LInux-多线程基础概念

news2024/12/22 17:01:05

文章目录

  • 前言
  • 预备
    • 页表详解
      • 缺页中断
      • 页表的映射
  • 一、多线程是什么?
    • 轻量级进程
  • 二、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.coloradmin.cn/o/1500156.html

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

相关文章

Spring基础——Spring配置Mybatis连接数据库

目录 Spring配置MyBatis流程1. 添加Mybatis依赖2. 配置MySQL数据库连接池2.1 首先创建jdbc配置文件2.2 配置数据库DataSource 3. 配置MyBatis3.1 配置SqlSessionFactoryBean3.2 配置mybatis Mapper Bean 4. 创建MyBatis Mapper接口6. 测试数据输出 数据库类型&#xff1a;MySQL…

centos7虚拟机启动并配置java环境(vmware启动+安装jdk+安装maven)

VMware下载 推荐很详细的一个教程Centos7.7安装及配置教程 - 掘金 VMware下载链接&#xff1a;https://pan.baidu.com/s/1jnUBawBPOtAD0gicZj-qTA?pwdm959 提取码&#xff1a;m959 centos7镜像&#xff08;文件较大&#xff0c;建议使用迅雷&#xff0c;更好支持暂停后继续下…

(MATLAB)应用实例13-时域信号的频谱分析

采用傅里叶变换来计算存在噪声的适于信号频谱。 假设数据采样频率为1000Hz&#xff0c;一个信号包含两个正弦波&#xff0c;频率50Hz、120Hz&#xff0c;振幅0.7、1&#xff0c;噪声为零平均值的随机噪声&#xff0c;采用FFT方法分析其频谱。 clearFs 1000; …

【C++】设计模式:观察者、策略、模板

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍设计模式&#xff1a;观察者、策略、模板。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

最长上升子序列c++

题目 输入样例&#xff1a; 7 3 1 2 1 8 5 6输出样例&#xff1a; 4 思路 题目求最大长度&#xff0c;考虑使用DP来做。我们从状态表示和状态计算两方面进行分析。 假设用a数组来存序列&#xff0c;f数组来存以f[i]结尾的最长上升子序列。 1. 状态表示&#xff1a; 这一步…

找不到msvcr100.dll怎么办,五种有效解决msvcr100.dll丢失的方法

由于系统中关键文件msvcr100.dll的缺失&#xff0c;用户可能会遭遇一系列始料未及的困扰与问题。msvcr100.dll是Microsoft Visual C运行库中的一个核心动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当这个特定的dll文件丢失时&#xff0c;可能会导致部分软件…

电脑如何快速生成图片二维码?在线图片生码的制作步骤

多张图片在电脑上如何生成二维码之后预览呢&#xff1f;现在很多场景下都会发现扫码会展现很多的图片&#xff0c;通过手机来获取图片内容&#xff0c;那么图片放入二维码中的制作方法是什么样的呢&#xff1f;下面就通过本篇文章来给大家介绍图片二维码在线制作的方法及步骤&a…

SpringBoot+Ajax+redis实现隐藏重要接口地址

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用&#xff0c;供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个&#xff0c;发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

JumpServer 简介安装

目录 1、概念介绍 JumpServer 概述 JumpServer 功能 JumpServer 组件 JumpServer 架构 2、前置安装 环境要求 安装 ELRepo 库 更新内核 设置 grub2 安装 Python 配置 Python 虚拟环境 3、安装 Jumpserver Core 组件 下载安装 替换客户端组件 安装 Python 依赖库…

基于树莓派4B的智能家居系统设计

目录 一、项目介绍 二、前期准备 1.硬件准备 2.开发环境 三、C语言的简单工厂模式 1.工厂模式介绍 2.类和对象 3.工厂模式的优缺点 四、树莓派的基本使用 1.树莓派刷机和登入 2.树莓派WiringPi库介绍 3.树莓派 CSI 摄像头配置 4.树莓派与其他模块接线 五、智能家居…

【Java】生成条形码工具类

报销单需要根据单号生成条形码 先看效果图 直接上代码&#xff0c;复制即可使用 /*** Description:生成条形码*/ public class BarCodeUtils {/*** 默认图片宽度*/private static final int DEFAULT_PICTURE_WIDTH 300;/*** 默认图片高度*/private static final int DEFAULT_…

【C++杂货铺】详解string

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 为什么学习string &#x1f4c1; 认识string&#xff08;了解&#xff09; &#x1f4c1; string的常用接口 &#x1f4c2; 构造函数 &#x1f4c2; string类对象的容量操作 &#x1f4c2; string类对象的访问以及遍历操…

智慧油气场站:油气行业实现数字化转型的关键一步

智慧油气场站&#xff1a;油气行业实现数字化转型的关键一步 在现代社会&#xff0c;能源供应是国家经济发展和人民生活的重要保障。而油气场站作为能源的重要供应和储存基地&#xff0c;扮演着至关重要的角色。此外&#xff0c;油气场站还可以为石油和天然气的生产提供支持。…

前端手册-实现挂坠灯笼效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

网红老阳推荐的蓝海项目,视频号带货怎么样?有优势吗?

老阳是一位在互联网创业领域颇具影响力的任务&#xff0c;他经常会在自己的社交媒体平台上分享一些他认为有潜力的蓝海项目和创业机会。近期&#xff0c;老阳推荐了一个备受关注的蓝海项目——视频号带货。那么&#xff0c;这个项目究竟怎么样呢?我们来分析一下。 首先&#x…

TypeScript 基础(一)

目录 一、概述 二、开发环境 三、数据类型 1.boolean 2.number 3.string 4.Array 5.type 6.tuple 7.enum 8.any 9.null / undefined 10.never 11.object 结束 一、概述 TypeScript 是一种由微软开发的开源编程语言。它是 JavaScript 的一个超集&#xff0c;这意…

【排序算法】推排序算法解析:从原理到实现

目录 1. 引言 2. 推排序算法原理 3. 推排序的时间复杂度分析 4. 推排序的应用场景 5. 推排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现推排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#xff1a; 6.…

使用langchain搭建本地知识库系统(新)

使用langchain搭建自己的本地知识库系统&#xff08;新&#xff09; 前些时候字节上了自己的扣子&#xff0c;用来构建我们自己的 agent [AI 实战&#xff1a;手把手教你使用「扣子/coze」来搭建个人blog知识库 受到启发&#xff0c;想在本地或者自己的服务器上面搭建一个知识…

震惊!性能一下子提升10倍,用Performance面板分析性能瓶颈全流程!

工作中发现了一个下拉框打开的数据比较慢&#xff0c;并且打开弹框的时候会有相当长一段时间的延迟&#xff0c;下拉的弹框不是使用组件库的&#xff0c;而是自己封装的一个组件&#xff0c;怀疑存在数据量过大影响的情况&#xff0c;所以借助性能分析工具来找出具体的原因。 如…