我有一个由许多线程(超过100个)组成的程序。因为有许多线程,程序所需的内存非常昂贵,所以我不能在我的PC上运行它。
我有一个运行这个程序的想法。设线程数为100。
1- i=1, flag = false
2- if(flag == true) reconstruct thread[i], thread[i+1], ..., thread[i+9] from snapshots file[i], file[i+1], ..., file[i+9]
3- run thread[i], thread[i+1], ..., thread[i+9] for one second
4- take a snapshots of thread[i], thread[i+1], ..., thread[i+9], and write the snapshots on file[i], file[i+1], ..., file[i+9]
5- kill thread[i], thread[i+1], ..., thread[i+9]
6- i = i + 10
7- if(i < 100) go to line 3
else i = 1, flag = true, go to line 2
如何用C++或C#实现这个想法?
发布于 2018-06-26 03:51:09
我担心你正在考虑实现操作系统的大部分,而不知道操作系统为你做了什么。
操作系统管理虚拟内存和正在运行的线程。如果你有很多线程,并且每个线程都有大量数据,那么如果总内存使用量超过RAM,那么运行所有这些线程将是一个挑战。但是,操作系统将使用某种描述的页面文件作为计算机中虚拟内存系统的一部分。这导致虚拟内存大小受到HDD大小的限制,而不是已安装的RAM。
现在,您将讨论如何备份/恢复线程。您去哪儿?想必你的意思是磁盘。但是,您的程序执行自己的磁盘备份/恢复和操作系统通过虚拟内存系统及其页面文件为您执行备份/恢复之间没有根本区别。在这两种情况下,您最终都会得到磁盘上存储的RAM无法容纳的数据:
因此,如果这两种方法最终得到类似的结果,那么性能相似也就不足为奇了。确实如此;许多线程颠簸虚拟内存页面文件是s-l-o-w。不同之处在于,操作系统已经开发了很多年,以使其尽可能好(即协调线程调度与有效使用页面文件),您很可能无法成功击败它。
这就是线程池很有用的原因。不是设置许多线程(每个线程执行一个任务),而是将许多任务提交到一个线程池,并让线程池管理如何最好地运行这些任务。如果单个任务不依赖于另一个任务执行某些操作(如发布信号量等),则这一功能尤其强大。
如果使用得当,线程池将尽可能多地处理提交的任务列表,因为它发现自己正在运行的硬件。这使您不必自己编写代码来了解机器架构(如果您对将线程数量优化为内核数量感兴趣)。
它还可能导致虚拟内存系统对页面文件执行的分页操作要少得多,这意味着HDD的抖动将减少到最低限度。这是因为同时运行的线程(任务)要少得多,所以只有这些任务的数据会被分页到RAM中。
这就是我要做的。使用线程池而不是大量独立的线程,依靠操作系统有效地管理所有虚拟内存,并避免编写大量复制操作系统功能的代码。
如果这仍然不够快,那么您将不得不购买一台更大的计算机,或者开始编写代码以跨计算机集群以分布式方式运行。Things ZeroMQ和OpenMPI只是帮助实现这一点的两种不同的方法(OpenMPI是超级计算机专家最喜欢的一种方法)。
https://stackoverflow.com/questions/51017149
复制相似问题