计算机是如何工作的下篇

previewfile_29534312814

操作系统(Operating System )

操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等.

操作系统由两个基本功能:

  • 对下,要管理硬件设备.

  • 对上,要给软件提供稳定的运行环境.

因此,操作系统是软件硬件用户之间交互的媒介.

电脑端的操作系统

我们最熟悉的操作系统Windows的发展过程
Windows 98 => Windows 2000 => Windows XP => Windows 7 => Windows 10 => Windows 11(最新发布)

Linux操作系统 ~~ 程序猿必须要掌握的系统
特别适合进行开发和部署
该系统的应用范围:
1.服务器
2.嵌入式设备(如冰箱,洗衣机,空调,投影仪…)
3.移动端设备

Mac操作系统 ~~ 苹果电脑用的系统
和Linux是表兄弟,
初学编程阶段,不太适合使用mac电脑
(注:博主人生第一台笔记本就是MacBook Air 13,用的就不适手,最后大一开学就给换了一台,ε=(´ο`*)))唉!!!)
更推荐同价位的ROG系列的windows电脑.

手机端的操作系统

Android ~~ 本质上也是Linux

IOS ~~ 和Mac同宗同源

操作系统的定位

在这里插入图片描述

硬件设备:
电脑后盖打开,看到的就都是硬件设备
~~1.清灰 2.扩展内存/硬盘

驱动程序:
JDBC的驱动程序就是让JDBC和各个数据库厂商的API进行适配
~~和电脑转接头(适配器)一样
硬件设备,种类繁多,厂商各异.
硬件厂商在开发硬件的同时会提供驱动.
电脑装了对应驱动,才能让系统正确识别硬件设备.

操作系统内核:
~~ 操作系统的核心功能
=>管理,对上要管理硬件设备,对下要给软件提供稳定的运行环境

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

应用程序:
~~ 比如Java虚拟机就属于操作系统中的一个应用程序,这里不做详细介绍

什么是进程/任务(Process/Task)

进程是操作系统对一个正在运行的程序的一种抽象
换言之,可以把进程程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位

一个跑起来的程序,就是一个"进程"如果没跑起来,就不算进程!!!

image-20230917002927281

在博主的笔记本上躺着一个idea64.exe可执行程序.
但是此时我没有去运行它(双击就运行) => 没运行的就不是进程!!!(没跑起来的,叫做"程序")

此刻博主的笔记本上的进程如下:

image-20230917005708203

进程是一个重要的"软件资源",是由操作系统内核负责管理的

那么操作系统内核是如何管理进程的呢?

管理 => 描述 + 组织

  • 描述: 讲清楚都有哪些属性特征
    使用结构体(C语言的结构体 ~~ 操作系统基本上都是C/C++来写的)来描述进程属性
    用来描述进程的这个结构体起了个特殊的名字,叫做 PCB (Process Control Block 进程控制块)

  • 组织: 通过一定的数据结构把多个这样的基本单位串起来
    通过双向链表(并不是一个单纯的双向链表),把多个PCB给串到一起

创建一个进程,本质上就是创建一个PCB 这样的结构体对象,把它插入到链表中.
销毁一个进程,本质上就是把链表上的 PCB节点删除掉.
任务管理器查看到进程列表,本质上就是遍历这个PCB 链表

进程控制块抽象(PCB Process Control Block)

计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征
PCB里面描述进程的特征如下:

  1. pid 进程的身份标识符.(唯一的数字)

  2. 内存指针指向了说自己的内存是哪些

  3. 文件描述符表硬盘上的文件等其他资源

  4. 进程调度相关的属性 ~~ 留待下面讲解

~~ 2,3描述了进程持有了哪些硬件资源

// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识(唯一的数字) —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息
}

CPU 分配 —— 进程调度(Process Scheduling )

操作系统对CPU资源的分配,采用的是时间模式 —— 不同的进程在不同的时间段去使用 CPU 资源
博主的笔记本带有的就是一个16核CPU

image-20230917154049557

8核16线程
一个CPU分成8个核心,每个核心,又能一个顶两个(超线程技术)
这种情况就视为是16核就行了!

并行

微观上同一时刻,两个核心上的进程,就是同时执行的.

并发

微观上,同一时刻,一个核心上只能运行一个进程.但是它能够对进程快速的进行切换助
比如CPU这个核心上,先运行一下QQ音乐,再运行一下cctalk,再运行一下画图板.
只要切换速度足够快(2.5GHz,每秒运行25亿条指令),宏观上人感知不到.
人看起来就感觉好像是这几个进程在同时运行.
例子:电灯闪烁频率高了,人就感觉电灯是常亮的

内核负责处理的,应用程序(程序猿)感知不到!!因此往往也把并行和并发,统称为并发!!!
未来除非显式声明,否则谈到并发,就是指并行+并发

操作系统里面有一个重要的模块调度器,就负责让有限的CPU来调度执行这么多的进程

PCB里进程调度相关的属性

  1. 进程的状态

  2. 就绪状态: 随叫随到,进程随时准备好了去CPU上执行

  3. 运行状态: 正在CPU上执行的线程所处的状态

  4. 阻塞状态: 短时间无法到CPU上执行了 ~~
    ~~比如进程在进行密集的IO操作,读写数据.在读写数据的过程中,就无法响应CPU的执行操作了

  5. 进程的优先级
    进程也是有优先级的~~操作系统进行调度并不是一碗水端平
    先给谁排,后给谁排.给谁排多点,给谁排少点…

  6. 上下文

    操作系统在进行进程切换的时候,就需要把进程执行的"中间状态"记录下来,保存好( => 存档)
    下次这个进程再上CPU上运行的时候,就可以恢复上次的状态好继续往下执行( => 读档)
    上下文本质上就是你存档的内容.
    进程的上下文,就是CPU中的各个寄存器的值.
    寄存器 ~~ CPU内置的存储数据的模块.保存的就是程序运行过程中的中间结果.

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

  7. 记账信息

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

内存分配 —— 内存管理(Memory Manage)

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

C语言学过的指针变量,它存的数字就表示内存地址,
不过这里的内存地址,就是虚拟的内存地址,并非真实的物理内存地址!!

内存(物理上是个内存条)可以存很多数据.
内存就可以想象成是一个大走廊,走廊非常长,
有很多房间.每个房间大小1Byte每个房间还有个编号,从0开始依次累加.
这个房间编号,就是"地址",这个地址也就认为是"物理地址"

内存有个了不起的特性,随机访问(闪现)
~~ 访问内存上的任意地址的数据,速度都极快,时间上都差不多
~~ 正是这个特点,造就了数组取下标操作时间复杂度是O(1)

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

image-20230917175631796

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

CE

CE 是一个类似于"黑客工具",功能大概就是改另一个进程里的内存数据,
这个东西是属于操作系统,给程序猿留了个后门.
直接通过C中的指针操作,无法针对另一个进程的内存进行修改的!!!
但是操作系统给我们提供了一些特殊的系统调用
~~ 通过这些系统调用,就可以手动的操作另一个进程中的内存数据了.

虽然进程隔离了.但是又引入了新问题.
有些时候,确实进程之间,需要进行数据的交互(相互配合)
~~ 这就涉及到了进程间通信

进程间通信(Inter Process Communication)

所谓进程间通信,就是在隔离性的前提下找一个公共的区域(“公共空间”),让两个进程借助这个区域来完成数据交换 ~~ 就是在隔离性的前提下,做了个小小的妥协
操作系统提供的进程间通信具体实现方式,有很多种.
目前,主流操作系统提供的进程通信机制有: 管道,共享内存,文件,**网络,**信号量,信号

Java圈子里,并不是很鼓励多进程编程
~~ 在Java圈子里,主要使用文件, socket,这两种方式完成进程间通信

作业
作业(job)这个术语比进程更抽象一层.
你可以说 process是job的一种具体实现,
但job也不一定全是 process.

句柄
句柄(handler)
系统中包含很多的软件资源(进程就是一种软件资源)
写代码就需要用到一些软件资源.
软件资源是在操作系统内核里.在应用程序的代码中,不方便直接操作.

句柄,就好比一个遥控器.(简单的整数/编号)
通过系统调用借助这个句柄就可以操作软件资源了.

例子:
三国时代,董卓,曹操=>挟天子以令诸侯.
天子就是天下的句柄,就是天下的遥控器

指针也可以视为是一种句柄.对应的是内存资源.

文章总结⭐️⭐️⭐️

  1. 操作系统,定位,结构,
    应用程序,系统调用,内核,驱动,硬件设备.

  2. 进程的概念[重点内容]
    跑起来的程序就是进程
    操作系统就需要管理很多进程
    => 描述(PCB) + 组织(双向链表)

    • 1).pid
    • 2).内存指针
    • 3).文件描述符表
    • 4).进程调度的属性,状态,优先级,上下文,记账信息
      • 4).=> 本质上是要解决"狼多肉少”的问题,让大量的进程可以在少数的CPU上同时运行
  3. 进程的虚拟地址空间
    解决的是进程之间相互影响的问题
    引入虚拟地址空间,地址越界,就能及时发现

  4. 进程间通信
    通过公共空间,来完成进程之间的数据交互
    使用文件,使用网络

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元

目录 1,开发板原理图 2,浮点运算单元(FPU) 1,开发板原理图 课程视频比较早,介绍了三款开发板。观看视频时用的开发板说和51单片机共板的STM32核心板,将51单片机从底座拆下来后,安…

云原生Kubernetes:K8S存储卷

目录 一、理论 1.存储卷 2.emptyDir 存储卷 3.hostPath卷 4.NFS共享存储 二、实验 1.emptyDir 存储卷 2.hostPath卷 3.NFS共享存储 三、问题 1.生成pod一直pending 四、总结 一、理论 1.存储卷 (1)概念 容器磁盘上的文件的生命周期是短暂的…

如何玩转CSDN AI工具集

前言 人工智能生成内容(AIGC)是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容,完成文章翻译、代码生成、AI对话、插图创作等工作,带来了许多令人兴奋的机遇。 本文将介绍CSDN AI工具集的基本使用…

Bard人工智能9月19日重大更新

1、巴德现在可以回复来自谷歌地图、航班、酒店和YouTube的实时信息,因此您可以在一个地方完成更多工作。 2、Bard 可能会与其他服务共享您的部分对话和其他相关信息,例如您的位置。这些服务可能会使用该信息进行改进,即使您以后删除了您的 Ba…

湖南湘潭家具3D轮廓扫描测量家居三维数字化外观逆向设计-CASAIM中科广电

随着科技的不断进步,CASAIM三维扫描技术在各个行业中得到了广泛应用,家具行业也不例外。传统的家具设计和展示方式已经无法满足现代消费者的个性化、多元化需求,而三维扫描技术的出现为家具行业带来了新的机遇和可能性。 家具表面有雕刻图案…

机器学习第九课--随机森林

一.什么是集成模型 对于几乎所有的分类问题(图像识别除外,因为对于图像识别问题,目前深度学习是标配),集成模型很多时候是我们的首选。比如构建一个评分卡系统,业界的标配是GBDT或者XGBoost等集成模型,主要因为它的效…

(2) Java 8 实战第二版——补充 收集数据、并行数据处理能力与性能

第6章 用Collectors类创建和使用收集器将数据流归约为一个值汇总&#xff1a;归约的特殊情况数据分组和分区开发你的自定义收集器 对一个交易列表按货币分组&#xff0c;获得该货币的所有交易额总和&#xff08;返回一个Map<Currency, Integer>&#xff09;。将交易列表…

git之撤销工作区的修改和版本回溯

有时候在工作区做了一些修改和代码调试不想要了,可如下做 (1)步骤1:删除目录代码,确保.git目录不能修改 (2)git log 得到相关的commit sha值 可配合git reflog 得到相要的sha值 (3)执行git reset --hard sha值,可以得到时间轴任意版本的代码 git reset --hard sha值干净的代…

【Linux基础】第31讲 Linux用户和用户组权限控制命令(三)

用户组管理命令 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同。如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组…

二叉树的操作大全

文章目录 1.通过前序遍历数组"ABD##E#H##CF##G##"构建二叉树2.前序遍历3.中序遍历4.后序遍历5.层序遍历6.二叉树结点个数及第k层结点个数7.查找为x的结点8.叶子结点个数9.销毁二叉树(二级指针)10.判断是否为完全二叉树测试代码及运行结果 1.通过前序遍历数组"AB…

【LeetCode热题100】--560.和为K的子数组

560.和为K的子数组 示例2的结果&#xff1a; 输入&#xff1a;nums [1,2,3] ,k3的时候 连续子数组有[1,2],[3]&#xff0c;一共有2个 利用枚举法&#xff1a; 枚举[0,…i]里所有的下标j来判断是否符合条件 class Solution {public int subarraySum(int[] nums, int k) {i…

Unity用相机实现的镜子效果

首先登场 场景中的元素 mirror是镜子&#xff0c;挂着我们的脚本&#xff0c;Quad是一个面片。Camera是用来生成RenderTexture给面片的。里面的test1是我用来调试位置的球。 镜子size是大小&#xff0c;x是-2&#xff0c;为了反转一下贴图 相机直接可以禁用掉&#xff0c;用…

负载均衡中间件---Nginx

一.nginx的好处 学习 Nginx 对于一个全栈开发者来说是非常有价值的&#xff0c;下面是一些学习 Nginx 的原因和好处&#xff1a; 反向代理和负载均衡&#xff1a;Nginx 是一个高性能的反向代理服务器&#xff0c;可以用于将客户端请求转发给多个后端服务器&#xff0c;实现负…

【Linux】文件缓冲区

目录 一、dup2 二、 引入 三、C语言FILE中的缓冲区 3.1 缓冲区的作用 3.2 缓冲区的刷新机制 3.3 对引入代码现象的解释 3.4 模拟实现C语言中的FILE 四、文件系统中的缓冲区 4.1 fsync 在本期内容正式开始之前&#xff0c;我们先介绍一个上期遗漏的知识点&#xff1a; …

【数据结构】二叉树的链式实现及遍历

文章目录 一、二叉树的遍历1、前序遍历2、中序遍历3、后序遍历4、层序遍历 二、二叉树结点个数及高度1、二叉树节点个数2、二叉树叶子节点个数3、二叉树第k层节点个数4、二叉树查找值为x的节点 三、二叉树创建及销毁1、通过前序遍历数组创建二叉树2、二叉树的销毁3、判断是否为…

17.适配器模式(Adapter)

意图&#xff1a;将一个类的接口转换为Client希望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类在一起工作。 UML图 Target&#xff1a;定义Client使用的与特定领域相关的接口。 Client&#xff1a;与符合Target接口的对象协同工作。 Adaptee&#xf…

vue+element plus 使用table组件,清空用户的选择项

<el-table ref"tableRef"> .... </el-table> <script lang"ts" setup> import { onMounted, reactive, ref, nextTick } from vue const clearBtn () > {console.log(清空用户的选择项)tableRef.value.clearSelection() } </scr…

CGI与FastCGI的区别在哪里,FastCGI的应用场景讲解

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

qml Combobox用法介绍与代码演示

ComboBox 是 QML 中的一个组件,用于在下拉列表中显示一组项供用户选择。它是 Qt Quick Controls 2 模块中的一个组件,经常用于创建用户界面。 下面是 ComboBox 的一些基本用法: 1. 基本使用: import QtQuick 2.15 import QtQuick.Controls 2.15ApplicationWindow {visib…

在服务器上创建git仓库

1、在服务器上创建git仓库 选择一个创建文件夹的地方&#xff0c;这个地方不会将源码存放在这里&#xff0c;只用于版本控制 # 创建一个专门放置git的文件夹&#xff0c;也可以叫其它名 mkdir git && cd git # 创建自己项目的文件夹&#xff0c;文件夹后面要带 .git…