禾赛面经分享

news2025/1/13 8:08:36

前言

    禾赛的linux开发工程师(实习),base是上海,以下是面试遇到的一些问题。

目录

  • 前言
  • 题目与答案
    • C语言部分
    • 嵌入式相关
    • 手撕题

题目与答案

C语言部分

  1. static关键字的作用

static修饰局部变量时:①改变了其存储位置,存储在静态区;②同时改变了其生命周期,为整个源程序,因此它只被初始化一次,若没显式初始化则自动初始化为0。
   
static修饰全局变量时:改变了其作用域,只可以被文件内所用函数访问。
   
static修饰函数时:改变了其作用域,只可被这一文件内的其它函数调用。


  1. 传入函数的时候,指针如何传递?

在C语言中,指针可以通过值传递给函数。当你传递一个指针给函数时,你实际上是传递了该指针的拷贝,但这两个指针(原始指针和拷贝的指针)都指向同一个内存地址。


  1. 假设如下所示传递指针,会不会有问题
func(int* p) {
	p[0] = 0; p[1] = 1;
}

int * a;
func(a);

这个会访问未分配的内存,因为传入的是一个指针,然后在函数内解引用的时候用到了当前地址的后一个位置,而这个位置是未定义的,因此这个会发生错误,以下是实验结果

在这里插入图片描述

  1. 编译的过程

预处理 --> 编译 --> 汇编 --> 链接


  1. 静态链接和动态链接的区别

静态链接和动态链接两者最大的区别就在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时


  1. 由gcc编译的C语言程序占用的内存分为哪几个部分
区名功能
栈区(stack)存放函数的参数、局部变量。
堆区(heap)提供程序员动态申请的内存空间。
全局(静态)区(static)存放全局变量和静态变量,初始化不为0的全局变量和静态变量、const型常量在一块区域(.data段),未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域(.bss段)。
程序代码区存放函数体的二进制代码和字符串常量。

  1. 什么是内存泄露

内存泄漏(Memory Leak)指的是在程序运行过程中,动态分配的内存没有得到及时释放,从而导致系统内存的消耗随着程序运行时间的增加而不断增加的现象。简单来说,就是程序在申请内存后,未能适时地释放已申请的内存空间,造成系统内存的浪费,严重时会消耗完系统内存,导致程序卡顿、崩溃或者影响到其他程序的运行。
内存泄漏通常发生在以下几种情况:

  • 常驻内存的程序:这类程序由于一直运行,如果不正确地管理内存,就容易造成内存泄漏。
  • 频繁分配和释放内存的程序:在反复申请和释放内存的过程中,如果存在未被正确释放的内存块,也会导致内存泄漏。
  • 使用了动态分配的内存,但忘记释放:例如,在C或C++中,使用malloc、calloc、realloc或new等函数动态分配内存后,如果没有相应的free或delete操作来释放内存,就会发生内存泄漏。
  • 循环引用:在某些高级语言中,如Java或C#,如果对象之间存在循环引用,并且这些对象没有其他引用指向它们,垃圾回收器可能无法正确地回收这些对象,从而导致内存泄漏。
  • 全局变量或静态变量:这些变量在程序整个生命周期中都存在,如果不当使用,也可能导致内存泄漏。
  • 资源泄露:除了纯内存泄露外,还有资源泄露的概念,比如文件句柄、数据库连接、网络连接等没有适时关闭,这些也可以视为一种广义的内存泄露。

  1. 什么是段错误,发生段错误的原因是什么

段错误(Segmentation Fault)是计算机程序中一种特定的运行时错误。它发生在程序尝试访问的内存地址并不属于其地址空间,或者程序试图以不允许的方式(如写入只读内存)访问内存时。简单来说,就是程序试图访问一个它不应该或不能访问的内存区域。
   
发生段错误的原因有多种,主要包括以下几点:

  1. 指针误用:
  • 未初始化指针:如果指针在使用前没有被正确初始化,它可能指向任意内存地址,导致段错误。
  • 指针已被释放或失效:如果一个指针指向的内存已经被释放(如使用free函数后),或者指针因其他原因失效,再次访问该指针将导致段错误。
  • 指针越界:例如,数组下标越界访问,此时指针可能指向不属于程序的内存区域。
  1. 访问不可访问的内存空间:
  • 试图访问内核空间或其他受保护的内存区域。
  • 访问不存在的内存地址,可能是由于计算错误或逻辑错误导致的非法地址。
  1. 试图写入只读内存空间:例如,程序的代码段通常是只读的,如果尝试向代码段写入数据,将触发段错误。
  2. 栈溢出:这通常发生在函数递归调用过深时,导致栈空间耗尽,并可能覆盖到其他内存区域,从而引起段错误。

