Java---进程

Posted 4612

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java---进程相关的知识,希望对你有一定的参考价值。

进程

1、进程和程序的区别

1)
程序(静态):静态硬盘上的一个可执行文件,是永久存在的
进程(动态):程序运行起来后,就是一个进程(由系统管理起来的),是系统分配资源(CPU资源、内存)的最小单位,存在是暂时的

2)程序+数据+PCB(进程控制块,是进程存在的唯一标识)=进程

3)双击打开某个文件(该文件叫做程序),打开这个文件让程序运行起来就是一个进程

补充:

  • 进程运行(从程序到进程)
    程序加载到内存中在执行(分配内存,带哦都CPU来执行程序代码),最终运行起来就是一个进程
  • 对于Java程序的执行
    在这里插入图片描述
  • 进程的PID
    PID在操作系统系统里是指进程的识别号,即进程的标识符,操作系统每打开一个程序 都会创建一个进程ID,即PID)。
    注意
    它是进程运行时系统分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是进程终止后PID标识符就会被系统回收,就可能会被计息分配给新运行的程序

2、时间片轮转调度

在这里插入图片描述

1)操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。

2)任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发。

  • 进程中的上下文

1)背景
由于并发执行将多个进程时,涉及到时间片轮转调度的切换,所以在切换出去的时候就要保存相关的上下文环境,切换回来的时候要恢复环境,所以提出此概念

2)定义
简单说来,上下文就是一个环境,在切换环境时,某个环境切换出去就是上文,恢复回来就是下文
具体来说,上下文就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容。

3、并发和并行

  • 并发:多个进程在一个CPU下,采取时间片轮转调度的方式执行
    从cpu的角度看,进程还是一个一个依次执行,但是执行的时间是人肉眼无法感知的,给人的感觉像是在同时执行,所以也叫做假同时
    eg:一个窗口(cpu)提供卖票服务,大家需要排队轮流买票(时间片轮转调度)
  • 并行:多个CPU,在同一个时间点,同时进行多个进程,也称为真同时

4、内核态与用户态

  • 前置知识
    进程是由系统调度CPU来执行指令的,指令执行是有权限的,操作系统具有最高执行权限,用户程序权限最低,特别突出的就是io操作,程序都没有权限,都需要调度系统函数库(系统开放接口)

  • 内核态与用户态
    cpu真正执行用用户的代码指令,就是用户态
    代码指令需要调用系统函数库,就是内核态(其实是用户态转变为内核态)
    系统函数调用结束后又切换回用户态

举例:
张三去填表,自己写姓名,电话,邮箱等等,做着自己的事情,这叫做用户态
而张三通过窗口的工作人员,把自己的需求给工作人员,自此,张三在等,银行工作人员在忙,对张三来讲,就叫做陷入内核。那么内核态是什么意思?就是工作人员在帮你办理业务时的状态

  • 说明
    系统调度cpu执行某个进程代码,也是内核做的事
    常见的io操作,也是有内核态的体现
    用户态到内核态的切换,属于比较耗费资源的

  • 结论
    如果代码导致频繁地在用户态和内核态之间切换,性能是非常差的
    线程也同样具有以上特征,即线程数量太多,一次轮转,就需要很撑时间才能切换回来,花费在切换上的时间就比较多
    频繁的io操作,涉及到用户态和内核态之间的频繁切换,性能差

5、进程的状态转换图

在这里插入图片描述

  • 就绪态
    进程处于可运行的状态,只是CPU时间片还没有轮转到该进程
  • 运行态
    进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码
  • 进程创建之后,为什么不能直接进入运行态而要先经过就绪态?
    答:进程的状态是由系统调度决定的,而不是由用户程序自身来决定的
  • 阻塞态
    表现特征:程序暂停等待,满足条件后才能恢复并继续执行

6、CPU基于寄存器中的数据来执行程序代码

在这里插入图片描述

以上是关于Java---进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux中怎样用命令启动后台java进程

如何查看java进程及服务?

java 获取指定的进程id

linux环境下 ps命令查看找不到java进程,使用ps-efgrep java可以找到java进程,为啥?

java 怎么获取当前进程的映像名称

java 如何获得一个进程的内存使用情况,cpu运行的时间