JavaEE - 操作系统与进程入门概念

目录

一、操作系统

二、操作系统的定位

2.1 操作系统的定位

2.2 进程的概念

2.3 进程的描述

进程调度相关的属性

三、进程的虚拟地址空间(内存管理)

四、进程间通信

解决进程间相互影响的问题


一、操作系统

操作系统是很重要的一个概念,也是程序员务必要了解的一个东西。

首先,直观上讲,操作系统是一个软件,是一个搞管理的软件,它主要涉及两方面的东西:

  1. 对下,要管理硬件设备。电脑上有很多的硬件,包括CPU,内存,硬盘,主板,风扇,电源等,这些都是电脑上的硬件设备,这些硬件设备怎么去协调工作,都是需要操作系统统筹规划的;
  2. 对上,要给软件提供稳定的运行环境。

进一步说,操作系统就是软件、硬件和用户之间交互的媒介。

我们在平时生活中或者日常学习中也见过不少的操作系统,那么最熟悉的操作系统就是Windows系统,有Windows 98,2000,xp,Vista,win7,win10,win11,每个操作系统之间的迭代变化很大,但是它们最核心的功能还是不变的:管理硬件设备给软件提供稳定运行环境

那么世界上还有很多其他的系统,比如Linux(程序员必须要掌握的系统),我们Windows系统,说白了就是给大众用的,它的特性就是使用的门槛比较低,上手非常容易,而Linux就不那么容易就能掌握的。Linux特别适合于开发和部署的。我们可以看见的Linux包括:1.服务器设备(MySQL),2.嵌入式设备(冰箱,洗衣机,空调,投影仪……(智能家居,可编程的)),3.移动端设备(手机)

除了Linux之外,还有Mac操作系统,就是苹果电脑用的系统,它和Linux是非常相似的,这里不过多介绍。

二、操作系统的定位

2.1 操作系统的定位

如图就是一个计算机的结构,平时所说的操作系统就是红色框内的东西。

解释一下这几个部分都是什么意思:

硬件设备:电脑后盖打开,看得见的都是硬件设备,包括CPU,内存,硬盘,主板,风扇,电源等;

驱动程序:

MySQL中JDBC的驱动程序:为了让JDBC和各大数据库厂商的API进行适配(电脑转接头一样,也称为适配器);

硬件设备是种类繁多的,而且厂商各异,硬件厂商在开发硬件的同时会提供驱动,电脑装了对应驱动,才能让系统正确识别并使用硬件设备。

操作系统内核:操作系统的核心功能(管理);

系统调用:操作系统给应用程序提供的API。比如有个程序想操作硬件设备,就需要先通过系统调用,把操作命令告诉给系统内核,内核调用驱动程序,进一步操作硬件设备;

应用程序:当前学习的Java就是处在应用层次。

2.2 进程的概念

进程是操作系统中的一个核心概念,前面讲到操作系统就是做了两件事,一个是管理硬件,一个是给软件运行提供了环境。这句话的理解就需要谈到进程管理。

首先什么是进程,我们认为,一个跑起来的程序,就是一个“进程”。比如说我们在使用浏览器,它就是一个进程,再比如说我们使用微信,这也是一个进程。而如果没有跑起来,就不叫做进程。再比如在我们的电脑上躺着一个idea64.exe可执行程序,但是此时我们没有去运行它(双击就运行)

没运行的就不是进程!(没跑起来的,叫做“程序”)

那么我们如何看到有哪些进程正在跑呢?我们直接打开电脑的任务管理器(win10使用Ctrl+shift+esc打开,也可以在任务栏鼠标右键打开),这个任务管理器显示的东西就叫做进程。(注:进程(process)也叫做任务(task))

然后可以很明显的看到,每个进程都对应分配了一些系统资源,所以可见:进程是操作系统资源分配的基本单位。

句柄的概念:

系统中包含很多的软件资源,我们程序员写代码就需要用到一些软件资源。软件资源位于操作系统内核中、在应用程序的代码中,我们不方便直接操作。这时就有了句柄这一概念,句柄就好比一个遥控器(简单的整数编号),通过系统调用借助这个句柄就可以操作软件资源了。比如说C语言中的指针也可以视为是一种句柄,对应其可以操作内存资源。

注:磁盘和网络一起叫做IO:衡量IO的快慢就会用带宽这个词表示。电脑的“卡不卡”其实与硬盘上的东西多不多没有任何关系。

介绍到这里,我们可以了解到,进程是一个重要的“软件资源”,是由操作系统内核负责管理的,接下来我们主要研究一下进程在操作系统的如何被管理的,此处我们谈到管理,就是如何描述(讲清楚都有哪些属性和特征)与组织(通过一定的数据结构把多个这样的基本单位串起来)进程。那么在这里我们是如何描述与组织的呢?我们一起往下看。

2.3 进程的描述

