JavaEE初阶学习web开发的第一步**计算机组成原理,操作系统,进程(基础扫盲)**

文章目录

  • [*1. 前言*](#1. 前言)
  • [*2. 正文*](#2. 正文)
    • [1. 计算机的简介](#1. 计算机的简介)
      • [1.1 计算机的组成部分](#1.1 计算机的组成部分)
      • [1.2 冯诺依曼体系结构](#1.2 冯诺依曼体系结构)
      • [1.3 CPU的指标(与开发相关)](#1.3 CPU的指标(与开发相关))
      • [1.4 CPU执行指令的过程](#1.4 CPU执行指令的过程)
    • [2. 操作系统](#2. 操作系统)
      • [2.1 操作系统的分类](#2.1 操作系统的分类)
      • [2.2 操作系统的作用](#2.2 操作系统的作用)
    • [3. 进程](#3. 进程)
      • [3.1 什么是进程(process)](#3.1 什么是进程(process))
      • [3.2 操作系统如何管理进程](#3.2 操作系统如何管理进程)
      • [3.3 PCB的重要属性](#3.3 PCB的重要属性)
      • [3.4 进程如何被执行](#3.4 进程如何被执行)
      • [3.4 进程的调度](#3.4 进程的调度)
  • [*3. 结语*](#3. 结语)

Believe you can and you're halfway there!

1. 前言

下面我们正式开展JavaEE初阶的学习,!涉及web开发,网络编程,服务器开发,后端开发的关键性知识,本文我们主要先了解计算机的组成,以及计算机如何工作的,当然MySQL的剩余部分知识会与JavaEE初阶同步更新!注意,这个系列不涉及过多的计算机组成原理和操作系统的知识,我们只需要了解大体即可,web开发是我们最终的目标!本文全是理解性概念,请各位特种兵做好准备!


2. 正文

1. 计算机的简介

1.1 计算机的组成部分

在深入了解计算机的组成和零件前,我们先梳理一个概念,什么是计算机?

只有电脑才算计算机吗? 答案:不是的 ,我们生活中处处都用到了计算机,比如说家用洗衣机,微波炉,空调等等都算计算机范畴之内,所以计算机这个概念在我们的生活中应用十分广泛!如果哪天计算机消失了,人类的生活会直接发生天翻地覆的变化,甚至倒退到远古时期了!那到底什么算是计算机呢? 只要符合冯诺依曼体系结构的电子设备都算是计算机,冯诺依曼是计算机界的鼻祖!!我们后面会详细讲解! 下面我们主要以电脑出发来看看计算机的组成部分和各个零件

1)CPU -->中央处理器

相信大部分的小伙伴手中都有一台电脑,无论是台式电脑还是笔记本电脑,都离不开CPU!CPU是电脑上最核心的部分;称之为中央处理器,也是人类历史上的巅峰制作,承载了无数的智慧!我们先来看看CPU到底长什么样子

如图就是一个大公司Intel品牌的CPU,相信大家都对这个品牌有一定的了解!CPU 是一个手掌大小的方块,内部构造十分复杂,我们看到如图 CPU 上面凸起的金色小点点,那是用来与主板相连,连接后 CPU 就可以为电脑工作了,当然我们还可以查看当前电脑 CPU 的型号

小编这台电脑是 Windows 系统,搭载如图 CPU 的笔记本;除此之外,小编还有一台

macOS 系统的笔记本

它搭载的就是苹果自研发的 m5芯片的 CPU 🌸


2)主板 -->大插座

如图这块黑色的板子就是主板,上面搭载了各个硬件,主板就没什么好说的了,本质上就是一个大插座!


3)内存 --> 存储数据的主要模块

内存在计算机的组成中起着非常重要的作用,它是存储数据主要的模块!小伙伴们最近可能听说内存条堪比 gold 一样📈,内存是与 CPU 交互的主要单元,我们知道电脑中有磁盘,这些磁盘都称为硬盘,如果 CPU 想要处理数据,执行程序,就要先从硬盘加载到内存再从内存加载到 CPU

如图就是一个内存条的照片,它是靠着外圈的''金手指''竖着插在主板上的!我们在买电脑前,如果你不是一个刚入门的小白,都会先看 CPU 型号显卡型号其次就是内存!我们也可以查看一下自己电脑的内存,如果是 Windows 系统就在任务管理器中查看即可

小编这台电脑的内存就是32G,只要内存够用例如 16g的程序在硬盘中面对 8g 的内存可能要分布加载,频繁在硬盘和内存之间来回倒,但是如果是 32g 的内存那就会全部一次性加载

小编的这台苹果电脑的内存只有可怜的 10G,由于操作系统的不同 macOS 有沙盒机制,程序不会乱占内存,缓解了内存的压力,有兴趣的小伙伴可以了解一下,这里注意如果要对比内存的利用要看的是操作系统!


4)硬盘 -->存储数据的主要模块

如图就是一个硬盘,硬盘的面积是比内存大的,存储数据的容量也更多,这里我们就引出了一个关键的问题,内存和硬盘到底有什么区别?

内存 🆚 硬盘

  1. 内存的读写速度快;硬盘的读写速度慢
  2. 内存的造价高;硬盘的造价低
  3. 内存的存储空间比较小;硬盘的存储空间比较大
  4. 内存存储数据不是持久性存储,断电就消失了;硬盘是持久性存储数据(但是硬盘放很久很久里面的数据也有可能丢失的)

我们之前学习的 MySQL 存储数据就在硬盘中,不易丢失!

由于我们是在自己电脑安装的MySQL,所以服务器和客户端都在本机上,这张图就是大致的流程!

在此我们在讨论一个点,在买手机时,销售人员常常说这个手机是多少内存,比如 32g,64g... ,这种说法是不正确的,这里的内存本质上是硬盘的容量!

小编的手机的硬盘就属于要爆满的状态了🥲,由于大多数人都分不清这两个概念,

所以业内出现了一个新的名词叫"运存",也是内存的意思RAM。


5)显卡 --> GPU 专用计算芯片

相信绝大部分小伙伴对这个都不陌生,尤其是游戏佬,显卡是非常重要的,与 CPU 一样,也可以进行算数运算和逻辑判断,但是 GPU 只能做简单的算数运算''1+1'',而显卡可以做高等算数元算''微积分''!

那这里为什么称 GPU 为专用计算芯片呢?是因为 GPU 不只是孤绝奋战,而是一组打工人来工作,计算 1+1 的速度非常非常的快,这就使GPU 在 图形渲染,ai 人工智能方向需要大量的计算起了重要的作用!


6)电源

7)散热器

8)机箱

9)键盘鼠标

10)显示器

这些都是众所周知的硬件设备了,这里小编就不拿图片详细描述了


1.2 冯诺依曼体系结构

我们上面强调过只要符合冯诺依曼体系结构的设备都是计算机!那冯诺依曼体系结构到底长什么样子?

这里的控制信号,数据信号先不用管,我们只需要知道只要满足 CPU;存储器;输入设备;输出设备这四项就是冯诺依曼体系结构!

那什么是输入? 什么是输出?

常见的输入设备:键盘,鼠标,麦克风...;输出设备:显示器,打印机,投影仪...

这里面还有既是输入设备又是输出设备: 触摸屏;网卡(集成在主板上,上网的时候和网线连接的对应硬件设备)下载数据数输入,上传数据是输出


1.3 CPU的指标(与开发相关)

与我们做开发最密切相关的就是CPU,这里我们主要关注CPU的两点:CPU的频率和CPU的核心数

1)CPU频率

以Windows操作系统的电脑为例,CPU的频率查看也是在任务管理器中

图中关于CPU频率的解释有两个,一个是速度,一个是基准速度

这里基准速度又称为基频/默频 单位为GHZ G相当于10^9次方,HZ代表1s多少次,也就是我这台电脑的CPU基频一秒可以进行22亿次的计算!!

而图中的速度又称为睿频/加速频率 ,也就是cpu根据当前的任务量,进行频率变更,类似于变频空调这一特点


2)CPU的核心数

也是以Windows电脑为例

以上是我这台电脑CPU的核心数,我们发现它分为内核和逻辑处理器,这里我们简单讲解一下!

什么是 CPU 的核心?CPU 的核心可以理解为一个工人,专门为 CPU 打工的,以前的电脑都是单核 CPU,也就是一个工人为 CPU 打工,面对简单的任务还是绰绰有余的,但是时代飞速发展,所处理的业务也越来越多,单核 CPU 就不太够用了,所以引用了两个核心来工作,多了一名工人效率也就大大提高了!Intel 公司对此还觉得远远不够,引入了''超线程技术'',让一个 CPU 核心顶两个,也就是一个工人干两个工人的活 (资本家),这样 CPU 上面就有了 4 个核心。

所以这里的物理核心(内核):真实干活的工人;逻辑核心:实际上这些人能同时干几个人的活

但是目前 Intel又引入了新的技术,退出''大小核''的技术,大核心(一个工人能干两个人的活)小核心(一个工人只能干一个人的活),小编这台电脑就是典型的大小核,8 大核+16 小核


1.4 CPU执行指令的过程

CPU就像一个时刻准备工作的打工人,程序员就是老板,程序员发送指令让CPU去做什么工作,CPU才会去执行对应的工作,那么程序员使用的是哪种语言指示CPU工作的呢?

首先编程语言分为三大类: 机器语言;汇编语言;高级语言。我们所学习的Java,c语言都属于高级语言范畴,拿Java来举例,程序员编写好Java代码,编译器帮助程序员转换为字节码文件,字节码文件再给到JVM,由JVM生成机器语言再给到CPU

那CPU都支持哪些指令呢? CPU支持的指令是在其设计出来就确定了,每个指令表示什么,有什么意义都是被确定好的!我们简单举一个例子,使用指令表,表示CPU都支持哪些指令

如图就是一张简易版的指令表,此处我们规定一条指令为8bit(8个二进制位) 真实的指令一条是8Byte大小,我们先来简单分析一下

LOAD_A LODB_B 都是将内存指定地址的数据加载到对应寄存器上,注意这里的寄存器是镶嵌在 CPU 上的,比内存加载数据的速度还要快!一CPU 上有几十个寄存器,分别有各自的作用,CPU 寄存器主要是在 CPU 执行指令和进行各种运算时临时存储数据的,起到辅助作用

一条指令==4 位操作码(opcode) + 4位操作数

如图是我们要执行的一段指令,地址是内存地址,我们一点点分析,假设 CPU 是从 0 号的内存地址开始执行

1) CPU 读取 0 号地址的指令

0010 1110==4 位操作码 + 4 位操作数,也就是这里操作码为 0010 对应指令表执行 LOAD_A 操作

1110是操作数,换算成十进制就是 14,把这条指令翻译过来就是将 14 号内存地址这条数据从0 号内存地址写入寄存器 A

从表中寻找 14 号内存地址,对应 0000 0011 换算成十进制为 3

最后将 3 写入寄存器 A


2)CPU 继续执行下一条指令,1 号内存地址的指令

0001 1111 --> 将 15号内存地址的数据写入寄存器B,将 0000 1110 写入 B,换算成十进制为 14


3)CPU 继续执行 2 号位置指令

1000 0100 --> 执行指令表中 ADD 操作,这里我们规定寄存器 A 的 ID 为 00,寄存器 B 的 ID 为 01,所以执行 3+14 操作并把结果放入寄存器 A 中

此时寄存器A 存放数据 17,寄存器 B 存放数据 14


4) CPU 执行 3 号内存地址的指令

0100 1101 -->执行指令表中 STORE_A 操作,将寄存器 A 写入 RAM,写入对应的位置为 1101 换算成十进制为 13 号内存地址

将 13 号内存地址的数据改为 0001 0001


5)CPU 继续执行 4 号内存地址的指令

