计算机是如何工作的(笔记)

目录

寄存器

操作系统

进程(process)

CPU

pcb中关于进程调度相关的属性


寄存器

用来存储数据的单位,是CPU的一部分

寄存器,存储空间更小,访问速度更快,成本更高,掉电后数据会丢失

寄存器的速度和从内存速度的差距是极大的,3~4个数量级

寄存器用途:辅助CPU完成指令的执行,一条指令,不仅仅是指令本身,同时还有操作数

操作数通常是要在寄存器中保存的

由于寄存器和内存之间速度和空间上差异太大了,难以协调工作

CPU 往往又引入了 “缓存” (cache) 来调和寄存器和内存之间的速度

CPU 上要进行一系列运算,在运算的过程中,要反复用到一组内存中的数据,这些数据要频繁使用,又要频繁访问内存,同时这些数据又比较多,在寄存器中又存不下,就可以放到缓存中了

缓存的存储空间介于 寄存器 和 内存 之间

由于寄存器和内存之间差距太大了,搞一个缓存还不够用,后来又搞了一个

现代的CPU 都是这种典型的3级缓存的结构

 缓存大小,对于有些场景,是非常影响到CPU 的性能的 


操作系统

是一个搞管理的软件

操作系统存在的意义:

1、对下,要管理各种硬件设备

2、对上,要给应用程序提供一个稳定的运行环境


进程(process)

进程是程序的实例化,是一个正在运行中的程序、

这是一个所谓的程序,但是这个程序当前并没有正在运行

没有正在运行的程序,不叫进程

同一个程序,运行多次,就可能会产生多个进程

平时所说的程序,指的是 exe 的可执行文件,进程得是把程序跑起来

打开任务管理器,此时看到的这些,都是进程 

程序是一个可执行文件,只是在硬盘上的一个东西(静态的)

如果双击程序,此时操作系统就会把可执行文件中的数据和指令,加载到内存中,并且让cpu去执行这里的指令,完成一系列相关的工作,运行起来的(动态的)进程

进程能够干活,说明进程能够消耗一定的硬件资源

可执行程序,只是占用了硬盘空间,而进程会消耗cpu资源、内存资源、硬盘、网络带宽.....

进程是系统分配硬件资源的基本单位

一台正在运行的计算机中,大概率是包含很多进程的,一旦东西多了,就需要套考虑“管理”

管理的前提是数量非常多,如果只需要考虑一两个进程,不用涉及到这么多

此时,针对计算机中“进程”的管理,核心思路是:先描述,再组织

1、会使用一个专门的结构体来记录一个进程里面各个属性

结构体就是一个低配的类

PCB(进程控制块) 是我们用来描述进程的一个结构体,Linux 中的PCB,在源码中是一个task_struck结构体

2、会使用一系列的数据结构,把多个进程进行一个有效的组织,随时方便进行遍历、查找、汇总数据....

通常是使用双向链表这样的方式来组织

当使用双向链表来组织的时候

a)查看进程的列表,本质上就是在遍历这个链表

b)插入一个进程,就是创建了一个PCB结构体,并且插入到链表上

c)销毁一个进程,就是把这个pcb结构体从链表上删除并释放

PCB中大概有哪些信息呢?

1、pid进程的标识 

在同一个系统上,同一时刻中,每个进程的pid一定是不同的

有的时候,运行的是一个 .exe 但是实际上可能会涉及到多个进程

 2、内存指针

表示了,该进程对应的内存资源是什么样的

内存资源中最主要要存储的就是从exe可执行文件中加载过来的指令和数据,此外还需要保存一些运行过程中的中间结果

指令是指二进制的指令,都是在程序员开发这个程序的时候,最终编译生成的结果,也就是程序员写的代码的逻辑

3、文件描述符表

硬盘是硬件,应用程序一般是没法直接接触到"硬件"这一层的

实际上是操作系统抽象成“文件”这样的概念,程序操作的是文件,而文件实际上是存储在硬盘上的

每个进程就会有一个“文件描述符表” 来记录当前这个进程正在使用哪些文件

操作系统打开一个文件,就会产生一个“文件描述符”(就相当于文件的身份标识一样,当然只是在进程的内部生效的),同时会使用文件描述符表(类似于数组)把文件描述符给组织起来


CPU

进程是需要在cpu上来执行指令的

进程如果是演员,cpu就是拍摄场地,每个进程要想执行cpu里面的命令,完成想要的任务,都需要在cpu上执行

一台机器上,进程同一个时刻有百八十个,但是cpu只有一个,这该怎么办呢?

轮着用就行了,也就是进程的调度

CPU是只有一个,但是舞台不只是一个,现在的cpu都是多核心的cpu

此时,我这个cpu是8个舞台,但是要拍戏的剧组有几十上百个,仍然是不够的,这个时候就要考虑到调度,调度的时候有下面两种情况:

