JavaEE基础——进程和线程

进程

进程指的是操作系统中程序的一次运行过程,在操作系统内部,进程又是操作系统进行资源分配的基本单位。即所有的.exe文件都是一个进程。

从任务管理器中可以看到当前操作系统运行的所有进程:

当进程较多时,就需要进行管理,即描述和分类。例如上图描述了每个进程的大体细节以及分为应用和后台进程两类。

进程的运行靠的是CPU,CPU的核心数越多,可并发的程序就越多,可以通过任务管理器查看CPU的详细信息:

每个核心数可以处理1-2个进程,但是核心数通常远远少于进程数,例如这里核心数只有6,而进程却有100+,也就是说所有进程不能同时处于运行状态,因此进程有多个状态。

进程有三种不同的状态:运行、就绪和阻塞。运行状态是指进程已经获得必要的资源,占用处理机,处理机正在执行该进程。就绪状态是指进程等待分配CPU。阻塞状态是指进程等待某个事件。

实现进程的状态转换并记录参数,就是进程调度。进程调度也称为低级调度(CPU调度),是按照某种调度算法(或原则)从就绪队列中选取进程分配CPU,主要是协调对CPU的争夺使用。

也就是说一个核心数需要处理多个进程,但在某一时刻只能处理其中某一个进程。即这一时刻才处理A,下一时刻去处理B,再过一段时间后又去处理A。也就是通过所谓的快速切换来实现“同时”进行——也就是并发。而多个核心数同时处理的多个进程,才算是真的“同时“——也就是并行

进程调度参考的属性除了进程状态外还有:进程的优先级、上下文以及记账信息。

进程的优先级:我们可以对某些进程提高优先级,但这只是”建议“,并不能保证这些进程一定优先执行。

进程的上下文:进行进程调度时需要保存当前进程的执行过的进程指令和数据(上文),以便在下次执行该进程时可以从中止的地方继续进行。而正文和下文则分别指新执行的进程和下次执行的进程相关指令和数据。

进程的运行时间:记录每个进程在CPU上运行了多久,运行了很久的进程应该让出CPU。

除此之外还会考虑进程的等待时间等因素。

进程的资源分配,除了CPU分配之外,还有内存分配。不同的进程在内存的不同区域,互不干扰。进程与进程之间相互独立,互不干扰。

操作系统为进程分配的内存首先是虚拟地址,再通过某种映射关系存储到内存条的实际位置处。如果不分配虚拟地址而是直接存储到内存条中,由于某些原因导致造成地址错误就可能影响到内存条中存储的其他信息。也就是说,设置虚拟地址是一个保险操作。

进程与进程之间虽然是独立的,但有时需要必要的交互,也就是进程间通信。因此在满足隔离性的前提下,不同的进程需要通过公共区域进行信息的交互,这个公共区域可以是管道、共享内存、文件、网络、信号量和信号等。

线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个线程就是一个“执行流”。每个进程中都至少包含一条线程。同一进程中的线程,也在并发的进行。

CPU的核心数是很有限的,因此保证程序的稳定运行就依赖于并发操作。虽然进程也可以并发,但每次创建一个进程都需要较大的时间成本和资源成本,而操作线程的成本是低于进程的。线程的创建不需要申请资源(创建进程时已经申请好了)。Java中往往采用多线程的编程方式。

进程与线程的区别

进程是操作系统资源分配的基本单位,线程是操作系统能够进行运算调度的基本单位。

每次创建进程,都需要进行资源分配,而创建线程不需要。

一条线程只能属于一个进程,而每个进程可以包含多个线程。

每个进程都至少包含一条线程。

进程与进程之间是独立的,相互之间不受影响,一个进程出问题,不会影响其他进程。同一进程的线程与线程之间可以共用某些部分,一个线程出现了BUG,可能会影响其他的线程,甚至整个进程都有影响。

同一个程序,要想实现多种功能,往往采用多线程的方式;不同的程序之间采用多进程的方式。

猜你喜欢

转载自blog.csdn.net/weixin_71020872/article/details/129465555
今日推荐