发现为 0000 0000 ,此时认为程序结束了,CPU 也不会继续向下执行了

以上就是机器指令的相关操作,实际上要比小编复述的复杂的多,我们只需要了解大致即可,最重要落在 web 开发上!


2. 操作系统

2.1 操作系统的分类

操作系统是计算机中重要的软件!现在主流的操作系统大概分为五种

首先是电脑端: Windows操作系统, Linux操作系统,MacOS操作系统,作为我们程序员最常用的操作系统就是Linux

手机端分为两种:IOS(苹果),Android(安卓)。

不同的操作系统最直接的区别是:提供的 api(系统函数) 截然不同,很简单的一个例子,你在Windows端写的程序只能在Windows操作系统中运行,在Linux和MacOS上不可运行,我们熟知Windows的程序都是 .exe 后缀结尾 ,而MacOS的操作系统都是 .dmg 结尾。

话题再扯到我们所学的Java语言 ,我们在刚开始学Java时,就听过一句话"Write once,run anywhere",不管是在任何的操作系统,Java的代码均是可以运行的,这是由于JVM的特性,注意:JVM在不同的操作系统下是不同的程序,Windows有独属于Windows的JVM,Linux有独属于它的JVM,但是这些JVM上层支持的Java字节码一致,所以有了那句名言!


