大数跨境
0
0

面试服务器开发方向 C++ 实习生时,大致会被问到哪些问题?

面试服务器开发方向 C++ 实习生时,大致会被问到哪些问题? CppGuide
2023-04-27
2

正好我这里有一份腾讯内部 C++ 服务器开发实习生要求,读者可以参考一下。

如果你本文中列举的知识点要求过高,可以拉到文末,寻求帮助。

『腾讯后台开发』实习生技能要求

如题,应届生除了要良好地掌握算法和数据结构以外,以下一些技能点列表希望对大家有帮助,有兴趣的朋友可以参考这个针对性地补缺补差。文章列出的技能点有的要求熟悉,有的了解即可,注意技能点前面的修饰词。如果没有明确给出“熟悉”“了解”等字眼,要求均为熟悉。

一、操作系统方面

  • 熟练使用(但不局限于)以下 Linux API,Linux 系统常用的 API 可以阅读 《Linux 系统编程》这本书,这本书的作者是大名鼎鼎的 Robert Love,他写过另外一本书叫《Linux 内核设计与实现》。


  • 多线程相关与线程之间同步技术

Linux下的线程创建、等待、获取线程id

  
  
  
1 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
2 int pthread_join(pthread_t thread, void **retval);
3 pthread_t pthread_self(void);
  • 常见线程之间的同步技术(何时该用那种技术)

互斥体

  
  
  
1 int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutexattr);
2 int pthread_mutex_destroy(pthread_mutex_t* mutex);
3 int pthread_mutex_lock(pthread_mutex_t *mutex);
4 int pthread_mutex_trylock(pthread_mutex_t* mutex);
5 int pthread_mutex_unlock(pthread_mutex_t* mutex);

信号量

  
  
  
1 int sem_init(sem_t* sem,int pshared,unsigned int value);
2 int sem_destroy(sem_t* sem);
3 int sem_wait(sem_t* sem);
4 int sem_post(sem_t* sem);
5 int sem_getvalue(sem_t* sem, int* valp);

条件变量

  
  
  
1 int pthread_cond_init(pthread_cond_t* restrict cond,const pthread_condattr_t* restrict attr);
2 int pthread_cond_destroy(pthread_cond_t* cond);
3 int pthread_cond_signal(pthread_cond_t* cond);
4 int pthread_cond_broadcast(pthread_cond_t* cond);
5 int pthread_cond_wait(pthread_cond_t* restrictcond, pthread_mutex_t* restrictmutex);
6 int pthread_cond_timedwait(pthread_cond_t* restrictcond,pthread_mutex_t* restrict mutex, const struct timespec *restrict abstime);

读写/自旋锁

  
  
  
1 int pthread_rwlock_init(pthread_rwlock_t* restrict rwlock, const pthread_rwlockattr_t* restrict attr);
2 int pthread_rwlock_destroy(pthread_rwlock_t* rwlock);
3 int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);
4 int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock);
5 int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock);
6 int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock);
7 int pthread_rwlock_unlock(pthread_rwlock_t* rwlock);
//以下这两个函数在Linux和Mac的man文档里都没有,新版的pthread.h里面也没有,旧版的能找到
8 int pthread_rwlock_timedrdlock_np(pthread_rwlock_t* rwlock, conststruct timespec *deltatime);
9 int pthread_rwlock_timedwrlock_np(pthread_rwlock_t* rwlock, const struct timespec * deltatime);
10 int pthread_spin_init(__pthread_spinlock_t* __lock, int__pshared);
11 int pthread_spin_destroy(__pthread_spinlock_t* __lock);
12 int pthread_spin_trylock(__pthread_spinlock_t* __lock);
13 int pthread_spin_unlock(__pthread_spinlock_t* __lock);
14 int pthread_spin_lock(__pthread_spinlock_t* __lock);

