Multithreading RAM中的多线程布局是什么样子的

Multithreading RAM中的多线程布局是什么样子的,multithreading,memory-management,memory-layout,Multithreading,Memory Management,Memory Layout,我试图弄清楚RAM中的多线程布局是什么样子的。我从谷歌上得到了下面的图片: 这张图片似乎告诉我每个线程都有自己的堆栈,这就是我们所知道的 所以我认为多线程进程需要更多的内存空间 然后我用C++11做了这样一个测试: int main() { return 0; } 我编译上面的代码,得到一个大小为12K的可执行文件 void func() { std::this_thread::sleep_for(std::chrono::milliseconds(5000)); i

我试图弄清楚RAM中的多线程布局是什么样子的。我从谷歌上得到了下面的图片:

这张图片似乎告诉我每个线程都有自己的堆栈,这就是我们所知道的

所以我认为多线程进程需要更多的内存空间

然后我用C++11做了这样一个测试:

int main()
{
    return 0;
}
我编译上面的代码,得到一个大小为12K的可执行文件

void func()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    int i = 1;
    cout << &i << endl;
}

int main()
{
    return 0;
}
添加螺纹后,尺寸变为
52K

void func()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    int i = 1;
    cout << &i << endl;
}

int main()
{
    thread t1(func);
    thread t2(func);
    thread t3(func);
    thread t4(func);
    thread t5(func);
    thread t6(func);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    t5.join();
    t6.join();

    return 0;
}
void func()
{
std::this_线程::sleep_for(std::chrono::毫秒(5000));
int i=1;

cout运行时内存分配(和布局)与程序可执行文件大小和“堆栈”不同不是程序可执行文件的一部分。想象一下,如果有一个循环基于命令行选项启动2个或100个线程。运行时选项肯定不能更改已编译的可执行文件大小!程序大小的增加基于所使用的新功能,包括模板实例化、所需的静态链接和编写的代码;以及“添加更多线程”的行同时增加程序大小;仅以字节为单位,不会引起注意。tldr;可执行\u映像\u大小!=RAM\u或\u内存_usage@user2864740因此,对于多线程进程的运行时内存分配,每个线程都有自己的堆栈?这意味着所有线程都将拥有自己的物理内存,或者线程可以使用/共享same物理内存?每个线程都有自己的堆栈空间,这样它们就可以在不影响其他线程的情况下修改自己的堆栈。内存和资源(包括加载的程序代码)通常是共享的。请注意,在图像中,“文本+数据”表示程序可执行文件-无论线程数多少,该文件都不会更改(每个线程都有自己的堆栈,同时共享相同的“文本+数据”和堆,如右图所示)。
void func()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    int i = 1;
    cout << &i << endl;
}

int main()
{
    thread t1(func);
    thread t2(func);
    thread t3(func);
    thread t4(func);
    thread t5(func);
    thread t6(func);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    t5.join();
    t6.join();

    return 0;
}