多进程编程 VS 多线程编程

简介: 多进程编程 VS 多线程编程


cfb675e737894ac5ad7eb735b305afbe.png


 

进程也可以称为是“任务”。操作系统要想执行一个具体的“动作”,就需要创建出一个对应的进程。

一个程序在没有运行的时候,它仅仅是一个“可执行的文件”,一旦程序跑起来了,就变成了一个进程了。

为了实现并发编程,同时执行多个任务,就引入了“多进程编程”。把一个很大的任务,拆分成若干个很小的任务,就可以创建多个进程,每个进程分别负责其中的一部分任务。

多进程编程也带来了一个很大的问题:创建/销毁进程,比较重量或比较低效。

为了避免这样的问题,就引入了线程

每个线程都是一个独立的执行流。一个进程包含了一个或多个线程。我们的初心就是为了能够实现并发,多个进程能够实现并发,同样多个线程也能实现并发。但是多线程要比多进程更加高效和轻量。创建线程/销毁线程比创建进程/销毁进程更加高效和轻量。所以,一般情况下,会使用多线程来进行开发。


因此,在Java这个圈子里面,大部分的并发编程都是通过多线程的方式来实现的。

难道多进程就一无是处吗?

当然不是,多进程也有它自己独特的优势。

进程相比于线程的优势:

进程的“独立性”更好。比如在操作系统上,同一时刻运行着很多个进程:


同一时刻可能同时运行着成百上千的进程,但是每个进程之间都不相互干扰,如果某一个进程挂了不会影响到其他的进程,因为每个进程有各自的地址空间。每个进程之间井水不犯河水,自己经营着自己的一亩三分地,由我们的操作系统统一进行统筹管理,如果某个进程出现了一些意外,无法正常工作,直接奔溃了,那么也仅仅是这个进程自身挂了,不会出现把其他进程也带走的情况。所以说,进程“独立性”这一点是非常重要的。

相比之下,由于多个线程之间,共用着一个进程的地址空间。这就导致了某个线程挂了,就很可能会直接把整个进程带走,那么这个进程里面的其他线程也就没了。

正是因为这一点,进程要比线程来的更加稳定一点。虽然进程没有线程那么高效,但是它的独立性带来的稳定是非常关键的。

多进程编程主要做的事情:

站在操作系统的角度(以Linux为例),提供了很多和多进程编程相关的接口:进程创建、进程终止、进程等待、进程程序替换、进程间通信......

而在Java中对系统提供的这些操作进行了限制,最终给用户只提供了两个操作:进程创建和进程等待。虽然功能受限,但是当前也是足够用了。

案例分析:

比如有一个类似在线OJ刷题的平台,那么它就有一个服务器进程(接受用户的请求,返回响应),用户提交的代码其实也是一个独立的逻辑,那么这个逻辑是使用多线程执行好,还是多进程呢?


那么对于这里用户提交的代码,一定是要通过“多进程”的方式来执行的!!!因为我们无法控制用户到底提交了什么代码,代码很可能是存在问题的,很可能一运行就会出现崩溃的情况。那么如果使用多线程,就很可能会导致用户代码直接把整个服务器进程都给带走了的情况。因为一个服务器同时要给很多个用户提供服务,但是不能因为一个用户问题就挂了服务器,导致其他用户也访问不了。而且在真实情况下,用户是非常非常多的,是不能保证每一个用户的代码都是没毛病的!


相关文章
|
1天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
5天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
12天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
14天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
11天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
17天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
14天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
24 1
|
14天前
|
Java UED
Java中的多线程编程基础与实践
【10月更文挑战第35天】在Java的世界中,多线程是提升应用性能和响应性的利器。本文将深入浅出地介绍如何在Java中创建和管理线程,以及如何利用同步机制确保数据一致性。我们将从简单的“Hello, World!”线程示例出发,逐步探索线程池的高效使用,并讨论常见的多线程问题。无论你是Java新手还是希望深化理解,这篇文章都将为你打开多线程的大门。
|
22天前
|
安全 程序员 API
|
15天前
|
安全 Java 编译器
Java多线程编程的陷阱与最佳实践####
【10月更文挑战第29天】 本文深入探讨了Java多线程编程中的常见陷阱,如竞态条件、死锁、内存一致性错误等,并通过实例分析揭示了这些陷阱的成因。同时,文章也分享了一系列最佳实践,包括使用volatile关键字、原子类、线程安全集合以及并发框架(如java.util.concurrent包下的工具类),帮助开发者有效避免多线程编程中的问题,提升应用的稳定性和性能。 ####
42 1