1、并行

在同一时刻,两个进程同时运行在两个cpu逻辑核心上

2、并发

两个进程在同一个舞台上,轮着上

由于cpu切换进程速度极快,微观上,这两个进程是串行执行的,宏观上,看起来这两个进程是“同时”进行的

操作系统,在调度这些进程的时候,可能是按照并行的方式来调度,也可能是按照并发的方式来调度

在应用程序这一层,感知不到(在系统内核中能感知到),由于感知不到是哪种方式调动,并且这两种调动方式在宏观上的体现是一样的,通常也会用 “并发” 这个词代指 “并行” 和 “并发”


pcb中关于进程调度相关的属性

这些属性也就描述了进程对应的cpu资源的使用情况

(1)状态

就绪状态:一个进程已经随时做好了在cpu上执行的准备

阻塞状态 / 睡眠状态:有的时候,进程没有准备好被调度到cpu上

状态之间是可以相互转换的 

实际上,进程在系统中状态还有很多种,其中最关键的就是 就绪 和 阻塞 状态

(2)优先级

系统给进程进行调度的时候,也不完全是公平的,也会根据优先级的不同,来决定时间分配的权限,就可以把系统资源调配给更重要的进程上了

(3)上下文

这些进程是轮着上的,一次运行不完,就需要保证下次上cpu的时候,能够从上次运行的位置,继续往后运行

对于操作系统来说,所记录的上下文就是该进程在执行过程中,cpu的寄存器中对应的数据

这些寄存器,有的是存一些中间结果,有的是才能一些特定含义的数据(比如下一条指令是在哪里,比如当前函数的调用关系)这些寄存器中的数据就需要在进程离开cpu之前,都保存好,保存到对应进程的pcb的上下文字段中(内存中)

下次该进程回到cpu执行,就可以把pcb中的上下文里的数据恢复到对应的寄存器中,这个时候,进程就是和上次执行的状态一模一样了 

(4)记账信息

相当于是一个统计信息

会统计每个进程在cpu上都执行多久了,执行了多少指令了

是对于进度的调度工作进行一个“兜底”

例如:如果我发现给C排的时间太少了,接下来就给C多排一点时间


每个进程,都需要有一定的内存资源

早期的操作系统,就是直接把物理内存分配给进程,就带来一个严重问题:

一旦某个进程内部代码写出了bug,内存访问越界了,就可能影响到别的进程

C语言中有一个东西叫做指针(指针是个变量,存了个整数,这个整数就是内存的地址)

使用指针,尤其是解引用指针的时候,就需要保证当前这个指针指向的是有效的内存,否则解引用操作就可能引起 未定义行为

这个保证是由人工保证的,这就很容易出现指针越界,指向了不该指向的内存(野指针)的情况、

按照上述,直接分配物理内存的模型,此时一旦指针越界指向到其它位置,就会影响到别的进程的执行,会非常影响系统的稳定性

后来,操作系统就引入了 “虚拟地址空间” 这样的概念,有效解决上述的问题

虚拟地址,并非是在物理内存上真实存在的地址,只是在该进程中存在

不同的进程中,可以存在相同的虚拟地址,但是实际上对应到的是不同的物理地址

虚拟地址和物理地址,操作系统可以灵活的进行转换

但是对于应用程序来说,只能看到虚拟地址,看不到真实的地址

虚拟地址的好处:

这样设定之后,每个进程的有效的虚拟地址,都是固定范围

1、这样使用该虚拟地址的内存,都需要操作系统进行转换成物理地址的过程,这个转换过程中,就可以针对虚拟地址是否有效做出一个校验,将之前的人工保证变成了系统自动检查

2、当系统发现这里检查出了非法的地址的使用,就可以及时的通知这个进程,甚至直接让进程挂掉,避免影响到其它的进程,提高了整个系统的稳定性

在虚拟地址空间的加持下,进程就具有了独立性:每个进程都有自己的虚拟空间,一个进程无法直接访问或者修改其它进程虚拟地址空间的内容,强化了系统的稳定性

通过虚拟地址空间,把进程隔离开了,但是有的时候,还需要让进程之间,产生点配合 / 联系

进程间通信:就是在进程隔离性的进程上开一个口子,能够有限制的进行相互影响

进程之间具体用来通信的办法有很多,无论用哪种办法,本质都是一样的:找一个公共的区域,多个进程都能访问到的区域,借助公共区域来完成数据的交换

 

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

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

相关文章

java 定时任务不按照规定时间执行

这里写目录标题 使用异步启动可能出现的问题排查代码中添加的定时任务步骤是否正确排查是否任务阻塞,如果定时任务出现异常阻塞后,将不会在次执行java中多个Scheduled定时器不执行为了让Scheduled效率更高,我们可以通过两种方法将定时任务变成…

