小编Col*_*sey的帖子

管理可变状态的最佳方法是什么?

我刚刚在Coursera完成了Martin Odersky的scala课程.Scala是我的第一个FP语言,我对限制可变状态的想法很兴奋.这允许更容易的并发性并且还使代码超级可维护.

在学习所有这些的同时,我意识到你可以保证对象的可变性,只要它没有可变变量并且只引用了不可变对象.所以现在我可以通过创建一个新状态而不是修改旧状态来做任何事情,尽可能使用尾递归.

大.所以我到目前为止只能做到这一点.在某些时候,我的应用程序需要能够修改一些现有的状态.我知道在这一点上放入并发控制的地方,锁定,等等等等.我仍然默认使用我一直使用的标准多线程并发控制.

哦斯卡拉社区,还有更好的方法吗?莫纳德也许?

编辑:这个问题有点笼统,所以我想给出一个用例:我有一个机器学习算法,可以存储几个数据集合.它们具有返回数据(训练等)的更新表示的函数,所有函数都是不可变的.最终,我可以将这个返回更新状态模式保持在运行模拟的实际对象上.它具有可变的状态并保存对集合的引用.我可能想分发到多核或多系统.

scala

5
推荐指数
1
解决办法
3305
查看次数

在具有多个(物理)CPU 的系统上的多线程进程中,如何处理线程调度?

这是一个广泛的问题,但我很好奇在具有多个物理 CPU 的机器上的单个进程应用程序中线程调度的细节。

编辑 - 想澄清下面我在谈论物理 CPU。我已经很好地处理了进程/线程如何与多核 CPU 一起工作,但我说的是主板上的多个物理 CPU 染料(如 2 个 4 核至强)。

答案 - 多亏了 Brokenfoot 和 nosid 的回应,我想我已经明白了: - Linux 调度程序有不同的 NUMA 策略,这些策略会影响线程调度,因为它们与内核/染料有关的内存突变/访问模式。- 染料之间的缓存一致性是可能的,但速度比预期的要慢。- 最佳行动方案 - 控制共享内存的可变性(尽量保持不变) - 使用尊重线程局部性的内部(进程内)任务调度程序 - 使用与进程内任务调度程序配合使用的 NUMA 策略

假设:

  • 缓存一致性是允许多个内核在共享内存上运行的魔法。(确认的)
  • 据我所知,缓存一致性在多个 CPU 上是可能的,但性能会降低(Linux 3+,系统有多个现代多核 Xeons CPU)。(确认的)

所以情况:

  • 我有一个多线程的单进程服务,它可以并行执行......东西。它可以有效地利用多个内核并以通常避免 cpu-core 缓存未命中和一致性滥用的方式划分工作。Executor 对任务具有相对的线程亲和性。
  • 服务线程可以在进程中使用共享数据(大部分是不可变的)。
  • 服务架构的实现方式可以在同一个机器上运行多个进程,但每个机器只有 1 个进程(共享缓存、资源等)是有利的。

问题:

  • 多个 CPU 之间是否可以实现缓存一致性?实用吗?(这是,性能降低)
  • linux 将如何调度 CPU 之间的线程?(如果可能的话)
  • 有没有办法将进程固定到单个 CPU?(确认的)
  • 最终......我是否为每个 CPU 和 pin 执行一个进程?或者每盒 1 个(这会很酷,如果我不会因为慢速的跨 CPU 缓存未命中而自欺欺人)(开始听起来像 1 个进程是好的,只要我的并行任务与某个线程有关联并且大部分是不可变的数据)

linux parallel-processing multithreading process linux-kernel

3
推荐指数
1
解决办法
1603
查看次数