2.2 操作系统的作用

首先我们要搞清操作系统是干什么的?

操作系统是一个负责管理计算机的一个软件

1)操作系统管理各种硬件设备

这里可能会有小伙伴困惑,一个软件怎么管理一个硬件呢? 确实如此,操作系统并不是直接管理硬件的,而是通过驱动程序间接管理硬件设备,那什么又是驱动呢? 驱动也是一个软件,不知道大家有没有买过当今大牌子的电竞鼠标,比如说罗技,罗技的鼠标与正常的鼠标有所不同,上面会有很多按键,在没有安装驱动时,多余的按键是不能使用的,只有左键右键也就是正常鼠标的功能,只有安装罗技官网了驱动,罗技的鼠标才能发挥100%的功效!这个驱动程序是研发硬件的人所提供的;我们的电脑本身也有大量驱动,例如正常的鼠标和键盘都是应用了系统自带的低配版驱动。

2)操作系统负责给各种应用程序提供一个稳定的运行环境

我们的电脑上会有很多的应用程序,它们在工作中是互不打扰,不会出现一个应用程序在使用中出现bug而导致所有应用程序崩溃的情况,这都要归功于操作系统!

对于应用程序的执行我们就要引出一个新的概念:进程


3. 进程

3.1 什么是进程(process)

