计算机系统与组成
计算机系统与组成
计算机系统概述
数据的正负,补码和反码
1.负数的反码:对源码除特殊符号位其他其余位逐级取反就是反码
2.负数的补码:复数的补码就是对其反码+1
3.正数的源码、反码、补码都一样
存储系统
CPU主要就是负责指令运行以及计算机的内存,随机存取存储器,是一种暂时存储数据的硬件设备,用于存储当前正在与逆行的程序和数据
当CPU需要执行程序时,他会将程序和相关的数据从硬盘读入内存中,由于内存的容量有限,当内存的空间不足以容纳所需要执行的程序和数据的时,操作系统就会用虚拟内存来扩展内存容量,虚拟内存僵尸哟中将部分数据从内存中映射到硬盘上的技术,以便腾出内存空间来运行的程序使用
存储系统
寄存器,缓存器,RAM,ROM

EMMC:Embeded MultiMedia Card内嵌多媒体卡 BGA封装
EMMC = NandFLash + 控制器 + 标准封装接口
Cache一致性
缓存表示多个处理器和多个核心的计算器系统中,他们共享同一个内存区域时,保证每个处理或者核心的缓存中存储的数据都是一致的,当一个处理器或者核心修改共享内存中的数据时,他必须通知其他的和处理器或核心,以便他们可以更新自己的缓存
如果不进行缓存一致性的处理,就可能导致不同处理器核心看到的不同的数据,就会引发程序错误,例如:死锁、竞争条件,缓存一致性可以通过硬件或者软件实现
常见的缓存一致性包括MESI,MOESI和MESIF等、这些协议都通过一些
机制来保证缓存数据的一致性,例如当一个处理器修改共享内存时,他会发送一个信号给其他处理器或者核心,通知他们将缓存中的数据置为无效状态,从而保证了数据的一致性
在多核心和多处理器的计算机系统中,缓存一致性是一个非常重要的概念,他对于系统的性能和正确性都有着重要影响
Cache的读写属性
在计算机科学中,“cache(缓存)”是一种临时存储设备,用于在处理器和主内存之间存储数据以提高访问速度,Cache具有两个主要读写属性
1.读取:当处理器需要访问内存中的数据时,它首秀安徽检查cache中是否存在数据,如果数据存储在于cache中,处理器可以直接从cache中读取数据,这笔主从内存中读取速度更快,如果数据不在cache中,处理器必须从主内存中读取数据,者将会引起一定的延迟
2.写入:对于写入操作,cache有不同的策略来管理数据的更新,一种常见的策略是写回,其中当数据在cache中被修改后,只有在被替换出cache时候才会写入主内存
这些读写属性的管理有助于提高处理器的性能,通过在处理器主内存之间创建一个临时存储层,减少了频繁访问主内存的开销
CPU要先对cache 做什么,才能读取DMA数据
在CPU读取DMA数据之前,需要先进行缓存一致性操作,以确保DMA数据与CPU缓存中的数据是一直的,具体而言,需要进行一下操作
1.使CPU缓存失效:CPU将缓存中与DMA数据相关的数据标记为无效,以却博爱下一次访问这些数据时,能从内存中读取最新的数据
2.禁用缓存:禁用CPU缓存,以确保CPU访问的是物理内存中的最新数据
3.刷新缓存:将缓存中的所有数据写回到内存中,以确保内存中的数据与CPU缓存中的数据一致
完成上述操作后,CPU就可以从内存中读取DMA数据了,读取完成后,需要重新启用缓存,并确保缓存中的数据是最新的,以便下一次访问时能从缓存中读取数据,提高访问速度
CPU三级缓存,每级在干什么
CPU三级缓存是指现代处理器中的三个层次的缓存:L1缓存、L2缓存和L3缓存,他们的作用是提供快速访问数据的能力,以减少CPU访问主内存的延迟
1.L1缓存
分为L1指令缓存(L1i缓存)和L1数据缓存(L1d缓存)两部分
L1i缓存用于存储CPU指令,提供快速的指令访问能力
L1d缓存用于存储CPU的数据,包括读取和写入的数据
L1通常位于CPU核心内部,每个CPU核心都有自己的独立L1缓存
L1缓存的容量较小,但是速度非常快,能够在几个时钟周期内响应CPU的访问请求
L2缓存
L2缓存是位于L1缓存和主内存之间的中间缓存
它的容量较大,速度相对于L1缓存来说稍慢,但仍然比主内存快得多
L2缓存可以被多个CPU核心共享,以提高缓存的利用率
L2缓存不仅用于存储指令和数据,话可以存储其他的CPU内部数据和缓冲区
L3缓存
L3缓存是位于L2混村和主内存之间更大的容量的缓存
它通常位于CPU芯片上,被多个CPU核心共享
L3缓存的速度相当于对L2缓存来说更慢,但仍然比主内存要快
L3缓存的目的是提供更大大的容量和提高的命中率
三级缓存的存在主要是为了解决CPU访问主内存的速度平静,L1缓存作为最近和最快的缓存,可以快速访问CPU的访问请求,L2缓存量更大,可以提供横夺数据存储,L3缓存则进一步扩展了容量,并且在多喝处理器中实现了共享,以提高整体的性能
这种层次的缓存设计可以在不同级别的访问延迟和容量做出权衡
NORFlash 和NAND Flash 区别
| NOR | NAND | |
|---|---|---|
| 单位 | 字节 | 页(一般为512字节) |
| 运行 | 代码可以直接在NOR flash运行 | 代码不可以直接在NAND flash运行(因为它按照块访问)需搬移到内存,或者重新定位,或者额可以按块放到芯片内iRAM运行 |
| 容量 | 一般为1~16MB | 一般为8~128M |
| 结构 | 并行存储结构,每个存储单元都可以独立访问,适用于读取速度较快的应用 | 串行存储结构,多个存储单元串联在一起,适用于存储容量大,读取速度相对较慢的应用 |
| 成本 | 较高 | 较低 |
| 性能 | 读写速度比NAND稍快 | 写入,擦除比NOR块很多 |
| 接口 | 带有SRAM接口,有足够的地址引脚来寻址,可以容易的读取去其内部的每一个字节 | 使用复杂的I/O口来穿行地读取数据,8个引脚用来传送控制,地址和数据信息 |
| 耐用性 | 最大擦写次数是十万次 | 最大擦写次数是一百万次 |
| 软件支持 | 写入和擦除都需要MTD(内存技术驱动程序),运行代码不需要任何软件支持 | 写入和擦除都需要MTD,运行代码也需要MTD |
| 适用 | 适用于需要快速读取,执行代码和数据的应用,比如固件,引导程序和系统软件等 | 适用于需要高存储容量、相对较慢读取速度的应用,如移动存储,数字相机MP3 |
其中NANDFLash和norFlash的0地址是不冲突的,norflash占用BANK地址,而nandflash不占用BANK地址,他的0地址是内部的,在NOR Flash中,每个存储单元都可以独立访问,因此0地址可以映射到第一个存储单元,而在NAND FLash中多喝存储单元串联在一块,形成一个页,每个页都有一个页地址,因此,0地址通常映射到第一个页的第一个存储单元,而不是直接映射到第一个存储单元,因此,尽管NAND Flash和NOR Flash的0地址不会直接冲突,但在使用中还是需要根据具体的芯片行啊后和数据手册来确定地址的映射关系
RAM是什么
RAM(Random Access memory)即随机存储器,速度很快,可随机读写,但断定啊则低俗hi数据,一般作用内存
其分类有(SRAM、DRAM、SDRAM)
SRAM\DRAM\SDRAM的区别
RAM可分为两类,一类是动态随机的DRAM->电容实现(Dynamic)->
另一种是静态的随机存储SRAM(Static)->(双稳态触发器,更快更贵)
由于DRAM结构简单,高集成度,低功耗,地制造成本,大量的被应用在内存中
其中DRAM可根据工作原理中是否与系统上时钟同步,分为同步动态随机存储其SDRAM和异步动态随机存取存储器EDO DRAM
DDR SDRAM的速度是SDRAM的2倍,也就是双倍SDRAM
SRAM、DRAM、SDRAM的区别如下
1、SRAM:静态随机存储器,加电的情况下,不需要刷新,数据不会丢失,CPU缓存就是使用SRAM
2、DRAM:动态随机存储器,加电情况下,也需要不断刷新才能保存数据,最为常见的系统内存
3、SDRAM:同步动态随机存储器,即数据的读取需要时钟来同步,也可用作内存
| RAM | SRAM | DRAM |
|---|---|---|
| 存储原理 | 触发器 | 电容 |
| 书否刷新 | 不需要 | 需要 |
| 运行速度 | 块 | 慢 |
| 存储成本 | 高 | 低 |
| 发热量 | 大 | 小 |
| 送行列地址 | 同时发送 | 分两次发送 |
| 破坏性读出 | 否 | 是 |
| 集成度 | 低 | 高 |
ROM是什么
1、ROM是只读存储器,速度较慢,不能直接与CPU进行交互,断电之后数据不丢失,一把用来保存断电不丢失的程序
2、常见的ROM有pROM、RPROM、EEPROM
描述一下嵌入式基于ROM的与逆行方式和基于RAM的运行方式有什么区别
基于ROM的运行方式是指程序被存储在ROM中,系统在启动时从ROM中加载程序并执行,由于ROM是只读存储器,程序不能被修改,因此在基于ROM的与逆行方式中,程序一旦被烧录到ROM中,就不能被修改,这种方式适合于需要长期运行,不需要频繁更新的应用程序,例如控制系统
基于RAM的运行方式是指程序被存储在RAM中,
系统在启动时从外部设别(如闪存)中加载程序并存储在RAM中,然后执行程序,由于RMA是可读写存储器,程序可以被修改,这种方式适合于需要频繁更新的应用程序,例如操作系统
磁盘跟硬盘的关系
磁盘(Magnetic)和硬盘(Hard Disk)是两个不同的概念,但在计算机存储中常常会被混淆使用
磁盘是指一种通过在磁性材料表面记录和读取的存储设备,通常是指磁性硬盘的驱动器或者磁性软盘的驱动器,磁性硬盘驱动器通常包括一个或者多个旋转的磁性盘片或者一个或者多个磁头,用于读取或者写入数据
而硬盘是指一种数据存储设别,通常是指磁性硬盘驱动器,包括一个或者多个磁性盘片和磁头,用于读取和写入数据,硬盘是计算机系统中最常见的存储设备之一,通常用于存储操作系统,应用程序和用户数据等
因此,磁盘是一种数据存储介质,而硬盘则是一种包含磁盘等存储介质,读写磁头和其他机械和电子组件的数据存储设备,可以说,硬盘是一种磁盘驱动器,其中包含了磁盘等其他组件
指令系统
RISC(精简指令集)和CISC(复杂指令集)的区别
RISC(Reduced)CISC(Complex)是两种指令集架构,它们有以下几个方面的不同之处
1、指令集复杂度:CISC指令集的指令通常包含多个操作,而RISC指令集的指令通常只包含一个简单的操作,因此RISC指令集比CISC更加简单
2、指令执行时间
中央处理器
什么是锁相环
简单来说,输入时钟的存在是在作为“参考源”锁相环不是为了单纯产生同频同相信号,而是一般继承进某种“频率综合电路”长生一个不同频,但锁相的信号,打个比方:某晶振10MHz,频率综合其A使用参考源产生了900MHz时钟,而频率综合其B产生了1Ghz时钟,虽然两路频率不同,但由于使用同一个参考源,他们俩仍然是桐原信号,相反,如果不同源,那么即便他们同频他们也不可能一致,因为世界上没有两个时钟能做到完全一样,总有微弱的频差,导致相位漂移
在PLL,输入信号经过一个比例放大器和一个相位器,与参考信号进行比较,输出一个误差信号,该误差信号经过一个低通滤波器,再金国一个控制电压控制振荡器的频率和相位,使其与参考信号的频率和相位保持一致,这样,输出的信号的频率和相位就会与草靠信号相同
PLL常用于电子系统中的时钟同步和频率合成,例如数字信号处理,
操作系统
操作系统概述
大内核
大内核指的是将所有操作系统服务都包含在内核中的设计方式,包括文件系统,网络栈协议,设别驱动程序等等,在大内核中,所有服务共享同一个地址空间,因此服务之间的通信速度很快,但是代码很复杂,可靠性低,一个服务的故障可能影响整个操作系统的稳定性
优点:高性能
缺点:内核代码大,结果混乱,难以维护
微内核
微内核架构则将内核中最笨的功能(如时钟、中断、原语等)保留在内核,而将那些不需要在核心态执行的功能移到用户态执行,从而见底了内核设计的复杂性,操作系统的黑犀牛服务拆分为多个独立的服务,每个服务运行在自己的地址空间中,通过消息传递的方式来进行通信,这些服务包括设别驱动、文件系统、内存管理、进程管理,由于微内核只包含最基本的服务,因此具有更高可靠性和可扩展性,同时也跟工人那个以实现安全性和灵活性
优点:内核功能少,结构清晰方便管理,更加稳定
缺点: 需要频繁的在核心态与用户态之间切换,性能低
系统调用是什么,用过哪些系统调用,和库函数有什么区别
系统调用
系统调用是操作系统提供给程序的一组接口,用于访问底层系统资源(如网页、网络、进程)
应用程序通过系统调用请求操作系统执行某些特定的操作,例如创建进程、读取文件、发送数据等等
常见的系统调用包括
1、文件系统操作:打开文件、读取文件、写入文件、关闭文件
2、进程控制:创建进程、终止进程、等待进程结束等等
3、网络通信:建立连接、发送数据、接收数据等
4、内存管理:分配内存、释放内存
5、设备控制:读取设备、写入设备
不同操作系统可能会提供方不同的系统调用,但通常都会提供以上基本的功能,应用程序通过系统调用与操作系统进行交互,从而实现对底层系统资源的访问
库函数
库函数是把函数放在库里,供别人使用的一种方式。方法是把一些常用到的函数编玩放到一个文件夹里,供不同的人进行调用。一般放在.lib文件中。库函数调用则是面向应用开发的,库函数可分为两类,一类是C语言标准的库函数,一类是编译器特定的库函数
1、库函数是在用户地址空间执行,系统调用是在内核地址空间执行,库函数云逊个时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大
2、库函数是有缓冲的,系统调用是无缓冲的
3、库函数不依赖平台,库函数调用与系统无关,不同的系统,调用库函数,库函数会调用不同的底层函数实现,因此可移植性好,系统调用以来平台
系统调用的作用
为应用程序提供访问硬件资源的统一接口,以至于应用程序不必关心具体的硬件操作性细节,对系统内核进行保护,保证系统的稳定性和安全,因为系统调用规定了用具进程进入内核的具体方法以及所能访问的数据范围
简述实时操作系统和非实时操作系统的区别
实时操作系统主要用于对响应时间和可靠性要求较高的应用长江,例如机器人控制、飞行控制系统、医疗设别,实时操作系统是课前展示内核,能够快速响应外部事件,并在规定时间内完成这些时间的处理,事实操作系统通常分为硬事实操作系统,和软实时操作系统,硬事实操作系统对相应时间要求非常严格,必须再贵的时间完成任务处理,而软事实操作系统对响应时间的要求相对宽松,允许在规定的时间范围内完成任务处理(FreeRTOS)
非实时操作系统是非抢占式内核,住哟啊用于相应使劲啊和可靠性要求比较低的应用场景,比如普通的桌面应用程序,web应用程序,非事实操作系统通常注重资源利用效率和灵活性,允许应用程序在不同的时间段内处理任务,并且不会因为相应时间超时而一昵称系统错误(Linux)
(1)用MMU的操作系统有:Windows、MacOS、Linux、Android;不用MMU的操作系统有: FreeRTOS、VxWorks、UCOS。
(2)带MMU的CPU有:Cortex-A系列、ARM9、ARM11系列;不带MMU的CPU有:Cortex-M系列 (STM32就是使用M系列内核)。
进程和线程
进程的组成
程序段、数据段、PCB
进程控制块(PCB)
- 进程描述信息: 进程标识符、用户标识符等;
- 进程控制和管理信息: 进程状态,进程优先级等;
- 进程资源分配清单: 虚拟内存地址空间信息,打开文件列表,IO设备信息等;
- CPU相关信息: 当进程切换时,CPU寄存器的值都被保存在相应PCB中,以便CPU重新执行该进程 时能从断点处继续执行;
进程的组织方式
1.无序列表方式:操作系统将所有的进程都存放在一个无序的列表中,每个进程都有一个标识符用于 唯一标识。这种方式的优点是简单易实现,但是在查找和管理进程时效率较低。
- 链表方式:操作系统将所有的进程存放在一个链表中,每个进程都包含一个指向下一个进程的指 针。这种方式的优点是查找和管理进程的效率较高,但是对于频繁的进程插入和删除操作,效率较 低。
- 数组方式:操作系统将所有的进程存放在一个数组中,每个进程都有一个在数组中的位置索引。这 种方式的优点是查找和管理进程的效率较高,但是对于频繁的进程插入和删除操作,效率较低。
- 树状结构方式:操作系统将所有的进程组织成一棵树,每个进程都有一个父进程和若干个子进程。 这种方式的优点是可以方便地管理和控制进程之间的关系,但是需要更复杂的算法来维护进程树结 构。
- 索引方式,建立索引表。

