qq_37497603
qq_37497603
采纳率60%
2017-04-30 10:13

关于stack管理的一些软件硬件问题

40
已采纳

有些操作系统一个process会分为多个threads,每个thread会有自己的stack,,请问在主存一个stack区是分为多个small stacks吗???如果是,,这大概是怎么管理的

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • iamoyjj 欧阳嘉 4年前

    简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。
    另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
    同一个进程的多个子线程在进程的共享内存中分配独立的栈空间
    栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是thread safe的。每个C++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。

    点赞 评论 复制链接分享
  • iamoyjj 欧阳嘉 4年前

    这个地址的分配是如何管理的和操作系统是强相关的
    在Linux系统上每一个线程,实际上都有独立的2个栈空间,用户栈空间和内核栈空间。(注意是每个线程一个)
    进程和线程在Linux上的唯一区别就是同一个进程的不同线程共享进程的地址空间,仅此而已。
    更多的可以参考:
    http://stackoverflow.com/questions/12911841/kernel-stack-and-user-space-stack
    想要看到这些技术细节,你可以尝试用gdb来跟踪一个多线程的程序,一般我们只能看到用户栈
    你可以尝试用 i register 打印每个线程的SS/ESP寄存器来找到每个线程的栈顶。
    你也可以再跟踪其它的进程。
    从而了解线程的栈地址和进程的栈地址都在什么位置。

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 4年前

    没有什么大堆栈小堆栈之分。每个线程有一个堆栈。堆栈的大小一般是固定的。

    点赞 评论 复制链接分享

相关推荐