一个运行起来的程序就称为进程

我们也可以在电脑上查询当前电脑的进程个数

以Windows操作系统为例,现代计算机都会一下跑百十来个进程!这样就需要操作系统平好好管理这些进程,这也体现了操作系统的第二点作用。

那么操作系统为什么要管理进程呢?这是由于进程的数量太多了,好比你进入一家只有两个人的公司,老板可能不怎么会管你,但是你进入一家上千人的大公司,老板肯定要细化管理的流程,才能更好的约束员工!操作系统也一样,面对的进程有成百个,当然要好好的管理。


3.2 操作系统如何管理进程

站在操作系统的视角下,管理进程分为两步走

1)先描述一个进程是什么样的 (描述)

2)再把多个进程组织起来 (组织)

这里就充分体现了编程的思维,从个体入手到掌握全局🌸

举一个例子帮助我们更好的理解: 学校为了更好管理每个班级的同学状况就要先知道每个同学的各种信息(学号,班级,姓名,性别...),这就好比把学生定义为一个结构体或者对象,通过对象的各种属性保存同学的信息,然后把这些同学所对应的对象通过某种数据结构组织起来,方便增删改查!

那么结合到操作系统管理进程:1.描述一个进程就要使用结构体 (这里不能使用对象,因为主流的操作系统都是c语言写的,只有在Java中才谈对象);描述出进程的核心属性; 2. 再把多个进程通过数据结构组织起来

这里我们把描述线程的结构体 称为 进程控制块(PCB) ,这是一个非常大的结构体,里面包含很多属性!所以我们如果创建一个新进程,就是创建一个PCB,并初始化PCB各个属性,加载到对应的数据结构上;销毁一个进程,也就是把当前进程的PCB在数据结构上找到并删除!


3.3 PCB的重要属性

1) pid --> 进程的身份标识符(进程Id)

当运行一个程序时,就会创建一个进程,并且进程的PCB含有唯一的PID

这里我们看到除了第一个进程,剩余两个进程都分配了唯一的PID,第一个进程之所以没有分配是因为他是一个进程组!

我们可以看到进程组中的每个进程也分配了PID


2)内存指针

这里可能有小伙伴有疑问了,为什么进程会用到内存指针?拿Windows操作系统举例,操作系统内核会把.exe文件中的指令和数据读取出来加载到内存中,后续进程在运行过程中,就会从指令内存区域里一条一条取指令并执行。

