根据面经准备面试第9期-c软件2026创维
感觉是我目前最难的,太菜了,知识很多都忘了,不熟练
- git,拉取,上传,冲突怎么解决
- 怎么安全线程退出
- linux系统启动流程
- linux系统线程崩溃,怎么解决
- 用户态和内核态联系
- #我的失利项目复盘#
- dma的作用
- BootLoader
- BootLoader怎么起作用的
- 进程间通信,选一个具体讲讲
- 线程间怎么共享变量
- socket端口怎么使用
- cs架构
- IP地址与Mac地址,作用
- epoll与select区别
- cmake与makefile怎么编写,基本配置
- 什么时候用单例,什么时候用工厂
- static作用,能否修改
- linux驱动什么流程
- linux系统启动流程
- linux命令,下载,
- 消息队列具体是怎么通知接收方的
- 端口什么时候阻塞,什么时候不阻塞
- git,拉取,上传,冲突怎么解决
拉取git pull,拉取远程分支更新到本地
git add.暂存修改,git commit-m描述,提交到本地仓库,git push origin分支名,推送到远程
冲突解决:
拉取若冲突,git status查看冲突文件
打开文件,找到冲突标记,
手动编辑保留正确内容,删除标记
重新git add ,git commit,git push完成提交
- 怎么安全线程退出
避免强制终止,如pthread——cancel可能导致资源泄漏
采用协作式退出,定义共享标志位,volatie bool is——exit,线程定期检查
主线程需退出,设置is——exit=true,并通过条件变量pthread——cond——signal唤醒阻塞中的线程
线程检测到标志位后,主动释放资源,最后调用pthread——exit退出
- linux系统启动流程
BIOS:初始化硬件cpu、内存、磁盘,检测启动设备,读取主引导记录或系统分区
bootloader,加载uboot,解析配置,加载内核到内存
内核初始化,解压内核,检测硬件,初始化驱动,挂载跟文件系统,是linux系统启动时挂载的第一个文件系统,是操作系统的核心文件系统,包含系统正常运行所必须的关键文件和目录结构
系统启动基础,内核初始化完成,第一个挂载的文件系统就是跟文件系统,没有它系统无法正常启动,内核通过跟文件系统找到初始化进程并启动
包含核心组件,存放操作系统运行必需的文件,目录结构,确保不同Linux发行版的目录结构一致,便于应用程序兼容
多种存在形式,可以是磁盘分区,initramfs,内存中的临时文件系统,网络文件系统,具体设备上的跟文件系统通常需要内核对应的文件系统格式
- linux系统线程崩溃,怎么解决 看core文件,用gdb程序名core分析,段错误位置,调用栈
修复根源,根据调试结果修复代码,如空指针、数组越界、内存泄漏
主线程通过pthread——join监控子线程状态,崩溃后重启线程,或用信号处理
- 用户态和内核态联系 用户态是应用程序运行的低权限状态,不能直接访问硬件,内核态是操作系统运行的高权限状态,可访问所有资源,
- 切换机制,通过系统调用,read/write、中断、如外设io完成,异常除以0触发切换
用户态程序发起程序-》陷入内核态,内核处理,读写硬盘-》返回硬核态并带回结果
- #我的失利项目复盘#
- dma的作用 dma直接内存访问,允许外设直接与内存交换数据,无需cpu全程参与
减少cpu负担,cpu只需初始化dma控制器,指定源地址,目标地址,传输长度
提升数据传输效率,尤其大块数据,传输完成后需通过中断cpu
- BootLoader 系统上电后运行的第一个程序,是内核加载的桥梁
作用:硬件初始化:关闭看门狗,设置时钟,初始化内存
加载内核:从flash/硬盘读取内核镜像到内存
启动内核:跳转到内核入口地址,移交控制权
- BootLoader怎么起作用的
- 进程间通信,选一个具体讲讲 半双工,仅用于进程通信
pipe创建管道,
父进程fork子进程,关闭无关端
父进程通过write写入,子进程通过read读取
数据在内存中临时存储,进程退出后释放
- 线程间怎么共享变量 线程共享进程的地址空间,
默认共享全局变量、静态变量
显式共享,堆内存malloc分配,线程间传递指针即可访问
需要用互斥锁,或条件变量同步,避免竟态条件
- socket端口怎么使用
端口是16位整数,用于标识进程
服务器端,socket创建套接字,bind绑定ip和端口,listen监听,accpet接受连接
客户端,socket套接字,connect指定服务器ip和端口
通信,通过套接字描述符read/write或send/recv传输数据
- cs架构 客户端发起请求、浏览器、app
接收并且处理请求,返回响应,服务器
- IP地址与Mac地址,作用 网络层逻辑地址,标识跨网络的主机,用于路由选择,跨网段通信
数据链路层物理地址,用于局域网内设备识别,通过arp协议将ip地址映射为mac
- epoll与select区别 select轮询所有文件描述符fd,低效,受fd——setsize限制,通常1024,每次调用需要重置fd集合,仅仅水平触发
epoll事件驱动,只处理fd,高效,无限制,fd可复用,支持水平触发和边缘触发
- cmake与makefile怎么编写,基本配置 定义依赖规则,目标依赖,编译命令
cmakelist通过cmakelist生成makefile,基本配置,最低版本,项目名,生成可执行文件,链接数学库
- 什么时候用单例,什么时候用工厂 需保证类只有一个实例,配置管理器、日志器,提供全局访问点,避免资源竞争
工厂模式,创建对象时隐藏实例化逻辑,客户端无需知道具体类名,
- static作用,能否修改 c中:修饰全局变量/函数-》作用域限制为本文件,修饰局部变量,生命周期延长至程序结束,仅仅初始一次
c++中,额外修改类成员-》属于类而非对象,无this指针
能否修改,能修改值,合法,仅仅存储和作用域退缩
- linux驱动什么流程 编写驱动代码,实习模块初始化,退出cleanup——module,定义file_operations体
open/read/write操作
编写makefile,指定内核路径,生成。ko模块
insmod驱动。ko加载-》mknod/dev/设备名c主设备号,次设备号,创建设备节点,用户态通过open/read驱动
- linux系统启动流程
- linux命令,下载,
下载文件:
wget URL
(如wget https://xxx.txt
)、curl -O URL
; - 安装软件:Debian 系用
apt-get install 包名
,RedHat 系用yum install 包名
。
- 消息队列具体是怎么通知接收方的
阻塞等待,msgrcv()调用时若队列空,线程阻塞至有消息
非阻塞,msgrcv如加ipc——nowait,无消息立即返回错误
发送方,msgsnd通过kill给接收方进程发信号,接收方注册信号处理函数,收到信号后调用msgrcv获取
- socket端口什么时候阻塞,什么时候不阻塞
当套接字处于阻塞模式时,以下操作会导致线程阻塞(暂停执行),直到操作完成或出错:
accept()
:服务器调用时,若没有客户端连接请求,会一直阻塞等待,直到有新连接到来。recv()
/read()
:读取数据时,若缓冲区中没有数据,会阻塞直到有数据到达或连接关闭。send()
/write()
:发送数据时,若缓冲区已满(如网络拥堵),会阻塞直到缓冲区有空闲空间。connect()
:客户端发起连接时,会阻塞直到与服务器建立连接或超时。
适用场景:简单的单连接程序(如一对一通信),无需复杂的并发处理,代码实现简单。
当套接字通过fcntl()或ioctl()设置为非阻塞模式时,所有操作不会阻塞线程,而是立即返回:
若操作可以完成(如缓冲区有数据可读),返回实际结果(如读取的字节数)。
若操作暂时无法完成(如无数据可读),返回错误码(Linux 下为EAGAIN或EWOULDBLOCK),线程可继续执行其他任务。
适用场景:高并发程序(如服务器同时处理多个客户端),需配合select/poll/epoll等 I/O 多路复用机制,避免线程因等待 I/O 而闲置。
关键区别
阻塞模式:操作未完成时,线程挂起,不占用 CPU 资源,但会阻塞其他任务执行。
非阻塞模式:操作未完成时,立即返回错误,线程可继续处理其他事务,但需通过轮询或事件通知机制判断操作是否就绪,可能消耗额外 CPU。
实际开发中,非阻塞模式常与 I/O 多路复用结合,既避免阻塞,又减少无效轮询,是高性能网络编程的常用方案(如 Nginx、Redis 的网络模型)。