多进程和多线程的区别
多进程和多线程的区别
进程是资源分配的最小单位,线程是CPU调度的最小单位
多进程之间不共享数据,程序上下文区分开。 多线程之间共享数据,在数据处理上要谨慎
多进程和多线程的主要区别是: 线程是进程的子集(部分),一个进程可能由多个线程组成。 多线程共享进程数据,共享简单;但同步复杂。 多进程的数据是分开的、共享复杂,需要用IPC;但同步简单。
程序: 只是一组指令的有序集合,是计算机硬盘上的一些文件,是“死的”
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,是“活的”
线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
进程和线程都是一个时间段的描述,是CPU工作时间段的描述。
什么是多进程?
进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。 当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。
在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多进程,也称多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。
多任务带来的好处是明显的,比如你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。
什么是多线程?
线程是一个轻量级的子进程,是最小的处理单元;是一个单独的执行路径。可以说:线程是进程的子集(部分),一个进程可能由多个线程组成。
线程是独立的。如果在一个线程中发生异常,则不会影响其他线程。它使用共享内存区域。
多线程是一种执行模型,它允许多个线程存在于进程的上下文中,以便它们独立执行但共享其进程资源。
参考 https://www.php.cn/faq/416853.html https://www.jianshu.com/p/fd3927cd6ee7 https://blog.csdn.net/linraise/article/details/12979473
什么时候用多进程什么时候用多线程
多线程:io密集型 多进程:计算 cpu耗用的多
多进程优点:进程增减容易,进程互不干扰可以专心干自己的事情,效率高些,调试起来也方便些 多进程缺点:进程数大于cpu核数,又比较繁忙,导致频繁进行上下文切换会严重降低整体效率
多线程优点:上下文切换问题没那么严重,线程间可以方便地共享数据 多线程缺点:共享数据的时候需要小心,坑多,会增加一定代码复杂度个人倾向于一般尽量采用多进程,轻松舒服。
当涉及较多同步阻塞操作时,或者不得不需要较多实例时考虑多进程。
那么在 Python 中什么时候用多线程什么时候用多进程呢? 当在CPU-bound(计算密集型:绝大多数时间在计算) 时最好用 - 多进程, 而在 I/O bound(I/O密集型 : IO 处理 并且 大多时间是在等待) 的时候最好用 - 多线程。
python因为其全局解释器锁GIL而无法通过线程实现真正的平行计算。这个论断我们不展开,但是有个概念我们要说明,IO密集型 vs. 计算密集型。
IO密集型:读取文件,读取网络套接字频繁。 计算密集型:大量消耗CPU的数学与逻辑运算,也就是我们这里说的平行计算。
而concurrent.futures模块,可以利用multiprocessing实现真正的平行计算。
核心原理是: concurrent.futures会以子进程的形式,平行的运行多个python解释器,从而令python程序可以利用多核CPU来提升执行速度。 由于子进程与主解释器相分离,所以他们的全局解释器锁也是相互独立的。每个子进程都能够完整的使用一个CPU内核。
Java线程和操作系统线程的关系
1.操作系统线程模型 1.1 线程实现在用户空间下 1.2 线程实现在操作系统内核中 1.3使用用户线程加轻量级进程混合实现
OS中线程的实现有三种,一种是用户级线程ULT(UserLevelThreads),一种是内核支持线程KST(KernelSupportedThreads),还有一种是前两种的组合方式。
OS内核常驻在内存中,所以将内存空间分为内核空间和用户空间。 线程在内核中实现有以下几个好处: 1、内核可以在多处理器系统中调度同一进程中的多个线程并行执行。 2、如果某一个进程中的线程阻塞了,可以跨进程调度其他线程进行执行 3、线程的切换速度快,开销小。并且内核本身支持多线程技术可以提高系统的执行速度和效率。
Java线程在操作系统上本质: 现在的Java中线程的本质,其实就是操作系统中的线程,Linux下是基于pthread库实现的轻量级进程,Windows下是原生的系统Win32 API提供系统调用从而实现多线程。
参考 https://blog.csdn.net/CringKong/article/details/79994511 https://blog.csdn.net/yangmx_5/article/details/68065299?utm_source=blogkpcl7 https://www.jianshu.com/p/7c980955627e
Last updated
Was this helpful?