Q;空闲的进程和阻塞的进程状态会不会在唤醒的时候误判?
不会。每个进程有个进程控制块PCB,两种状态的进程分别处于两种队列。唤醒应该是找阻塞队列的进程。
在操作系统中,进程状态的转换是由内核管理的,通常情况下,内核会对进程的状态进行严格的控制, 不会出现误判的情况。当一个进程被阻塞或空闲时,内核会记录其状态,并将其从可执行队列中移除, 直到满足某些条件(如I/O操作完成)才会将其唤醒并放回可执行队列中。 公众号「赛博二哈」 在唤醒进程时,内核会根据进程当前的状态和优先级来决定是否将其放回可执行队列中,或者将其放回 阻塞队列或空闲队列中。通常情况下,内核会根据进程当前的状态和优先级进行正确的判断,从而避免 误判的情况。 然而,在多线程或多进程的并发环境中,可能会出现竞争条件等问题,从而导致进程状态的混乱或错 误。因此,在设计并发程序时,需要考虑并发问题,并使用同步机制(如锁、信号量等)来保护共享资 源,避免竞争条件等问题的出现。、
Q:.请问就绪状态的进程在等待什么?
就绪状态的进程并不是在等待某个特定的事件或资源,而是已经完成了所有必要的前置工作,可以立即 被调度执行,但是由于系统资源有限,需要等待CPU时间片的分配,因此处于就绪状态。
Q:.必定引起进程切换的3种状态
运行状态、阻塞状态和就绪状态是引起进程切换的三种状态。
Q:何时使用多进程,何时使用多线程?
多进程:
- 需要充分利用多核CPU的情况:多进程可以在不同的CPU核心上并发执行,以充分利用多核CPU的 性能。
- 需要保证各进程间数据独立性和安全性的情况:多进程可以使用进程间通信来传递数据,同时不同 进程之间的内存空间是独立的,可以避免多线程中的竞争条件和死锁等问题。
多线程:
- 需要充分利用单个CPU核心的情况:多线程可以在同一个CPU核心上并发执行,以充分利用CPU资 源。
- 需要共享数据/频繁通信/切换程序/创建跟销毁程序的情况:可以共享同一个进程的内存空间,方便 线程之间共享数据和状态信息。
进程通信
LINUX进程间通信方式有哪些?有什么优缺点?
管道:用来实现进程间相互发送非常短小的、频率很高的消息,通常适用于两个进程间的通信。
无名管道(内存文件):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有 亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。半双工速度慢,利用内核 中的一串缓存,容量有限。只有具有亲缘关系的进程间通讯。面向字节流。
有名管道(FIFO文件,借助文件系统):有名管道也是半双工的通信方式,但是允许在没有 亲缘关系的进程之间使用,管道是先进先出的通信方式,克服了管道没有名字的限制。但速度 慢。
流管道(s_pipe): 去除了第一种限制,可以双向传输(全双工),或者用两个管道实现全双工 也行。
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但 多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专 门设计的。但需要进程自行解决进程同步和互斥问题,往往与信号量,配合使用来实现进程间的同 步和通信。共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据。
消息队列:消息队列是有消息的链表数据块,存放在内核中并由消息队列标识符标识。消息队列克 服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。是一种异步的通信 方式可以使多个进程之间传递数据块。消息队列通常用于进程间的同步,进程可以从队列中读取数 据,或者向队列中写入数据。进行通信时不再需要考虑同步问题,使用方便, 但是信息的复制需要 额外消耗CPU的时间,通信不及时,不适宜于信息量大或操作频繁的场合。
套接字:是一种基于网络协议的通信方式,适用于不同机器间进程通信,在本地也可作为两个进程 通信的方式。 信号:信号是一种异步通信方式,可以向进程发送一个软件中断请求。用于通知接收进程某个事件 已经发生,比如按下ctrl + C就是信号。主要作为进程间以及同一进程不同线程之间的同步手段。
信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制, 防止某进程正在访问共享资源时,其他进程也访问该资源。实现进程、线程对临界区的同步及互斥 访问。主要作为进程间以及同一进程内不同线程之间的同步手段。不能用来传递复杂消息,只能用 来同步。
什么时候用什么?
消息队列通常用于以下情况
\1. 进程间通信:当多个进程需要在不同的时间进行异步通信时,消息队列是一个很好的选择。每个进 程可以将消息发送到队列中,而其他进程可以从队列中接收消息。这对于分布式系统和多进程应用 程序非常有用。
- 解耦和流量控制:消息队列可以用于解耦不同部分的应用程序,使它们能够独立演化。它还可以用 于流量控制,以确保接收方可以以自己的速度处理消息,而不会被发送方过多的数据淹没。
- 持久化消息:消息队列通常可以配置为持久化消息,即使接收方不在线,也可以在稍后接收和处理 消息。
对于传输YUV图像和发控制命令的情况,可以考虑以下建议:
如果您需要在不同的进程之间传输YUV图像,共享内存可能是更好的选择,因为它提供了高性能和 低延迟的数据传输方式。您可以将YUV图像存储在共享内存中,然后多个进程可以直接访问这些数 据。 控制命令通常可以通过消息队列传递,因为它们通常不需要高性能或低延迟,而且消息队列提供了 一个方便的方式来在不同的进程之间进行异步通信。您可以将控制命令打包成消息并将其发送到消 息队列中,然后接收方进程可以从队列中接收并处理这些命令。
.匿名管道的限制
\1. 匿名管道只能用于单向半双工通信,即只能用于一个进程向另一个进程传递数据。如果需要进行双 向通信,需要创建两个匿名管道。
- 匿名管道只能在创建它的进程及其子进程之间进行通信,即只能用于具有亲缘关系的进程之间。
- 匿名管道的缓冲区大小是固定的,一旦缓冲区被填满,写进程就会被阻塞,直到读进程读取数据后 才能继续写入数据。因此,在使用匿名管道时需要注意控制数据的流量。
- 匿名管道的生命周期与创建它的进程相关联。如果创建它的进程结束了,管道也会被销毁。