嵌入式工程师面试笔试总结——day1

第一章、进程与线程

1、什么是进程、线程,有什么区别?

    进程是资源( CPU 、内存等)分配的基本单位,线程是 CPU 调度和分配的基本单位(程序执行的最小单 位)。同一时间,如果CPU 是单核,只有一个进程在执行,所谓的并发执行,也是顺序执行,只不过由 于切换速度太快,你以为这些进程在同步执行而已。多核CPU 可以同一时间点有多个进程在执行。

2、多进程、多线程的优缺点

     说明:一个进程由进程控制块、数据段、代码段组成,进程本身不可以运行程序,而是像一个容器一 样,先创建出一个主线程,分配给主线程一定的系统资源,这时候就可以在主线程开始实现各种功能。
    当我们需要实现更复杂的功能时,可以在主线程里创建多个子线程,多个线程在同一个进程里,利用这个进程所拥有的系统资源合作完成某些功能。
优缺点: 1 )一个进程死了不影响其他进程,一个线程崩溃很可能影响到它本身所处的整个进程。 2 ) 创 建多进程的系统花销大于创建多线程。3 )多进程通讯因为需要跨越进程边界,不适合大量数据的传送, 适合小数据或者密集数据的传送。多线程无需跨越进程边界,适合各线程间大量数据的传送。并且多线 程可以共享同一进程里的共享内存和变量。

3、什么时候用进程,什么时候用线程

     1 )创建和销毁较频繁使用线程,因为创建进程花销大。 2 )需要大量数据传送使用线程,因为多线程切换速度快,不需要跨越进程边界。3 )安全稳定选进程;快速频繁选线程;

4、多进程、多线程同步(通讯)的方法

进程间通讯:
1 )有名管道 / 无名管道( 2 )信号( 3 )共享内存( 4 )消息队列( 5 )信号量( 6 socket
线程通讯(锁):
1 )信号量( 2 )读写锁( 3 )条件变量( 4 )互斥锁( 5 )自旋锁

5、进程线程的状态转换图

1 )就绪状态:进程已获得除 CPU 外的所有必要资源,只等待 CPU 时的状态。一个系统会将多个处于就绪状态的进程排成一个就绪队列。
2 )执行状态:进程已获 CPU ,正在执行。单处理机系统中,处于执行状态的进程只一个;多处理机系统中,有多个处于执行状态的进程。
3)阻塞状态:正在执行的进程由于某种原因而暂时无法继续执行,便放弃处理机而处于暂停状态,即进程执行受阻。(这种状态又称等待状态或封锁状态) 通常导致进程阻塞的典型事件有:请求 I/O,申请缓冲空间等。 一般,将处于阻塞状态的进程排成一个队列,有的系统还根据阻塞原因不同把这些阻塞集成排成多个队列。

进程的三种状态转换

(1) 就绪 执行
    处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2) 执行 就绪
    处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
(3) 执行 阻塞
    正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
(4) 阻塞 就绪
    处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

6、父进程、子进程

    父进程调用 fork() 以后,克隆出一个子进程,子进程和父进程拥有相同内容的代码段、数据段和用户堆栈。父进程和子进程谁先执行不一定,看CPU 。所以我们一般我们会设置父进程等待子进程执行完毕。

7、说明什么是上下文切换?

    你可以有很多角度,有进程上下文,有中断上下文。
    进程上下文:一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
    中断上下文:由于触发信号,导致 CPU中断当前进程,转而去执行另外的程序。那么当前进程的所有资源要保存,比如堆栈和指针。保存过后转而去执行中断处理程序,快读执行完毕返回,返回后恢复上一个进程的资源,继续执行。这就是中断的上下文。

第二章、C/C++题目

1newmalloc

    做嵌入式,对于内存是十分在意的,因为可用内存有限,所以嵌入式笔试面试题目,内存的题目高频。
    1 malloc free c++/c 语言的库函数,需要头文件支持 stdlib.h new delete C++ 的关键字,不需要头文件,需要编译器支持;
    2 )使用 new 操作符申请内存分配时,无需指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地支持所需内存的大小。 3 new 操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new 是符合类型安全性的操作符。而 malloc 内存分配成功则是返回 void ,需要通过强制类型转换将 void 指针转换成我们需要的类型。
