多进程编程 VS 多线程编程

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


cfb675e737894ac5ad7eb735b305afbe.png


 

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

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

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

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

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

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


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

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

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

进程相比于线程的优势:

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


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

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

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

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

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

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

案例分析:

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


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


相关文章
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
15天前
|
安全 Java 程序员
ArrayList vs Vector:一场线程安全与性能优化的世纪之争!
在 Java 面试中,ArrayList 和 Vector 是高频考点,但很多人容易混淆。本文通过10分钟深入解析它们的区别,帮助你快速掌握性能、线程安全性、扩容机制等核心知识,让你轻松应对面试题目,提升自信!
49 18
|
17天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
83 13
|
12天前
|
存储 缓存 Oracle
Java线程池,白话文vs八股文,原来是这么回事!
本文介绍了Java线程池的原理、实现方式及相关参数。首先,通过类比公司员工的方式解释了线程池的核心概念,如核心线程、最大线程数、任务队列和拒绝策略。接着,详细描述了线程池的任务处理流程,并提供了使用`ThreadPoolExecutor`和`Executors`创建线程池的代码示例,强调了`ThreadPoolExecutor`的灵活性和`Executors`的局限性。最后,总结了线程池的相关参数及不同类型的线程池实现,并附带常见面试题及其解答,帮助读者全面理解线程池的应用场景和优化方法。
29 4
|
12天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
93 2
|
2月前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
1月前
|
缓存 Java 调度
多线程编程核心:上下文切换深度解析
在现代计算机系统中,多线程编程已成为提高程序性能和响应速度的关键技术。然而,多线程编程中一个不可避免的概念就是上下文切换(Context Switching)。本文将深入探讨上下文切换的概念、原因、影响以及优化策略,帮助你在工作和学习中深入理解这一技术干货。
47 10
|
2月前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
29天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
29天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
50 3