y*k 发帖数: 80 | 1 背景:EE毕业但是做行业软件的,工作好多年了一直用C++。没有专门学过计算机专业
课。刷题刷了好几个月了。
上星期经历了几次店面,Linkedin是我自己觉得面得最好的,以为可以拿onsite了,结
果被据了。
别的店面感觉比Linkedin差很多的都过了,所以特别surprise. 我把问题详细贴出来,
并附上我自己的解答,请大家帮忙分析一下,是哪里出了问题,还是被三哥黑了。面试
一共分三部分。因为最后的题做得比较快,三哥还跟我谈笑风生了几分钟,说你的
coding不错,你来面试的时候需要多准备点系统设计,多线程之类的,搞得我以为我都
拿到onsite在为下一步准备了。
1. 10分钟互相介绍,然后问之前做的最难的项目,我说了一下,三哥问了几个问题,
双方都比较满意(之后的回答过程中,三哥不会说你哪里回答得不大好,但是会一直追
问直到他说ok,当然也不知道这个ok是好还是嘿嘿你丫错了)
2. 基础知识。
Q: virtual memory是如何工作的?优缺点?
A:操作系统一般在内存不够时分配虚拟内存,不够的虚拟空间存硬盘上。优点是内存
不够时还能转,缺点是硬盘读写速度慢
Q:如果有两个进程P1和P2,两个进程都分别读取地址0xabc,会发生什么?
A:因为是两个进程,系统会开两个不相干的地址空间,各读各的没有干扰。
Q: 那这样的读取到底是怎么实现的?P1说我要读0xabc,怎么就知道它能读到自己想要
的内存?
A: (这个我不明确科班的答案),就说操作系统应该有一个进程对page的映射,系统
知道在哪个page里面的地址空间里找。
Q: 这样的不同进程分配不同地址空间的做法有什么优缺点?
A: 优点是不同进程之间的地址各不相干,不会干扰;另外多个进程可以在总内存不够
的时候仍然能转;缺点是进程间通信比较麻烦。
Q:process和thread的区别
A: process是不共享内存的,thread共享内存。后来网上查了一下,好像主要是这个,
当然也说thread往往是light work,但是我觉得漏掉这个应该没有关系,三哥很快说ok
了。
3. 电脑上做题
三哥先敲了道简单的问我问题,我估计这个答得不是太好。
int a;
int* b[100];
Q: 如果改变a或者b有什么问题?
A: 改变a就是赋值还好,改变b实际上是改变了指向array的指针,可能会有问题。(后
来回想起来当时有点紧张,其实改变b也没有关系,或者应该说具体点,如果没有别的
指针指向array的话,array里面的内容没有变量指向,会有leak)
Q: 如果是多个线程要改变a或者b呢?
A: 那就有问题了,会conflict(我知道data race,但是当时没有说这个词)。
Q: a是从内存哪里来的?
A: heap
Q: 那b呢?
A: b指向的array内容也是从heap来的,但是b自己可能来自进程stack吧(后来想我是
不是错了,b是指针跟int差不多也得分配内存空间)。
然后编程题,设计一个数据结构,实现add(e), remove(e), removeRand(e), 都是O(1)
复杂度。我提出了用hash+array,并且在remove的时候,把array尾巴和remove的位置
swap,同时更新hash。三哥说这主意不错你写吧。
下面是我的程序。写完后三哥说cool, sounds good,又问了几个followup,说如果数
有重复怎么办。我说那个hash的value要改成list,记录所有相同元素的位置。那你现
在怎么产生随机数呢?我还没怎么想好,三哥就说是不是要看看重复的个数之类的,然
后就跟我瞎聊了。
大家帮我看看,我是哪里不对挂掉的呢?
template
class element {
public:
element() {}
void add (T e) {
array.emplace_back(e);
hash[e] = array.end() - 1;
}
void remvoe (T e) {
if (count(hash[e]) {
auto it = hash[e];
hash.erase(e);
if (!hash.empty()) {
auto lastit = array.end() - 1;
swap(*it, *lastit);
hash[*lastit] = it;
}
array.pop_back();
}
}
void removeRand() {
if (!array.empty()) {
default_random_engine re ((random_device())());
uniform_int_distribution dis(0, array.size() - 1);
int index = dis(re);
T e = array[index];
remove(e);
}
}
private:
vector array;
unordered_map::iterator> hash;
}; |
s***c 发帖数: 639 | 2 patpat,不过这给个onsite没什么问题吧 |
y*k 发帖数: 80 | 3 如果要挑毛病的话,是哪里需要注意呢?我希望通过这个总结自己也有提高,不要下一
次也挂了。
【在 s***c 的大作中提到】 : patpat,不过这给个onsite没什么问题吧
|
h********d 发帖数: 109 | |
f********y 发帖数: 156 | 5 这个应该是在stack上
Q: a是从内存哪里来的?
A: heap |
f*********5 发帖数: 1237 | 6 Q: a是从内存哪里来的?
A: heap
Q: 那b呢?
A: b指向的array内容也是从heap来的,但是b自己可能来自进程stack吧(后来想我是
不是错了,b是指针跟int差不多也得分配内存空间
都是stack,b没有用new |
t*********r 发帖数: 387 | 7 >Q: 那这样的读取到底是怎么实现的?P1说我要读0xabc,怎么就知道它能读到自己想
要的内存?
> A: (这个我不明确科班的答案),就说操作系统应该有一个进程对page的映射,系
统知道在哪个page里面的地址空间里找。
TLB, hard/soft page faults, different types of page tables (e.g. multilevel,
inverse)
> Q:process和thread的区别
> A: process是不共享内存的,thread共享内存。后来网上查了一下,好像主要是这个
,当然也说thread往往是light work,但是我觉得漏掉这个应该没有关系,三哥很快说
ok了。
内存这词用的不准确吧,比如 https://en.wikipedia.org/wiki/Shared_memory#
Support_on_Unix-like_systems
这年头进程就是个容器,启动个地址空间给线程用 |
d******v 发帖数: 801 | |
z**********g 发帖数: 141 | 9 L有严格的question bank。
感觉这些概念题以前在bank里面没见过,应该是面试官自己想出来搞人的。
feedback说你background不solid。 |
j*****8 发帖数: 3635 | 10 这烙印摆明了要黑你,move on吧
【在 y*k 的大作中提到】 : 背景:EE毕业但是做行业软件的,工作好多年了一直用C++。没有专门学过计算机专业 : 课。刷题刷了好几个月了。 : 上星期经历了几次店面,Linkedin是我自己觉得面得最好的,以为可以拿onsite了,结 : 果被据了。 : 别的店面感觉比Linkedin差很多的都过了,所以特别surprise. 我把问题详细贴出来, : 并附上我自己的解答,请大家帮忙分析一下,是哪里出了问题,还是被三哥黑了。面试 : 一共分三部分。因为最后的题做得比较快,三哥还跟我谈笑风生了几分钟,说你的 : coding不错,你来面试的时候需要多准备点系统设计,多线程之类的,搞得我以为我都 : 拿到onsite在为下一步准备了。 : 1. 10分钟互相介绍,然后问之前做的最难的项目,我说了一下,三哥问了几个问题,
|
|
|
t*********r 发帖数: 387 | 11 LZ写C++的背景,第三题答的的确不理想
【在 j*****8 的大作中提到】 : 这烙印摆明了要黑你,move on吧
|
q*********n 发帖数: 37 | 12 虽然还没有面完但必须要跳出来说一句,你被黑了
你的面经和我的类似,和一亩三分地里另一个人的也类似:http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=157908&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3046%5D%5Bvalue%5D%3D6%26searchoption%5B3046%5D%5Btype%5D%3Dradio%26sortid%3D311
结果也一样,被拒,连第二次电面都没有
我被问了virtual memory,进程线程区别,你的第三题(我刷到过,似乎是Leetcode收
费题,说出来思路,烙印说不用coding了),以及LC原题Merge Interval,coding基本
是秒杀,被烙印质疑半天后来发现他不懂python里array[-1]是啥意思,讲清楚了就聊
天了。自我感觉妥妥onsite结果被拒
建议楼主:
1. 果断向recruiter投诉(我也投诉了)
2. move on,不要受这个影响,还有其他公司,领英以后也还有机会再面 |
n**s 发帖数: 2230 | 13 第三题答的不好。
没说这两个变量在哪里定义,所以可能是stack ,也可能是全局变量数据区。 |
s********d 发帖数: 93 | 14 频频看到国人被三哥三姐黑 很多人却还处于denial中不觉醒 慢慢弯曲国人就绝迹了
【在 q*********n 的大作中提到】 : 虽然还没有面完但必须要跳出来说一句,你被黑了 : 你的面经和我的类似,和一亩三分地里另一个人的也类似:http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=157908&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3046%5D%5Bvalue%5D%3D6%26searchoption%5B3046%5D%5Btype%5D%3Dradio%26sortid%3D311 : 结果也一样,被拒,连第二次电面都没有 : 我被问了virtual memory,进程线程区别,你的第三题(我刷到过,似乎是Leetcode收 : 费题,说出来思路,烙印说不用coding了),以及LC原题Merge Interval,coding基本 : 是秒杀,被烙印质疑半天后来发现他不懂python里array[-1]是啥意思,讲清楚了就聊 : 天了。自我感觉妥妥onsite结果被拒 : 建议楼主: : 1. 果断向recruiter投诉(我也投诉了) : 2. move on,不要受这个影响,还有其他公司,领英以后也还有机会再面
|
k***e 发帖数: 1931 | 15 第三题答错太多,不应该。感觉基础不扎实,尤其是你说你做了多年的C++。
int a;
int* b[100];
Q: 如果改变a或者b有什么问题?
A: 改变a就是赋值还好,改变b实际上是改变了指向array的指针,可能会有问题。(后
来回想起来当时有点紧张,其实改变b也没有关系,或者应该说具体点,如果没有别的
指针指向array的话,array里面的内容没有变量指向,会有leak)
// b是数组名,数组名是不能被赋值的。
Q: 如果是多个线程要改变a或者b呢?
A: 那就有问题了,会conflict(我知道data race,但是当时没有说这个词)。
Q: a是从内存哪里来的?
A: heap
// a应该是stack上
Q: 那b呢?
A: b指向的array内容也是从heap来的,但是b自己可能来自进程stack吧(后来想我是
不是错了,b是指针跟int差不多也得分配内存空间)。
// b应该也是stack上 |
k***e 发帖数: 1931 | 16 >Q: 那这样的读取到底是怎么实现的?P1说我要读0xabc,怎么就知道它能读到自己想
要的内存?
> A: (这个我不明确科班的答案),就说操作系统应该有一个进程对page的映射,系
统知道在哪个page里面的地址空间里找。
TLB, hard/soft page faults, different types of page tables (e.g. multilevel,
inverse)
//补充一点,CPU/SoC需要有MMU或者MPU支持,做address translation。如果OS支持的
话是可以不需要MMU/MPU的,如uCLinux。
> Q:process和thread的区别
> A: process是不共享内存的,thread共享内存。后来网上查了一下,好像主要是这个
,当然也说thread往往是light work,但是我觉得漏掉这个应该没有关系,三哥很快说
ok了。
内存这词用的不准确吧,比如 https://en.wikipedia.org/wiki/Shared_memory#
Support_on_Unix-like_systems
这年头进程就是个容器,启动个地址空间给线程用
// 补充一点,除了内存,还包括其他资源,如Windows下的临界区,是该process中所
有的thread共享的,非kernel object,使用时无须进行模式切换,较快。扯远了,教
科书的定义应该是Process是操作系统中资源分配的单位,资源包括虚拟地址空间和其
他各种object;线程是操作系统执行调度的单位,当然线程还分用户态线程(如
Windows中的Fiber)和内核态线程。
multilevel,
【在 t*********r 的大作中提到】 : >Q: 那这样的读取到底是怎么实现的?P1说我要读0xabc,怎么就知道它能读到自己想 : 要的内存? : > A: (这个我不明确科班的答案),就说操作系统应该有一个进程对page的映射,系 : 统知道在哪个page里面的地址空间里找。 : TLB, hard/soft page faults, different types of page tables (e.g. multilevel, : inverse) : > Q:process和thread的区别 : > A: process是不共享内存的,thread共享内存。后来网上查了一下,好像主要是这个 : ,当然也说thread往往是light work,但是我觉得漏掉这个应该没有关系,三哥很快说 : ok了。
|
k***e 发帖数: 1931 | 17 答上stack我觉得就算对了,至于是不是在bss可以作为follow up。
如果因为没有同时答出stack或者bss,就关掉楼主,那就有点黑人了。
【在 n**s 的大作中提到】 : 第三题答的不好。 : 没说这两个变量在哪里定义,所以可能是stack ,也可能是全局变量数据区。
|