『JavaWeb』进程

本篇博客主要讨论一下操作系统中的进程和线程的简单概念。

什么是进程?


我们简单的认为,对于操作系统来说,一个任务就是一个进程(Process)

  • 课本概念程序的一个执行实例,正在执行的程序等
  • 内核观点担当分配系统资源(CPU时间、内存)的实体

程序和进程的关系

  • 程序静态资源。程序是指令和数据的集合,可以作为目标文件保存在磁盘中,或者作为段存放在内存地址空间中。
  • 进程正在运行的程序进程是程序运行的一个具体的实例,程序总是运行在某个进程的上下文中。

下面,我们尝试来查看一下系统进程
首先,我们先来写一个Java程序。

public class Test {
	public static void main(String[] args) {
		while (true) {}
	}
}

打开cmd,编译运行该程序
在这里插入图片描述
然后,我们按下shift + ctrl + esc打开任务管理器,选择详细信息,就可以看到刚运行起来的程序
在这里插入图片描述
这里的PID指的是进程标识符,代表这个进程的代号。我们传说中的Java虚拟机,本质上也只是系统中的进程

时间片


现代操作系统如:Windows、Mac OS、Linux等,都是支持多任务的操作系统。所谓的多任务,就是操作系统可以同时运行多个任务
操作系统的任务调度采用的是时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行
任务执行的一段时间叫做时间片任务正在执行时的状态叫运行状态任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来
这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速切换,给人的感觉就是多个任务在“同时运行”

并行和并发


现在,多核CPU已经非常普及了,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行

  • 并发多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发
  • 并行多个进程在多个CPU下分别同时运行,称之为并行

用户态和内核态


为什么要有用户态和内核态
由于需要限制不同的程序之间的访问能力防止它们获取别的程序的内存数据或者获取外围设备的数据,并发送到网络CPU划分出两个权限等级–用户态和内核态

  • 内核态CPU可以访问内存的所有数据,包括外围设备,例如硬盘、网卡;
    操作系统内核主要完成以下工作进程管理、内存管理、文件管理、驱动管理等
  • 用户态只能受限的访问内存,且不允许访问外围设备,占用CPU的能力被剥夺。

用户态和内核态的切换
所有的用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情,例如从硬盘读取数据,或者从键盘获取输入等。而唯一可以做这些事情的就是操作系统,所以此时程序就需要向操作系统请求以程序的名义来执行这些操作
一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称内核态)。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。
内核态和用户态是操作系统的两种运行级别。如:Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放着整个内核的代码和所以的内核模块,以及内核所维护的数据用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write、send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换倒内核态,进入3G-4G中的内核地址空间去执行这些代码完成操作,完成后,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。

用户态切换到内核态的三种方式

  • 系统调用:这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作
  • 异常:当CPU在执行运行在用户态下的程序时,发生了某些实现不可知的异常,这时会触发由当前运行进程切换到处理异常的内核相关程序中,也就转到了内核态,比如缺页异常
  • 中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

三种方式是系统在运行时由用户态切换到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的异常和外围设备中断则是被动的

进程中的上下文


上下文简单说来就是一个环境,进程在时间片轮转切换时,由于每个进程运行环境不同,就涉及到转换前后的上下文环境的切换

  • 一个进程在执行的时候,CPU的所有寄存器的值、进程的状态以及堆栈上的内容
  • 切换时需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行

进程状态


在这里插入图片描述

  • 就绪状态进程处于可运行的状态,只是CPU时间片还没有轮转到该进程,则该进程处于就绪状态;
  • 运行状态进程处于可运行的状态,而且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态;
  • 阻塞状态进程不具备运行条件,正在等待某个事件的完成

阻塞状态不能直接转换到运行状态就绪状态转换到运行状态由操作系统来决定,用户只能将进程从阻塞状态转换为就绪状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值