Multithreading RAM中的多线程布局是什么样子的
我试图弄清楚RAM中的多线程布局是什么样子的。我从谷歌上得到了下面的图片: 这张图片似乎告诉我每个线程都有自己的堆栈,这就是我们所知道的 所以我认为多线程进程需要更多的内存空间 然后我用C++11做了这样一个测试: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
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;
}