1.线程锁,进程锁,分布式锁:

线程锁主要用来给方法、代码块加锁。当某个方法或者代码块加锁时,那么在同一时刻至多仅有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法、代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该段代码。但是,其余线程是可以访问该对象中非加锁代码块的。

进程锁是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制。

分布式锁是当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。

2.进程和线程之间的关系:

线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;

调度和切换:线程上下文切换比进程上下文切换要快得多

3.硬链接和软链接:

软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。

硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。

4.哈希表:

也叫散列表,是根据关键码值而直接进行访问的数据结构,也就是说,他通过把关键码值映射到表中一个位置来记录,以加快查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

5.avl树:

AVL树本质上还是一颗二叉搜索树,它的特点是:本身首先是一颗二叉搜索树;带有平衡条件,每个节点的左右子树高度之差的绝对值(平衡因子)最多为1.

6.封装、继承、多态:

封装:把抽象的数据和对数据进行的操作封装在一起,数据被保存在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。

继承:当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法。

多态:将派生类对象视为基类对象,并执行派生类的函数实现。

多态形成条件:父类中有虚函数;子类覆写父类中的虚函数;通过已被子类对象覆写的父类指针或引用,调用共用接口。

编辑于 2020-07-25


编程指北

腾讯科技(深圳)有限公司 后台开发工程师

去年刚参加完校招的来回答一下,我本身语言也是 C++,走的是 Linux C/C++后台开发方向,拿到过百度、腾讯、字节等大厂offer

目前来说,C++主要场景在Linux C++ 后台开发、游戏开发、PC客户端开发(qt等)、工业软件、实时推荐系统、搜索引擎、流媒体服务、还会有分布式系统方向做一些infra开发。

而对于大多数人来说 C++ 后台开发是最容易达成的,目前后台方向,Java岗确实远多于C++岗。

但从收到的简历数量来说,Java 的简历是远远多于C++,也侧面说明了 C++ 岗其实竞争比 Java 岗小很多。

一年时间掌握 C++ 肯定是足够的,当然了,这里的掌握仅仅是指熟悉 C++ 常用特性,能用 C++ 写出正确且符合规范的代码,连精通的门都还没进,精通 C++ 也不是谁都敢说的,确实博大精深,特性繁多,支持好几种编程范式。

那么如何循序渐进的学习 C++,并且通过大厂面试呢?

C++语言知识

这里首先说下语言基础知识,一些关键字和实现原理等首先是入门阶段,除了基本的循环、变量、判断以外,至少需要掌握这些:

  • 指针、引用、数组、内存
  • C和 C++ 的一些区别,比如 new、delete 和 malloc、free 的区别
  • C++中引用与指针区别
  • 继承
  • 多态: 动态绑定,静态多态
  • C++里一些关键字的作用:static、const、volatile、extern
  • 类初始化等

这个阶段以看C++ Primer 前 12章为主。

接下来可以逐步学习现代C++(C++11以后)、并且学习一些C++底层实现原理,如:

  • C++ 重写、重载
  • 虚继承、菱形继承等
  • C++虚机制:虚函数、虚函数表、纯虚函数
  • C++11 部分新特性,比如右值引用、完美转发等
  • 智能指针原理:引用计数、RAII(资源获取即初始化)思想
  • 智能指针使用:shared_ptr、weak_ptr、unique_ptr等
  • 类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
  • STL大部分容器的实现原理,如 vector、deque、map、hashmap
  • 模板特化、偏特化,萃取 traits 技巧
  • 程序编译链接机制、内存布局(memory layout)、对象模型

可以通过看这些书去学习:

  • Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》,这部分是提高C++编码能力
  • 《STL 源码剖析》和《深度探索 C++ 对象模型》,这是了解STL容器底层实现和对象模型,面试常考

视频可以看看侯捷老师的:可以在 B 站搜索「候捷 C++」,主要会有以下几个系列视频:

  • 《C++ STL与泛型编程高级》
  • 《C++11 新特性》
  • 《C++内存管理》
  • 《STL源码分析》

看完上面这些书(不是挨着看,有些可以挑关键章节),会让你对C++比较理解比较透彻,运用更加熟练。

当然了,如果是自学C++的话,会比较困难,主要是C++语言本身很难学,最好能够有老师带着学,这里推荐一个ACM金牌大佬的免费C++课程,可以体验一下:

学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样已失效

上面提到的C++这些书,我帮你整理了一部分,有需自取: 百度网盘: https://pan.baidu.com/s/10xx2Zk8xSgBTrnhAu2HgpQ提取码: wt2n