描述:使用结构体(C语言的结构体(操作系统基本上都是C/C++写的))来描述进程属性。用来描述进程的这个结构体,起了个特殊的名字,叫做PCB(进程控制块)。

注:可以理解为操作系统使用PCB管理进程。

组织:通过双向链表,把多个PCB给串到一起(并不是一个单纯的双向链表)

创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。

销毁一个进程,本质上就是把链表上的PCB节点删除掉。

打开任务管理器,查询到的进程列表,本质上就是遍历了这个PCB链表。

接下来我们看看PCB里面有哪些描述了进程的特征

  1. pid :进程的身份标识符。(唯一的数字)
  2. 内存指针:指向了说自己的内存是哪些。
  3. 文件描述符表:硬盘上的文件等其他资源

注:内存指针与文件描述符表描述了 进程持有了哪些硬件资源

硬件资源:内存、硬盘、网卡都好分,但是CPU资源不好分。进程有上百个,而CPU一般只有有限的几个,那么操作系统里面有一个重要的模块调度器,就负责让有限的CPU来调度执行这么多的进程。

进程调度相关的属性

1. 进程的状态

就绪状态:进程随时准备去CPU运行的状态;

运行状态:正在CPU运行的进程的状态;

阻塞状态:进程“出差了”,短时间内无法到CPU上执行了,比如进程在进行密集的IO操作,读写数据。

注:很多操作系统不会明确区分就绪和运行状态。

2. 优先级

先给谁(进程)排,后给谁排。给谁排多点,给谁排少点。

进程也是有优先级的,操作系统进行进程调度并不是一碗水端平的。

3. 上下文

操作系统在进行进程切换的时候,就需要把进程执行的“中间状态”记录下来,保存好,下次这个进程再和是哪个CPU上运行的时候,就可以回复上次的状态,好继续往下执行。

简单来说,就是“存档,读档”,上下文本质上就是存档的内容。那么再具体一点:

进程的上下文,就是CPU中各个寄存器的值。(寄存器:CPU内置的存储数据的模块,保存的就是程序运行过程中的中间结果);

保存上下文,就是把这些CPU寄存器的值,记录保存到内存中;

恢复上下文,就是把内存中的执行寄存器值恢复回去。

4. 记账信息

操作系统,统计每个进程在CPU上占用的时间和执行的指令数目,根据这个来决定下一阶段如何调度。

注:PCB中包含的属性是非常多的,上述都是核心的属性

三、进程的虚拟地址空间(内存管理)

刚才讲到PCB中有内存指针这样的一个东西,这个内存指针就描述了当前内存都有哪些东西,但是这里要注意这里的内存指的并不是真实的内存条上的内存而是一个虚拟的内存。

虚拟地址空间:程序中所获取到的内存的地址,并非是真实的物理内存的地址,而是经过了一层抽象,虚拟出来的地址。

实际上程序并不能直接获取物理内存的地址,举一个具体的例子:

比如说给进程1分配0x1000~0x1FFF这块空间,进程2分配0x8000~0x8FFF这块空间。此时如果代码两个进程的代码相安无事还好,一旦代码里出现bug了,那么这个时候就可能影响非常严重:如果进程1代码出现bug了,就可能导致它访问的内存就越界了,本来访问0x1000~0x1FFF这块空间,结果不小心指针变量变成了0x8000,明明是进程1的bug,把进程2搞坏了,很可能写个程序,一运行chrome(举出了一个其他进程)就崩溃了或者画图板崩溃了,或者其他进程崩溃了。

那么为了解决上述问题,为了避免进程之间的相互影响,我们就需要引入虚拟的地址空间,对进程使用的内存进行隔离

针对内存使用的空间,进行“隔离”,引入虚拟地址空间。也就是说代码里不再直接使用真实的物理地址了,而是使用虚拟的地址,由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。

如图,此时一旦进程1要访问0x3000这个越界地址,那么拿着这个地址去MMU这块去翻译翻译不了,意思就是本来MMU(集成在操作系统内核里,CPU中)规划进程1是0x1000~0x1FFF,进程2是0x1000~0x1FFF,进程3是……,结果一看给了一个0x3000无法翻译的地址,超出了进程1的访问范围,于是它就会及时向进程反馈一个错误(具体来说是发送一个SIGN SEGEMENT FALUT信号,引起进程的崩溃)。

虚拟地址空间,主要就是为了避免进程之间产生相互影响。

四、进程间通信

解决进程间相互影响的问题

虽然进程隔离了,但是又引入了新问题,有些时候,确实进程之间,需要进行数据的交互(相互配合)。那么怎么样去解决要相互配合的问题?

在隔离性的基础上,开个口子。引入了“进程间通信”,它的实现方式很多但是核心思路是一致的。

我们需要搞一个多个进程都能访问到的“公共空间”,基于这个公共空间来进行数据交互即可。这里的公共空间有很多具体的体现形式,后面主要了解两种方式,基于文件,基于网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值