📜  APT 作品集面试经验 |设置 1(校内)

📅  最后修改于: 2022-05-13 01:58:21.565000             🧑  作者: Mango

APT 作品集面试经验 |设置 1(校内)

第1轮
编码分配 - TCP 发送方接收方通信,处理重复和无序数据包。

场景:应用程序从网络上的服务器接收数据包。每个数据包属于一个特定的通道,并且也由一个唯一的序列号标识。请注意,每个通道都有自己的序列号系列。因此,如果服务器正在为 10 个通道发送数据,您应该会看到这 10 个通道中的每一个通道都以序列号 1 开头的数据包。

网络是这样的,在离开服务器之后但在到达您的应用程序之前,这些数据包可能是

  1. 重新排序;或者
  2. 重复;但
  3. 从未完全下降。

您的应用程序的目标是始终按(特定于通道的)序列号的顺序应用数据包数据,并且没有任何间隙。当然,在现实世界中,还有更多的工作要做,但我们暂时忽略它。

您必须实现函数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);
}

这段代码会编译吗?如果是,输出是什么?如果不是,为什么?

堆栈上的内存分配和释放将如何工作?

关于分段错误的长时间讨论。如果是,为什么?如果不是,是吗?当函数返回或局部变量的值仍然存在时,内存是否会从堆栈空间中交换出来,除非下一个函数覆盖。实际发生了什么?

在我离开时让我运行代码。我问我可以带走这段代码吗?他说不,我不能透露问题并笑了。然后,我说没关系。问题在我脑海中。我一定会执行的。