Multithreading 拍摄线程的快照

Multithreading 拍摄线程的快照,multithreading,concurrency,multiprocessing,Multithreading,Concurrency,Multiprocessing,我有一个由许多线程(100多个线程)组成的程序。因为有很多线程,程序所需的内存非常昂贵,所以我不能在我的电脑上运行它 我有一个运行这个程序的想法。让线程数为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

我有一个由许多线程(100多个线程)组成的程序。因为有很多线程,程序所需的内存非常昂贵,所以我不能在我的电脑上运行它

我有一个运行这个程序的想法。让线程数为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
1-i=1,flag=false
2-如果(flag==true)从快照文件[i]、文件[i+1]、…、文件[i+9]重建线程[i]、线程[i+1]、…、线程[i+9]
3-运行线程[i]、线程[i+1]、…、线程[i+9]一秒钟
4-拍摄线程[i]、线程[i+1]、…、线程[i+9]的快照,并将快照写入文件[i]、文件[i+1]、…、文件[i+9]
5-终止线程[i]、线程[i+1]、…、线程[i+9]
6-i=i+10
7-如果(i<100)转到第3行
否则i=1,flag=true,转到第2行

如何用C++或C语言实现这个概念?

< P>我担心你正在考虑实现OS的大部分,而不知道操作系统在为你做什么。 操作系统管理虚拟内存和正在运行的线程。如果您有很多线程,并且每个线程中都有很多数据,那么如果总内存使用量超过RAM,那么运行所有这些线程将是一个挑战。但是,操作系统将使用某种描述的页面文件作为计算机虚拟内存系统的一部分。这导致虚拟内存大小受到HDD大小的限制,而不是受已安装RAM的限制

现在,您将讨论备份/恢复线程。去哪里?想必你是指磁盘。但是,您的程序自己备份/恢复到磁盘,操作系统通过虚拟内存系统及其页面文件为您备份/恢复到磁盘,两者之间没有根本区别。在这两种情况下,您最终得到的数据都无法放入存储在磁盘上的RAM中:

  • 如果您只是在线程中分配和填充内存,操作系统将通过页面文件在后台为您完成所有工作,最重要的是,您不必编写任何代码来完成这些工作

  • 但是,如果您编写程序来将数据保存/恢复到硬盘,那么您已经编写了大量源代码,并且最终不会得到比让操作系统继续使用更好的结果

因此,如果这两种方法最终得到相似的结果,那么性能相似也就不足为奇了。事实就是这样;大量线程对虚拟内存页面文件进行震荡是s-l-o-o-o-w。不同之处在于,操作系统已经开发了很多年,以使其尽可能好(即协调线程调度和有效使用页面文件),而您很可能无法成功击败它

这就是线程池有用的原因。您可以将大量任务提交到线程池,并让线程池管理如何最好地运行这些任务,而不是设置大量线程(每个线程只执行一个任务)。如果单个任务不依赖于另一个任务执行某些操作(如发布信号量等),则此功能尤其强大

如果使用得当,线程池将尽可能仔细检查提交的任务列表,因为它发现自己运行在硬件上。这样,您就不用编写代码来了解自己的机器体系结构(如果您有兴趣将线程数优化为内核数)

它还可能导致虚拟内存系统对页面文件的分页次数大大减少,这意味着HDD抖动将降至最低。这是因为一次运行的线程(当然是任务)要少得多,所以只有这些任务的数据才会被分页到RAM中

那就是我要做的。使用线程池而不是大量单独的线程,依靠操作系统高效地管理所有虚拟内存,并避免编写大量复制操作系统功能的代码


如果这还不够快,那么您要么需要一台更大的计算机,要么开始编写代码,以便在计算机集群中以分布式方式运行。ZeroMQ和OpenMPI只是帮助实现这一点的两种不同方式(OpenMPI是超级计算机的经典选择)。

请告诉我们您真正想要做的是什么,让您认为拥有100个线程就是答案。我不想知道关于线程的事情——只是你试图解决的问题是什么。另外,你不能在不破坏运行时的情况下安全地杀死.NET中的线程。因此,任何带有“kill”或“abort”的解决方案都是行不通的。线程没有那么昂贵(即使它们有1MB的堆栈,那么在现代硬件上运行100也不是问题)。这可能是你在这些线程上所做的。所以这个问题无法回答。