1
lindt99cocoa 67 天前
Linux 只有 task ,进程和线程都是在 task 的基础上抽象出来的,通常说的栈就是 task 的栈
|
2
GeekGao 66 天前 1
进程作为容器,有自己的初始栈(每个进程至少包含一个线程,即主线程)也就是主线程的栈
每个线程都有自己的私有栈 所有的栈都在进程的地址空间内 我认为核心根结在于:在 Linux 中,进程和线程都是通过相同的数据结构( task_struct )表示。所以就有与教材不一致的理解。 很多系统对于进程设计,不同于 Linux ,例如早期的 Unix 、Plan 9 或是一些嵌入式系统等等。 |
3
restkhz 66 天前 18
这个有点钻牛角尖,个人理解,我打个比方吼:
如果有项目组(进程),那么至少应该有一名员工在做事(执行流)。如果要有一名员工办事,那么至少应该给他一个办公桌(栈)。一个有办公桌能拿文档的能做事的员工叫做线程。 所以 OP 的问题可以当作: 项目组有自己的办公桌吗? |
4
david98 66 天前 1
linux 中进程相当于线程组,也就是一群共享内存地址空间的线程 线程之间都能看到对方内存数据 变量等。第一个线程的 id 就作为组 ID 也就是进程 ID 而已
|
5
dumbbell5kg OP @GeekGao “ 每个进程至少包含一个线程”,那进程和主线程是有各自的 task_struct 吗,还是进程本身就是主线程?
|
7
3apiosexual 66 天前
@restkhz 赞
|
8
PTLin 66 天前 1
@dumbbell5kg 不要进程线程这些被名词所困扰。
对于 Linux 来讲,可以理解为只有调度单位 task_struct ,每一个调度单位都有自己的内核栈,以供系统调用以及中断处理过程使用。 假如某几个调度单位共享了:地址空间,打开的文件,信号处理 handle ,等资源,那这一组调度单位的集合就是一个进程,集合中每一个都是一个线程。例如 pthread_create 的实现就是调用了 clone 设置了些共享资源。 |
9
whosesmile 66 天前
程序执行就要分配内存,内存里面是必须的数据,不管进程还是线程,都要有自己的堆栈来保存程序执行中的数据,然后语言会设计一套逻辑来查找和编辑数据。
至于说进程内新启动的线程是否可以共享进程的堆栈,要看你的程序设计和语言本身;而进程如果没有堆栈,它怎么管理自己的程序数据呢? |
10
echoechoin 66 天前
进程肯定有栈了,切换进程的栈,就是在切换进程
|
11
zzz22333 66 天前
|
12
GeekGao 66 天前 1
@dumbbell5kg "进程和主线程是有各自的 task_struct 吗"
1.进程和线程在内核层面并没有严格的区分。每个进程至少包含一个线程,即主线程。 2.主线程的 task_struct 就是进程的 task_struct 。 3.新创建的线程也会有自己的 task_struct 。这个 task_struct 与主线程的 task_struct 非常相似 只是共享了一些资源。 |
13
GeekGao 66 天前 1
|
14
dumbbell5kg OP @GeekGao 感谢!
|
15
dumbbell5kg OP @PTLin 通透!
|
16
PTLin 66 天前 1
@dumbbell5kg 你要想搞明白建议买一本好点的内核书籍,详细学习一下 switch_to ,switch_mm 都代表着什么,为什么需要内核栈,中断和 syscall 是怎样切换到内核栈的,内核栈所在的地址空间和用户地址的关系。
Linux 内核设计与实现这书是教不会人的,讲的太笼统。 |
18
PTLin 66 天前 1
|