多线程(一): 进程 基础

简介: 多线程(一): 进程 基础

前言:


上一个篇章MySQL数据库就这些东西,不算多但还得需要多多练习,从本章开始又要开始新的篇章。


从本章开始就进入了JavaEE阶段,这个阶段将会持续很久,因为这整个内容非常多;我们将整个EE阶段分为初阶和进阶两个近阶段,我们一点点来了解,我会尽我所能将内容讲解清楚。

我们先来了解了解JavaEE 和 JavaSE 的区别:

1、领域不同

  • javase为平台标准版,可供任何领域使用。
  • javaee为平台企业版,主要供应企业的使用。

2、作用不同

  • javase提供了开发与运行Java软件的编译器等开发工具、软件库及Java虚拟机。它也是Java2平台、企业版本和Java网页服务的基础。
  • JavaEE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等。同时还提供了对 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。


简单认识认识计算机

根据祖师爷 冯·诺依曼 提出的冯诺依曼体系可以知道,计算机分为五大类:

  • 运算器
  • 控制器
  • 存储器
  • 输入设备
  • 输出设备

我们又可以将控制器和运算器统称为:CPU(中央处理器)


如下图:

911613dbb578498f86fb02db0a1bf635.png


操作系统管理硬件分层视图: 



7d6ce04c2ef14cc7b080b88e7294f4ff.png


我们可以简单的将其分为硬件和软件。

而所有的软件都是基于操作系统的,如今常见的操作系统有 DOS ,Windows等等....

这个操作系统的本质其实就是一个软件,它的主要功能主要有两个:

  1. 对上:管理好各个硬件设备
  1. 对下: 给软件提供稳定的运行环境

操作系统它本身非常复杂,这里主要讨论的就是进程管理这一块里的内容。


进程


什么是进程


进程(Process)又名任务(Task)是关于某数据集合上的一次运行活动,进程是操作系统进行资源分配的最小单位(这是文章最最重要的要点之一)

-- 百度百科。


举个例子来解释以下:像 .exe 文件程序在现代系统上运行,操作系统会提供一种假象,好像系统行只有这个程序运行。程序看上去像是独占地使用处理器、主存和I/O设备。处理器看上去就像不间断地一条条执行程序的指令,这种假象是通过进程的概念来实现的。


我们试着通过任务管理器看看此时电脑上有啥程序在运行:


1deabbf2f85e4004a0c529d8363956ab.png


进程与程序的区别


进程是由多道程序的并发执行而引出来的,它和程序是两个截然不同的概念。



f49fc4aeb2d842508de7d728fe1b0e82.png

通过上图我们可以知道程进程与程序最大的区别就在于进程是动态的,同一个静态的程序可以对应多个不同的动态进程,例如:同一个QQ程序可以形成多个动态的QQ进程:


7c8fc32976844c34aac07d94d4e01f5c.png


所以我们可以作出如下总结:


  1. 进程是动态的,程序是静态的
  2. 进程是暂时的,程序是永久的
  3. 进程是可并发的,程序是不能并发的(并发本身就是借助了中断和通道技术,对于程序 一旦程序开始并发,则其程序就终止了,如果想要再执行该程序就需要再次启动,不能再接着前面的程序执行)(并发的概念后面会说)
  4. 进程是活跃在内存和cpu中的,而程序是静止放在存储器中的


进程管理系统


为什么需要进程管理系统这个东西?

现在市面上的电脑都是 几核几线程的,我们来看看我的电脑:


ff7ae0e86d4342fdb9232b6cca963462.png


一共六核十二线程,再来看看我们的进程情况:


0d5524e44fea480c91cf1a4db0d6d00d.png


此时我只有12个进程, 1 - 1 对应肯定是不够用的,那么这时就需要进程管理系统来对这些进程进行管理了。

如何进行进程管理呢?


  1. 描述一个进程,使用 类/结构体 将一个进程的全部信息表示出来;这个结构体又叫PCB(process control block)进程控制块
  2. 组织这个进程,使用一定的数据结构将其这个结构体对象放到一起(一般使用双链表)


