相关疑难解决方法(0)

进程和线程有什么区别?

进程和线程之间的技术差异是什么?

我感觉像'过程'这样的词被过度使用,还有硬件和软件线程.如Erlang这样的语言轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?

multithreading process

1513
推荐指数
27
解决办法
111万
查看次数

上下文切换的开销是多少?

最初我认为上下文切换的开销是TLB被刷新.但是我刚刚在维基百科上看到:

http://en.wikipedia.org/wiki/Translation_lookaside_buffer

2008年,英特尔(Nehalem)[18]和AMD(SVM)[19]都引入了标签作为TLB条目的一部分,以及在查找期间检查标签的专用硬件.即使这些没有得到充分利用,但可以设想,将来这些标签将识别每个TLB条目所属的地址空间.因此,上下文切换不会导致刷新TLB - 而只是将当前地址空间的标记更改为新任务的地址空间的标记.

以上是否确认较新的Intel CPU TLB不会在上下文切换时刷新?

这是否意味着现在在上下文切换中没有真正的开销?

(我试图理解上下文切换的性能损失)

linux virtualization performance operating-system context-switch

24
推荐指数
3
解决办法
3万
查看次数

IPC共享内存和线程内存之间的性能差异

我经常听到,与访问线程之间的进程内存相比,访问进程之间的共享内存段没有性能损失.换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题).

但我怀疑:

1)shmat()将本地进程虚拟内存映射到共享段.必须为每个共享存储器地址执行此转换,并且可能代表显着的成本.在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规进程中一样.

2)内核必须以某种方式维护共享内存段.例如,当连接到shm的所有进程都被删除时,shm段仍然处于运行状态,并且最终可以被新启动的进程重新访问.可能存在与shm段上的内核操作相关的一些开销.

多进程共享内存系统是否与多线程应用程序一样快?

linux multithreading ipc shared-memory

19
推荐指数
2
解决办法
1万
查看次数

重型线程消耗对ARM(4核A72)与x86(2核i5)的影响

我有一个实时的Linux桌面应用程序(用C编写),我们正在移植到ARM(4核Cortex v8-A72 CPU).在架构上,它结合了高优先级显式pthread(其中6个)和一对GCD(libdispatch)工作队列(一个并发和另一个串行).

我的担忧有两个方面:

  • 我听说ARM没有超越x86的方式,因此我的4核已经是上下文切换以跟上我的6 pthreads(和后台进程).我应该从中得到什么样的性能损失?
    • 我听说我应该期望这些ARM上下文切换效率低于x86.真的吗?
    • 一些pthreads是针对相当罕见的事件的高优先级处理程序,这会改变前景吗?(即他们坐在select声明中)
  • 我更大的担忧来自GCD在这个应用程序中的影响.我对GCD内部工作原理的理解是,它是一个与调度程序交互的动态扩展线程池,并将尝试添加更多线程以适应负载.在我看来,这对我的情景中的性能几乎完全是负面影响.(核心被完全消耗的系统中的IE)正确吗?

parallel-processing operating-system arm multiprocessing grand-central-dispatch

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

线程上下文切换和进程上下文切换的区别

我知道这里对这个问题有一个解释。但我对一些点有点困惑-:

令i有属于进程P1的线程T(1-a)和T(1-b)以及属于进程P2的线程T(2-a)和T(2-b)。

现在我的问题是——

  1. 线程 T(1-a) 想要将上下文切换到线程 T(1-b)。根据这个答案,

    这两种类型(进程上下文切换和线程上下文切换)都涉及将控制权移交给操作系统内核来执行上下文切换(我主要讨论线程上下文切换)。

怀疑

如果T(1-a)和T(1-b)是用户级线程,内核将无法区分T(1-a)和T(1-b),那么上下文切换将如何完成?

  1. 让所有线程 T(1-a)、T(1-b)、T(2-a) 和 T(2-b) 都是内核级线程,如果线程 T(1-a) 想要上下文切换到 T( 2-b)。

怀疑

成本/交易不会与进程上下文切换相同吗,因为不仅虚拟内存空间发生变化,而且 TLB 也被刷新?

multithreading computer-science operating-system context-switch

4
推荐指数
1
解决办法
1914
查看次数

如何在不阻塞主线程的情况下“触发并忘记”任务?

我想到的是一个非常通用的BackgroundTask 类,可以在网络服务器或独立脚本中使用,以安排不需要阻塞的任务。

我不想在这里使用任何任务队列(celery、rabbitmq 等),因为我正在考虑的任务太小且运行速度太快。只是想尽可能地完成它们。这是一种异步方法吗?将它们扔到另一个进程上?

我想出的第一个可行的解决方案:

# Need ParamSpec to get correct type hints in BackgroundTask init
P = ParamSpec("P")


class BackgroundTask(metaclass=ThreadSafeSingleton):
    """Easy way to create a background task that is not dependent on any webserver internals.

    Usage:
        async def sleep(t):
            time.sleep(t)

        BackgroundTask(sleep, 10) <- Creates async task and executes it separately (nonblocking, works with coroutines)
        BackgroundTask(time.sleep, 9) <- Creates async task and executes it separately (nonblocking, works with normal functions)
    """

    background_tasks = set()
    lock = threading.Lock()

    def __init__(self, func: …
Run Code Online (Sandbox Code Playgroud)

python multithreading asynchronous

4
推荐指数
1
解决办法
2941
查看次数