V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dumbbell5kg
V2EX  ›  程序员

进程有自己的栈吗

  •  
  •   dumbbell5kg · 79 天前 · 2953 次点击
    这是一个创建于 79 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • CPU 的调度单位是线程,所以我认为只有线程有栈,而进程没有
    • 如这个答案里的说法我是比较赞同的 https://stackoverflow.com/questions/2131832/whats-the-difference-between-a-threads-stack-and-a-processs-stack
    • 但是看书的时候又经常看到进程栈这个词,比如《操作系统概念》、《 Linux 内核设计与实现》
    • 书里说到 Linux 中进程和线程的实现仅是共享资源程度的不同,所以 Linux 中的进程和线程一样是有栈的?如果是这样,那进程的栈是用来做什么的?
    19 条回复
    lindt99cocoa
        1
    lindt99cocoa  
       79 天前
    Linux 只有 task ,进程和线程都是在 task 的基础上抽象出来的,通常说的栈就是 task 的栈
    GeekGao
        2
    GeekGao  
       79 天前   ❤️ 1
    进程作为容器,有自己的初始栈(每个进程至少包含一个线程,即主线程)也就是主线程的栈
    每个线程都有自己的私有栈
    所有的栈都在进程的地址空间内

    我认为核心根结在于:在 Linux 中,进程和线程都是通过相同的数据结构( task_struct )表示。所以就有与教材不一致的理解。

    很多系统对于进程设计,不同于 Linux ,例如早期的 Unix 、Plan 9 或是一些嵌入式系统等等。
    restkhz
        3
    restkhz  
       79 天前   ❤️ 18
    这个有点钻牛角尖,个人理解,我打个比方吼:

    如果有项目组(进程),那么至少应该有一名员工在做事(执行流)。如果要有一名员工办事,那么至少应该给他一个办公桌(栈)。一个有办公桌能拿文档的能做事的员工叫做线程。

    所以 OP 的问题可以当作:
    项目组有自己的办公桌吗?
    david98
        4
    david98  
       79 天前   ❤️ 1
    linux 中进程相当于线程组,也就是一群共享内存地址空间的线程 线程之间都能看到对方内存数据 变量等。第一个线程的 id 就作为组 ID 也就是进程 ID 而已
    dumbbell5kg
        5
    dumbbell5kg  
    OP
       79 天前
    @GeekGao “ 每个进程至少包含一个线程”,那进程和主线程是有各自的 task_struct 吗,还是进程本身就是主线程?
    gbw1992
        6
    gbw1992  
       79 天前
    @restkhz #3 这比喻打的挺好,我看标题也一愣,赶紧点进来学习学习。
    3apiosexual
        7
    3apiosexual  
       79 天前
    @restkhz
    PTLin
        8
    PTLin  
       79 天前   ❤️ 1
    @dumbbell5kg 不要进程线程这些被名词所困扰。
    对于 Linux 来讲,可以理解为只有调度单位 task_struct ,每一个调度单位都有自己的内核栈,以供系统调用以及中断处理过程使用。
    假如某几个调度单位共享了:地址空间,打开的文件,信号处理 handle ,等资源,那这一组调度单位的集合就是一个进程,集合中每一个都是一个线程。例如 pthread_create 的实现就是调用了 clone 设置了些共享资源。
    whosesmile
        9
    whosesmile  
       79 天前
    程序执行就要分配内存,内存里面是必须的数据,不管进程还是线程,都要有自己的堆栈来保存程序执行中的数据,然后语言会设计一套逻辑来查找和编辑数据。
    至于说进程内新启动的线程是否可以共享进程的堆栈,要看你的程序设计和语言本身;而进程如果没有堆栈,它怎么管理自己的程序数据呢?
    echoechoin
        10
    echoechoin  
       79 天前
    进程肯定有栈了,切换进程的栈,就是在切换进程
    zzz22333
        11
    zzz22333  
       79 天前
    进程肯定是有栈的,线程是进程的执行单位,也就说一个进程中的多个线程都是用的进程的栈。 详情可以看这张图。
    GeekGao
        12
    GeekGao  
       79 天前   ❤️ 1
    @dumbbell5kg "进程和主线程是有各自的 task_struct 吗"

    1.进程和线程在内核层面并没有严格的区分。每个进程至少包含一个线程,即主线程。
    2.主线程的 task_struct 就是进程的 task_struct 。
    3.新创建的线程也会有自己的 task_struct 。这个 task_struct 与主线程的 task_struct 非常相似
    只是共享了一些资源。
    GeekGao
        13
    GeekGao  
       79 天前   ❤️ 1
    dumbbell5kg
        14
    dumbbell5kg  
    OP
       79 天前
    @GeekGao 感谢!
    dumbbell5kg
        15
    dumbbell5kg  
    OP
       79 天前
    @PTLin 通透!
    PTLin
        16
    PTLin  
       79 天前   ❤️ 1
    @dumbbell5kg 你要想搞明白建议买一本好点的内核书籍,详细学习一下 switch_to ,switch_mm 都代表着什么,为什么需要内核栈,中断和 syscall 是怎样切换到内核栈的,内核栈所在的地址空间和用户地址的关系。
    Linux 内核设计与实现这书是教不会人的,讲的太笼统。
    ginakira
        17
    ginakira  
       79 天前
    @PTLin 求推荐内核书哪本讲的比较好
    PTLin
        18
    PTLin  
       79 天前   ❤️ 1
    ginakira
        19
    ginakira  
       79 天前
    @PTLin 感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:47 · PVG 19:47 · LAX 03:47 · JFK 06:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.