进程属性


  1. Pid(操作系统里指进程识别号):P (Process)每个程序的id
  2. 内存指针:当前这个进程使用的进程使用的内存指的是那一部分(进程运行时,使用了哪些内存上的资源)
  3. 文件描述符:目前进程使用了哪些文件,对其进行简单的描述例如:



a495c8e4f1c249539526fd8270caf1dd.png


  1. 进程调度:咱们的程序能够运行,全依仗cpu,每个程序相当于一组’二进制指令’的集合,这些指令靠cpu运行.

我们一共 6 个核心, 12 个进程 , 对于上面一共近百个进程肯定时不够用的,这里就涉及到如何同时进行多个线程了。


进程调度


对计算机的调度主要有两种处理方式:

并发

  1. 并发是指两个或多个事件在同一时间间隔发生。
  2. 并发侧重于在同一实体上。
  3. 并发在一台处理器上“同时”处理多个任务。

并行

  1. 并行是指两个或者多个事件在同一时刻发生。
  2. 并行侧重于在不同实体上。
  3. 并行在多台处理器上同时处理多个任务。

这对应是二者的区别。

并发、并行和多线程的关系


并行需要两个或两个以上的线程跑在不同的处理器上,并发可以跑在一个处理器上通过时间片进行切换。


而如今的计算机采用的都是并行的方式,此并行非彼并行,这里提到的并行(宏观)指的是:一段时间内采用并发的状态,一段时间采用上面的并行(微观)的状态。


换句话说就是:一段时间内由 一台处理器上“同时”处理多个任务;一段时间内由 在多台处理器上同时处理多个任务,由这两种方式交替进行 统称为(并行),此后大部分的并行,说的都是这个并行。


进程调度的属性


这里提到的属性不是一个属性,而是指一组与CPU资源相关的属性。


  1. 进程状态:简单的认为主要是两个状态:就绪态和阻塞态                                                                  就绪态:该进程已经准备好了,随时可以上CPU执行                                                      阻塞状态:进程还没准备好,暂时无法上CPU执行
  2. 进程的优先级:进程的调度不一定公平,会遵循优先级,优先级调度
  3. 进程的上下文:就是记录进程运行到哪里的存档,当A进程突然离开CPU,那么B进程进入CPU执行,执行完后进程A回来继续执行,就从进程A的突然中断的地方继续执行 ;        在进程上来说,就是进程运行中,CPU内部的寄存器存储的值,寄存器有很多作用,在这里的作用就是保存当前进程执行的中间结果,包括了执行到哪一条指令 ,寄存器有一个存档和读档的操作。                                                                                                             所谓存档:进程在中途离开CPU的时候,寄存器会记录进程执行到哪一步了,那么CPU把寄存器上的值存到PCB的上下文中        
  4. 进程的记账信息:记录进程在CPU执行的时间长短,便于操作系统进行进程的调度


如何组织PCB

操作系统使用双向链表组织PCB

  • 进程的创建:创建一个链表结点
  • 进程的销毁:删除一个链表节点
  • 进程列表的遍历:遍历该链表


内存分配 —— 内存管理(Memory Manage)


操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。

这里说的内存空间并不是指物理内存地址,而是说虚拟内存地址,为什么不采用真实的物理内存地址;接着往下看:


9be6c9371cf5413a9b4a27ad8baa8c89.png


假设这就是映射到真实的内存地址。

那么就会产生一个非常严重的问题,如果进程1 存在一个bug (例如野指针问题),那么进程2 就可以会被这个野指针影响,此时 进程1 的崩溃会导致线程2 的崩溃。

那么我们就采用虚拟地址的方式来 对内存资源的分配。

如下图:



44f16924a74f4ec1b60f1c6e07ecd8d6.png


由于创建、销毁、调度进程的开销特别大,我们Java不太建议使用进程,而是使用线程。


相比于进程,线程是一个更加高效的选择,一个进程可以包含多个线程,一个线程公用一份进程的资源,那么就意味着,对于线程而言,系统性资源已经分配好了,创建线程也就极大的节省了分配资源的开销。


具体的内容就留在下一章内容中讲到。

目录
打赏
0
0
0
0
2
分享
相关文章
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
183 67
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
161 0
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
167 11
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
111 6
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
215 6
|
7月前
|
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
204 5
|
7月前
|
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
210 4

相关实验场景

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问