嵌入式相关

  1. 说一下I2C通信的流程

这个可以见我的博客:嵌入式驱动学习第七周——I2C子系统,只需要看主机和从机通信部分


  1. I2C有两根线SCL和SDA,说一下发送开始信号时这两根线的电平情况:

SCL高电平,SDA出现下降沿


  1. I2C的死锁有没有尝试过,发生的原因是什么,如何避免

数据线在等待时钟线的下降沿, 时钟线在等待数据线的高电平, 二者等待的条件一直不成立, 最终造成死锁。
  
避免I2C死锁:

  • 要避免I2C死锁,需要在设计和实现阶段就充分考虑和预防潜在的问题。合理规划通信流程、设置时序参数、处理错误和异常情况,以及遵循设备的规范和建议,都是确保I2C通信稳定性和可靠性的重要措施。

I2C产生死锁的原因是什么、避免、解决I2C死锁


  1. linux发生死锁的条件

(1)死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。

(2)原因:①系统资源不足。②资源分配不当。③进程推进的顺序不合适。
   
产生死锁的条件:
(1)互斥条件:一个资源每次只能被一个进程使用,其他进程只能等待。
(2)请求与保持条件:进程已经获得至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时该进程被阻塞,但对已获得资源依然保持不放。
(3)不可剥夺条件:进程所获得的资源不能被其他进程剥夺,只能被自己释放。
(4)循环等待条件:若干进程形成首尾相接循环等待资源的关系。


  1. 如何解决死锁

解决死锁:
(1)预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件。
(2)避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁。
(3)检测和解除死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉。


  1. linux的调度算法熟不熟悉,说一说linux调度算法

(1)SCHED_OTHER分时调度策略;

(2)SCHED_FIFO实时调度策略,先到先服务。

(3)SCHED_RR实时调度策略,时间片轮转。


  1. 如何避免死锁

(1)破坏“请求与保持条件”:
①静态分配,即每个进程在开始执行时就申请它所需要的全部资源:
②动态分配,即每个进程在申请所需要的资源时它本身不占用系统资源。
(2)破坏“不可剥夺条件”:一个进程在阻塞等待期间,其占有的资源被隐式释放后被其他进程使用,而阻塞等待的资源只有获得所有需要的资源才能重新启动。
(3)破坏“循环等待条件”:采用资源的有序分配,将所有资源进行编号,紧缺的资源采用 比较大的编号,一个进程只有获得较小编号的资源才可以申请较大编号的资源。


  1. linux内核中,进程的几种状态

在这里插入图片描述

(1)就绪态:所有运行条件已就绪,只要得到了CPU时间就可运行。

(2)运行态:得到CPU时间正在运行。

(3)僵尸态:进程已经结束了但父进程还没来得及回收。

(4)等待态:包括浅度睡眠跟深度睡眠。进程在等待某种条件,条件成熟后即进入就绪态。浅度睡眠时进程可以被信号唤醒,但深度睡眠时必须等到条件成熟后才能结束睡眠状态。

(5)暂停态:暂时停止参与CPU调度(即使条件成熟),可以恢复。


  1. 说一下linux的中断机制
  • 中断控制器接收中断信号并识别中断号。
  • 控制器通知CPU,CPU关中断、保存断点和识别中断源。
  • 根据中断向量表跳转到对应的中断服务程序。
  • 保护现场,即保存当前栈指针和一些寄存器的状态,确保中断服务程序结束后能恢复到原来的状态。
  • 执行中断服务程序,处理中断事件。
  • 恢复现场,返回断点,并重新打开中断。

  1. linux中断分为哪三部分

Linux中断由中断向量表、中断处理子程序和中断请求三部分组成,它们共同协作以处理系统中发生的中断事件


  1. phy和mac的区别