C++ 开发岗位,除了需要掌握 C++ 以外,还需要掌握那几门计算机科班必学的课程。

计算机基础知识:

计算机网络:

需要掌握的网络协议和知识:

  • HTTP、TCP、IP、ICMP、UDP、DNS、ARP
  • HTTPS安全相关的:数字签名、数字证书、TLS
  • 常见网络攻击:局域网ARP泛洪、DDoS、TCP SYN Flood、XSS等 其实我们工作中就特别重视安全,上线新的对外服务前都要经过安全扫描,安全是生命线。
  • IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型)

TCP的重点知识:

  • 状态转换:三次握手、四次挥手
  • 拥塞控制、快速重传、慢启动等
  • TCP 状态中 TIME_WAIT

学习过程中也要多思考为什么要这么设计,这里列几个问题:

  • TCP 如何实现可靠传输的(画外音:如何基于 UDP 实现可靠传输
  • 第二次和第三次之间的等待是什么
  • 为什么不是四次握手
  • TIME_WAIT 的存在解决了什么问题,等待时间为什么是 2 MSL
  • TCP 连接建立为什么不是两次握手(画外音:三次握手的充分必要性说明

最后别忘了自己复述一遍那被问烂了、写烂了的问题:

  • 从 URL 输入到页面展现到底发生什么?

推荐书籍:

  • 《网络是怎样连接的》
  • 《计算机网络:自顶向下方法》
  • 《TCP/IP详解卷1:协议》
  • 《图解HTTP》

操作系统知识

一些复习的思路:

  • 操作系统由哪些构成
  • 进程和线程的区别
  • 线程的实现方式(一对一、多对一等)
  • 页面置换算法
  • 进程的状态、切换、调度
  • 进程间通信方式(共享内存、管道、消息)
  • 互斥与同步(信号量、管程、锁)
  • 死锁检测与避免
  • 为什么需要虚拟内存,MMU 具体如何做地址转换的
  • 内存为什么分段、分页
  • 并发经典的问题:读者写者、哲学家就餐问题
  • 文件系统是如何组织的
  • 虚拟文件系统(VFS)是如何抽象的

书籍推荐:

  • 《现代操作系统》
  • 《操作系统—精髓与设计原理》
  • 《Linux内核设计与实现》

网络编程和服务器开发

重点知识:

Linux 下网络编程核心的包括网络 IO 和系统编程两个部分:

  • 进程间通信方式: 信号量、管道、共享内存、socket 等
  • 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
  • 高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor
  • 多线程编程:互斥锁、条件变量、读写锁、线程池等
  • IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)

推荐的书:

  • 《Unix网络编程》
  • 《Unix环境高级编程》
  • 《Linux高性能服务器编程》
  • 《Linux多线程服务器端编程》

网络编程练手小项目推荐http server:

HTTP 服务器,熟悉http协议的解析和网络编程

这里推荐一个做为参考:https://github.com/imarvinle/WebServer: 这是我看完高性能服务器编程后写的,欢迎star~

系统知识

推荐书籍:

  • 《深入理解计算机系统》
  • 《程序员自我修养》

算法于数据结构

**算法的话刷题是必须的,这里推荐一份谷歌大佬的刷题笔记,讲解刷题的框架思维,对我很有帮助,墙裂推荐:

看完谷歌大佬的Leetcode刷题笔记, 我直接手撕了200道Leetcode算法题 - 知乎 (zhihu.com)

重点数据结构:

  • 线性表、数组、链表
  • 栈与队列、堆
  • 散列函数和散列表
  • 树、二叉树、多叉树实现和遍历方式,AVL树实现以及插入删除过程、红黑树(了解定义即可)
  • 图,以及图的实现方式、遍历
  • B树、B+树

常见的算法:

  • 排序算法:冒泡、插入、堆排、基数、快速、希尔、归并等
  • 常见算法思想:递推、分治、贪心、递归、枚举、动态规划等
  • 字符串匹配算法:KMP

书籍推荐:

  • 《啊哈算法》
  • 《算法图解》
  • 《算法第四版》

刷题网站推荐:

  • 牛客网
  • leetcode
  • 各种OJ其它还包括数据库、系统设计、Redis这些组件的知识,我就不一一列出来了。

至于游戏开发,可以去看 Milo 大神推荐的游戏开发入门到进阶的路线。

当然了,如果是自学C++的话,会比较困难,主要是C++语言本身很难学,最好能够有老师带着学,这里推荐一个ACM金牌大佬的免费C++课程,可以体验一下:学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样已失效 如果觉得,分享有用的话,记得关注我 @编程指北,帮我点个赞哟,笔芯~

编辑于 2020-12-09