文章持续更新,全文首发自我的个人公众号,可以微信搜一搜「 高性能服务器开发 」第一时间阅读,后台回复【文章下载】获取 Linux C/C++ 后台开发全套资料。
以下是腾讯某工作室对 Linux C/C++ 后台方向实习生的一些技能要求。
应届生除了要良好地掌握算法和数据结构以外,技能点列表希望对大家有帮助,需要找大厂实习的同学可以参考这个列表针对性地进行补缺补差。
文章列出的技能点有的要求熟悉,有的了解即可,注意技能点前面的修饰词。如果没有明确给出“熟悉”、“了解”等字眼,要求均为熟悉。
一、操作系统方面
多线程相关与线程之间同步技术
熟练使用(但不局限于)以下 Linux API
linux下的线程创建、等待、获取线程 id
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); int pthread_join(pthread_t thread, void **retval); pthread_t pthread_self(void);
常见线程之间的同步技术(何时该用那种技术)
互斥体
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);
信号量
int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_destroy(sem_t *sem); int sem_wait(sem_t *sem); int sem_post(sem_t *sem); int sem_getvalue(sem_t *sem, int *valp);
条件变量
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
读写/自旋锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); //这两个函数在 Linux 和 Mac 的 man 文档里都没有,新版的 pthread.h 里面也没有,旧版的能找到 int pthread_rwlock_timedrdlock_np(pthread_rwlock_t *rwlock, const struct timespec *deltatime); int pthread_rwlock_timedwrlock_np(pthread_rwlock_t *rwlock, const struct timespec *deltatime); int pthread_spin_init (__pthread_spinlock_t *__lock, int __pshared); int pthread_spin_destroy (__pthread_spinlock_t *__lock); int pthread_spin_trylock (__pthread_spinlock_t *__lock); int pthread_spin_unlock (__pthread_spinlock_t *__lock); int pthread_spin_lock (__pthread_spinlock_t *__lock);
熟悉守护进程的创建、原理
了解计划作业crontab
熟悉进程、线程状态查看命令(top、strace、pstack)
熟悉内存状态查看命令 memstat、free
熟悉 IO 状态查看命令 iostat、df、du
了解 Linux 文件的权限、用户、时间(ctime、mtime、atime)、inode等文件基本属性,熟练使用 chmod、chown、chgrp 等基本命令。
熟悉文件传输命令 scp、rz、sz 命令、
熟悉文件定位命令 find、whereis 命令。
熟悉软链接,熟悉 ln 命令。
熟悉 lsof 命令。
二、网络
熟悉 TCP 状态机(三次握手、四次挥手)。
熟悉 tcpdump 命令。
熟悉网络状态和***状态查看命令:netstat、ifconfig、iptables
熟悉 socket API,包括但不限于(connect、accept、bind、listen、send/sendto、recv/recvfrom、select、gethostbyname)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); int bind(int socket, const struct sockaddr *address, socklen_t address_len); int listen(int sockfd, int backlog); ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set); struct hostent *gethostbyname(const char *name);
熟悉epoll,熟悉水平触发与边缘触发。
int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 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 两个操作系统平台。
网上也有人分享了这本书(喜欢记得买正版哦):
链接: https://pan.baidu.com/s/1Z84jcVVowofdLZGxO2ENSA 密码: pdh1
我刚工作那会儿,做股票行情服务器的底层服务开发,需要熟悉网络编程,那会儿天天下班抱着这本书看,建议小白把书中的网络通信代码都自己敲一遍。
工作中,我们面试一些同学时,发现很多同学写的网络通信程序在本机测试没问题,一拿到局域网或者测试环境就不能正常工作,这本书会告诉你答案。
三、脚本工具
了解 shell 基本语法、变量操作、函数、循环/条件判断等程序结构。
熟练使用文本编辑工具vi/vim。
了解使用文本处理命令 grep、sed、cut。
了解 awk 命令。
四、数据库
熟悉数据表结构设计(三范式、字段属性)。
了解查询优化(索引的概念与创建、sql 优化)。
熟悉常见的 mysql API函数:
mysql_real_connect mysql_select_db mysql_query mysql_store_result mysql_free_result mysql_num_rows mysql_close mysql_errno
五、编程语言
C/C++方面
熟悉内存分布(堆、栈、静态/全局/局部变量、虚指针…)
熟悉 Makefile。
- 熟悉 gdb 调试(断点、查看内存、执行跟踪、了解 CPU 主要寄存器作用…)。
注意如果你想胜任 Linux C/C++ 后台开发,一定要熟练使用 gdb 调试,gdb 网络上有很多教程但都不系统,这里给大家推荐一本国外的图书《Debugging with GDB ——the GNU Source Level Debugger》,写的非常通俗易懂,网络上有人分享出来:
链接: https://pan.baidu.com/s/1uq3Kzsty3Z26K8QPhAeXDg 密码: kua1
建议购买正版哦。
这里说一个注意事项:由于受疫情影响,很多面试都改成了线上,一些同学在写完一些算法题时,放到 Linux 机器上调试和运行,如果遇到问题,会不会熟练利用 GDB 调试,高下立判。熟练调试也是很重要的加分项。
熟悉性能分析工具(gprof)。
熟悉 C-Runtime 常用函数(如字符串格式化函数 printf、scanf,字符串比较连接函数、内存分配函数、文件与目录操作函数等)。
熟悉 stl 库。
熟悉 OO 思想、常见设计模式(如单例模式、工厂设计模式、装饰者模式、Builder 模式、生产者消费者模式、策略模式等)。
熟悉 RAII、pimpl 惯用法。
有一定的代码质量和重构能力。
来源: 公众号「高性能服务器开发」
原文链接:腾讯 Linux C/C++ 后台开发实习生技能要求