linux 创建一个线程的基础开销探讨

news2024/11/15 21:09:19

测试代码

测试方法比较笨,每修改一次线程数,就重新编译一次,再运行。在程序运行过程中,查看到进程 pid,然后通过以下命令查看进程的运行状态信息输出到以线程数为名字的日志文件中,最后用 vimdiff 对比文件来查看内存上的差异。

cat /proc/查询到的pid/status
#include <pthread.h>
#include <unistd.h>

void *test(void *arg) {
    while(1) {
        sleep(1);
    }
    return NULL;
}

int main(int argc, char *argv[])
{
    const int NUM = 76; // 线程数
    pthread_t arr[NUM];

    for (int i = 0; i < NUM; ++i) {
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&tid, &attr, test, NULL);
        pthread_attr_destroy(&attr);
        arr[i] = tid;
    }

    for (int i = 0; i < NUM; ++i) {
        pthread_join(arr[i], NULL);
    }

    //test(NULL);
    return 0;
}

测试结果

在这里插入图片描述

  • 每多创建一个线程,虚拟内存增长 8M 左右(这大概是匹配 linux 线程/进程的栈空间大小),对于 64 位操作系统来说,虚拟内存是远大于物理内存的,所以不用担心虚拟内存不够,实际更应该关心物理内存的占用情况。
  • 由于从 glibc 库到操作系统,再到物理内存硬件都有着复杂的内存管理机制,有两点要意识到,一是分配了多大的虚拟内存,并不一定会分配相应大小的物理内存,二是进程向操作系统申请 n 字节空间,操作系统并不是刚好给该进程分配 n 字节物理内存。我在测试中发现,创建一个线程,占用的物理常驻内存(VmRss)是 392kb,然后我逐渐增加线程数,一直到14个线程,VmRss 都还是 392 kb。
  • 测试下来发现:
    • 1 ~ 14 个线程,VmRss 约等于 392kb
    • 15 ~ 45 个线程,VmRss 约等于 652kb addMem = 652 - 392 = 260kb
    • 46 ~ 76 个线程,VmRss 约等于 916kb addMem = 916 - 652 = 264kb
    • 77 ~ ? 个线程,VmRss 约等于 1180 kb
  • 大致得出平均一个线程的基础内存开销 = 260/30 = 8.6kb

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

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

相关文章

LVS负载均衡集群之LVS-DR部署

目录 一、lVS-DR集群概述 二、LVS-DR数据包流向分析 四、LVS-DR特性 五、DR模式 LVS负载均衡群集部 5.0配置虚拟 IP 地址&#xff08;VIP 192.168.14.180&#xff09; 5.1.配置负载调度器(192.168.14.101) 5.2部署共享存储&#xff08;NFS服务器&#xff1a;192.168.14.10…

7-3打怪升级(25分)【Floyd、dijkstra】【2021 RoboCom 世界机器人开发者大赛-本科组(初赛)】

考点&#xff1a;Floyd&#xff0c;dijkstra变式&#xff08;记录路径&#xff0c;多优先级&#xff09; 7-3 打怪升级 (25分) 很多游戏都有打怪升级的环节&#xff0c;玩家需要打败一系列怪兽去赢取成就和徽章。这里我们考虑一种简单的打怪升级游戏&#xff0c;游戏规则是&am…

数据在计算机中的存储——【C语言】

在前面的博客中&#xff0c;我们已经学习了C语言的数据类型&#xff0c;先让我们回顾一下C语言中有哪些数据类型。 目录 C语言的基本内置类型 类型的基本归类 整型在内存中的存储 原码、反码、补码 存储中的大小端 练习 浮点型在内存中的存储 浮点数的存储规则 对引例问…

【算法与数据结构】20、LeetCode有效的括号

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;括号匹配是使用栈解决的经典问题。做这道题首先要分析什么时候括号不匹配。1、右括号多余 ( { [ ] } )…

动态规划之96 不同的二叉搜索树(第7道)

题目&#xff1a; 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例&#xff1a; 递推关系的推导&#xff1a; n3时&#xff0c;如上图所示。 当1为头结点的时候&#x…

C#学习之路-常量

C# 常量 常量是固定值&#xff0c;程序执行期间不会改变。常量可以是任何基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量或者字符串常量&#xff0c;还有枚举常量。 常量可以被当作常规的变量&#xff0c;只是它们的值在定义后不能被修改。 整数常量 整数常量可…

Mybatis-Plus查询

Mybatis-Plus Mybatis-Plus条件查询的书写方法 1.条件查询 直接new QueryQuery<>创建对象&#xff0c;然后再wrappee.eq(“数据库列表”,“匹配值”)创建条件就可以。 其中&#xff0c;基本查询&#xff1a;eq表示相等&#xff1b;gt表示大于&#xff1b;lt表示小于&a…

