进程
一个可执行程序运行起来,就可以看作是一个进程.进程同时也是操作系统分配资源的最小单位,一个进程在内核中都会对应着一个PCB对象,这个PCB对象描述了一个进程有哪些属性,在PCB中包含如下这些东西:
- 进程id:身份标识;
- 一组内存指针:指向进程运行时依赖的指令和数据在内存的哪个位置;
- 进程的状态:是正在运行,还是在休眠;
- 进程的优先级:这个进程是优先上CPU执行还是放到后面上;
- 进程的上下文:保存了上次进程在CPU上执行的进度,以便下次进程上CPU的时候能够继续执行
- 进程的记账信息:记录了进程在CPU上一共执行了多长时间,通过这个时间来限制不要让某个进程霸占CPU太久,导致其他进程无法执行.
线程
如果把进程看作是一个工厂,那线程就是工厂里面的若干个流水线,线程是系统调度的最小单位.或许可以这样理解"线程",他其实就是一种"轻量级"进程.
"进程"与"线程"之间的联系与区别
- 线程其实是包含在进程中的
- 一个进程中可能会有多个线程
- 每个线程都有一段自己要执行的逻辑(指令),每个线程都是一个独立的"执行流"
- 同一个进程的很多线程之间是共享了一些资源的,主要包含了两方面:内存资源(但是两个不同进程之间的内存不能共享),打开的文件
- 每个进程至少有一个线程,即主线程
- 创建一个线程比创建一个进程成本低
- 销毁一个线程比销毁一个进程成本也低(新创建一个线程不需要给这个线程分配很多新的资源,大部分资源都是和原来的线程共享的,但是如果创建一个进程,就需要给这个进程分配较多的资源)
- 但是也有一些不是共享的资源:上下文/状态/优先级/记账信息;内存中的"栈"空间每个线程都是独立一份的
- 线程比进程轻量,并发时效率更高
- 线程之间共享的资源多,完成一些操作时更加方便
- 线程是操作系统进行调度和执行的最小单位(本质上是操作系统对这个进程中的若干个进程进行调度.
时间片
在现代的操作系统中如MAC OS X,UNIX,LINUX,Windows等,都是支持"多任务"的操作系统.这里所谓的"多任务"就是操作系统可以同时运行多个任务,那如何去对这些任务进行调度呢,就是采用"时间片轮转"的强度时调度方式,也就是说一个任务执行一小会儿后强制暂停去执行下一个任务,每个任务轮流执行.
1.时间片:某个任务执行的这一小段时间 2.运行状态:任务正在执行的状态 3.就绪状态:某个任务执行过程中被强制暂停,这时这个任务就处于就绪状态等待他的下一个时间片的到来. 4.并发:每个任务都能得到执行,同时由于CPU的执行效率非常高,时间片非常短,在各个任务之间来回快速的切换,给人的感觉就是多个任务在"同时执行".
并发和并行
在现代,随着多核CPU的普及,由于任务数量远远多于CPU的核心数量,所以操作系统也会自动把很多任务轮流调度到每个核心上执行.
并发:多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
操作系统中把并行和并发明显区分开,主要指从微观的角度来讲的,具体是指进程的并行性(多处理机的情况下,多个进程同时运行)和并发性(单处理机的情况下,多个进程在同一时间间隔运行的). 举个栗子:工厂要扩大产量,1是多建造几个工厂,这就是并行.2是在这个工厂中新增流水线,这就类似于并发.
内核态和用户态
这是对执行权限进行分级的.
1.内核态:操作系统内核作为直接控制硬件设备的底层软件,权限最高 2.用户态:用户程序的权限
再举个栗子:就那上面的工厂来说,里面的工人在流水线上做自己的事情这就是用户态,工人把自己工作的情况汇报给经理,经理根据工人的工作情况核对来给工人发工资,这时经理所处的状态就是内核态,对于工人来说,这就叫陷入内核.
进程中的上下文
简单来说就是一个环境,进程在时间片轮转切换时,由于每个进程运行环境不同,就涉及到转换前后的上下文环境的切换
1.就是一个进程在执行的时候,CPU的所有寄存器中的值,进程的状态以及堆栈上的内容 2.切换时需要保存当前进程的所有状态,即保存当前进程的进程上下文,一边再次执行该进程的时候,能够恢复切换时的状态,继续执行
进程状态
初始:新建一个进程 就绪:进程处于可运行的状态,只是CPU时间片还没有轮转到该进程 运行:进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态 阻塞:进程不具备运行条件,正在等待某个时间的完成 结束/异常终止:进程终止执行
Java线程之间的状态转化
Java线程的各个状态间的完整关系流程如下
|