这里我们注意一下: .exe文件是程序员写代码生成的,程序员写的代码最终被编译成二进制指令包含在exe文件中,exe中还有数据,cpu 根据 exe 中的二进制指令和数据来执行指令

下面我们画一个本篇博客最最最重要的一张图!充分理解这部分知识!

这就是一个可执行文件如何运行的大体逻辑,通过这张图我们就能得出:进程运行过程中是需要依赖内存资源的!

我们在这里插一嘴题外话:到底是操作系统操作 cpu 还是 cpu 操作操作系统呢?大家肯定意见分歧,这里小编用自己的理解来解释一下,操作系统本身是一个软件,也是由二进制的指令和数据构成的,在电脑开机时,cpu 会通过主板等硬件执行当前操作系统的二进制指令,这样操作系统就被唤醒了,之后再由操作系统接手,监管电脑。所以没有谁操作谁这一说法,只有层级关系!可以把 cpu 当成只会工作的工人,操作系统是工头


3)文件描述符表

在上面的图中我们提及到了文件描述符表,这其实就是进程在运行过程中,需要与硬盘进行交互,(硬盘上的数据都是以文件的形式组成的),进程在读写文件的时候,就需要先打开文件,每打开一个文件就会把当前文件的信息保存到文件描述符表中,表里的每个项,就对应着一个打开了的文件

在我们电脑的硬盘上会有很多文件,这些文件就是操作系统对数据的封装,除了硬盘资源,操作系统还会把很多资源都抽象成文件来表示,例如网卡,为什么要统一抽象成文件呢? 当然是为了好管理!不管什么资源 open 就是打开资源,read 就是读资源...

以上我们得到了一个结论:进程运行也会依赖到硬盘,网卡等相关资源设备的

除了内存资源和硬件资源,进程运行,执行指令都要消耗 cpu 资源的

总结: 进程是操作系统中资源分配的基本单位! 这句话非常重要一定要牢记


3.4 进程如何被执行

拿小编这台Windows电脑举例,我这台电脑有32个逻辑核心数,一个CPU的逻辑核心同一时刻只能执行一个进程,那么我这台电脑只有32个牛马为我干活,如何同时进行100多个任务的工作?

我们把话题先追溯到上个世纪,在早期操作系统都是''单任务''操作系统,同一时刻只能执行一个进程,如果想运行下一个进程必须得结束上一个进程,这使得用户使用下来非常麻烦!你和女神聊天,女神不搭理你了,你还不能离开聊天页面打局游戏,只能干等女神回复🤡

继单任务操作系统后推出了多任务操作系统,这里的多任务操作系统被发明前还没有多核CPU,只有单核CPU!那么单核CPU如何进行多任务操作? 它主要采用了分时复用的方法:把单位时间分成很多份,第一份时间运行进程1的指令,第二份时间运行进程2的指令... ...这期间人类是感知不到的,超出了人类的反应时间!这就使人看起来感觉进程在''同时执行''一样,但是如果运行的任务(进程)实在是太多了,人类还是有可能感知到卡顿;

这里我们单个CPU核心按分时复用 执行多个进程的方式称为 ''并发执行'',本质上CPU是在串行执行多个进程,切换速度超级快!

我们把多个 CPU 核心 ,分别同时执行多个进程的方式称为 ''并行执行''(这里不是采用分时复用!是多个进程占用不同的核心)

并发就可以理解为一个人左右手写两份作业;并行就可以理解为两个人写两份作业

现代的 CPU 在运行进程时,并发和并行执行是同时存在的! 我们把 "多个进程通过并行并发来消耗CPU 资源" 的方式称为 进程的调度

这里我们再多提一嘴,程序员写代码时是无法判断当前进程是并发执行还是并行执行的!所以我们会把并行合并发统称为''并发''


3.4 进程的调度

所谓进程的调度就是多个进程运行如何来协调消耗CPU资源! 我们上面讲解了多个进程是通过''并行并发''的方式消耗CPU资源!进程的调度还与PCB中四个关键的属性密不可分!我们来一一讲解!

1)进程状态

进程的状态分类有很多,我们这里只谈两种:就绪状态;阻塞状态

这里小编举一个现实生活的例子,假设小编是一个吸引无数万千少男的女神,追我的人有很多,我需要一个长得高,长得帅,有钱的男朋友,但是小编发现符合以上三点的完美男生太稀缺了,所以小编谈了三个男朋友🐱🐱🐱

