秋招学习笔记 Day 64 之准备系统软件开发工程师岗位笔记

一、系统软件开发相关的八股

1.讲解一下 fork

Fork 是创建子进程的系统调用。在执行 Fork 之后,父子进程都从 Fork 之后的位置开始进行执行。父进程 Fork 的返回值是子进程的 PID,子进程的返回值是 0。然后如果 Fork 调用失败,返回 -1。然后 Fork 父子进程会共享文件描述符、内存空间等资源,但是它们有独立的虚拟地址空间和页表。

Fork 的设计是采用写时拷贝的机制,也就是说,当其中一个进程去写的时候,触发缺页异常,然后给这个进程分配新的物理页,建立虚拟页到物理页的映射,拷贝数据。这种设计提高了内存空间的利用率。

2.讲解一下 malloc

Malloc 是程序员可以申请堆上空间的接口,它底层是通过 brk 和 mmap 系统调用去申请虚拟地址空间。如果申请的空间比较小的话,可以直接通过内存池满足的话可以减少这此次的调用,否则就通过 brk 移动堆栈指针。如果申请大块的空间,可能需要 mmap 去申请。

Malloc 分配的空间只是虚拟地址空间,在第一次访问之前没有真正的分配。第一次访问时触发缺页异常,然后分配。

3.讲解一下 Linux 中断的全流程。

Linux 中断处理分成上半部分和下半部分。上半部分主要是保存程序的运行状态,然后根据 idt 也就注册的中断描述符表去找到对应的中断处理程序处理,下半部分主要是软件中断,包括 tasklet,也就是轻量级的任务,是在中断环境下去运行,还有工作队列。它在进程环境下去运行。由 thread lq 在进程环境下去运行,它把具体的处理交给内核进程去完成。

拓展问题,中断上下文切换的特点。

首先是因为中断上下文切换不是进程切换,所以它不需要切换进程的虚拟地址空间,也就是页表这些内容。其次是中断上下文,它是不可以被阻塞,不可以阻塞也不可以睡眠的,因为它没有一个独立的进程,如果它阻塞或者睡眠的话,没有办法去唤醒。然后它的下半部分的机制主要有基于 softirq 的,然后这个是在中断环境下不能阻塞。然后还有 tasklet,也就是基于 softirq 去处理。然后还有工作队列,它是在进程环境下运行的,所以说它可以阻塞。还有 threadirq,它也是在进程环境下运行的,所以说它也可以阻塞。

4.互斥锁和自选锁的区别,它们的使用场景是什么?以及中断环境下使用哪种锁?

互斥锁是在获得锁变量失败之后,进程会进入阻塞。但是自选锁的话,进程就会一直的去查询锁变量的状态,并试图持有。它们的不同之处在于自选锁会一直占据 CPU。

然后适用场景的话,对于临界区短,也就是访问临界资源短或者简短的代码,可以使用自选锁。对于那些比较长比较复杂的临界区,要使用互斥锁,这样才能不会浪费资源。

中断处理下一定要使用自选锁,因为中断处理下进程是不能阻塞或者睡眠的。

5.RTOS 和 Linux,它的调度有什么不同?

RTOS 是追求实时性和准确性,它的调度是如果有更高优先级的进程到来的话,它可以抢占更低优先级进程的 CPU。而对于 Linux 的话,它是追求一种更加公平的调度方式,它会根据进程的时间片去进行一定的调度。然后 RTOS 采用这种方式是因为它通常是在工业领域或者是汽车这些对安全性要求比较高的领域。

总结一下关于系统开发的话,对于 mylog 这个,在面经里看过次数比较多。Fork 这个之前主要是知道它是显示拷贝,但是没有想到是进程的虚拟地址空间和页表是独立的。

关于 RTOS 这个是之前完全不了解的知识,之前只是在于一些车企的它的岗位描述上看到过 RTOS,但是因为这部分不懂,其他部分基本上都是匹配的,所以说也投过,但是也是第一次知道 RTOS 是什么。

对于中断处理这部分的话,中断其实从考研的时候就在学了,然后包括什么中断向量表呀,但是当时好像没有去区分上半部分和下半部分,就是从学术上去学的,所以说这部分是比较新的知识。比如说下半部分它是有中断环境和非中断环境的。然后在我知道下半部分可以异步处理,还是之前在看消息队列还是 Redis 的时候了解到的。

关于互斥锁和自选锁,这个也是比较久的理论知识,但是也是最近才开始思考什么时候要用哪种锁。然后对于中断环境下,也是今天才学到的,因为今天才知道中断环境下它是不能阻塞或者睡眠的。

想到要复习一下关于系统软件开发相关的知识,是因为有对应的面试。当然不可能因为每种面试不同的岗位描述,都去完全复习不同的知识,主要是复习一些经典的问题。然后这些问题的话,其实也是一个掌握理论比较扎实的人应该掌握的,对于比如说 CPU 相关的知识。

我看到一个很有意思的一个面经,就是有一个人,他被面试官问到懂不懂什么是系统开发,他说不清楚,然后面试官就结束了。

怎么说呢?我只能说现在到了两边都能理解的年纪。一方面理解就是,你只是不懂这个概念,但是其实可能大部分知识你还是懂的。但是对于面试官来说,可能就是会感觉你连这个岗位在做什么,你都不去愿意搜一下。而且现在 AI 这么发达,就会感觉这个人可能不是那么认真,不是那么投入。但是说的也是有道理的吧,毕竟现在 AI 这么发达,想知道什么问题,如果不是那种特别难的,在这个世界上很难找到知识的那种理论知识,基本上都能搜到。所以说还是得去,在面试之前至少了解一下对应的公司是做什么的,对应的岗位是做什么的。

之前感觉后端受限,就是感觉自己后端不足够扎实。虽然说会 MySQL,会 Redis,然后网络编程也比较扎实,但是总感觉太卷了,而且现在 AI 弄得特别难,所以说想转 AI 全栈,或者是学 Agent 相关的知识。现在既然有这种面系统软件的机会,那也就参加一下吧。而且系统软件在我看来,它应该是更偏向后端,其实和我原本的最初的走向是有关系的。不过现在的软件开发,只要是有发展性的公司,基本上好多也在写 CUDA,也在部署大模型。

相关推荐
奇树谦1 小时前
LRU 缓存原理与 C++ 实践示例
开发语言·c++·缓存
多弗朗皮卡丘1 小时前
C++ 红黑树
开发语言·c++·红黑树
曼巴UE52 小时前
UE 属性同步
网络·c++·ue5
无忧.芙桃2 小时前
图的精髓:邻接矩阵与遍历全解析
c++·算法·面试·深度优先·广度优先
jimy12 小时前
标准的动态类型定义与“多态”无关,非多态对象同样会出现动态类型不同于静态类型的情形
开发语言·c++
MOONICK2 小时前
COM 组件技术(三)
c++·windows
_wxd6662 小时前
二叉搜索树(BST)万字详解:概念、操作、性能分析与 C++ 实现
数据结构·c++·二叉搜索树
UIU1143 小时前
P1115 最大子段和
c++·算法
wuminyu3 小时前
ZGC染色指针在虚拟线程stackChunkOop上的并发屏障全景分析
java·linux·c语言·jvm·c++