4 new 内存分配失败时,会抛出 bad_alloc 异常。 malloc 分配内存失败时返回 NULL

2、在1G内存的计算机中能否malloc(1.2G)?为什么?(2021浙江大华二面问题)

答:是有可能申请 1.2G 的内存的。
解析:回答这个问题前需要知道 malloc 的作用和原理,应用程序通过malloc函数可以向程序的虚拟空间申请一块虚拟地址空间,与物理内存没有直接关系,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。

3 extern”C” 的作用

    我们可以在 C++ 中使用 C 的已编译好的函数模块,这时候就需要用到 extern”C” 。也就是 extern“C” 都是在c++ 文件里添加的。
    extern 在链接阶段起作用(四大阶段:预处理 -- 编译 -- 汇编 -- 链接)。

4strcatstrncatstrcmpstrcpy哪些函数会导致内存溢出?如何改进? 2021浙江大华二面问题)

    strcpy 函数会导致内存溢出。
    strcpy 拷贝函数不安全,他不做任何的检查措施,也不判断拷贝大小,不判断目的地址内存是否够用。
char *strcpy(char *strDest,const char *strSrc) 1
strncpy 拷贝函数,虽然计算了复制的大小,但是也不安全,没有检查目标的边界。
strncpy(dest, src, sizeof(dest));

    strncpy_s 是安全的strcmp(str1,str2),是比较函数,若 str1=str2 ,则返回零;若 str1<str2 ,则返回负数;若 str1>str2 ,则返回正数。(比较字符串)
    strncat() 主要功能是在字符串的结尾追加 n 个字符。
char * strncat(char *dest, const char *src, size_t n);
strcat() 函数主要用来将两个 char 类型连接。例如:
char d[20]="Golden";
char s[20]="View";
strcat(d,s);
//打印d
printf("%s",d);
输出 d GoldenView (中间无空格)
延伸:
    memcpy 拷贝函数,它与 strcpy 的区别就是 memcpy 可以拷贝任意类型的数据, strcpy 只能拷贝字符串类型。

    memcpy 函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(dest所指向的内存区域); 有一个size变量控制拷贝的字节数;

    函数原型:
void *memcpy(void *dest, void *src, unsigned int count);

5 static的用法(定义和用途)(必考)

1 )用 static 修饰局部变量:使其变为静态存储方式 ( 静态数据区 ),那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中。
2 )用 static 修饰全局变量:使其只在本文件内部有效,而其他文件不可连接或引用该变量。
3 )用static修饰函数:对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的(这一点在大工程中很重要很重要,避免很多麻烦,很常见)。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

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

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

相关文章

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)

优化器&#xff08;Optimizers&#xff09; 引言1. 随机梯度下降/Stochastic Gradient Descent (SGD)2. 学习率&#xff08;Learning Rate&#xff09;3. 学习率衰减&#xff08;Learning Rate Decay&#xff09;4. 带动量的随机梯度下降法&#xff08;Stochastic Gradient Des…

UE5安装教程及设置

学习链接&#xff1a;01-安装UE5及设置_哔哩哔哩_bilibili

如何利用Python爬虫精准获得1688店铺的所有商品信息

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电商领域。1688作为中国领先的B2B电商平台&#xff0c;拥有丰富的商品数据。对于电商企业来说&#xff0c;获取这些数据对于市场分析、竞品研究等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&…

电子学习中的关键游戏化元素

游戏化彻底改变了电子学习领域&#xff0c;提供了一种使学习具有吸引力、互动性和有效性的方法。通过将类似游戏的功能集成到教育平台中&#xff0c;教育工作者可以增强动力&#xff0c;提高知识记忆&#xff0c;并创造动态的学习体验。游戏化的关键要素为设计与学习者产生共鸣…

docker镜像、容器、仓库介绍