🐱男朋友A:有钱;

🐱男朋友B:长得帅;

🐱男朋友C:长得高;

小编下面开始制定和以上三位男同志的约会天数:

🐱A:周一周二

🐱B:周三周四

🐱C:周五周六

周天小编需要休息一天

以上与每个🐱约会就是一个进程,约会表就体现了进程的分时复用,并发执行

下面小编开始约会啦!首先与🐱A约会,这时🐱A家里突然有急事,需要回去继承家族企业,这时小编与🐱A的约会就不能顺利进行了!这就属于进程的阻塞状态 ,那么小编肯定要利用这两天时间多多奖励🐱B和🐱C,他们都属于随叫随到的状态,这就属于进程的就绪状态

这里我们注意:在操作系统中是不区分就绪和执行,也就是只要🐱B 或 C 随叫随到,随时都可以约会,或者正在进行约会,都属于就绪状态!


2)进程优先级

成百个进程在 CPU 上执行的机会肯定是不均等的! 有些进程就需要吃CPU 较多的资源,有些进程就吃 CPU 较少的资源;比如你打开黑神话悟空🐒和 QQ,黑马喽肯定要吃 CPU 更多的资源,如果不吃黑马喽就跑不动了,而QQ 只需要较少的资源即可,消息晚几秒也无伤大雅,这里注意:进程吃 CPU资源与挂后台是无关的

结合到进程的调度,还是上面的例子:小编是女神,女神也是要生活的,肯定更倾向于

物质的美丽而不是外表的美丽,所以对🐱A 的奖励就更多一点🤣


3)进程的上下文

进程的调度本质上是执行一会,失去 CPU,一段时间后再返回 CPU 上执行,因为进程的调度是要抢占 CPU 资源的分时复用的;所以当进程重新返回 CPU 执行肯定不能从头再来!这时就需要用到进程的上下文!

进程在 CPU 运行本质上是依靠 CPU 寄存器执行指令的,在进程需要离开时,会把寄存器中的所有数据保存到进程的 PCB 中再保存到内存中!这属于进程保存上下文的操作;当进程返回 CPU 时,把 PCB 刚才保存的属性重新填写回对应的寄存器中,这就属于进程恢复上下文的操作

结合到进程的调度:小编当女神,每次约会后肯定要记录与🐱的发展关系,下次再赴约不能忘记之前🐱对我们的好,适当多奖励对我们更好的🐱 😊


4)进程的记账信息

这个属性主要用来统计,统计每个进程在 CPU 上运行了多久,如果发现某个进程太久没吃到 CPU 资源,就会给这个进程倾斜点资源

还是刚才小编当女神的例子:由于🐱A 两周都在忙于事业,这周刚回来,小编肯定要多奖励奖励🐱A,多跟🐱A 约约会,爆爆金币🐶


以上 PCB 的四个属性与进程的调度相关,小伙伴们一定要理解性记忆!


3. 结语

以上就是本文主要的内容,我们迈开学习JavaEE的第一步,也是非常重要的一步,本文全是理论性知识,需要大家费点功夫理解并吃透,下面我们会进入代码的环节,就没有这么枯燥了!有不明白的地方可以留言小编会回复,希望读者们多提建议,小编会改正,共同进步!谢谢大家。 🌹🌹🌹

相关推荐
慕容卡卡2 小时前
大模型核心,MCP(模型上下文协议)和Session API
java·开发语言·人工智能·spring boot·spring cloud
zore_c2 小时前
【C++】C++类和对象实现日期类项目——时间计算器!!!
java·c语言·数据库·c++·笔记·算法·排序算法
小郑加油2 小时前
python学习Day6-7天:条件判断与基本综合应用
java·服务器·apache
weixin_443478512 小时前
Flutter学习之自定义组件
javascript·学习·flutter
23471021274 小时前
4.18 学习笔记
软件测试·笔记·python·学习
苏瞳儿7 小时前
java对数据库的增删改查
java·数据库·oracle
zhangjw347 小时前
Java基础语法:变量、数据类型与运算符,从原理到实战
java·开发语言
yaoxin52112310 小时前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
lizhihai_9910 小时前
股市学习心得-AI算力20大硬件四金刚
学习