嵌入式八股文

硬件

1.CPU、MPU、MCU、SOC联系与差别

Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。 CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。所谓的计算机的可编程性主要是指对CPU的编程

MPU (Micro Processor Unit),叫微处理器通常代表一个功能强大的CPU

MCU(Micro Control Unit),叫微控制器,是指随着大规模集成电路的出现及其发展,将计算机的 CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的芯片,MCU MPU 最主要的区别就是能否直接运行代码。MCU有内部的RAM ROM,而MPU是增强版的CPU,需要添加外部RAM ROM才可以运行代码。

SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,它既MCU(51,avr)那样有内置RAM,ROM同时又像MPU(arm)那样强大的,不单单是放简单的代码,可以放系统级的代码,也就是说可以运行操作系统(将就认为是MCU集成化与MPU强处理力各优点二合一)。

2.什么是交叉编译

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。

3.左值和右值是什么?

    左值是指可以出现在等号左边的变量或表达式,它最重要的特点就是可写(可寻址)。也就是说,它的值可以被修改,如果一个变量或表达式的值不能被修改,那么它就不能作为左值。

    右值是指只可以出现在等号右边的变量或表达式。它最重要的特点是可读。一般的使用场景都是把一个右值赋值给一个左值。通常,左值可以作为右值,但是右值不一定是左值。

Linux

进程

1.进程和线程有什么区别?

1、根本区别

       进程是资源分配的基本单位,线程是程序执行的最小单位

2、资源开销

       进程有自己独立地址空间(代码空间和数据空间),每启动一个进程,系统会为它分配地址空间。

       线程没有自己独立的地址空间,线程共享进程中的数据,使用相同的地址空间。每个线程都有自己的堆栈。

       线程切换的资源开销要比进程小。涉及频繁切换,就选择线程。

       线程开销小,但是不利于进行资源包含;进程开销大,但是有利于资源保护。

3、关于通信

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。(ftok函数)

但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

4、执行过程

进程是独立的任务执行单元,而线程是在进程内的任务执行单元。一个进程可以有多个线程,但一个线程只能属于一个进程

       每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

2.何时使用多进程,何时使用多线程?

       对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

       要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程

3.进程的几种状态?

关于IO:

       用户程序进行IO的读写,会用到read&write两大系统调用。read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。

 同步IO

是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。

异步IO

是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方。

4.进程间通信方式有哪些?有什么优缺点?

一、管道(Pipe)

  • 优点

    • 易于实现和使用,适用于具有亲缘关系的进程之间的通信(如父子进程)。

  • 缺点

    • 只能用于单向通信,无法进行双向通信。

    • 局限于具有亲缘关系的进程间使用。

    • 缓冲区有限,可能导致数据丢失或阻塞。

二、命名管道(Named Pipe)

  • 优点

    • 可以在不具有亲缘关系的进程之间进行通信。

    • 提供一个唯一的名称,可以在文件系统中进行访问。

  • 缺点

    • 长期存于系统中,使用不当容易出错。

    • 缓冲区有限,可能导致数据丢失或阻塞。

三、消息队列(Message Queue)

  • 优点

    • 可以实现任意进程间的通信。

    • 消息的接收和发送没有严格的先后顺序,支持异步处理。

    • 可以通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题。

  • 缺点

    • 信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

    • 消息类型比较单一,可能无法满足复杂的数据传输需求。

四、共享内存(Shared Memory)

  • 优点

    • 速度最快,因为多个进程可以直接访问同一块物理内存。

    • 可以进行大量数据的传输,无需复制数据。

  • 缺点

    • 需要额外考虑同步机制,以避免数据竞争和不一致性问题。

    • 同步问题可能导致程序复杂性和出错率的增加。

    • 只能同一个计算机系统中的诸多进程共享,不方便网络通信。

五、信号量(Semaphore)

  • 优点

    • 可以用于多个进程之间进行同步和互斥控制。

    • 计数器机制可以有效地管理共享资源的访问。

  • 缺点

    • 容易出现死锁问题,如果信号量的使用不当。

    • 信号量有限,可能无法满足大量并发访问的需求。

六、套接字(Socket)

  • 优点

    • 可以进行网络通信,适用于不同主机之间的进程通信。

    • 传输数据为字节级,传输数据可自定义,数据量小效率高。

    • 传输数据时间短,性能高。

    • 适合于客户端和服务器端之间信息实时交互。

    • 可以加密,数据安全性强。

  • 缺点

    • 通信开销相对比较大,需要建立和维护网络连接。

    • 需对传输的数据进行解析,转化成应用级的数据。

5.僵尸进程的危害?

  浪费资源、降低系统性能,进程号枯竭:在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号PID,退出状态,运行时间等)。直到父进程通过wait / waitpid 来取时才释放。 如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
 

6.如何清理僵尸进程?

       当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程, 让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。  

7.什么是堆,栈,内存泄漏和内存溢出? 

堆(Heap)和栈(Stack)是计算机内存管理中的两个重要概念,而内存泄漏和内存溢出则是与内存管理相关的两个问题。