docker docker介绍docker镜像命令docker容器命令docker仓库 docker介绍 官网 Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为“容器”的单一包中&#xff0c;使得应用能够在任何环境下运行&#xff0c;不受底层系…

一些好的AI技术学习平台和资料(动态更新)

1. 大模型 1.1 提示词&#xff08;Prompt&#xff09; 目前&#xff0c;大模型技术已经深入到工作生活的方方面面&#xff0c;各技术大厂的大模型也层出不穷&#xff0c;从开始的OpenAI一家独大&#xff0c;到当今世界的“百模大战”。从一些日常使用的角度来说&#xff0c;模…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

QT简易项目 数据库可视化界面 数据库编程SQLITE QT5.12.3环境 C++实现

案例需求&#xff1a; 完成数据库插入&#xff0c;删除&#xff0c;修改&#xff0c;查看操作。 分为 插入&#xff0c;删除&#xff0c;修改&#xff0c;查看&#xff0c;查询 几个模块。 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget…

丹摩征文活动|实现Llama3.1大模型的本地部署

文章目录 1.前言2.丹摩的配置3.Llama3.1的本地配置4. 最终界面 丹摩 1.前言 Llama3.1是Meta 公司发布的最新开源大型语言模型&#xff0c;相较于之前的版本&#xff0c;它在规模和功能上实现了显著提升&#xff0c;尤其是最大的 4050亿参数版本&#xff0c;成为开源社区中非常…

MySQL与Informix数据库中的同义表创建:深入解析与比较

MySQL与Informix数据库中的同义表创建:深入解析与比较 一、同义表的基本概念与用途1. 定义与概念2. 主要用途二、MySQL数据库中的同义表创建1. 使用视图创建同义表2. 使用别名创建同义表3. MySQL中的同义表限制与替代方案三、Informix数据库中的同义表创建1. 创建同义表的基本…

【LeetCode面试150】——202快乐数

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

鸿蒙进阶篇-状态管理之@Provide与@Consume

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天我们来学习一下状态管理中的Provide与Consume。 一、概述 嘿&#xff01;大家还记得这张图吗&#xff1f;不记得也要记得哦&#xff0c;因为这张图里的东西&#xff0c;既是高频必考面试题&#xff0c;也是实际开发中&…

非交换几何与黎曼ζ函数:数学中的一场革命性对话

非交换几何与黎曼ζ函数&#xff1a;数学中的一场革命性对话 非交换几何&#xff08;Noncommutative Geometry, NCG&#xff09;是数学的一个分支领域&#xff0c;它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数&#xff0c;其中乘积不是交换性的&…

【AIGC】大模型面试高频考点-RAG篇

【AIGC】大模型面试高频考点-RAG篇 &#xff08;1&#xff09;RAG的基本原理&#xff08;2&#xff09;RAG有哪些评估方法&#xff1f;&#xff08;3&#xff09;RAG有哪些评估框架&#xff1f;&#xff08;4&#xff09;RAG各模块有哪些优化策略&#xff1f; &#xff08;1&am…

永磁同步电机末端振动抑制(输入整形)

文章目录 1、前言2、双惯量系统3、输入整形3.1 ZV整形器3.2 ZVD整形器3.3 EI整形器 4、伺服系统位置环控制模型5、仿真5.1 快速性分析5.2 鲁棒性分析 参考 1、前言 什么是振动抑制&#xff1f;对于一个需要精确定位的系统&#xff0c;比如机械臂、塔吊、码头集装箱等&#xff…

Spring 中的 ProxyFactory 创建代理对象

一、jdk 动态代理 和 cglib动态代理 简单介绍 1.jdk动态代理 public interface AService {public String serviceA(String param);public String serviceAA(String param); } public interface BService {public String serviceB(String param);public String serviceBB(Str…

C++数据结构与算法

C数据结构与算法 1.顺序表代码模版 C顺序表模版 #include <iostream> using namespace std; // 可以根据需要灵活变更类型 #define EleType intstruct SeqList {EleType* elements;int size;int capacity; };// Init a SeqList void InitList(SeqList* list, int capa…

贵州茅台[600519]行情数据接口

贵州茅台&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker600519获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…