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

这篇具有很好参考价值的文章主要介绍了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;
}

测试结果

linux 创建一个线程的基础开销探讨,linux,linux,服务器,c语言文章来源地址https://www.toymoban.com/news/detail-535191.html

  • 每多创建一个线程,虚拟内存增长 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

到了这里,关于linux 创建一个线程的基础开销探讨的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分别通过select、多进程、多线程实现一个并发服务器

    多进程 多线程 select

    2024年02月20日
    浏览(30)
  • 【网络编程】实现一个简单多线程版本TCP服务器(附源码)

    accept 函数是在服务器端用于接受客户端连接请求的函数,它在监听套接字上等待客户端的连接,并在有新的连接请求到来时创建一个新的套接字用于与该客户端通信。 下面是 accept 函数的详细介绍以及各个参数的意义: sockfd: 是服务器监听套接字的文件描述符,通常是使用

    2024年02月13日
    浏览(41)
  • 从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

    由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些学习方向,有什么错误的地方欢迎各位同行进行讨论。 本篇教程预计使用Java+Redis+Mongo 本着先完成再完美的原则,从最简单的

    2024年02月10日
    浏览(42)
  • 【Linux网络编程】高并发服务器框架 线程池介绍+线程池封装

    前言 一、线程池介绍 💻线程池基本概念 💻线程池组成部分 💻线程池工作原理  二、线程池代码封装 🌈main.cpp 🌈ThreadPool.h 🌈ThreadPool.cpp 🌈ChildTask.h  🌈ChildTask.cpp 🌈BaseTask.h 🌈BaseTask.cpp 三、测试效果 四、总结 📌创建线程池的好处 本文主要学习 Linux内核编程 ,结合

    2024年01月16日
    浏览(82)
  • 【Linux后端服务器开发】封装线程池实现TCP多线程通信

    目录 一、线程池模块 Thread.h LockGuard.h ThreadPool.h 二、任务模块模块 Task.h 三、日志模块 Log.h 四、守护进程模块 Deamon.h  五、TCP通信模块 Server.h Client.h server.cpp client.cpp 关于TCP通信协议的封装,此篇博客有详述: 【Linux后端服务器开发】TCP通信设计_命运on-9的博客-CSDN博客 线程池

    2024年02月16日
    浏览(35)
  • 通过OpenIddict设计一个授权服务器02-创建asp.net项目

    在这一部分中,我们将创建一个ASPNET核心项目,作为我们授权服务器的最低设置。我们将使用MVC来提供页面,并将身份验证添加到项目中,包括一个基本的登录表单。 正如前一篇文章中所说,授权服务器只是另一个web应用程序。以下内容将指导您使用用户名密码登录来设置

    2024年01月18日
    浏览(37)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(44)
  • linux服务器创建新用户

    无论是创建新用户还是删除某个用户,都需要拿到root用户的密码,才有权限创建删除。 首先进入root账户,输入以下指令,created_name 是我们创建的用户名,可以换成你想要创建的用户名称。 按回车后,输入如下指令设置账户密码 按回车后,在 New password 后面输入设置的密码

    2024年02月16日
    浏览(35)
  • 迁移Linux服务器用户数据(将一个服务器的Linux用户数据迁移到另一个Linux服务器用户的流程)

    先来到根目录,再使用tar命令打包数据: tar czvf root.zip.gz ./* 在根目录使用指令: scp 打包好的数据 用户@ip:目的用户下的某个目录 源Linux服务器用户 : 查看压缩包是否到达: 对收到的数据进行解压,使用指令 tar xzvf root.zip.gz 解压到当前目录下。 目的Linux服务器用户 : 看到

    2024年02月08日
    浏览(40)
  • 如何将linux数据从一个服务器复制到另外一个服务器

    首先先要确定两台服务器之间可以通讯 可以使用ping 服务器的地址查看是否通信 然后使用下面的步骤进行通讯 可以使用scp命令来在Linux系统中将文件或目录从一台服务器复制到另一台服务器。 语法为:scp [选项] 源路径 目标地址 其中,[选项]包括但不限于: 命令参数: 示例

    2024年01月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包