进程和线程之间的技术差异是什么?
我感觉像'过程'这样的词被过度使用,还有硬件和软件线程.如Erlang这样的语言轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
最初我认为上下文切换的开销是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
我经常听到,与访问线程之间的进程内存相比,访问进程之间的共享内存段没有性能损失.换句话说,多线程应用程序不会比使用共享内存的一组进程更快(不包括锁定或其他同步问题).
但我怀疑:
1)shmat()将本地进程虚拟内存映射到共享段.必须为每个共享存储器地址执行此转换,并且可能代表显着的成本.在多线程应用程序中,不需要额外的转换:所有VM地址都转换为物理地址,就像在不访问共享内存的常规进程中一样.
2)内核必须以某种方式维护共享内存段.例如,当连接到shm的所有进程都被删除时,shm段仍然处于运行状态,并且最终可以被新启动的进程重新访问.可能存在与shm段上的内核操作相关的一些开销.
多进程共享内存系统是否与多线程应用程序一样快?
我有一个实时的Linux桌面应用程序(用C编写),我们正在移植到ARM(4核Cortex v8-A72 CPU).在架构上,它结合了高优先级显式pthread(其中6个)和一对GCD(libdispatch)工作队列(一个并发和另一个串行).
我的担忧有两个方面:
select
声明中)parallel-processing operating-system arm multiprocessing grand-central-dispatch
我知道这里对这个问题有一个解释。但我对一些点有点困惑-:
令i有属于进程P1的线程T(1-a)和T(1-b)以及属于进程P2的线程T(2-a)和T(2-b)。
现在我的问题是——
这两种类型(进程上下文切换和线程上下文切换)都涉及将控制权移交给操作系统内核来执行上下文切换(我主要讨论线程上下文切换)。
如果T(1-a)和T(1-b)是用户级线程,内核将无法区分T(1-a)和T(1-b),那么上下文切换将如何完成?
成本/交易不会与进程上下文切换相同吗,因为不仅虚拟内存空间发生变化,而且 TLB 也被刷新?
multithreading computer-science operating-system context-switch
我想到的是一个非常通用的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)