• Java EE|软件视角下的操作系统


    前言

    虽然,本文我们主要讨论的是软件视角下的操作系统,但是我们还是对操作系统做一个整体概述即软件+硬件角度说明。因为细节很多,所以整篇文章会比较长,请屏幕前的你做好准备嗷~

    文章最后附本文的思维导图

    操作系统的概念及常见的OS举例

    定义:操作系统就是一组做计算机资源管理的软件统称,英文名字叫做operating system,简称OS。

    简而言之,它就是一类用来做管理的、分配资源的软件。如果把整个电脑比成一个公司,那么操作系统就相当于是董事长或者总经理。

    常见OS举例

    1. windows系列,我们常用的基本上就是这个windows系列。
    2. Linux系统,是我们程序猿必须要掌握的系统。为什么呢?因为它特别适合开发和部署,比如服务器、嵌入式设备以及移动端设备基本上都是使用的linux系统,并且目前公司中绝大多数使用的都是这个系统,而非我们更为熟知的Windows。
    3. Mac系统,也就是苹果电脑中用的系统。
    4. Android系列,是手机端的操作系统,在谷歌旗下,本质上也是linux
    5. ios系列,也就是苹果手机中的OS,与mac系列是同根同源的。
    6. 鸿蒙……

    操作系统的定位以及它的功能/职责/作用

    定位:

    1.是设备中软硬资源的管理者

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZmQ35UP-1668925514459)(F:\typora插图\image-20221120114054969.png)]

    2.是程序跑起来的必备条件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CupnvFKS-1668925514461)(F:\typora插图\image-20221120120658256.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxuSdtwK-1668925514462)(F:\typora插图\image-20221120114758206.png)]

    补充知识

    电脑能直接识别的只有机器语言(机器码、0、1组成的字符串序列),前辈们为了方便使用,设计了汇编语言(指令集,由一些单词组成的字符集),通过汇编语言操作电脑。但是这还不够方便,所以后来又发展出来了高级语言,我们可以通过高级语言来操作。例如java,编译后生成字节码文件(高级语言----》汇编语言),运行时,字节码变成机器码,被电脑识别(汇编语言—》机器语言)。

    操作系统因为对硬件和软件方向都需要是绿灯,所以,需要提供一套指令集方便使用者编写、同时方便电脑硬件识别,以便于驱动硬件,完成程序的执行。但是不同的OS厂商设计的指令集会有所不同,所以,他们提供的驱动程序也不尽相同。

    功能

    操作系统(OS)是硬件、软件、用户之间交互的媒介。对上(一般的app),起着给软件提供稳定的运行环境的作用;对下,起着硬件设备管理的作用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-icziZ09K-1668925514463)(F:\typora插图\image-20221120121003108.png)]

    全程高能!!!敲黑板警告!!!

    一、进程概念(感性认知)

    我们已经知道了,OS为软件提供了操作环境。那么具体是怎么操作的呢?OS对软件通过进程来管理。那么什么是进程呢?

    概念:一个跑起来的程序,就叫做进程/任务。进程英文名字叫做process,任务名字叫做task。

    例如,我们windows系统就可以通过ctrl+alt+delete调出我们的任务管理器,其实也就是我们这里的进程管理器。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZhijhwA-1668925514463)(F:\typora插图\image-20221120121526833.png)]

    这里我们需要区分两个概念

    进程&程序

    1.从概念角度而言

    程序:是一套数据处理的步骤,是静态的,表现为一个或一组文件。

    进程:进程是程序的一次执行过程。

    2.从用户角度而言

    一个程序可以多次执行即有多个进程,甚至可以多次同时执行(宏观角度)。进程是程序在运行时的视觉主体。

    3.从OS角度而言

    进程是OS进行资源分配的基本单位/最小实体。

    进程是一个非常重要的软件资源,是由操作系统内核负责管理(描述和组织)的。

    那么OS究竟是怎么进行描述和组织的呢?我们接下来详细讨论讨论这个问题。

    二、进程的描述和组织!!!

    描述

    进程的描述一般并不是单个数据能够描述清楚的,往往是一组数据。

    在java中,我们可以用类/对象来描述这一组数据,C/C++中用的是结构体来描述的。他们都有一个共同的名字叫做进程控制块****,英文名字叫做process control block简称PCB。

    而不管是结构体表示还是类/对象表示,它们的组成都是不变的,都必须包含以下四部分/具有以下四部分特征:

    ①进程的唯一标识——pid

    ②内存指针。注意这里的指针不是C/C++的指针,而是一个形象比喻,毕竟我们还有说java呢–它描述了进程关联的程序信息,例如那个程序加载到那个内存里去了。主要解决的就是内存分配的问题,比较重要!。

    **③文件描述赋表。**也就是分配给这个资源使用的其他资源的信息。

    ④进程调度信息。主要解决的就是cpu资源的分配。非常重要!!因此,我们在下边专门开了一个小节讨论这部分内容。

    PCB的这四个特性解决了OS操作中/资源分配中的进程标识、内存分配、CPU分配这三个主要问题。


    我们在idea或者vs上边打印地址其实并不是真正的地址,有人说哈希出来的虚拟地址,这种说法对吗?我们在后边专门开了一个小节讨论这个问题。


    组织

    通过一定的数据结构来组织。这里采用的就是一个双向链表来把多个PCB给串到了一起。

    大体认知

    在基本了解了进程描述和组织之后,我们不难有这样的结论:

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

    • 销毁一个进程,本质上就是把链表中的一个PCB对象给删除

    • 任务管理器查看到进程列表,本质上就是遍历这个PCB链表。

    三、进程描述之进程调度/CPU分配详解!!!

    首先说结论,OS对CPU资源的分配,采用的是时间模式,即不同进程在不同时间段去使用CPU资源。

    既然要讨论CPU分配,我们首先需要对它有一个基本的了解吧。

    1.什么是CPU?

    CPU是一块超大规模热集成电路,是一台计算机的运算核心和控制中心。

    2.CPU的分类

    决定一棵CPU战斗力的要参数包括“三大两小”。三大:核心数/线程数、频率、架构;两小:缓存、工艺。

    这里我们主要关注的是核心数/线程数。

    我们经常看到类似于这样的术语“8核16线程”,它的含义就是一个CPU分成8个核心,每个核心又能一个顶俩(超线程技术)。我们可以把每个核心都视为一个独立的CPU。

    这里我们注意要区分进程和线程的概念,由于篇幅原因,这里我将会在第6个小节中对它进行说明。这里我们只需要简单知道进程和线程是一对多的关系即可。

    了解完cpu,我们现在再来思考一个问题,cpu的核心/线程数是有限的,而我们需要处理的数据是海量的,这样就无可避免的会造成一个问题,那就是进程/线程并发。而谈到并发我们又往往会联想到并行,所以,我们再来讨论一下cpu资源分配过程中的并发和并行问题。

    先来说结论,我们是希望同时进行的,为的是效率更高一些,为此,前辈们提出了一个概念——分时并发,同时涉及到并行和并发。

    注意:不管是并行还是并发,一个核心上只能执行一个进程。

    并行,微观上来讲,就是同一时刻,两个核心上的进程时可以同时执行,宏观上也是同时执行的。【可以理解为平行关系,互不干扰完全没问题】

    并发,微观上来讲,就是同一时刻,(一个核心的多个进程是不可以同时执行的,只是跟并行并发没关系),一个核心一次只能执行一个进程,但是他能通过对进程进行快速的切换,达到宏观上,同时执行的假象。

    可以暂时这样理解:
    并行讨论的是cpu的不同核心上的进程,并发讨论的是同一个核心上的不同进程。
    对于宏观上同时执行的进程,是并行或者并发的关系。如果这两个进程是在同一个核心上,那么就是并发的关系;如果是在不同核心上,那么就是并行的关系。

    因此,分时并发就可以解决数据量比较大的时候程序的运行问题,服务于很多的进程。另外,宏观而言,并行和并发我们并不能区分,因此很多时候我们把并行和并发统称为并发,如果不显式声明的话。

    讨论完cpu和并行并发这些背景知识,我们来看进程到底是怎么调度的?

    进程的调度通常是通过调度器完成的调度器有以下几种核心属性

    1. 进程的状态

      • 就绪状态:随叫随到,就成随时准备好了去cpu上执行
      • 运行状态:正在执行
      • 阻塞状态:短时间内无法响应……
      • ……(其他的了解/用到再查也可以,先掌握这些重要的)
    2. 优先级

      进程之间也是有优先级的,联想优先级队列

    3. 上下文

      情景:加到一半断电了。此时就需要有人/部件记录这个状态,在cpu中当一下子加载不完也是需要上下文这个功能。

      上下文本质上就是我们存档的内容。

      进程的上下文就是cpu中各个寄存器的值。(联想cpu的功能)

      保存这些上下文,就是把这些cpu寄存器的值,保存到内存中去。恢复上下文就是把这些cpu的值加载回去。

    4. 记账信息

      操作系统中,统计每个进程再cpu上占用的时间和指令的舒木木,根据这个决定来决定下一阶段如何调度。

      相当于一个会议记录,方便复盘。

    四、进程描述之内存管理/内存分配!

    首先说结论,OS对内存资源的分配,采用的是空间模式,即不同进程使用内存中的不同区域,互相不会干扰。

    既然要讨论内存,我们首先需要对它有一个基本的了解吧。

    1.什么是内存?

    内存是内存器,一般表现形式有内存条等等。

    2.内存功能

    暂时存放 CPU 中的运算数据, 以及与硬盘等外部存储器 交换数据。

    3.内存条简单介绍

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZ3X63eW-1668925514464)(F:\typora插图\image-20221120131248114.png)]

    虚拟地址与物理地址:

    物理地址:真实的内存地址

    虚拟地址:物理地址被操作系统转换后的地址

    这么做的原因是:同一个进程不一定会被放在内存的同一个位置,而且不同的进程因为地址的不同,而且可能不连续,编写程序会变得很复杂。

    虚拟地址是暂时承诺给你,等你需要(访问这段内存)的时候才会给你分配内存

    五、进程之间通信

    进程一多,无可避免的会带来一些问题,比如进程相互影响的问题。我们可以把它们全部隔离吗?不可靠,如果这些进程之间有相互依赖/配合的关系呢?需要他们进行相互配合。

    这个时候我们就需要在隔离性的基础上“开个口子”,搞一个多个进程都能访问到的“公共空间”,基于这个公共空间来交互数据。

    通信方式/公共空间有很多具体的体现形式,我们重点掌握两种**,基于文件和基于网络**即可。

    六、相关拓展知识(了解即可)

    进程和线程的区别

    1. 线程是依赖于进程存在的
    2. 进程和线程是一对多的关系
    3. 进程是os资源分配的基本单位,线程是cpu调度的基本单位

    内存管理主要研究的问题

    1. 那些内存已经被分出去,那些还没有
    2. 已经分配出去的内存什么时候回收,怎么进行回收
    3. 物理地址到线性地址的转换。。。
    4. 内存碎片问题。。。

    在这里插入图片描述

    参考

    CPU
    OS

  • 相关阅读:
    胡说八道(24.6.3)— 数字信号处理
    车载网络扫盲
    Android Studio 插件 — 开发工具类搜集
    解决userdel: user xxx is currently used by process 2461和kill命令无法杀死进程
    STEAM上的一款电路模拟神器 — CRUMB Circuit Simulator
    品牌媒介工作流程是什么,媒体投放目标怎么做?
    C/C++中的内存管理
    Ab3d.Reader3ds - 3ds 文件导入器 --FIX-Crack
    .NET Core(.NET6)中gRPC注册到Consul
    深度学习技巧应用28-强化学习的原理介绍与运用技巧实践
  • 原文地址:https://blog.csdn.net/moteandsunlight/article/details/127948683