进程基础
什么是进程?
为了实现并发的功能,引入了进程的概念。 为了实现并发,需要引入多程序的环境,但是多程序的环境会造成一些单程序时不存在的问题,比如程序的之间没有了封闭性,程序不可以连续的执行,由于没有封闭性和连续性(隔离性和安全性),也就失去程序再现的能力。为了解决这些问题,需要进一步的修改操作系统,为达到隔离性与安全性的要求的集合,就称之为进程,进程就是为了解决这些问题而提出的概念。
名词解释:
程序:静态的,一个指令集合 进程:动态的,一个程序的执行过程;
进程=PCB+程序段+数据段
eg:在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
线程基础
进程还是没有完美解决并发的需求,需要引入线程进一步解决并发出现的上下文切换损耗,引入线程后,使用相近的资源的程序可以使用线程进行开发,因为如果使用进程进行开发,程序切换带来的开销是很大的,这些开销主要是上下文切换。因此可以说是为了减少进程切换带来的花销(主要是上下文切换),引入了线程的概念。而同时也会带来其他的问题,例如死锁、数据一致性(竞争条件)等。 (竞争条件:多个线程访问共享数据(资源),并且尝试改变这些数据(资源)时,它们之间对于该资源的操作顺序会影响最终结果的正确性。)
什么是线程?
为了减少进程切换(上下文切换)带来的效率损耗,引入了线程这个概念。线程是进程的一个实现,不占有资源,但是可以执行相应的代码指令。有点类似于工程机械公司——老板拥有所有资源,即挖机、修理机械、保养设备等,挖机师傅负责干活,公司有多种挖机,大挖机、小挖机、长臂挖机、水挖机,每次遇到什么问题,不用换专门的公司,只需要换一个挖机师傅就可以了,挖机师傅从老板那里取干活用的挖机(调用进程资源),这样一来,省了招标的流程了,直接内部解决问题。 线程是轻量级的进程,不拥有资源,线程间切换付出的时空开销小,对于java而言,线程共享堆与方法区,而pc寄存器、虚拟机栈和本地方法栈都是私有的。
名词解释:
上下文切换
Javaguide的回答有问题,上下文不涉及栈信息,上下文指的是cpu周边的那些寄存器(硬件)里面的信息,计组里面的内容了,上下文切换就是要保存那些寄存器(程序计数器、处理器状态寄存器等等一系列寄存器的信息)到内存,然后再从内存把之前保存的,另一个线程的上下文拿过来放到cpu里面,让这些寄存器获得这个线程的信息,然后跑起来。这样一来,就达到切换线程的目的了。
什么时候切换上下文? 切换线程的时候切换上下文,进程什么时候会切换?如下:
-
主动让出 CPU,比如调用了
sleep()
,wait()
等。 -
时间片用完,因为操作系统要防止一个线程或者进程长时间占用 CPU 导致其他线程或者进程饿死。
-
调用了阻塞类型的系统中断,比如请求 IO,线程被阻塞。
-
被终止或结束运行
并发与并行的区别?
并行是一系列任务在同一时间同时执行;
并发是一系列任务在同一时间段内轮番执行。
同步与异步的区别?
首先要涉及到一个叫做调用的概念,在执行的过程中,执行一条指令,这条指令不是简单的指令,而是指向另一个程序的接口,通过这个指令会出发另一个程序的执行,并得到返回结果(返回值,有或者没有)。
-
同步 : 发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。
-
异步 :调用在发出之后,不用等待返回结果,该调用直接返回。