堆(Heap):堆是一种动态分配的内存区域,它由程序员分配和释放。堆的大小受系统限制,通常位于栈的顶部。在程序运行过程中,当需要分配大块内存时,可以通过调用malloc等函数从堆中分配。堆的优点是可以灵活地分配和释放内存,但需要注意的是,由于堆是动态分配的,可能会存在内存碎片和内存泄漏的问题。

栈(Stack):栈是一种静态分配的内存区域,它由系统自动分配和释放。栈的大小也受系统限制,通常位于内存的底部。在程序运行过程中,当需要分配局部变量或函数参数时,系统会自动从栈中分配内存。栈的优点是分配和释放内存的速度较快,但缺点是空间有限且大小固定,无法分配大块内存。

内存泄漏(Memory Leak):内存泄漏指的是程序中的某些代码由于某些原因未能释放已经不再需要的内存,导致内存无法被再次使用。这通常会导致程序运行过程中出现内存不足的情况,从而导致程序性能下降或崩溃。

内存溢出(Out of Memory):内存溢出指的是程序在运行过程中所需的内存超过了系统所能提供的内存大小。这通常会导致程序崩溃或出现不可预测的行为。为了解决内存溢出问题,程序员需要优化程序的内存使用,避免无谓的内存占用和泄漏。

8.堆和栈的区别

1) 申请方式不同:栈由系统分配和释放,存放函数的参数值、局部变量的值等;而堆需要程序员自己申请和释放,堆中的具体内容也由程序员自己安排;

2) 申请大小的限制:栈空间有限,栈是向下生长的一块连续的内存区域,栈顶的地址和栈的容量已经设定好了,若申请的空间大于栈的剩余空间,则会报栈溢出错误。堆是向上生长的不连续的内存区域,系统中使用链表来管理空闲的内存地址,堆的大小受限于计算机系统中有效的的虚拟内存(链表的遍历方向是由低地址向高地址,当系统收到程序的申请时,会遍历链表,寻找第一个空间大于所申请空间的堆节点,然后将节点从内存空闲节点链表中删除,并将该节点的空间分配给程序)。可见,堆的空间比较灵活,通常比栈的空间要大。

栈通常位于内存的底部,大小固定,而堆位于栈的顶部

3) 申请效率:栈由系统分配,效率较高,但程序员无法控制;相比之下堆的申请效率就比较低,而且容易产生内存碎片,但是用起来比较方便。

9.栈区放什么?栈区有多大?

栈区主要用于存储函数调用时的局部变量函数形参以及返回地址等,linux下默认8M,可以用ulimit -s修改

网络

TCP、UDP的区别

TCP 有连接 一对一 有缓冲区 字节流 可靠 效率低 应答机制 

UDP 无连接 一对多 无缓冲区 数据报 不可靠 效率高 

3次握手的过程是怎么样的?

描述端口号的作用,概念,两边都有还是只有一边

端口号在网络通信的双方都存在。

TCP为啥安全可靠?

一、校验和

TCP在数据传输过程中,会对传输的数据进行校验和计算。这是通过将数据当作一个16位整数,把所有数据加起来(最前面的进位补到最后一位),然后取反得到的。

发送方和接收方都会进行校验和的计算与验证。如果接收方计算出的校验和与发送方的不一致,那么数据就被认为是传输有误的,接收方会丢弃这个TCP段,并可能请求重发。

二、序列号与确认应答

TCP给发送的每一个数据包分配一个序列号,接收方根据序列号对数据包进行排序,确保数据按序到达。

接收方在成功接收数据后,会返回一个确认应答(ACK),告知发送方已正确接收的数据序列号。这一机制确保了数据的完整性和传输的可靠性。

三、超时重传

当TCP发出一个数据包后,会启动一个定时器等待接收方的确认应答。

如果在定时器超时前未能收到确认应答,TCP会认为数据包已丢失或损坏,并重新发送该数据包。这一机制有效应对了数据包在网络传输过程中的丢失问题。

四、连接管理

TCP在数据传输之前会进行三次握手连接过程,确保双方都已准备好进行数据传输。

数据传输结束后,还会进行四次挥手断开连接过程,以节约系统资源并确保双方都已正确结束数据传输。

五、流量控制与拥塞控制

TCP使用滑动窗口协议实现流量控制,确保发送方不会发送超过接收方处理能力的数据。

拥塞控制则通过慢启动、拥塞避免、快重传和快恢复等算法,动态调整发送速率,避免网络拥塞。

六、面向连接的特性

TCP是一个面向连接的协议,这意味着在数据传输之前必须先建立连接。

这种面向连接的特性使得TCP能够提供更可靠的数据传输服务,因为它可以在连接建立阶段就进行一系列的参数协商和准备工作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外卖跑腿小程序源码如何满足多样需求?

外卖跑腿平台已经成了当代年轻人的便捷之选,校园中也不例外,那么外卖、跑腿小程序就需要满足用户多样化的需求,而这背后的源码扮演者最重要的角色。 用户类型的多样性 1.对上班族而言,他们希望外卖小程序能够快速下单、准确配送…

【Java语言】异常处理