功能上的差异:

  • PHY(物理层芯片):主要实现物理层的功能,是网络结构中的最底层。它负责发送和接收以太网的数据帧,可以检测到网络上是否有数据在传送,并处理数据发送前的准备工作,如数据编码和模拟信号的转换。在发送数据时,PHY会将数据从并行转化为串行流数据,再按照物理层的编码规则将数据编码,然后通过模拟信号将数据发送出去。此外,PHY还负责处理冲突检测等任务。
  • MAC(介质访问控制层芯片):主要实现数据链路层的功能,包括MAC子层和LLC子层的功能。MAC从PCI总线收到IP数据包(或其他网络层协议的数据包)后,会将其拆分并重新打包成特定大小的帧,这个帧里面包括了目标MAC地址、源MAC地址和数据包里的协议类型。MAC还负责处理介质访问控制,确保数据在传输过程中的准确性和效率。

数据传输流程的区别:

  • 在数据传输过程中,MAC层首先处理数据包,将其拆分并重新打包成帧,然后通过PHY层进行发送。PHY层在接收到MAC层传来的数据后,会进行一系列的处理,如增加检错码、数据并行转串行、编码和模拟信号的转换等,最终将数据发送出去。在接收数据时,PHY层负责解码模拟信号并将数字信号传送出去,而MAC层则负责处理接收到的帧数据。

信号处理的区别:

  • PHY芯片主要处理模拟信号,负责信号的解码和转换,将解码后的数字信号传送出去。它不对数字信号进行任何处理,即使一帧有问题的数据也会如实转发出去。而MAC芯片则主要处理帧数据的内容,如更新MAC地址列表等。

  1. phy和mac地址

PHY地址:

  • PHY芯片的地址或物理连接点的标识,负责处理物理层的信号转换和数据传输

MAC地址:

  • 物理地址或硬件地址,是一个网络设备在网络层面的唯一标识符

手撕题

最后是一道手撕题,共享屏幕后,打开leetcode,选了一道字符串题,是leetcode38:外观数列

一道中等偏下题,按题意写就行了

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

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

相关文章

基础知识集合

https://blog.csdn.net/sheng_q/category_10901984.html?spm1001.2014.3001.5482 epoll 事件驱动的I/O模型,同时处理大量的文件描述符 内核与用户空间共享一个事件表:监控的文件描述符以它们的状态,当状态变化,内核将事件通知给…

【分治】Leetcode 库存管理 III

