APT 作品集面试经验 |设置 1(校内)
第1轮
编码分配 - TCP 发送方接收方通信,处理重复和无序数据包。
场景:应用程序从网络上的服务器接收数据包。每个数据包属于一个特定的通道,并且也由一个唯一的序列号标识。请注意,每个通道都有自己的序列号系列。因此,如果服务器正在为 10 个通道发送数据,您应该会看到这 10 个通道中的每一个通道都以序列号 1 开头的数据包。
网络是这样的,在离开服务器之后但在到达您的应用程序之前,这些数据包可能是
- 重新排序;或者
- 重复;但
- 从未完全下降。
您的应用程序的目标是始终按(特定于通道的)序列号的顺序应用数据包数据,并且没有任何间隙。当然,在现实世界中,还有更多的工作要做,但我们暂时忽略它。
您必须实现函数re_sequence_and_apply() 。
您可以为此目的使用任何数据结构,包括来自 C++ STL 的任何数据结构。如果您编写自己的数据结构,请在您的解决方案中提供该数据结构的完整定义。
此外,您还必须实现 event_source 接口以按照您希望的任何方式测试您的代码。您的解决方案将根据正确性以及空间和时间复杂度进行评估。
代码片段
#include
#include
struct event
{
uint8_t channel_id;
uint32_t sequence_number;
uint8_t *pkt_data;
uint32_t pkt_len;
};
classevent_source
{
public:
virtual event* get_next() = 0;
virtual void release_event(event* ev) = 0;
};
void apply_pkt_data( int8_t channel_id, uint32_t sequence_number,
uint8_t* pkt_data, uint32_t pkt_len)
{
std::cout<<"(" <<(int)channel_id<<","<get_next()) != NULL)
{
re_sequence_and_apply(ev->channel_id, ev->sequence_number,
ev->pkt_data, ev->pkt_len);
event_q->release_event(ev);
}
return 0;
}
第 2 轮(约 35-40 分钟)
1、什么是用户态和内核态?
——>内核模式
在内核模式下,执行代码可以完全且不受限制地访问底层硬件。它可以执行任何 CPU 指令并引用任何内存地址。内核模式通常保留给操作系统的最低级别、最受信任的功能。内核模式下的崩溃是灾难性的;他们将停止整个 PC。
用户模式
在用户模式下,执行代码无法直接访问硬件或参考内存。在用户模式下运行的代码必须委托给系统 API 来访问硬件或内存。由于这种隔离提供的保护,用户模式下的崩溃总是可以恢复的。在您的计算机上运行的大部分代码都将在用户模式下执行。
2、单用户系统为什么需要内核模式?
—> 考虑硬件资源和 I/O 资源分配,陷阱、系统调用、中断都发生在内核模式。对于原始和敏感指令的执行,内核模式是必要的。
3. 为什么内核态的操作不能在用户态执行?
4. 两个进程可以生成相同的虚拟地址吗?如果是,那么物理地址会不同还是相同?为什么相同或为什么不同?
5.什么是陷阱?什么是中断?中断类型?它们有何不同?所有陷阱都需要在模式之间切换吗?
6. 不同栈的进程线程如何共享资源?线程将如何通信?
7、多核的情况下,如果T1运行在core 1上,T2运行在core 2上,它们如何同步和通信?
8. 给出了一些 C++ 代码片段,其中 P1 和 P2 进程正在生成一些地址。 P1 生成的地址是使用取消引用初始化的。 P2 可以取消引用吗?
9.关于堆栈指针的问题。
10. 代码片段在印张上给出。询问将输出什么代码。答案中主要存在段错误。
11. 写了一些系统调用代码,但她非常耐心地向我解释了代码,然后问错误在哪里?我不记得代码了。
问我是否想问什么。我问了 2-3 个关于公司的问题,我应该怎么做?被问及工作和简介以及公司实际做什么?
她回答得很有趣。我喜欢它。
第三轮(约1小时)
面试官简直了。这一轮,我连一秒都没有感到不舒服。讨论一直在进行。根据我的个人经验,这真是太棒了。
1. 完成关于编码作业的讨论。使用的策略和数据结构。
2. 如果你有内存限制,设计数据结构来保存大量传入的数据包。
3、在线程执行中,Scheduler、Compiler、Dispatcher、MMU会放在哪里?详细解释一切。
4. 你知道汇编代码吗?您在线程库中使用的汇编代码?那将如何调用调度程序?
5. 如果您尝试访问地址 1,如 SP= Sp +1 所示,如果尝试访问由堆栈指针递增的地址 1,则会发生分段错误?如果是,为什么?如果不是,为什么?
6. 高级计算机网络课程讨论:新 TCP 协议:Vegas、Reno、Wireless westwood 等
7. 如果传入数据的速度非常快,请设计一个数据结构(可以使用 STL)来捕获数据包,同时牢记无序交付和重复数据包。高效处理所有案件。
—> 处理中的延迟应该是最小的
—> 能够管理超过 10000 个无序数据包。
8. 解释 3 次握手。如果 SYN 被丢弃,如果 SYN+ACK 被丢弃,如果 ACK 被丢弃,会发生什么?丢弃最后一个 ACK 后,发送方是否仍可以通过通道发送数据?会可靠吗?
9.关于pthread库实现的问题——CSP分配。关于调度器、编译器以及调度器在线程调度中的工作方式。循环调度程序的完整解释。
10.给出了一个代码:
int *f1(int a)
{
int *c = &a;
*c = *c*10;
return &c;
}
int *f2(int *b)
{
int c = *b*10;
return &c;
}
int main()
{
int a = 10;
int *add1=f1(a);
int *add2=f2(add1);
print (*add2);
}
这段代码会编译吗?如果是,输出是什么?如果不是,为什么?
堆栈上的内存分配和释放将如何工作?
关于分段错误的长时间讨论。如果是,为什么?如果不是,是吗?当函数返回或局部变量的值仍然存在时,内存是否会从堆栈空间中交换出来,除非下一个函数覆盖。实际发生了什么?
在我离开时让我运行代码。我问我可以带走这段代码吗?他说不,我不能透露问题并笑了。然后,我说没关系。问题在我脑海中。我一定会执行的。