精华内容
下载资源
问答
  • #include stdio.h #define KEY 0x97 //进行异或的字符unsigned char buf[] = "shellcode"; int main(int argc, char* argv[]){ unsigned char c[sizeof(buf)]; //获取shellcode长度 for (int i = 0;...
  • 如果有10个线程同时申请内存,而使用同步的话,效率比较低,那么如何保证这10个线程都能申请到内存????
  • linux线程内存开销

    千次阅读 2018-12-10 17:21:07
    1.首先是线程自己栈,程序没设置过,就是默认的,ulimit -s 中的值,现在一般都是... 这个主要是用来解决,线程申请内存时,互相竞争的问题。每个线程优先在这个空间内申请堆空间 如何判断线程是否采用了 pe...

    1.首先是线程自己栈,程序没设置过,就是默认的,ulimit -s 中的值,现在一般都是10240(单位KB)。

    2.跟版本有关,是否有 glibc 的 malloc per thread arenas 特性,有了这个特性,设置不好,一个新线程要增加至少64MB的内存,

      这个主要是用来解决,线程申请堆内存时,互相竞争的问题。每个线程优先在这个空间内申请堆空间

    如何判断线程是否采用了 per thread arenas 呢?最简单的看大小嘛,gdb到程序上,每创建一个线程的时候去看/proc/<pid>/status,

    比较虚拟内存增长值,如果大致多了64M+栈空间大小,那就是启用了。

    如果还不能确定的话,那就去看/proc/<pid>/smaps,文件中是否有类似

    2adf40021000 (65404 KB)  ---p (00:00 0)

    属性是---p,大小是65404KB的段,这个就是arenas,也证明采用了per thread arenas

    Arena
    arena的数量由系统的核数量决定。

    32位系统:
    arena的数量 = 2 * 核的数量
    64位系统:
    arena的数量 = 8 * 核的数量

    展开全文
  • C++编程中常见的线程内存问题

    千次阅读 2017-11-01 18:31:40
    最近在梳理一些的知识,这儿汇总一下C++中经常遇到的线程内存问题,以便后续注意。线程问题:丢失更新、脏读、死锁等 避免多线程使用线程不安全的函数 避免多线程读写的数据不加锁保护 避免相互调用的函数加成同一...

    最近在梳理一些的知识,这儿汇总一下C++中经常遇到的线程和内存问题,以便后续注意。

    线程问题:丢失更新、脏读、死锁等

    • 避免多线程使用线程不安全的函数
    • 避免多线程读写的数据不加锁保护
    • 避免相互调用的函数加成同一把锁造成死锁

    内存问题:覆盖、溢出、非法等

    ● 使用未初始化的内存
    全局变量和局部变量初始值为0,而局部变量和动态申请的变量,初始值随机。如果程序使用了随机值的变量,那么程序结果也就可能莫名其妙。

    ● 非法指针
    包括空指针或随意使用指针转换

    ● 内存读写越界
    内存越界是指访问了没有权限访问的内存地址空间。比如对访问数组时越界、对动态内存访问超出申请内存大小等。

    ● 内存覆盖
    C和C++强大之处就是可以直接操作内存,但是一旦内存区域发生重叠,就会导致程序发生不可预期的结果。

    ● 动态内存管理错误
    内存分配方式:静态存储、栈上内存、堆上分配
    ○ 申请和释放不一致
    比如用new申请的,用free释放
    ○ 申请和释放不匹配
    申请了多少内存,就要释放多少内存。如果没有释放就是内存泄露,如果释放多次也会发生问题。
    ○ 释放后仍然读写
    动态内存链表中,内存被释放,那就可能分配给其他部分使用,如果内存释放后再访问,就可能覆盖其他部分的内存,从而导致不可预期的错误。

    ● 内存泄露
    是指在程序动态申请的内存,使用完后既没有被释放,又无法被程序其他部分访问。内存泄露是开发大型程序最头痛的问题,关键是要养成良好的编程习惯。

    ● 堆栈溢出
    不要使用大的局部变量(栈大小是固定,比如8M),这样容易造成堆栈溢出,导致莫名其妙的错误。

    展开全文
  • 线程分离 - 线程也会内存泄漏

    千次阅读 2020-05-03 17:12:48
    线程分离 - 线程也会内存泄漏 线程退出后,释放了所有占用的资源嘛? 上述问题我们通过以下代码进行测试,不断地创建线程,每次创建线程计数器加一,只到创建线程失败,打印出已创建的线程数 ​ #...

    线程分离 - 线程也会内存泄漏

    • 线程退出后,释放了所有占用的资源嘛?

      • 上述问题我们通过以下代码进行测试,不断地创建线程,每次创建线程计数器加一,直到创建线程失败,打印出已创建的线程数

         #include <stdio.h>
         #include <unistd.h>
         #include <pthread.h>
         ​
         ​
         void *thread(void *arg)
         {
         ​
         }
         ​
         int main(int args, char *argv[])
         {
                 pthread_t tid = 0;
                 int error_flag = 0;
                 int thread_number = 0;
         ​
                 while(0 == error_flag)
                 {
                         error_flag = pthread_create(&tid, NULL, thread, NULL);
                         //pthread_detach(tid);
                         //pthread_join(tid, NULL);
                         thread_number++;
                         //printf("thread_number is %d\n", thread_number);
         ​
                 }
                 printf("thread_number is %d\n", thread_number);
                 printf("error_flag is %d\n", error_flag);
         ​
                 return 0;
         }
         ​
        • 编译

        • 运行

          • 注释21,22行代码(//pthread_detach(tid); //pthread_join(tid, NULL);),线程创建到3w多次失败

          • 只注释22行代码(//pthread_join(tid, NULL);),线程一直在创建

          • 只注释21行代码(//pthread_detach(tid);),线程一直在创建

          • 21和22行都不注释,该情况在我https://blog.csdn.net/MOSHIWANGJUE/article/details/105856327线程实例5中已经测试,已经分离后的线程无法通过join得到退出状态。

      • 由上述测试结果可知

        • 线程创建时默认情况是非分离的,非分离线程再结束后,线程不会释放自身资源。如果没有将线程资源回收,将产生僵尸线程,当线程将进程的的虚拟空间占据完后,便会引发12号errno错误,无法申请内存。

        • 非分离的线程终止后的退出信息会保存到pthread_join()显示回收后,否则一直保存到所在进程结束。

        • 因此,我们在使用线程时,需要在将线程设置为分离态,或者使用join函数显示回收。

           

    • 设置线程为游离态的两种方法

      • 创建线程后使用detach进行分离,在创建完线程后,使用detach(tid)进行线程分离

      • 创建线程前修改线程属性进行分离

      • 代码实现如下

        #include <stdio.h>
         #include <unistd.h>
         #include <pthread.h>
         ​
         int main(void)
         {
                 pthread_t tid;
                 void *tret;
                 int err;
         ​
         #if 1
         ​
                 pthread_attr_t attr;                    /*通过线程属性来设置游离态*/
                 pthread_attr_init(&attr);
                 pthread_attr_setdetachstate(&attr,      PTHREAD_CREATE_DETACHED);
                 pthread_create(&tid, &attr, tfn, NULL);
         ​
         #else
         ​
                 pthread_create(&tid, NULL, tfn, NULL);
                 pthread_detach(tid);         //让线程分离  ----自动退出,无系统残留资源
         ​
         #endif
         ​
                 while (1) {
                         err = pthread_join(tid, &tret);
                 printf("-------------err= %d\n", err);
                         if (err != 0)
                                 fprintf(stderr, "thread_join error: %s\n", strerror(err));
                         else
                                 fprintf(stderr, "thread exit code %d\n", (int)tret);
         ​
                         sleep(1);
                 }
         ​
                 return 0;
         }
         ​

         

    展开全文
  • 线程内存

    千次阅读 2010-02-04 16:53:00
    1、单线程内存池 内存池的基本思想是大块向系统申请内存,内部切割为小块,内部cache之后有选择的分配,不够的时候继续向系统大块申请内存,示例代码如下: struct tm_memblock{ tm_memblock *next;};class tm_...

    1、单线程内存池

     

    内存池的基本思想是大块向系统申请内存,内部切割为小块,内部cache之后有选择的分配,不够的时候继续向系统大块申请内存,示例代码如下:

     

    struct tm_memblock

    {

            tm_memblock *next;

    };

    class tm_pool

    {

            tm_bufunit *next;           //pool中自由块链

            tm_memblock *mbk;              //trunk

    };

     

    void *tm_pool::newobj()

    {

            if(! next)

            {

                    expand();

            }

            tm_bufunit *head = next;

            next = head->next;

            return (void *)head;

    }

     

    void tm_pool::delobj(void *pbuf)

    {

            tm_bufunit *head = (tm_bufunit*)(pbuf);

            head->next = next;

    next = head;

    }

    详细实现建议看云风的内存池,我也不过是学习了它的实现而已。

    不要小看了单线程内存池,它是我们走向更复杂应用的基础,它是我们后面提及的多线程内存池以及线程关联内存池的基础。

    这种单线程的内存池分配释放速度是很快的,dlmalloc更快近1倍,大约相当于malloc/free50-100(具体倍率视分配的大小而不同,分配小块倍率小,分配大块倍率大)

     

    有的朋友可能会考虑使用std::list之类的东西来构建内存池,我奉劝有这种想法的人打住,std::list是效率很低的,此外用一个高层的东西构建底层模块,总体上属于本末倒置。

     

     

    展开全文
  • 线程的工作内存

    千次阅读 2017-04-21 14:48:39
    所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的。看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓存的抽象描述。    ...
  • 1.2JAVA内存模型(JMM) 1.3常见的可见性错误 2.解决方案 2.1synchronized关键字 2.2volatile关键字 前言 可见性是一种复杂的属性,因为其错误总会违背我们的直觉。在单线程环境中,如果向某个变量先...
  • 线程内存

    千次阅读 2014-07-18 14:19:43
    如果一个内存池需要线程同步了,估计和默认的内存操作也差不了多远了...多线程内存池在实现上也就是在申请和释放外面包裹了一对加锁和解锁操作而已。如果我们采用模板编程,就可以实现一个功能强悍的模板类,该模板类有
  • 线程关联的内存

    千次阅读 2010-02-04 16:56:00
    4、线程关联的内存池 每每想到单线程内存池飞一般的速度和多线程下蜗牛一般的速度我就不能原谅自己,为什么差这么多,就不能让多线程内存分配更快一点吗?解决方法有了,那就是让缓存线程化,各个线程有自己...
  • 线程内存泄露问题

    千次阅读 2012-07-03 17:56:39
    怀疑是内存不够导致,使用top命令查看内存增长情况,发现有一个进程内存占用率不断增加,检查代码排除掉申请堆空间忘释放情况,上网搜了一下,发现使用pthread_create(&threadid, NULL, func, NULL);形式
  • Linux 多线程内存占用分析

    千次阅读 2014-08-11 22:39:11
    大概现象为,一个很简单的程序逻辑,开启了几个线程,程序本身并没有过多的申请内存,或者说根本没有申请内存,但是在实际运行起来后,通过PS命令和status 查看内存占用居然达到了40M,详细分析了smaps文件没有得到...
  • linux下的多进程 linux下的多进程 C++多线程 C++多线程 C++内存分布 C++内存分布
  • jvm线程栈空间内存分配位置

    千次阅读 2019-05-21 23:44:02
    jvm的线程申请内存空间属于堆外内存,是向操作系统申请的,也不是JVM直接内存,虽然类似。 JVM能创建的线程数需要的内存,不是JVM运行内存,堆内存,直接内存,而是操作系统剩余的可用内存,这个也决定了能创建...
  • 2:C语言mallco函数可以根据输入的值,申请一块连续的内存;free(*p),根据指针头释放连续的内存空间; 3:C语言创建线程 转载于:https://my.oschina.net/craftsdream/blog/1615107
  • C++:多线程内存管理的思考

    千次阅读 2019-08-07 16:55:33
    用 C++ 写多线程算法,如果程序设计过程中完全不用 new、delete、malloc、free 等动态申请、释放内存,理论上讲,变量内存会完全分配在栈上。如果不用全局变量和指针引用,理论上讲,算法可以实现无锁设计。 但问题...
  • 深入浅出多线程编程实战(六)ThreadLocal详解(内存泄漏) 文章目录前言一、内存泄露二、GC回收机制1.强引用与弱引用2.如何找到需要回收的对象三、ThreadLocal 内存泄漏四、...内存泄露为程序在申请内存后,无法释放
  • VC++多线程内存操作的优化

    千次阅读 2007-03-12 14:37:00
    许多程序员发现用VC++编写的程序在多处理器的电脑上运行会变得很慢,这种情况多是由 于多个线程争用同一个资源引起的。对于用VC++编写的程序,问题出在VC++的内存管理的具体实现上。以下通过对这个问题的解释,提供...
  • 线程内存分配器mt_alloc

    千次阅读 2014-09-02 12:05:00
    A fixed-size, multi-thread optimized allocator 原文URL:... 简介 ...mt allocator是一个固定大小(2的幂)内存的分配器,最初是为多线程应用程序(以下简称为MT程序)设计的。经过
  • Tomcat调优总结【内存线程

    万次阅读 2017-11-13 11:31:13
    本文,主要讲的是tomcat内存线程方面的优化 1.调整tomcat的内存 Java 的内存模型分为: Young,年轻代(易被 GC)。Young 区被划分为三部分,Eden 区和两个大小严格相同的 Survivor 区,其中 Survivor 区间中...
  • 定位多线程内存越界问题实践总结

    千次阅读 2014-03-14 16:57:09
    最近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程内存而导致程序core掉的问题。定位这个问题花了整整一周的时间,期间历经曲折,尝试了各种内存调试的办法。往往感觉...
  • 线程内存分配器mt_alloc

    千次阅读 2008-05-16 12:26:00
    size, multi-thread optimized allocator原文URL:http://list.cs.brown.edu/people/jwicks/libstdc++/html/ext/mt_allocator.html简介mt allocator是一个固定大小(2的幂)内存的分配器,最初是为多线程应用程序...
  • 线程内存池实现代码-双链表

    千次阅读 2013-05-24 16:19:03
    一下代码为一个简单的多线程内存池实现,内存池block块大小固定,采用双链表实现block申请、释放管理。 比较简单,参考注释和readme基本可以看懂,不多介绍了。 #ifndef _MEMPOOL_H_ #define _MEMPOOL_H_ /*...
  • java 多线程编程之内存模型

    千次阅读 2013-07-23 14:57:27
    要认识java线程安全,必须了解两个主要的点:java的内存模型和java的线程同步机制。 特别是内存模型,Java的线程同步机制很大程度上都是基于内存模型而设定的。 浅谈Java内存模型 不同的平台内存模型是不一样的,...
  • java内存模型与线程

    千次阅读 2016-05-15 23:20:23
    Java内存模型规定了所有的变量都存储在主内存中(此处的主内存仅仅指虚拟机内存),每条线程还有自己的工作内存线程的工作内存中保存了被线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,195
精华内容 59,278
关键字:

线程申请内存