异常 异常:在Java中程序执行过程中发生不正常行为。异常为多种,有算数异常、数组越界异常、空指针异常等(这些是比较常见的异常); 异常的体系结构: 数组越界异常: ArrayIndexOutOfBoundsException。空指…

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单,选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框(提示:项目名称不要出现汉字); ②选择【Analog or Mixed A/D】; ③单击【…

深度剖析C++STL:手持list利剑,破除编程重重难题(上)

前言: C 标准模板库(STL)中的 list 容器是一个双向链表结构,它提供了高效的插入和删除操 作。与 vector 不同,list 中的元素不是连续存储的,因此可以在任何位置高效插入和删除元素,而无需移动其…

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数,用于自定义转发内容。当用户点击右上角的菜单按钮,并选择“转发”时,会触发这个函数。开发者可以在这个函数中返回一个对象,用于定义分享卡片的标题、图片、路径等信息。 使用场…

Matlab实现白鲸优化算法优化随机森林算法模型 (BWO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 白鲸优化算法(Beluga Whale Optimizer, BWO)是一种受白鲸社会行为启发的新型群智能优化算法。该算法通过模仿白鲸群体中的合作和竞争机制来指导搜索过程,能够在复杂解空间中高…

c#基本数据类型占用字节长度/取值范围/对应.net类型

具体前往:c#基本数据类型占用字节数/取值范围/包装类-各基本类型.net类型,占用bit位数,默认值及取值范围

解决 IDEA 修改代码重启不生效的问题

前言 在使用 IntelliJ IDEA 进行 Java 项目开发时,有时会遇到一个令人头疼的问题:修改了代码后,重启服务却发现更改没有生效。通常情况下,解决这个问题需要通过 Maven 的 clean 和 compile 命令来强制重新编译,但这显…

React教程第二节之虚拟DOM与Diffing算法理解

1、什么是虚拟DOM 虚拟DOM 是javascript的一个对象,是内存中的一种数据结构,以树的形式存储UI的状态,树中的每个节点都代表着真实的DOM,用来描述我们希望在页面看到的 HTML结构; 现在的MVVM 框架,大多使用…

视觉SLAM相机——单目相机、双目相机、深度相机

一、单目相机 只使用一个摄像头进行SLAM的做法称为单目SLAM,这种传感器的结构特别简单,成本特别低,单目相机的数据:照片。照片本质上是拍摄某个场景在相机的成像平面上留下的一个投影。它以二维的形式记录了三维的世界。这个过程中…

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作(三种实现方式): 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

用jquery做一个websocket客户端

先看效果图&#xff1a; 功能很简单&#xff0c;就是作为客户端连接websocket&#xff0c;并实现接受和发送消息。具体代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"…

本地音乐服务器(二)

4. 上传音乐模块设计 4.1 上传音乐的接口设计 请求和响应设计&#xff1a; 新建music实体类&#xff1a; Data public class Music {private int id;private String title;private String singer;private String time;private String url;private int userid; } 4.2 创建Mu…

GRPC实现

1.首先下载对应编译插件&#xff0c;这里不再提供下载 2.编写proto文件 3.编写完成用命令生成go文件 protoc --go_out. --go-grpc_out. *.proto --go_out. 其中的. 是说你要编译的 .proto 文件目录为当前目录&#xff0c;按需修改 --go-grpc_out.&#xff0c;其中的. 是说你生…

「Java EE开发指南」如何使用Visual JSF编辑器设计JSP?(一)

Visual JSF Designer的目标是使创建JSF应用程序的特定于组件的工作更容易可视化&#xff0c;在本教程中&#xff0c;您将使用可视化设计器设计JSF登录页面&#xff0c;将学习如何&#xff1a; 创建一个JSF项目创建一个新的JSF页面设计JSF页面 该功能在MyEclipse中可用。 MyE…

大模型(LLMs)RAG 版面分析——表格识别方法篇

大模型&#xff08;LLMs&#xff09;RAG 版面分析——表格识别方法篇 一、为什么需要识别表格&#xff1f; 表格的尺寸、类型和样式展现出多样化的特征&#xff0c;如背景填充的差异性、行列合并方法的多样性以及内容文本类型的不一致性等。同时&#xff0c;现有的文档资料不…

力扣(leetcode)题目总结——动态规划篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

WebSocket实战,后台修改订单状态,前台实现数据变更,提供前端和后端多种语言

案例场景&#xff1a; 在实际的后台中需要变更某个订单的状态&#xff0c;在官网中不刷新页面&#xff0c;可以自动更新状态 在前端页面实现订单状态的实时更新&#xff08;不刷新页面&#xff09;&#xff0c;可以通过 WebSocket 的方式与后台保持通信&#xff0c;监听订单状态…

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …

面试题:Kafka(一)

1. Kafka如何保证消息不丢失 生产者发送消息到Brocker丢失 设置异步发送 消息重试 消息在Brocker中存储丢失 发送确认机制acks 消费者从Brocker接收消息丢失 Kafka 中的分区机制指的是将每个主题划分成多个分区&#xff08;Partition&#xff09;topic分区中消息只能由消费者…