当前位置: 首页 > article >正文

计算机是怎么工作的

目录

1.简单背景

2.指令

3.操作系统 

3.1基本介绍

3.2对于管理的理解

3.3像上层提供服务

3.4命令接口

3.5程序接口

​编辑3.5操作系统的特征 

3.6操作系统层级结构

3.7宏内核和微内核

4.进程

5.内存

6.线程


1.简单背景

下面的这个就是我们的这个CPU类型以及这个代数的简单的介绍,可以帮助我们了解这个相关的背景知识,其实这个和我们的日常生活息息相关,因为我们在买电脑的时候就会有这些相关的信息参数,进而决定了这个电脑的质量和性价比;

2.指令

指令是我们的CPU指令内容的最小的单元,我们需要把让这个计算机想要执行的内容分解成为一个一个的指令,这样这个CPU才可以按照我们的需求进行工作;

3.操作系统 

3.1基本介绍

内核:操作系统里面最核心的部件,管理硬件设备,且提供完整的支持(给应用程序);

操作系统本质上就是软件,是管理我们的整个计算机系统的硬件的软件资源的一个软件,给我们用户提供接口,为其他的软件提供环境,是我们的计算机体系里面的最基本的系统软件;

在我们日常的这个windows电脑里面,打开这个任务管理器,左边的这个就是操作系统对于软件的管理,右边的就是操作系统对于硬件的管理,操作系统是最接近于我们的硬件的一层软件;

3.2对于管理的理解

如何形象化的理解这个操作系统对于软硬件资源的管理,这个操作系统就是工人,计算机就是及其,操作系统对于计算机里面的软硬件资源的管理就是工厂里面的工人对于机器的管理;

操作系统的主要作用就是:处理器管理(这个主要就是我们电脑上面的CPU),存储器管理(这个主要就是我们的这个对于内存资源的一个管理),文件管理,以及设备管理(包括鼠标显示器之类的);

我们可以看到右下角的这个图里面,我们的这个用户是和这个应用软件之间连接的,这个表示的就是我们的用户对于这个应用软件的操作,用户还和这个操作系统连接,这个就是我们输入这个pwd,ls之类的这个命令的时候,实际上就是在和这个操作系统进行交互的;

3.3像上层提供服务

这个里面所提及的这个上层指的就是我们的用户层面的,我们的这个操作系统对于一些功能进行了封装,使得我们的用户不需要进行很多的了解,就可以对于这个计算机进行操作得到我们想要的结果,但是不需要特别理解这个计算机的底层逻辑,这个就是封装的思想;

这个接口分为命令接口,例如我们的这个cmd命令行窗口,程序接口例如我们的这个write向某地方进行内容的书写,这个printf函数,实际上就是调用的write函数向这个屏幕上面打印输出一些结果

3.4命令接口

命令接口分为两个类别,一个就是我们的交互式的命令接口,就是我们需要不断的提示进行输入,然后系统根据我们的输入进行处理之后再次进行输出;

还有一种叫做脱机,区别于上面的这个联机,脱机就是批量的处理,我们写一个文件,文件里面含有大量的信息,系统根据这个文件里面的内容,一句一句的进行读取操作,逐步的执行,读取这个文件的过程中,就会想用的进行执行,不需要我们人为的进行干预;

其实现在的这个词:脚本就是脱机的思想,我们的脚本就是对于我们想要做的事情列举出来一个清单,按照这个上面一个一个进行执行,我们经常说的这个视频脚本,就是每一个场景,每一个步骤要做什么,这个就是脱机的思想--------------说一堆,做一堆;

3.5程序接口

程序接口是由系统调用组成的,我们使用C语言里面的这个库函数举例,我们的printf函数在这个显示器上打印输出结果,这个实际上就是调用我们的程序接口write,程序接口请求操作系统提供相关的服务,系统调用是应用程序请求操作系统服务的唯一方式;

3.5操作系统的特征 

并发就是宏观上同时发生,但是微观上面交替运行;

并行就是真正意义上面的同时运行,同时发生;

单核的CPU只能并发执行,就是微观上交替运行,但是多核的CPU就可以做到并行执行,因为一个CPU控制一个进程,这个时候多个程序就是同时执行的;

下面的这个就是我们的资源共享的两个不同的方式:一个是互斥共享,例如我们的这个摄像头,如果我们使用这个摄像头进行视频通话,这个时候,我们就不可以使用摄像头进行拍照呢;

像这个同时共享,例如我们使用钉钉发送文件A和文件B,其实实际上两个文件都是在交替的访问者我们的磁盘的资源的;

虚拟也是分为了这个空分复用技术和时分复用技术,这个空分复用技术就是我们的这个程序虽然很大,但是我们电脑可以在内存很少的情况下把这个程序运行起来,这个时分复用技术就是把一个CPU当做多个CPU进行使用,这个时候我们的不同的若干小的几个CPU交叉执行,这个时候就达到了一个好像是连续的效果,实际上不是连续的,只不过我们人类感受不到这个过程罢了;

3.6操作系统层级结构

操作系统有三层,下面的两行就是我们的内核,上面的一层是我们的非内核功能;

设备管理其实也叫做IO管理,原语就是包含设备驱动(我们的这个鼠标点击的位置,计算机如何做出来应答之类的,计算机怎么知道我们点击的什么地方,这个就是设备驱动的内容)当涉及到多核CPU的时候,我们需要进行这个CPU的切换,也属于原语;

时钟管理:实现计时的功能;

中断管理:负责实现管理中断机制;