【LeetCode 75】第十五题(1456)定长子串中元音的最大数目

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 就难度而言,我觉得算不上中等,因为和上一题基本一致,只不过上一题是求最大平均数&#xff0c…

大麦订单生成器 大麦订单购买截图生成

后台一键生成链接,独立后台管理 教程:修改数据库config/Conn.php 不会可以看源码里有教程 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

过滤器,监听器与拦截器的区别

过滤器,监听器与拦截器的区别 ​ 过滤器和监听器不是Spring MVC中的组件,而是Servlet的组件,由Servlet容器来管理。拦截器是Spring MVC中的组件,由Spring容器来管理 ​ Servlet过滤器与Spring MVC 拦截器在Web应用中所处的层次如…

node.js系列-多种方案教你在node程序中同时使用CommonJS 和 ES Module 混合开发最佳实践

前情提要 我们平时使用的npm 第三方包一般基于这两种规范开发的,很容易遇到一个项目里既有 CommonJS 又有 ES Module 的情况,那么我们应该如何解决这种CommonJS 和 ES Module 混合开发的问题呢? CommonJS是什么? 2009年&#x…

MySQL主从复制原理以及实操

一、MySQL主从复制原理: 1、MySQL将数据变化记录到二进制日志中; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中; 3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数…

【Linux】常用的基本指令

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

C# Microsoft消息队列服务器的使用 MSMQ

先安装消息队列服务器 private static readonly string path ".\\Private$\\myQueue";private void Create(){if (!MessageQueue.Exists(path)){MessageQueue.Create(path);}}private void Send(){Stopwatch stopwatch new Stopwatch();stopwatch.Start();Message…

K8s的详细介绍

1.编写yaml文件的方式 2.yaml里面的内容介绍 Pod实现机制:(1)共享网络(2)共享存储 共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,…

【Spring Cloud 三】Eureka服务注册与服务发现

系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka?二、为什么要有服务注册发现中心?三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…

海量小文件传输慢的原因以及对应的优化方案

在日常工作中,我们经常遇到需要传输一些小文件的情况,但是当小文件的数量很多的时候,为什么小文件传输的速度就会变得很慢呢?为什么复制许多较小的文件时,小文件传输效率就会降低呢?针对这些问题&#xff0…

Mybatis插件

文章目录 1. 如何自定义插件1.1 创建接口Interceptor的实现类1.2 配置拦截器1.3 运行程序 2. 插件原理2.1 解析过程2.2 创建代理对象2.2.1 Executor2.2.2 StatementHandler2.2. 3ParameterHandler2.2.4 ResultSetHandler 2.3 执行流程2.4 多拦截器的执行顺序 3. PageHelper3.1 …

聊天系统登录后端实现

定义返回的数据格式 # Restful API from flask import jsonifyclass HttpCode(object):# 响应正常ok 200# 没有登陆错误unloginerror 401# 没有权限错误permissionerror 403# 客户端参数错误paramserror 400# 服务器错误servererror 500def _restful_result(code, messa…

Matlab Optimization Toolbox中的遗传算法工具包(GA)

matlab optimization 中使用了GA求解器 默认的是小于等于 找到GA 工具包 找到 APP选择 Optimization Tool 选择Solver ga - Genetic Algorithm 应用GA solver 定义适应度函数(Fitness function)与问题约束(Constraints) example one 优化函数 sin(x) 2 * cos(x)极其重要的…

windows10 设置代理

场景:同一个办公室,只有A的电脑有权限访问网站 http://10.129.129.129:5601, 那办公室其他B,C同学想访问 http://10.129.129.129:5601,需要怎么处理? A 同学电脑安装代理软件: 1. 下载wproxy IMFirewall, …

iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

手边有一闲置的linux开发板iMX6ULL一直在吃灰,不用来搞点事情,总觉得对不住它。业余打发时间就玩起来吧,总比刷某音强。从某多多上8块儿大洋买来一个usb接口的游戏手柄,让开发板支持以下它,后续就可以接着在上面玩童年…

信息学奥赛一本通——1258:【例9.2】数字金字塔

文章目录 题目【题目描述】【输入】【输出】【输入样例】【输出样例】 AC代码 题目 【题目描述】 观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。 在上面…

Java-很深我只知其一-泛型

Java-很深我只知其一-泛型 目录 泛型历史 泛型类/泛型接口 泛型方法 泛型属性 泛型约束 泛型历史 JAVA 泛型(generics)是 JDK 5 中引入的一个新特性, 允许程序员在编程时指定类型参数,使编译器可以在编译代码时检测到非法的类型。泛型的…

小研究 - 主动式微服务细粒度弹性缩放算法研究(四)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放,忽略了能够充分利用单台服务器资源的细粒度垂直缩放,从而导致资源浪费。为此,本文设计了主动式微服务细粒度弹性缩放算法…

Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…