- 主题:Linux应用程序新创建一个线程,线程栈是放在哪里的?
线程可以有无穷多个。不会是固定的位置。每个栈用 mmap 申请一段内存作为线程的栈空间。你可以搜一下 MAP_STACK 和 MAP_GROWSDOWN,都是专门为栈空间设计的。一起使用时,线程可以申请 128M 的栈空间,但实际系统只分配 64K,剩下的等用到了再分配。
【 在 wjhtingerx 的大作中提到: 】
: 是有固定的地方,还是在内存空间动态申请个地址,随机的?
--
FROM 117.28.152.*
这个是 unix 系统提供的一个系统调用,普通程序向内核申请内存。
虽然每个 amd64 的应用程序都能看到 2 ** 64 字节的内存空间,但是随便往里面读写数据是不行的。得先向内存申请一下内存空间。
mmap() 除了可以申请未使用的内存,还可以把文件的内容映射到内存里面。读写这段内存相当于读写文件。所以叫做 memory map.
【 在 JulyClyde 的大作中提到: 】
: 为什么是mmap?
--
FROM 117.28.152.*
申请的栈空间,一定是可读可写的,这个权限是针对整个进程的。举个例子:
线程1:
byte buf[1024];
command_to_bytes(buf, command);
mq.process(buf);
// buf is changed
线程2:
byte[] buf = mq.get();
command_from_bytes(buf, &command);
result = process(command);
result_to_bytes(buf, result);
在线程 2 里面修改线程 1 的栈是可行的吧,虽然说不是很安全。
【 在 JulyClyde 的大作中提到: 】
: 页表里不是设置了权限吗?
--
FROM 117.28.152.*
mmap() 也可以申请内存的。不止 brk.
我没有确认,不过我猜大多数情况下,线程栈都是调用 mmap() 而不是 brk() 来申请内存,因为 mmap() 有 MAP_STACK 和 MAP_GROWDOWN 这两个标志位。哪位大佬确认一下。
进程的堆才用 brk
【 在 JulyClyde 的大作中提到: 】
: mmap不是把文件映射到内存地址吗?
: 申请内存不是brk syscall吗?
--
修改:hgoldfish FROM 117.28.152.*
FROM 117.28.152.*