进程有自己的栈吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
dumbbell5kg
V2EX    程序员

进程有自己的栈吗

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

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

    很多系统对于进程设计,不同于 Linux ,例如早期的 Unix 、Plan 9 或是一些嵌入式系统等等。
    restkhz
        3
    restkhz  
       2024-09-04 04:31:12 +08:00   18
    这个有点钻牛角尖,个人理解,我打个比方吼:

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

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

    1.进程和线程在内核层面并没有严格的区分。每个进程至少包含一个线程,即主线程。
    2.主线程的 task_struct 就是进程的 task_struct 。
    3.新创建的线程也会有自己的 task_struct 。这个 task_struct 与主线程的 task_struct 非常相似
    只是共享了一些资源。
    R4rvZ6agNVWr56V0
        13
    R4rvZ6agNVWr56V0  
       2024-09-04 11:37:26 +08:00   1
    dumbbell5kg
        14
    dumbbell5kg  
    OP
       2024-09-04 12:18:46 +08:00
    @GeekGao 感谢!
    dumbbell5kg
        15
    dumbbell5kg  
    OP
       2024-09-04 12:30:54 +08:00
    @PTLin 通透!
    PTLin
        16
    PTLin  
       2024-09-04 13:00:53 +08:00   1
    @dumbbell5kg 你要想搞明白建议买一本好点的内核书籍,详细学习一下 switch_to ,switch_mm 都代表着什么,为什么需要内核栈,中断和 syscall 是怎样切换到内核栈的,内核栈所在的地址空间和用户地址的关系。
    Linux 内核设计与实现这书是教不会人的,讲的太笼统。
    ginakira
        17
    ginakira  
       2024-09-04 14:57:52 +08:00
    @PTLin 求推荐内核书哪本讲的比较好
    PTLin
        18
    PTLin  
       2024-09-04 16:06:40 +08:00   1
    ginakira
        19
    ginakira  
       2024-09-04 16:19:28 +08:00
    @PTLin 感谢!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3309 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 10:55 PVG 18:55 LAX 02:55 JFK 05:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86