以上知识点你可以看游双老师的《高性能 Linux 高性能服务器编程》相关章节获得。

  • 熟悉守护进程的创建、原理

  • 了解计划作业crontab

  • 熟悉进程、线程状态查看命令(topstracepstack

  • 熟悉内存状态查看命令memstatfree

  • 熟悉IO状态查看命令iostatdfdu

  • 了解linux文件的权限、用户、时间(ctime、mtime、atime)、inode等文件基本属性,熟练使用chmodchownchgrp等基本命令。

  • 熟悉文件传输命令scprzsz命令、

  • 熟悉文件定位命令findwhereis命令。

  • 熟悉软连接,熟悉ln命令。

  • 熟悉lsof命令。

二、网络

  • 熟悉tcp状态机(三次握手、四次挥手)。

  • 熟悉tcpdump命令。

  • 熟悉网络状态和防火墙状态查看命令:netstat、ifconfig、iptables

  • 熟悉socket API,包括但不限于(connectacceptbindlistensend/sendtorecv/recvfromselectgethostbyname

  
  
  
1 int connect(int sockfd,const struct sockaddr *addr, socklen_t addrlen);
2 int accept(int sockfd, struct sockaddr *addr, socklen_t* addrlen);
3 int bind(int socket,const struct sockaddr *address, socklen_t address_len);
4 int listen(int sockfd, int backlog);
5 ssize_t send(int sockfd, const void* buf, size_t len, int flags);
6 ssize_t sendto(int sockfd, const void* buf, size_t len,int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
7 ssize_t recv(int sockfd, void* buf,size_t len,int flags);
8 ssize_t recvfrom(int sockfd, void* buf, size_t len,int flags, struct sockaddr *src_addr, socklen_t* addrlen);
9 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
11 void FD_CLR(int fd, fd_set *set);
12 int FD_ISSET(int fd, fd_set *set);
13 voidFD_SET(int d, fd_set *set);
14 void FD_ZERO(fd_set *set);
15 struct hostent *gethostbyname(const char* name);
  • 熟悉epoll,熟悉水平触发与边缘触发。

  
  
  
1 int epoll_create(int size);
2 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
3 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  • 熟悉阻塞socket和非阻塞socket在connect、send、recv等行为上的区别,如何将socket设置为非阻塞的

上述网络编程知识点不知道你是否觉得困难,很多同学对网络通信原理、网络编程这块知识很惧怕,或者方法不当,学了忘,忘了学。这里不建议一开始就去读一些大部头的图书,容易坚持不下,最后放弃。如果想入门或者上手,建议找一些通俗易懂又可快速实践的书,这里推荐韩国人尹圣雨写的《TCP/IP 网络编程》这本书,这本书尤其适合非科班出身或者网络编程小白的同学,常见的 socket API 以及网络通信模式都有介绍,且同时包括 Linux 和 Windows 两个操作系统平台。我刚工作那会儿,做股票行情服务器的底层服务开发,需要熟悉网络编程,那会儿天天下班抱着这本书看,建议小白把书中的网络通信代码都自己敲一遍。工作中,我们面试一些同学时,发现很多同学写的网络通信程序在本机测试没问题,一拿到局域网或者测试环境就不能正常工作,这本书会告诉你答案。

三、脚本工具

  • 了解shell基本语法、变量操作、函数、循环/条件判断等程序结构。

  • 熟练使用文本编辑工具vi/vim。

  • 了解使用文本处理命令grep、sed、cut。

  • 了解awk命令。

四、数据库

  • 熟悉数据表结构设计(三范式、字段属性)。

  • 了解查询优化(索引的概念与创建、sql优化)。

  • 熟悉常见的mysql API函数:

  
  
  
1 mysql_real_connect
2 mysql_select_db
3 mysql_query
4 mysql_store_result
5 mysql_free_result
6 mysql_num_rows
7 mysql_close
8 mysql_errno

以上属于对开发的基本的数据库知识要求,你可以找一本相关入门级的数据库图书学习即可。

高级开发除了以上要求还要熟悉高可用 MySQL主从同步读写分离分表分库等技术,这些技术的细节一定要清楚,它们是你成为技术专家或者高级架构的必备知识。我们在实际面试时,在讨论高可用服务服务方案时,很多面试者也会和我们讨论到这些技术,但是不少面试者只知道这些技术的大致思想,细节往往说不清楚,细节不会就意味着你的高可用方案无法落地,企业需要可以落地的方案。

这些技术我首推《高性能 MySQL》这本书,这本书高级开发者一定要通读的,另外还有 2 本非常好的图书也推荐一下:一本是《MySQL 排错指南》,读完这本书以后,你会对整个“数据库世界”充满了清晰的认识;另外一本是《数据库索引设计与优化》,这本书读起来非常舒服,尤其是对于喜欢算法和数据结构的同学来说。

五、编程语言

  • C/C++方面

  • 熟悉内存分布(堆、栈、静态/全局/局部变量、虚指针…)

  • 熟悉性能分析工具(gprof)。

  • 熟悉C-Runtime常用函数(如字符串格式化函数printf、scanf,字符串比较连接函数、内存分配函数、文件与目录操作函数等)。

  • 熟悉stl库。

  • 熟悉OO思想、常见设计模式(如单例模式、工厂设计模式、装饰者模式、Builder模式、生产者消费者模式、策略模式等)。

  • 熟悉RAII、pimpl惯用法。

  • 有一定的代码质量和重构能力。

  • 熟悉Makefile。

  • 熟悉gdb调试(这个一定要熟悉,例如如何加断点、查看内存、执行跟踪、了解CPU主要寄存器作用…)。


常用的 gdb 命令并不多,但是也需要一些调试和操作系统的基础知识,如断点、调用堆栈、线程等概念,如果你已经了解了这些基础概念之后,学习 gdb 就不难了,只要你肯练习,十分钟内足可掌握,但是要灵活使用 gdb 调试还是需要多加练习,建议用 gdb 去调试一些工业级的开源项目,例如 Nginx、Redis 这样的源码。

我写过一篇如何使用 gdb 调试 Nginx 的源码,建议在你熟悉 gdb 调试之后再回过头来看这篇文章:

如何使用 GDB 调试 Nginx

常用的 gdb 命令并不多,我这里总结了一个表:

命令名称

命令缩写

命令说明

run

r

运行一个程序

continue

c

让暂停的程序继续运行

break

b

添加断点

tbreak

tb

添加临时断点

backtrace

bt

查看当前线程的调用堆栈

frame

f

切换到当前调用线程的指定堆栈

info

info

查看断点/线程等信息

enable

enable

启用某个断点

disable

disable

禁用某个断点

delete

del

删除断点

list

l

显示源码

print

p

打印或修改变量或寄存器值

ptype

ptype

查看变量类型

thread

thread

切换到指定线程

next

n

运行到下一行

step

s

如果有调用函数,进入调用的函数内部,相当于step into

until

u

运行到指定行停下来

finish

fi

结束当前调用函数,到上一层函数调用处

return

return

结束当前调用函数并返回指定值,到上一层函数调用处

jump

j

将当前程序执行流跳转到指定行或地址

disassemble

dis

查看汇编代码

set  args


设置程序启动命令行参数

show  args


查看设置的命令行参数

watch

watch

监视某一个变量或内存地址的值是否发生变化

display

display

监视的变量或者内存地址,当程序中断后自动输出监控的变量或内存地址

dir

dir

重定向源码文件的位置


网上很多关于 gdb 的教程都是零散的,不成体系,且调试的都是各种玩具型程序,看完后很多读者还是不知道如何调试大型 C/C++ 项目,因此我结合自己的工作经验,写了一套《gdb 高级调试实战教程》,这个教程有如下特点:

  • 以调试开源项目 Redis-Server 为例,项目不是玩具型的,具有实战意义;

  • 按调试流程,从 gdb 附加调试程序,到启动 gdb 调试再到使用 gdb 中断 Redis 查看各种状态,循序渐进地介绍各种 gdb 调试命令;

  • 介绍了实际工作中 gdb 的各种高级调试技巧,例如如何显示超长字符串、如何使用 gdb 调试多进程程序等等;

  • 也介绍了基于 gdb 的一些高级工具,如 cgdb、VisualGDB,这些章节是为不习惯 gdb 显示源码方式的同学量身定制。


以下是电子书目录:

gdb 高级调试实战教程》电子书获取方式:

需要获取gdb 高级调试实战教程的同学可以加小方的微信 cppxiaofang 领取,请备注“gdb”,无备注不加哦。

 
 
 

由于白天工作比较忙,好友通过后,请耐心等待。性子急的请将我拉黑。

相关的配套资源:

  • Redis 4.0.11 源码下载:https://github.com/balloonwj/redis-4.0.11

  • Redis 6.0.6  源码下载:https://github.com/balloonwj/redis-6.0.3

  • cgdb 下载地址:cgdb

  • VisualGDB 破解版下载地址:

链接:https://pan.baidu.com/s/1f4Y275wEhljVK1-ChEdUkw  提取码:snwb

总而言之,熟练掌握 gdb 调试等于拥有了学习优秀 C/C++ 开源项目源码的钥匙,只要可以利用 gdb 调试,再复杂的项目,在不断调试和分析过程中总会有搞明白的一天。  关于 gdb 的调试知识除了 gdb 自带的 help 手册,国外还有一本权威的书籍《Debugging with GDB: The The gnu Source-Level Debugger》,系统地介绍了 gdb 调试的方方面面:

链接:https://pan.baidu.com/s/1TXfnebdhEtKc5zedYoJ5ng  提取码:j4au


我目前在大厂做架构,开发语言主要也是 C/C++,面试和指导千人成功找到满意的 C/C++ 岗位,接触 C/C++ 十多年了,深知新手学习 C/C++ 的重要性和难点所在,因此特地给 C/C++ 开发的同学精心准备了一份优质学习资料————CppGuide,内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。


需要获取 CppGuide 的同学可以加小方的微信 cppxiaofang 领取,请备注“cppguide”,无备注不加哦。由于白天工作比较忙,好友通过后,请耐心等待,性子急的请将我拉黑。


推荐阅读

关注我,带你技术上分

【声明】内容源于网络
0
0
CppGuide
专注于高质量高性能C++开发,站点:cppguide.cn
内容 1260
粉丝 0
CppGuide 专注于高质量高性能C++开发,站点:cppguide.cn
总阅读783
粉丝0
内容1.3k