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

测试代码

测试方法比较笨,每修改一次线程数,就重新编译一次,再运行。在程序运行过程中,查看到进程 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.hqwc.cn/news/13167.html

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

相关文章

chatglm docker镜像,一键部署chatglm本地知识库

好久没有写文章了&#xff0c;今天有空&#xff0c;记录一下chatglm本地知识库的docker镜像制作过程。 核心程序是基于“闻达”开源项目&#xff0c;稍作改动。镜像可以直接启动运行&#xff0c;大家感兴趣可以进入镜像内部查看&#xff0c;代码位于 /app 目录下。 一、制作镜…

多元分类预测 | Matlab全连接神经网络(DNN)分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 全连接神经网络(DNN)分类预测,多特征输入模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 部分源码

SpringBoot配置外部Tomcat项目启动流程源码分析

前言 SpringBoot应用默认以Jar包方式并且使用内置Servlet容器(默认Tomcat)&#xff0c;该种方式虽然简单但是默认不支持JSP并且优化容器比较复杂。故而我们可以使用习惯的外置Tomcat方式并将项目打War包。 【1】创建项目并打War包 ① 同样使用Spring Initializer方式创建项目 …

【kafka面试题2】如何保证kafka消息的顺序性

【kafka面试题】如何保证kafka消息的顺序性 一、整体策略 如何保证kafka消息的顺序性呢&#xff0c;其实整体的策略就是&#xff1a;我们让需要有序的消息发送到同一个分区Partition。 为什么说让有序的消息发送到同一个分区Partition就行呢&#xff0c;&#xff0c;下面我们…

Python学习笔记(十六)————异常相关

目录 &#xff08;1&#xff09;异常概念 &#xff08;2&#xff09;异常的捕获 ①异常捕获的原因 ②捕获常规异常 ③捕获指定异常 ④捕获多个异常 ⑤ 捕获异常并输出描述信息 ⑥捕获所有异常 ⑦异常else ⑧异常的finally &#xff08;3&#xff09;异常的传递 &#xff08…

Idea社区版创建SpringBoot

一 下载Spring Initalizr and Assistant插件 选择左上角的File->Settings->Plugins&#xff0c;在搜索框中输入Spring&#xff0c;出现的第一个Spring Boot Helper插件&#xff0c;点击Installed&#xff0c;下载插件。&#xff08;这里已经下载&#xff09; 二 创建Spr…

【MySQL练习及单表查询】

一、MySQL练习 一.创建表&#xff1a; 创建员工表employee&#xff0c;字段如下&#xff1a; id&#xff08;员工编号&#xff09; name&#xff08;员工名字&#xff09; gender&#xff08;员工性别&#xff09; salary&#xff08;员工薪资&#xff09; 二.插入数据 1&…

【Windows】Redis单机部署

下载redis 下载地址&#xff1a;Releases microsoftarchive/redis GitHub 1、下载后解压&#xff0c;在文件根目录下创建两个文件夹dbcache、logs 修改配置文件redis.windows.conf &#xff08;1&#xff09;配置redis地址&#xff1a; bind 127.0.0.1 &#xff08;2&am…

Redis常见数据结构

文章目录 前言一、Redis通用命令二、String类型三、Key的层级结构四、Hash类型五、List类型六、Set类型七、SortedSet类型 前言 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;但是value的类型多种多样 在学习Redis不同数据类型时&#xff0c;我们…

AIGC - Stable Diffusion 图像控制插件 ControlNet (OpenPose) 配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131591887 论文&#xff1a;Adding Conditional Control to Text-to-Image Diffusion Models ControlNet 是神经网络结构&#xff0c;用于控制预…

Vision Pro销售策略曝光,面罩/头带/屈光镜片加大零售难度

彭博社Mark Gurman再次发布了关于苹果Vision Pro的销售策略&#xff0c;以及零售方面的难题。 一、销售计划和策略 1&#xff0c;2024年初先在美国部分门店销售&#xff0c;仅线下购买&#xff0c;线上暂不开放。购买方式是先线上预约&#xff08;可能要提供面部扫描图、眼镜…

JMeter进行websocket测试

在做websocket性能测试的时候找了几个测试工具都暂时没有对websocket的支持&#xff0c;发现jmeter好像对websockect支持。但是使用jmeter时需要安装插件&#xff0c;下面一起看一下。 jmeter下载安装&#xff1a; 官网下载 https://jmeter.apache.org/download_jmeter.cgi 也…