当前位置: 首页 > 面试题库 >

性能-多线程或多进程应用程序

谭坚诚
2023-03-14
问题内容

为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是,该应用通常可以在具有多个内核(虚拟或物理)的机器上运行。考虑到性能是关键标准,选择多线程应用程序还是采用多进程设计更好?我确实知道资源共享和从多个进程访问此类资源的同步是很多编程开销,但是如前所述,整体性能是关键要求,因此我们可以忽略这些事情。编程语言为C
/ C ++。

我听说,即使是多线程应用程序(单个进程)也可以利用多个内核,并在不同的内核上独立运行每个线程(只要没有同步问题)。而此调度是由内核完成的。如果是这样,则多线程应用程序和多进程应用程序之间的性能没有太大区别吗?Nginx使用多进程架构,而且速度很快,但是使用多线程应用程序能否获得相同的性能?

谢谢。


问题答案:

linux上的进程和线程彼此非常相似-主要区别在于整个虚拟内存是共享的,并且诸如信号处理之类的某些事物也有所不同。

这样可以在线程之间进行更便宜的上下文切换(不需要昂贵的MMU重新加载等),但并不一定会导致速度差异很大(尤其是在线程创建之外)。

对于设计高度网络密集的应用程序,基本上 唯一的
解决方案是使用事件架构(否则,您将因大量进程/线程使系统陷入瘫痪,并且比实际运行工作代码花费更多的时间进行管理),对套接字上的I /
O做出反应,并根据显示活动的套接字进行适当的操作。

关于这种情况下面临的问题的著名文章是 “ C10k问题”
,可从http://www.kegel.com/c10k.html获得
-它描述了不同的I / O方法,因此尽管有些陈旧,但这是一个很好的介绍。

不过,在深入了解类似反应堆的设计之前,请务必小心-
它们会变得笨拙和复杂,因此请查看您是否无法使用在其上提供更好的抽象的库/语言(Erlang是我个人最喜欢的,带有协程的语言)像Go一样有用)。



 类似资料:
  • 问题内容: 我有一个python应用程序,它可以捕获数据集合,并针对该集合中的每个数据执行任务。由于涉及到延迟,因此该任务需要一些时间才能完成。由于这种延迟,我不希望每个数据都随后执行任务,而是希望它们全部并行发生。我应该使用多进程吗?或执行此操作的线程? 我尝试使用线程,但遇到了一些麻烦,通常某些任务实际上不会执行。 问题答案: 如果您确实受到计算的限制,那么使用多处理模块可能是最轻巧的解决方案

  • 问题内容: 所以基本上我创建了这个程序,为redis添加了值。到目前为止,我得到了这个时机: 但是,当我尝试运行多个线程时: 我用set ot得到这个: 为什么我的程序在有 更多 线程的情况下运行 速度较慢 ? __ 我正在运行Linux Ubuntu 11.04和Python 2.7.1。 问题答案: 结果取决于Python的实现,cpython的GIL阻止了并行计算比顺序计算更快。 考虑使用该

  • 服务烧瓶应用程序“服务器”(懒惰加载) 环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。改用生产WSGI服务器。 调试模式:打开 在http://0.0.0.0:9002/上运行(按Ctrl+C退出) 使用stat重新启动 调试器处于活动状态! 调试器PIN:314-390-242线程线程中的异常-1:Traceback(最近的调用为last):文件“/home/user/downlo

  • 我正在开发应用程序(Matt的traceroute windows版本http://winmtr.net/),它创建了多线程,每个线程都有自己的进程(执行ping命令)。 使用阻塞队列(在任务执行之前保留任务) 平丝。JAVA 现在如果我创建多个线程,比如在一个循环中超过500个线程,并在池执行器中执行 执行线程 我确实知道LinkedBlockingQueue在执行任务之前持有任务。每个线程的进

  • 9.3.3 多线程编程的应用 线程原本是操作系统中的概念,是操作系统用于实现系统功能的工具。现在线程已演变成为用户程序可使用的工具,广泛用于应用程序设计。 多线程技术主要用于需要并发执行的场合。例如在很多游戏程序中,都需要维持一个动画场景,而玩家可以通过鼠标或键盘来输入操作指令,控制游戏的进行。假如程序只有一个 控制流,则当程序执行到等待用户输入指令的时候,由于用户输入较慢(相对 CPU 速度来

  • 问题内容: 在多线程应用程序中如何使用Hibernate(例如,每个客户端连接在服务器上启动它自己的线程)。 EntityManager应该仅由EntityManagerFactory创建一次,例如: 还是我必须为每个线程以及关闭EM的每个事务重新创建实体? 我的CRUD方法如下所示: 我要不要每次都跑?还是因为每个人都使用自己的缓存创建自己的EntityManager实例而使我陷入麻烦了? 问题