zoukankan      html  css  js  c++  java
  • Linux进程栈和线程栈

    参考资料:

    http://blog.csdn.net/xhhjin/article/details/7579145

    总结:

        1、进程的栈大小是在进程执行的时刻才能指定的,即不是在编译的时候决定的,也不是在链接的时候决定的

        2、进程的栈大小是随机确定的至少比线程栈要大,但是不到线程栈大小的2倍

        3、线程栈大小是固定的,也就是ulimit -a 显示的值

     

    查看线程栈大小:

    ulimit

    可以看到默认情况下线程栈大小为8192(8MB),可以使用ulimit -s xxx修改线程默认栈大小

    (1)检查线程栈默认大小(8KB)

    stacksize

        线程执行2030次之后,出现段错误(2030*4K=8120K)

    stacksize_error

     

    (2)修改栈大小,使用pthread_attr_setstack()

    setattribute

        如上修改栈大小为16MB,其中线程栈的空间从堆中进行分配

    setattribute_error

       程序执行4063次后出现段错误(4063*4KB)

     

    (3)创建两个线程,使用默认栈大小执行

    twothread

        创建两个线程,默认单个线程栈大小为8M

    twothread1_error

        执行结果1:程序执行4009次之后段错误(4009*4KB)

    twothread2_error

        执行结果2:程序执行3380次之后段错误(3380*4KB)

    总结:

            两个线程时,两个线程栈的总和不是固定值,也不是线程栈的2倍

     

    (3)不使用任何线程

    nothread

    nothread1_error

    执行结果1:程序执行2538次后段错误(2538*4KB)

    nothread2_error

    执行结果2:程序执行2537次后段错误(2537*4KB)

    总结:

        进程的栈大小不是固定的,而是比线程栈大一些

     

    (4)线程栈从进程栈中分配

    getstacksize

    getthreadsize1_error

    执行结果1:   程序执行2536次后段错误(2536*4KB>8M)

    getstacksize2_error

        执行结果2:程序执行2537次后段错误(2537*4KB>8M)

    总结:

        线程从进程栈分配空间,大小并不是固定的,如果分配空间大于进程栈空间,那么直接运行时出现段错误。

     

    关于进程栈和线程栈总结:

        (1)进程栈大小时执行时确定的,与编译链接无关

        (2)进程栈大小是随机确认的,至少比线程栈要大,但不会超过2倍

        (3)线程栈是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改

  • 相关阅读:
    PHP设计模式——观察者模式
    TRIZ系列-创新原理-34-抛弃和再生部件原理
    玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
    高速排序算法C++实现
    crm操作报价单实体
    CSS3 网格布局(grid-layout)基础知识
    shadowOffset 具体解释
    [软件人生]关于此次抄袭事件的一个对话
    SpringMVC接收复杂集合对象(参数)代码示例
    Spring MVC同时接收一个对象与List集合对象
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3680312.html
Copyright © 2011-2022 走看看