[Vue3]学习笔记-provide 与 inject

作用&#xff1a;实现祖与后代组件间通信 套路&#xff1a;父组件有一个 provide 选项来提供数据&#xff0c;后代组件有一个 inject 选项来开始使用这些数据 具体写法&#xff1a; 祖组件中&#xff1a; setup(){......let car reactive({name:奔驰,price:40万})provide(…

Leetcode刷题(Week1)——宽(深)度优先遍历专题

刷题时间&#xff1a; 2019/04/04 – 2019/04/07 主播&#xff1a;yxc(闫雪灿) 视频链接&#xff1a; https://www.bilibili.com/video/av32546525?fromsearch&seid14001345623296049881 题号题目链接127Word Ladderhttps://leetcode.com/problems/word-ladder/131Palind…

Integration Objects OPC 所有产品Crack

OPC产品 OPC UA 升级到 OPC UA 以提高互操作性和安全性。 OPC 隧道 无需 DCOM 即可实现安全可靠的连接。 OPC 数据归档 将 OPC 数据存储到标准数据库或 CSV 文件中。 OPC 服务器 将任何通信协议转换为OPC标准。 OPC 客户端 读取、写入和传输您的 OPC 数据。 OPC 服务器工具…

四十五、时间/空间复杂度分析

算法主要内容 一、时间复杂度分析1、由数据范围反推算法复杂度以及算法内容2、如何分析代码复杂度&#xff08;1&#xff09;看循环&#xff08;2&#xff09;看递归&#xff08;3&#xff09;一些看似为O(n^2)&#xff0c;但实际为O(n)&#xff08;4&#xff09;数据结构&…

HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境

一、目的 之前的博文中《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》我们介绍了如何使用visual studio code进行开发调试&#xff0c;但是用起来总缺少点感觉&#xff0c;那么有没有更加友好一些的IDE用来开发呢&#xff1f; 本篇主要介绍如何使用Embedded Stud…

Stable Diffusion 模型界面介绍

Stable Diffusion 模型界面介绍 界面1 图1 Stable Diffusion 模型界面1 ①&#xff1a;选择的模型&#xff0c;及Stable Diffusion进行生成图片是使用的模型。其中.ckpt为大模型 ②&#xff1a;prompt --> 正向提示词。表示你的想法&#xff0c;你想要生成一副什么样的图…

更快更准更简单的工业异常检测新SOTA:SimpleNet

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2303.15140.pdf 代码链接&#xff1a;https://github.com/DonaldRR/SimpleNet 0.背景&#xff1a; 图像异常检测和定位任务旨在识别异常图像并定位异常子区域。…

eNSP-交换机VLAN配置

eNSP-交换机VLAN配置 文章目录 eNSP-交换机VLAN配置一、题目要求二、拓扑结构三、基础配置四、测试验证五、知识点详解1.VLAN2.VLAN的端口成员模式3.不同端口成员模式对报文的处理 一、题目要求 1.PC1可以访问PC2&#xff0c;PC4,但是不能访问PC3 2.PC2可以访问PC1&#xff0…

Python实现PSO粒子群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

openGauss学习笔记-03 openGauss极简版单节点安装

文章目录 openGauss学习笔记-03 openGauss极简版单节点安装3.1 获取安装包3.1.1 下载对应平台的安装包3.1.2 解压安装包3.1.3 查看目录结构 3.2 准备软硬件安装环境3.2.1 硬件环境要求3.2.2 软件环境要求3.2.3 软件依赖要求 3.3 单节点安装3.3.1 安装前准备3.3.2 安装openGauss…

硬件电路设计--运算放大器(四)应用三比较器

文章目录 前言电压比较器一、过零比较器二、单门比较器三、滞回比较器&#xff08;施密特触发器&#xff09;四、窗口比较器五、未使用的比较器的处理六、推挽式输出或漏极开路输出开漏输出推挽输出 七、比较器的应用7.1 3V转5V7.2 双极性转单极性7.3 光敏电阻模数转换 八、比较…

互联网协议(Internet Protocol Suite)

文章目录&#xff1a; 一&#xff1a;从系统角度&#xff08;解释互联网是如何构成的&#xff0c;协议的设计思想&#xff09; 二&#xff1a;从用户的角度&#xff08;解释结构是如何发挥作用&#xff0c;完成网络数据交换的&#xff09; 参考&#xff1a;阮一峰 一&#x…

过滤器与拦截器的区别

1.运行顺序不同 过滤器是在客户端请求到达服务器&#xff0c;但还未到Servlet时运行的&#xff0c;而拦截器是在到达Servelt后&#xff0c;调用适配器(HandlerAdapter)前运行的。 2.配置方式不同 过滤器是在web.xml中配置&#xff0c;而拦截器是在Spring中的配置文件中配置&a…