进程有自己的栈吗

105 天前
 dumbbell5kg
3000 次点击
所在节点    程序员
19 条回复
lindt99cocoa
105 天前
Linux 只有 task ,进程和线程都是在 task 的基础上抽象出来的,通常说的栈就是 task 的栈
GeekGao
105 天前
进程作为容器,有自己的初始栈(每个进程至少包含一个线程,即主线程)也就是主线程的栈
每个线程都有自己的私有栈
所有的栈都在进程的地址空间内

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

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

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

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

1.进程和线程在内核层面并没有严格的区分。每个进程至少包含一个线程,即主线程。
2.主线程的 task_struct 就是进程的 task_struct 。
3.新创建的线程也会有自己的 task_struct 。这个 task_struct 与主线程的 task_struct 非常相似
只是共享了一些资源。
GeekGao
104 天前
dumbbell5kg
104 天前
@GeekGao 感谢!
dumbbell5kg
104 天前
@PTLin 通透!
PTLin
104 天前
@dumbbell5kg 你要想搞明白建议买一本好点的内核书籍,详细学习一下 switch_to ,switch_mm 都代表着什么,为什么需要内核栈,中断和 syscall 是怎样切换到内核栈的,内核栈所在的地址空间和用户地址的关系。
Linux 内核设计与实现这书是教不会人的,讲的太笼统。
ginakira
104 天前
@PTLin 求推荐内核书哪本讲的比较好
PTLin
104 天前
ginakira
104 天前
@PTLin 感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1070043

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX