V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qianjindapang
V2EX  ›  程序员

新鲜出炉的网易 C++面试题

  •  
  •   qianjindapang · 2018-01-02 20:32:28 +08:00 · 6262 次点击
    这是一个创建于 2515 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • openresty 中协程、lua 虚拟机的原理
    • nginx 源码的理解,讲讲各阶段如何处理
    • select、epoll 的区别,在使用和性能上有什么区别,当只有一个 tcp 客户端时,哪种机制效率更高,有没有看过实现的源码
    • 进程、线程区别
    • 两个进程如何共享 socket、子进程调用 execve 时如何共享 socket
    • 说说系统调用的实现原理,参数怎么传
    • 对 TCP 的了解,除了基本的建立连接、收发数据、关闭连接,说说 TCP 其他还有哪些奇奇怪怪的特性
    • 如何设计 DNS 服务器,DNS 中各记录的区别,A、AAA、NS、CNAME
    • pthread 库中各同步互斥技术的实现原理,有没有看过源码

    ** 虽然答不出来,但也不用怀疑自己的能力,生活继续 **

    第 1 条附言  ·  2018-01-02 23:19:31 +08:00
    * TLS 的交互细节
    * HTTP 协议的理解
    30 条回复    2018-01-05 13:48:59 +08:00
    mason961125
        1
    mason961125  
       2018-01-02 20:39:02 +08:00
    这哪是考 C++?
    safeoy
        2
    safeoy  
       2018-01-02 20:42:49 +08:00
    感觉这是招 C++搞 openresty
    mason961125
        3
    mason961125  
       2018-01-02 20:45:41 +08:00
    这越看越像 openresty 二次开发岗位?
    qianjindapang
        4
    qianjindapang  
    OP
       2018-01-02 21:07:49 +08:00
    @mason961125 @safeoy C++开发岗位,但因为我简历写了基于 OpenResty 的 Lua 应用开发的项目,就问这些内容
    watzds
        5
    watzds  
       2018-01-02 21:11:05 +08:00 via Android
    服务端 C++,估计网络编程什么的比较重要吧
    Technetiumer
        6
    Technetiumer  
       2018-01-02 22:14:38 +08:00 via Android
    DNS 有 AAA 記錄? A ? AAAA ?
    qianjindapang
        7
    qianjindapang  
    OP
       2018-01-02 23:20:55 +08:00 via Android
    @Technetiumer 写错了,应该是 AAAA 记录,谢谢指正
    sgissb1
        8
    sgissb1  
       2018-01-02 23:23:25 +08:00
    这和语言关系不大吧。nginx 是 c 写的。
    我是做 windows 开发的,select 和 epoll 的源码没看过,但至少我知道这两个玩意也是用 c 写的。。。。

    如果真的针对 c++,那应该问一些编程思维(非编程思想),这些都是问一些 linux 系统级开发的问题偏多。
    tls 和 http 除外基本问协议了。
    sgissb1
        9
    sgissb1  
       2018-01-02 23:24:02 +08:00
    我指的用 c 写的,是指 select 的实现和 epoll 的实现使用 c 写的。然后调用可以 c/c++
    zeke
        10
    zeke  
       2018-01-02 23:25:18 +08:00
    冒昧问一句,这薪资待遇得是多少。。。
    q397064399
        11
    q397064399  
       2018-01-02 23:31:55 +08:00
    @sgissb1 #8 应该是问的实现原理,epoll 用红黑树实现的 查找的时间复杂度是 log(N) select 估计是 O(N)的 for 循环实现的
    gnaggnoyil
        12
    gnaggnoyil  
       2018-01-02 23:36:48 +08:00
    @sgissb1 Windows 也有 select 的.你总不能说 Windows 是用 C 写的吧.
    q397064399
        13
    q397064399  
       2018-01-02 23:38:50 +08:00
    其实不知道,也很正常, 搬砖搬多了, 这些知识没见识过,也没机会去解决 自然水平上不去,说的就是我自己,搬砖搬太多了。

    面 C++ 一般都跟语言没什么大关系,C++的语言太繁琐 能把 栈模型 函数调用基本原理说清楚就行了,语法层面上的东西,图灵完备的语言那么多 C++特性太烧脑

    主要的还是基本功,, 操作系统 编译原理 算法 三板斧,是真的重要,编译原理其实也可以去掉,并不是所有人要写编译器,但是 一些基本的解析算法 递归下降还是要懂点
    q397064399
        14
    q397064399  
       2018-01-02 23:42:20 +08:00
    @gnaggnoyil #12 windows 还真有 c 代码,select 跟 epoll 区别其实 网上搜一下就知道了

    这个是 select http://zhangyafeikimi.iteye.com/blog/248815 看了下 select 应该是 O(N)级别
    epoll 快在使用了红黑树结构,能在 对数时间内完成查找
    framlog
        15
    framlog  
       2018-01-02 23:59:19 +08:00
    弱弱的问下用 lua 开发项目就需要知道 lua 虚拟机的细节嘛= =
    sgissb1
        16
    sgissb1  
       2018-01-03 09:46:24 +08:00
    @gnaggnoyil 看来你真不懂,windows 大部分代码就是 c 写的,只是用 c++做了包装和暴露( COM 接口除外)。

    另外 select 在 windows 上的实现就是 c 写的(并不是指伪终端,类似 cygwin )。
    sgissb1
        17
    sgissb1  
       2018-01-03 09:47:42 +08:00
    @q397064399 你说的只是一方面了,还有机制 select 和 epoll 处理的机制不同,这一快应该是比较明显的。
    jasonlz
        18
    jasonlz  
       2018-01-03 10:17:10 +08:00
    这是 C++后台吧...
    q397064399
        19
    q397064399  
       2018-01-03 20:41:02 +08:00
    @sgissb1 #17 其它的没有做过多深入的了解,其实这种差距 在并发很大,而且又都是 IO 密集型的时候确实有效,如果是计算密集型,意义不大,频繁调度 切换栈结构 消耗很大
    jeffson
        20
    jeffson  
       2018-01-03 22:49:16 +08:00
    厉害
    gnaggnoyil
        21
    gnaggnoyil  
       2018-01-04 00:48:18 +08:00
    @sgissb1 select 在 windows 上的实现用 C 写的这一结论是依据什么推测出的?愿闻其详.至少我记得当年当年 windows 2000 泄露出来的代码都是用 C++写的——或者更准确地说,C with classes.
    sgissb1
        22
    sgissb1  
       2018-01-04 12:30:04 +08:00
    @gnaggnoyil 你说的泄露的代码是 nt 内核吧?我就有一份,你需要吗?
    sgissb1
        23
    sgissb1  
       2018-01-04 12:41:05 +08:00
    @gnaggnoyil 另外如果真不懂,建议你就去好好查查资料,在看看 vs 里面的 win32 sdk 源代码。
    标准 socket 函数族就是 c 写的,也包括 select。你说的 c++写的那是微软封装过暴露出来的非标准 socket 函数族。

    微软自己都在自己的几本讲 windows 开发相关书里面提到过,windows 绝大部分是 c 语言写的基础库,底层库,对于上层部分接口才是 c++写的。

    麻烦你分清楚伯克利 socket 和非伯克利 socket。
    sgissb1
        24
    sgissb1  
       2018-01-04 12:44:57 +08:00
    @q397064399 其实还有一个问题,“态跃迁”问题(记得这个名词是 linux 内核一书里面说的)。

    select 要让用户态线程被挂起,并进入内核态等待中断上来。
    epoll 代码没有看过,但网上资料的介绍,感觉和 windows 上的 iocp 有几分相似。
    一个是态跃迁不再那么频繁,因为有对应的内核态线程在处理问题,用户态线程和内核态线程之间只是基于事件驱动。

    同时内存拷贝问题也是态跃迁里面一个比较严重的问题。epoll 好像不存在内存拷贝,用的是类似内存映射的方式解决的。
    gnaggnoyil
        25
    gnaggnoyil  
       2018-01-04 14:21:10 +08:00
    @sgissb1 好啊.能发我一份吗,我也很想看看.至少 VS2017 里的 CRT src 都是 asm,c 和 cpp 混用的,cpp 部分还有不少用了 WRL 和 WinRT.

    另外我也很赞赏您对于具有不同外延的名词注意区分其不同的执着态度.这份态度至少 ZeroMQ 的作者是比不上的.( https://github.com/zeromq/libzmq/blob/b3bf51716e0a9d3374fc0a76691b778522194937/builds/gyp/platform.hpp#L46)虽然 ZeroMQ 的代码质量被诟病也不是一天两天了.
    gnaggnoyil
        26
    gnaggnoyil  
       2018-01-04 14:21:32 +08:00
    @sgissb1 我的邮箱是 [email protected]
    sgissb1
        27
    sgissb1  
       2018-01-04 14:45:07 +08:00   ❤️ 1
    @gnaggnoyil 给你一个 git,你自己取 https://github.com/ExpLife/MinNT

    编译通过了,跑起来记得 show 一下哈。虽然本省编译也不难,有教程。
    q397064399
        28
    q397064399  
       2018-01-04 21:55:20 +08:00
    @sgissb1 #24 系统这块就了解的比较少了,我其实也就看网上说说, 半路出家,算法略懂一点 至于具体左旋右旋 我也说不清楚,但是 rb-tree 比 常数级别还是要好的,, 算是抛砖引玉吧。
    sgissb1
        29
    sgissb1  
       2018-01-05 09:42:01 +08:00
    @q397064399 哦,另外为啥看不到你的 at 通知?你被降权过吗?
    q397064399
        30
    q397064399  
       2018-01-05 13:48:59 +08:00
    @sgissb1 不清楚,,降权是什么鬼?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5861 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:11 · PVG 10:11 · LAX 18:11 · JFK 21:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.