题目讲解 LCR 159. 库存管理 III 本题的含义就是让求出最小的k个数 算法讲解 class Solution { public:void my_qsort(vector<int>& nums, int l, int r){if(l > r) return ;int i l, left l-1, right r1;int key nums[rand() % (r - l 1) l];//完成分三…

大数据真题讲解系列——拼多多数据分析面试题

拼多多数据分析面试题&#xff1a;连续3次为球队得分的球员名单 问题&#xff1a; 两支篮球队进行了激烈的比赛&#xff0c;比分交替上升。比赛结束后&#xff0c;你有一个两队分数的明细表&#xff08;名称为“分数表”&#xff09;。表中记录了球队、球员号码、球员姓名、得…

hv第一坑:定时器

错误代码 重试策略&#xff1a;一次延迟1s,最长30s直至事件成功。 int try_count 0;//do something if(not success)m_loop->setTimerInLoop((try_count > 30 ? 30: try_count) *1000 , cb, INFINITE, 0x100);表现现象 cpu 爆了内存爆了 总结原因 hv内部代码bug&…

Maven通过flatten-maven-plugin插件实现多模块版本统一管理

正文 起因是公司开始推代码版本管理的相关制度&#xff0c;而开发过程中经常使用多模块构建项目&#xff0c;每次做版本管理时都需要对每个模块及子模块下的pom文件中parent.version和模块下依赖中的version进行修改&#xff0c;改的地方非常多&#xff0c;且非常容易漏。为此…

如何用Python构建一个生产级别的电影推荐系统 - 机器学习手册

构建项目是彻底学习概念并发展必要技能的最有效方式之一。 项目使您沉浸在现实世界的问题解决中&#xff0c;巩固您的知识&#xff0c;并培养批判性思维、适应能力和项目管理专业知识。 本指南将带您逐步构建一个根据用户喜好量身定制的电影推荐系统。我们将利用一个庞大的包…

20240419,继承,多态

土豆的老家陕西安康&#xff01;怪舒服的咯&#xff0c;广西一眼望去全是房子啦&#xff0c;小时候一眼开敞水田再也回不来啦 目录 五&#xff0c;继承 5.1 基本语法 5.2 继承方式 5.3 继承中的对象模型 5.4 构造和析构顺序 5.5 同名成员处理 5.6 同名静态成员处理 5.…

c#+unity基础

序列化&#xff1a; [SerializeField]&#xff0c;点不出来&#xff0c;只能在面板上显示绑定游戏物体 //公有隐藏 特有函数 特有函数&#xff1a;不需要调用&#xff0c;自动执行 Awake最先执行->OnEable 面向对象思想 面向对象思想&#xff1a;分为具体对象和抽象对…

从预训练损失的角度,理解语言模型的涌现能力

原文&#xff1a;Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力&#xff0c;挑战了以往以模型大小或训练计算量为标准的观念。通过实验&#xff0c;作者发现预训练损失是预测下游任…

【算法】合并两个有序链表

本题来源---《合并两个有序链表》 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] /*** Definition for singl…

JavaSE——常用API进阶二(6/8)-ZoneId、ZoneDateTime、Instant(常见方法、用法示例)

目录 ZoneId 常见方法 用法示例 ZoneDateTime 常见方法 用法示例 Instant 常见方法 用法示例 如果在开发中我们有这样的需求&#xff1a;我们的系统需要获取美国现在的时间&#xff0c;或者其他地区的时间给用户观看&#xff0c;或者进行一些处理&#xff0c;那应该怎…

循环开关定时器(Smart PLC梯形图代码)

很多设备不需要复杂的逻辑时序控制,只需要实现简单的循环定时开关功能,对于这样的控制我们可以利用定时器组合去实现,但是如果系统里需要循环定时控制的设备比较多,那我们建议大家编写一个这样的循环定时开关功能块,SMART PLC循环开关定时器还可以参考下面文章链接 1、周…

短视频批量采集提取软件|视频关键词下载工具

短视频批量采集软件&#xff1a;快速抓取、高效下载 一、开发背景 随着短视频平台的兴起&#xff0c;获取并分析相关视频内容已成为许多业务的必要步骤。然而&#xff0c;传统的手动方式无法满足快速、批量获取的需求&#xff0c;因此我们开发了一款专业的短视频批量采集软件。…

FreeRTOS时间管理

FreeRTOS时间管理 主要要了解延时函数&#xff1a; 相对延时&#xff1a;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束。 绝对延时&#xff1a;指将整个任务的运行周期看成一个整体&#xff0c;适用于需要按照一定频率运行的任务。 函数 vTa…

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

A Geolocation Databases Study(2011年)第五部分:Evalution Model

下载地址:A Geolocation Databases Study | IEEE Journals & Magazine | IEEE Xplore 被引次数:195 Shavitt Y, Zilberman N. A geolocation databases study[J]. IEEE Journal on Selected Areas in Communications, 2011, 29(10): 2044-2056. 5. Discussion 在我们讨…

Jenkins的安装和部署

文章目录 概述Jenkins部署项目的流程jenkins的安装启动创建容器进入容器浏览器访问8085端口 Jenkins创建项目创建example项目 概述 Jenkins&#xff1a;是一个开源的、提供友好操作界面的持续集成&#xff08;CLI&#xff09;工具&#xff0c;主要用于持续、自动构建的一些定时…

什么是知乎知+广告推广?

知乎作为中国领先的知识分享社区和高质量用户群体汇聚地&#xff0c;其广告价值日益凸显&#xff0c;其中&#xff0c;“知”作为知乎官方推出的创新广告形式&#xff0c;正逐渐成为品牌与消费者深度连接的重要桥梁。知广告推广不仅局限于传统意义上的硬性推广&#xff0c;更强…

C语言中与内存操作有关的一些函数

前提 最近在使用C语言在开发项目时&#xff0c;要对内存进行操作。刚开始写的时候有一点迷糊&#xff0c;看了一些东西后才发现为什么说指针是C语言的灵魂&#xff0c;因为它可以对内存直接进行操作&#xff0c;多么帅的事情&#xff0c;真的是太帅了。 malloc 声明在头文件…

混合现实(MR)开发框架

混合现实&#xff08;MR&#xff09;开发框架为开发者提供了构建MR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统、网络功能以及支持同时处理现实世界和虚拟世界信息的功能。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…