3.7宏内核和微内核

宏内核,也称之为大内核,包括了这个图上面的两层内容,微内核就是大内核的简化,只包括了一层内容;

微内核只包括了时钟管理,中断处理以及原语这三个部分;

下面的这个就是在不同的内核模式之下,用户态和内核态之间的切换,当是宏内核的时候,只需要进行两次交互,当是微内核的时候,用户态里面的这个内容变多,这个时候我们的应用程序想要对于这个内核进行交互,这个时候的次数就会增加,因为这个过程状态的转换是有成本的,频繁的切换这个CPU就会降低我们的这个系统的性能,因此这个宏内核是有自身的优势的;

因此这个宏内核的资源利用率更高,但是微内核的升级开发维护的成本很小,相比之下这个大内核的内核代码庞大,进行维护的成本比较大;

4.进程

一个进程就是一个任务,本质上就是一个已经跑起来的程序;

在电脑上面可以通过任务管理器,就可以看到当前正在执行的进程,也就是任务;

一个计算机,只要一开机,基本上就有80-100个进程,有的是系统创建的,有的是我们用户自己创建的,一个进程想要执行,就要消耗硬件资源;

每一个进程都是系统资源分配的基本单位,每一个进程的属性使用PCB进行表示,一个进程可能会有一个多个PCB进行表示,双向链表用来把我们的这个进程串联起来;

PCB里面的关键的属性:pid(进程标识符),内存指针(指向内存的地址),文件描述符号表(进程有的硬盘资源);

我们的进程从CPU离开的时候,需要保存现场,这个时候把我们的这个寄存器里面的数值记录到内存里面去,当我们的进程继续回去执行的时候,再把这个寄存器里面的这个数值取出来,然后让这个进程继续执行-------存档,读档(官方的称呼就是-----上下文);

5.内存

讲到这个地方就不得不提一下这个虚拟地址空间了:

AB的这个虚拟内存映射到我们的这个物理内存里面去,这个时候AB看到的都是虚拟内存,方便我们进行检查,当我们的虚拟地址进行操作的时候,如果不符合,这个物理地址就无法被操作,方便我们的操作系统进行检查和校验;

这个就可以帮助理解了解进程的独立性,任何一个进程都有自己独立的这个虚拟地址,对于其他的进程无法产生影响;

如果我们的进程之间想要实现通信(因为我们的进程之间是独立的,互相看不到彼此的),这个时候就是要借助公共的空间(可以有多种形式,但是本质上就是实现的公共空间实现共享),下面解释两种:一个是通过文件,一个是通过socket网络进行通信;

6.线程

C++里面鼓励使用多进程,但是我们的java生态里面鼓励使用多线程thread进行编程,目的就是实现并发编程,因为我们的CPU是多核的,多个核心执行多个任务;

多进程也可以实现并发,但是进程创建的开销大,消耗时间长,太过于重量,主要消耗在申请资源上面,线程的创建,销毁都比进程更快,开销更小,因此这个线程也叫做轻量化进程;

但是进程依附于进程而存在,一个进程可以有多个线程;

一个进程开始的时候可以有一个线程,这个线程执行我们的代码,然后可以让这个线程增加数量,达到并发执行的效果;

每一个线程都可以独立的到CPU上面运行,但是一个进程的所有的线程共用相同的资源,省去了资源的分配的过程开销,因为他们的这个效率更高,因为我们的这个线程的资源属于进程,我们不可以随意的进行销毁;,是以上PCB就是线程,一个进程可以有多个线程,因此也就是可以有多个PCB结构;

----------------------------------进程线程的区别-----------------------------------------

1.进程包含线程,一个进程里面可以有一个线程,可以有多个线程;

2.进程,线程都是解决并发编程问题,线程更加轻量级;

3.一个进程的多个线程,共用相同的资源,省去了申请资源的开销;

4.进程之间具有独立性,但是同一个进程的线程之间可能会产生影响;

5.进程是资源分配的基本单位,线程是调度执行的基本单位;

----------------------------------------------------------------------------------------------


http://www.kler.cn/a/327041.html

相关文章:

  • stm32定时器输出比较----驱动步进电机
  • log4j2漏洞复现(CVE-2021-44228)
  • I.MX6U 启动方式详解
  • Java爬虫:速卖通(AliExpress)商品评论获取指南
  • Redis+注解实现限流机制(IP、自定义等)
  • 每天40分玩转Django:Django部署
  • 【Unity】本地化实现
  • Golang | Leetcode Golang题解之第448题找到所有数组中消失的数字
  • 向量化技术在机器学习领域的深度实践与探索
  • 12.C++程序中的自定义函数
  • idea启动项目报错Command line is too long
  • 中信银行西安分行:“极地来信”沉浸展西安站正式启幕
  • (详细、重点)iOS开发与前端开发的相同点和不同点 20个
  • golang学习笔记22-面向对象(四):接口【重要】
  • 优化后的版本
  • 家用无线路由器配置
  • 大语言模型之LlaMA系列-LlaMA 2及LlaMA_chat(下)
  • c++(AVL树及其实现)
  • 在线PDF怎么转换成JPG图片?分享14种转换操作!
  • 【系统架构】服务端高并发分布式结构演进之路
  • 使用PYTHONPATH的注意事项
  • C++11中智能指针以及标准模板库 My_string My_stack
  • Zabbix 7.0 图表中文乱码问题处理步骤
  • 后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0926)
  • leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)
  • 两个向量所在平面的法线,外积,叉积,行列式