注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
岗位:Software Engineer, Virtualization - New College Grad
面试我的是个德国人,人挺好的
上来面试官先自我介绍了下,然后轮到我介绍自己的项目
我讲了下我操作系统相关的经历。讲完后他会问一些相关的问题
简历部分就这样结束
面试官准备了两道题目
第一题:秒了
问:一个多线程的16核心处理器,这些核心都会去访问一个handler。该handler的调用非常频繁,你可以假设他一分钟至少会被调用1m次以上。现在我们想要去统计每个核心分别都运行了多少次handler。于是代码变成如下:int counter[16];
void handler() {
/* do something */
counter[CURRENT_CORE]++;
}
在应用该修改以后,运行速度变慢了很多。这是为什么?
答:由于counter这个数据结构全部在同一个cache line里面,而每个核心都有它自己的cache,每次有不同的核心去访问这个数据的时候cache都会需要同步(flush)。频繁的缓存同步导致性能下降严重
问:怎么修改代码避免这个问题
答:把每个核心的cache都放到不同的cache line里面。假设cache line是64byte的话就让他们的内存地址隔开至少这么多(代码就自己想吧哈哈)
第二题:慢慢写写出来的
问:写个scheduling算法。task有四个priority,且可能处于block或ready状态。有个reschedule函数返回最早会被运行的task。如果有同样priority的task的话,优先运行先来的task(fifo)
代码如下。#include <linux/list.h>
#define NUM_PRIO 4
/* ready/blocked */
struct task;
static struct task *current = NULL;
struct task *task_create(int prio);
/* if blocked -> ready */
void task_notify(struct task *);
/* if ready -> blocked */
void task_wait(struct task *);
/* -> current = current task */
/* list_next(head[0]) -> head */
/* 0 - lowest; 3 - highest */
void reschedule();
// [0] -> [A]
// [3] -> [B]
// []
// task_notify(A), task_notify(B); reschedule() -> current=A
// task_notify(B), task_notify(A); reschedule() -> current=B
// A(ready), B(ready); current = A
// task_wait(A); reschedule() -> current = B
// task_notify(A); reschedule() -> current = B
代码部分就这样结束
最后面试官和我说我是第一个他面试过的new grad
希望对你们有帮助! |