前言:
上一个篇章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(中央处理器)
如下图:
操作系统管理硬件分层视图:
我们可以简单的将其分为硬件和软件。
而所有的软件都是基于操作系统的,如今常见的操作系统有 DOS ,Windows等等....
这个操作系统的本质其实就是一个软件,它的主要功能主要有两个:
- 对上:管理好各个硬件设备
- 对下: 给软件提供稳定的运行环境
操作系统它本身非常复杂,这里主要讨论的就是进程管理这一块里的内容。
进程
什么是进程
进程(Process)又名任务(Task)是关于某数据集合上的一次运行活动,进程是操作系统进行资源分配的最小单位(这是文章最最重要的要点之一)。
-- 百度百科。
举个例子来解释以下:像 .exe 文件程序在现代系统上运行,操作系统会提供一种假象,好像系统行只有这个程序运行。程序看上去像是独占地使用处理器、主存和I/O设备。处理器看上去就像不间断地一条条执行程序的指令,这种假象是通过进程的概念来实现的。
我们试着通过任务管理器看看此时电脑上有啥程序在运行:
进程与程序的区别
进程是由多道程序的并发执行而引出来的,它和程序是两个截然不同的概念。
通过上图我们可以知道程进程与程序最大的区别就在于进程是动态的,同一个静态的程序可以对应多个不同的动态进程,例如:同一个QQ程序可以形成多个动态的QQ进程:
所以我们可以作出如下总结:
- 进程是动态的,程序是静态的
- 进程是暂时的,程序是永久的
- 进程是可并发的,程序是不能并发的(并发本身就是借助了中断和通道技术,对于程序 一旦程序开始并发,则其程序就终止了,如果想要再执行该程序就需要再次启动,不能再接着前面的程序执行)(并发的概念后面会说)
- 进程是活跃在内存和cpu中的,而程序是静止放在存储器中的
进程管理系统
为什么需要进程管理系统这个东西?
现在市面上的电脑都是 几核几线程的,我们来看看我的电脑:
一共六核十二线程,再来看看我们的进程情况:
此时我只有12个进程, 1 - 1 对应肯定是不够用的,那么这时就需要进程管理系统来对这些进程进行管理了。
如何进行进程管理呢?
- 描述一个进程,使用 类/结构体 将一个进程的全部信息表示出来;这个结构体又叫PCB(process control block)进程控制块
- 组织这个进程,使用一定的数据结构将其这个结构体对象放到一起(一般使用双链表)
进程属性
- Pid(操作系统里指进程识别号):P (Process)每个程序的id
- 内存指针:当前这个进程使用的进程使用的内存指的是那一部分(进程运行时,使用了哪些内存上的资源)
- 文件描述符:目前进程使用了哪些文件,对其进行简单的描述例如:
- 进程调度:咱们的程序能够运行,全依仗cpu,每个程序相当于一组’二进制指令’的集合,这些指令靠cpu运行.
我们一共 6 个核心, 12 个进程 , 对于上面一共近百个进程肯定时不够用的,这里就涉及到如何同时进行多个线程了。
进程调度
对计算机的调度主要有两种处理方式:
并发
- 并发是指两个或多个事件在同一时间间隔发生。
- 并发侧重于在同一实体上。
- 并发在一台处理器上“同时”处理多个任务。
并行
- 并行是指两个或者多个事件在同一时刻发生。
- 并行侧重于在不同实体上。
- 并行在多台处理器上同时处理多个任务。
这对应是二者的区别。
并发、并行和多线程的关系
并行需要两个或两个以上的线程跑在不同的处理器上,并发可以跑在一个处理器上通过时间片进行切换。
而如今的计算机采用的都是并行的方式,此并行非彼并行,这里提到的并行(宏观)指的是:一段时间内采用并发的状态,一段时间采用上面的并行(微观)的状态。
换句话说就是:一段时间内由 一台处理器上“同时”处理多个任务;一段时间内由 在多台处理器上同时处理多个任务,由这两种方式交替进行 统称为(并行),此后大部分的并行,说的都是这个并行。
进程调度的属性
这里提到的属性不是一个属性,而是指一组与CPU资源相关的属性。
- 进程状态:简单的认为主要是两个状态:就绪态和阻塞态 就绪态:该进程已经准备好了,随时可以上CPU执行 阻塞状态:进程还没准备好,暂时无法上CPU执行
- 进程的优先级:进程的调度不一定公平,会遵循优先级,优先级调度
- 进程的上下文:就是记录进程运行到哪里的存档,当A进程突然离开CPU,那么B进程进入CPU执行,执行完后进程A回来继续执行,就从进程A的突然中断的地方继续执行 ; 在进程上来说,就是进程运行中,CPU内部的寄存器存储的值,寄存器有很多作用,在这里的作用就是保存当前进程执行的中间结果,包括了执行到哪一条指令 ,寄存器有一个存档和读档的操作。 所谓存档:进程在中途离开CPU的时候,寄存器会记录进程执行到哪一步了,那么CPU把寄存器上的值存到PCB的上下文中
- 进程的记账信息:记录进程在CPU执行的时间长短,便于操作系统进行进程的调度
如何组织PCB
操作系统使用双向链表组织PCB
- 进程的创建:创建一个链表结点
- 进程的销毁:删除一个链表节点
- 进程列表的遍历:遍历该链表
内存分配 —— 内存管理(Memory Manage)
操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
这里说的内存空间并不是指物理内存地址,而是说虚拟内存地址,为什么不采用真实的物理内存地址;接着往下看:
假设这就是映射到真实的内存地址。
那么就会产生一个非常严重的问题,如果进程1 存在一个bug (例如野指针问题),那么进程2 就可以会被这个野指针影响,此时 进程1 的崩溃会导致线程2 的崩溃。
那么我们就采用虚拟地址的方式来 对内存资源的分配。
如下图:
由于创建、销毁、调度进程的开销特别大,我们Java不太建议使用进程,而是使用线程。
相比于进程,线程是一个更加高效的选择,一个进程可以包含多个线程,一个线程公用一份进程的资源,那么就意味着,对于线程而言,系统性资源已经分配好了,创建线程也就极大的节省了分配资源的开销。
具体的内容就留在下一章内容中讲到。