任何计算机系统都包含一个基本的程序集合,称为操做系统(OS)。笼统的理解,操做系统包括:java
内核(进程管理,内存管理,文件管理,驱动管理)web
其余程序(例如函数库,shell程序等等)shell
上面有关OS的样例,咱们也能看到以下结论:架构
那么,设计操做系统的目的是什么呢?类比银行系统,咱们就能理解并发
那咱们的所学的java在哪里呢?
svg
对于操做系统来讲,一个任务就是一个进程(Process)。函数
如何理解进程?spa
如:张三去银行转帐,就要使用银行的资源(接待,转帐人员,银行电脑,必要时保安也能够跟着:) )为张三完成转 帐,而在银行内部,这一整套过程的执行,咱们统称为办理业务。操作系统
类比,一个程序刚开始就是一个在硬盘上的程序,加载运行时,是为了完成某些任务(如迅雷完成下载任务),而要 完成任务,就须要操做系统为该任务提供足够作的资源(如内存和CPU资源),而这一整套任务的执行,咱们能够叫 作进程设计
因此:进程是担当分配系统资源(CPU时间,内存)的实体,是具备动态特性的,如张三在办理转帐业务期间,这样 任务一直都是存在且状态变动的。
而张三去银行转帐也不是立马就能进行,须要先抽号,在大厅等待,由于当时可能会有不少人在大厅等待,因此就有 了进程等待队列。而张三抽到的号,能够称之为进程ID
下面,咱们尝试查看系统进程
编写一个java进程:
public class Test{ public static void main(String[] args) throws Throwable{ Thread.sleep(999999999); } }
在cmd中编译并运行:
javac Test
java java Test
运行以后会启动java程序(进程),能够在任务管理器中查看到该进程:
这里的PID表明这个进程的代号,而咱们传说中的java虚拟机,本质上只是一个系统中的进程而已。具体能够在看看 以前的样例图
现代操做系统好比Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操做系统。所谓的多任务,就是操 做系统能够同时运行多个任务。
操做系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时 间后强制暂停去执行下一个任务,每一个任务轮流执行。
任务执行的一小段时间叫作时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个 任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。
这样每一个任务都能获得执行,因为CPU的执行效率很是高,时间片很是短,在各个任务之间快速地切换,给人的感受 就是多个任务在“同时进行”,这也就是咱们所说的并发。 如何理解?
假设张三准备办理转帐业务,但当他把全部资料给工做人员以后,工做人员告诉他,你如今办理不了,由于他如今需 要填写一张申请表,此时,工做人员将他的资料保存起来,让他去一边填写资料,填写完毕以后,再回来继续办理, 同时,张三去填表了,而工做人员继续给别人提供服务。这个过程叫作进程切换。
张三表填完了,继续回到柜台,工做人员拿出他以前的资料,继续给张三办理业务,这叫作进程的上下文保护与恢复 (想一想,为何要这麽作?由于进程的运行是在CPU上的,CPU有寄存器,保存的是进程运行的各类临时数据,为了 达到切换和便于恢复的目的,就有了将CPU寄存器保存和恢复的作法,归根结底是为了接着上次的位置继续运行)
后来,银行出台了规定,每一个人在柜台办理任务的时间不能超过10分钟(以防止其余人长时间等待),因此为了更好 的服务各我的员,银行工做人员将上面的切换与恢复的思路应用到各类业务中,因此长期来看,即使只有一个工做人 员,也能同时服务多个客户,这种机制叫作基于时间片的进程轮转管理机制,而上面的10分钟,就是银行轮转的时间 片,只要时间到了,客户酒的下去等待,让其余用户来办理业务
而上面的全部轮转与管理工做,在操做系统中,统一由一个叫作调度器的内核模块完成
而对每一个人来讲,在一段时间以内,可能全部人的业务都得以推动(即使没完成),而不至于你们长时间等待,这种 机制就叫作并发
若是银行财大气粗,工做人员比客户都多,那就好办了,一人一个工做人员,全部的任务真正同时处理,这种机制叫 作并行。
如今,多核CPU已经很是普及了,因为任务数量远远多于CPU的核心数量,因此,操做系统也会自动把不少任务轮流 调度到每一个核心上执行。对于
并发:多个进程在一个CPU下采用时间片轮转的方式,在一段时间以内,让多个进程都得以推动,称之为并 发。
并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。
计算机操做系统中把并行性和并发性明显区分开,主要是从微观的角度来讲的,具体是指进程的并行性(多处理机的 状况下,多个进程同时运行)和并发性(单处理机的状况下,多个进程在同一时间间隔运行的)。
并发与并行相似于工厂中的流水线,要扩大产量,1是考虑建造多个工厂,这就是并行,2是考虑每一个工厂中新增流水 线,这就相似并发
通常的操做系统(如Windows、Linux)对执行权限进行分级:用户态和内核态。
如何理解?
就比如上面的例子,张三去填表,本身写姓名,电话,邮箱等等,作着本身的事情,这叫作用户态
而张三经过窗口的工做人员,把本身的需求给工做人员,自此,张三在等,银行工做人员在忙,对张三来说,就叫作 陷入内核。那么内核态是什么意思?就是工做人员在帮你办理业务时的状态
上下文简单说来就是一个环境,进程在时间片轮转切换时,因为每一个进程运行环境不一样,就涉及到转换先后的上下文 环境的切换
就是一个进程在执行的时候,CPU的全部寄存器中的值、进程的状态以及堆栈上的内容。
切换时须要保存当前进程的全部状态,即保存当前进程的进程上下文,以便再次执行该进程时,可以恢复切换 时的状态,继续执行。
就绪:进程处于可运行的状态,只是CPU时间片尚未轮转到该进程,则该进程处于就绪状态。 运行:进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态。 阻塞:进程不具有运行条件,正在等待某个事件的完成。 能够对比张三去银行办理业务的状态