├── .gitattributes ├── AntFinancial ├── readme.md └── 金融研发_java研发_bozhi.md ├── Baidu ├── Readme.md └── 推荐后端_c++_mionger.md ├── ByteDance ├── AML_机器学习平台_chong1144.md ├── ByteDance 3月份笔试题.pdf ├── Readme.md ├── tiktok_测开_Linya(23届).md ├── 上海创新业务_后端_CrowFea.md ├── 上海创新业务_后端_mionger.md ├── 创新业务_后台开发_bozhi.md ├── 商业变现_后端日常实习_tongji4m3.md ├── 基础库研发_前端_weixiang.md ├── 基础架构_C++客户端_Maoyao233.md ├── 基础架构_代码中台_skyleaworlder.md ├── 大力智能_测开_josefRen.md ├── 抖音_客户端_asheng.md ├── 朝夕光年_游戏引擎实习二面凉_qingquan(23).md └── 飞书_服务端实习_wasd003.md ├── HuaWei └── readme.md ├── MeituanDianPing ├── readme.md ├── 基础研发平台_后端开发_yhd.md ├── 机器学习平台_后台开发_zhangyiwen599.md └── 美团面经.md ├── Netease └── 网易互娱_游戏研发实习一面二面凉_qingquan(23).md ├── Tencent ├── IEG_后台开发_josefRen.md ├── IEG_游戏引擎开发_Zheng.md ├── IEG_运营开发_bozhi.md ├── IMWeb_前端_xpnice.md ├── WXG_后端_Alivers.md └── readme.md ├── images └── readme.md ├── offer备战手册 └── 牛客独家春招实习备战手册-技术篇.pdf ├── readme.md └── 知识点 ├── 前端技术栈 ├── HTTP相关知识.docx ├── JS相关知识.docx └── vue相关知识点.docx └── 基础知识 ├── Algorithm.md ├── ComputerNetwork.md ├── DataBaseBasic.md ├── LanguageBaseBasic.md ├── OperatingSystemBasic.md └── 计算机网络备战面试笔记.docx /.gitattributes: -------------------------------------------------------------------------------- 1 | *.gif filter=lfs diff=lfs merge=lfs -text 2 | *.png filter=lfs diff=lfs merge=lfs -text 3 | *.jpg filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /AntFinancial/readme.md: -------------------------------------------------------------------------------- 1 | ## 蚂蚁金服面经 2 | -------------------------------------------------------------------------------- /AntFinancial/金融研发_java研发_bozhi.md: -------------------------------------------------------------------------------- 1 | ## 蚂蚁金服面经 2 | 3 | ### 蚂蚁金服电话一面 4 | 5 | 电话一面相当于探底,问的相对基础,涉及操作系统,计算机网络,数据结构。 6 | 7 | 1. http相关内容 8 | 2. 数据结构,栈和队列,数组的链表 9 | 3. 面向对象和面向过程的理解 10 | 4. 快排和冒泡排序笔记,快排思想 11 | 5. 个人爱好,学习习惯等。 12 | 13 | 询问是否愿意转岗,阿里技术栈为java,本人java未达到面试要求。 14 | 15 | ### 蚂蚁金服视频二面 16 | 17 | 使用钉钉视频面。因为是转岗,所以面试官没有问太多java。 18 | 19 | 1. 自我介绍。 20 | 2. linux查看线程占用cpu状态(top,`ps -mp `) 21 | 3. 进程和线程区别 22 | 4. 进程通信方式 23 | 5. 重载和重写区别。两个函数仅仅返回值不一样,名字和形参一样,是否属于重载,编译是否报错 24 | 6. TCP和UDP区别 25 | 7. TCP为什么可靠。 26 | 8. 如果硬件和带宽不变,如何提高TCP传输速率(想了一会,没想到) 27 | 9. 8没答好,面试官换了一个问发:UDP传输速率够快,如果提高可靠性。 28 | 10. 算法: 29 | * 快排 30 | * 链表的中间节点。 31 | * 大数据加法(超过 long long 能表示。 高精度加法。这里忘记考虑负数加法。) 32 | 33 | 反问环节: 34 | 1. 阿里实习生培养方案 35 | 2. 所属部门以及岗位工作 36 | 37 | 最后面试官建议:如果顺利进入阿里实习,需要提前自学java。 38 | 39 | 40 | ### 蚂蚁金服三面 41 | 42 | 三面聊人生,个人评价,最骄傲和最遗憾的事,自己怎么学习,和同学相处如何。 43 | 44 | -------------------------------------------------------------------------------- /Baidu/Readme.md: -------------------------------------------------------------------------------- 1 | # 百度面经 2 | 1. [推荐后端](https://github.com/wenjunBZ/RushForOffer/blob/master/Baidu/推荐后端_c%2B%2B_mionger.md) 3 | -------------------------------------------------------------------------------- /Baidu/推荐后端_c++_mionger.md: -------------------------------------------------------------------------------- 1 | 面试形式 : 集中面试,一天三面(技术面、技术面、主管面,无hr面)\ 2 | 状态 : 已oc(4.11集中面试,4.22oc) 3 | 4 | 一面(32min) 5 | 1. 自我介绍 6 | 2. TCP链接为什么要三次握手?四次可以吗?可不可以两次? 7 | 3. TCP握手时的最大等待时间? 8 | 4. 快速排序的思想和思路? 9 | 5. 手撕快排 10 | 6. 有序数据的查找? 11 | 7. 上亿数据TopK查找? 12 | 8. 动态规划思想?在项目中是否有应用? 13 | 14 | 二面(38min) 15 | 1. 自我介绍 16 | 2. 数据结构了解吗?介绍下自己了解的数据结构 17 | 3. 命令行下两个文件行内容的比较?时间复杂度?如果大小不一致,如何提高效率? 18 | 4. 手撕算法编辑距离 19 | 5. 数据库了解多少? 20 | 6. mysql了解吗?如何从表中查找num列最小的数,不能使用min函数 21 | 7. 反问 22 | 23 | 三面(36min) 24 | 1. 自我介绍 25 | 2. 你做的项目有很多的同学也做过差不多的,你做的时候有什么特别考虑的内容?你觉得和别的同学的相似项目比有什么优势? 26 | 3. 课程项目都是有提交的时间限制的,在交完作业之后有没有后续的思考过,有什么能让更多人用的创新点? 27 | 4. 最近半年学到的课程外的感兴趣的东西? 28 | 5. 个人做过的坚持时间最久的事情?开始的时候有没有定位目标?后续执行中有没有什么计划? 29 | 6. 想通过实习学到哪些东西? 30 | 7. 接触的百度产品中对哪一款使用比较深?对这个产品的理解? 31 | 8. 如果你是这个产品的研发,你会有什么意见? 32 | 9. 堆了解吗?简单介绍一下堆排序的建堆过程?堆排序是稳定排序吗? 33 | 10. 简单介绍一下快速排序,写一下伪代码 34 | 11. 反问 35 | 12. 百度每个实习生都会有一个指导人,(面试官简单介绍了一下这个指导人),假设你面试通过来实习,你希望你的指导人具备哪些品质和优势,最多可以说三点? 36 | 37 | -------------------------------------------------------------------------------- /ByteDance/AML_机器学习平台_chong1144.md: -------------------------------------------------------------------------------- 1 | # 字节跳动面试经验 2 | 3 |

Authored by SenW

4 | 5 | ## 一面 *50min左右* 6 | 7 | - 算法题 8 | 9 | 已知一个随机数生成器,生成概率分布分如下: 10 | 11 | | 生成数字 | 0 | 1 | 12 | | -------- | ---- | ---- | 13 | | 概率 | 50% | 50% | 14 | 15 | 根据上述的随机数生成器,生成如下分布的随机数生成器: 16 | 17 | | 生成数字 | 0 | 1 | 18 | | -------- | ---- | ---- | 19 | | 概率 | 25% | 75% | 20 | 21 | > 自己实现已知的随机数生成器 22 | > 23 | > 完成代码的测试工作 24 | > 25 | > 讲清楚为什么这么想 26 | > 27 | > 展示如果有问题应该如何debug 28 | 29 | - 经验题 30 | 31 | 解释 pytorch 和 tensorflow 底层图的实现原理和两者的区别。 32 | 33 | - 算法题 34 | 35 | - 在上述讨论的基础上,实现一个 $1 + 2 * 3$ 的计算图 36 | 37 | > 自己实现计算图的底层定义 38 | > 39 | > 自己完成测试 40 | 41 | - 如何实现一个对于不同操作函数的一个动态绑定 42 | 43 | > 目前题目只支持了加减乘除四个操作函数 44 | > 45 | > 如果要做成库需要动态添加不同的操作函数怎么办 46 | 47 | - 如果要做成库,还需要哪些方面的工作 48 | 49 | > 把动态绑定的时候用的图的定义放到头文件里面 50 | 51 | - 基础题 52 | 53 | - 在上述讨论的基础上,分析动态编译、静态编译的区别和优缺点 54 | - 讲解编译整个过程 55 | 56 | - 工程题 57 | 58 | - epoll 和 select 的实现的区别 59 | - 如何实现一个高性能服务器 60 | 61 | > 通过 epoll 异步的监视 62 | > 63 | > 如果有请求,分配给 worker 进程处理业务逻辑, 还有单独的 IO 进程负责读写操作 64 | 65 | ## 二面 *1h10min* 66 | 67 | - 基础题 68 | 69 | - 实现一个生产者-消费者模型 70 | - 堆栈的区别,线程间如何通讯 71 | 72 | - 基础题 73 | 74 | - 根据一个 fork 的程序分析输出结果 75 | - fork 系统调用的实现过程 76 | - 系统调用的 Linux 内核实现 77 | 78 | - 工程题 79 | 80 | - epoll 和 select 的实现的区别 81 | - 如何实现高性能服务器 82 | - 如何设计一个工程 83 | 84 | > 多进程、多线程的设计 85 | > 86 | > 之间的通讯问题 87 | > 88 | > 守护进程的问题 89 | > 90 | > 日志问题 91 | > 92 | > 权限问题 93 | > 94 | > .... 95 | 96 | - 基础题 97 | 98 | - 你用过什么数据库 你用的数据库的底层实现原理 99 | - 数据库的索引用过 应该如何合理设计索引 100 | 101 | - 基础题 102 | 103 | - TCP/UDP 的区别 104 | - 三次握手 四次挥手 105 | - HTTP 协议的理解, HTTPS 的理解 106 | - 滑动窗口协议简述一下 107 | 108 | - 休闲题 109 | 110 | - 你想了解我们公司什么东西 -------------------------------------------------------------------------------- /ByteDance/ByteDance 3月份笔试题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/ByteDance/ByteDance 3月份笔试题.pdf -------------------------------------------------------------------------------- /ByteDance/Readme.md: -------------------------------------------------------------------------------- 1 | 字节跳动面经 2 | -------------------------------------------------------------------------------- /ByteDance/tiktok_测开_Linya(23届).md: -------------------------------------------------------------------------------- 1 | 字节跳动测开三面面经(被调剂) 2 | 3 | #### 一面(4.7) 4 | 5 | 1. 自我介绍,问一下项目 6 | 2. 进程和线程的区别 7 | 3. HashMap 的底层实现 8 | 4. HashMap 和 HashTable 的区别 9 | 5. 为什么 HashMap 是线程安全的 10 | 6. 简单介绍一下 Java 中的垃圾回收机制 11 | 7. 浏览器中输入 url 会发生什么 12 | 8. tcp 和 udp 的区别 13 | 9. 同一个网站中每次打开一个新的页面都会建立新的 tcp 连接吗 14 | 10. 算法题:没必要把原题放出来了,总而言之就是快速排序 15 | 11. 快速排序的最坏情况时间复杂度是多少?最坏情况是什么情况? 16 | 12. 反问 17 | 18 | 这一面都是一些基础性的问题,能答得差不多就行,算法题我没做完面试官就说时间到了,说相信我能做出来然后就让我等通知了。不过第二天下午,二面通知就来了,接下来就是二面。 19 | 20 | #### 二面(4.13) 21 | 22 | 1. 自我介绍,说一下项目背景,有没有参与到这个项目用到的框架开发(没有) 23 | 2. 安卓了解吗,为什么之前想要去安卓客户端,有相关的经验吗(没有) 24 | 3. 说一下我知道多少 ios 和 Android 的区别 25 | 4. 对测开这个岗位是怎么理解的 26 | 5. 如果要测试网易云音乐的每日推荐功能,如何下手 27 | 6. 测试微博用户浏览时的相关推送功能 28 | 7. 介绍一下项目中怎么用到的 sql,了解 MySQL 吗(不是很了解) 29 | 8. 做一道 sql 的题目:统计用户连续登录天数(我用了窗口函数 row_number(),也是没写完,只给了五分钟,是一道经典题目了) 30 | 9. 这时候第二个面试官来了,介绍一下在学校内专业课学习的东西 31 | 10. 平时是怎么自学 Java 的,我说看 TIJ 还有网上的博客和一些资料 32 | 11. 聊一下未来规划,然后就没然后了,说等通知 33 | 34 | 二面问了很多场景问题,可能有些东西我不记得了,没有算法题,然后第二天下午 hr 又微信联系我来通知三面了。 35 | 36 | #### 三面(4.20) 37 | 38 | 1. 自我介绍,项目用到的框架背景介绍一下 39 | 2. 提到了 kotlin,说一下 kt 相较于 Java 的优势 40 | 3. kt 的 null safety 能具体举一下例子吗(然后我忘了 Elvis 关键字的这个 Elvis 怎么拼了) 41 | 4. 项目中是怎么实现多个用户点歌互不干扰的(协程) 42 | 5. 协程和线程的区别 43 | 6. 未来规划是怎么样的,希望公司给自己提供什么样的成长环境 44 | 7. 平时有一些什么兴趣爱好(我说了游戏但是我故意往跟技术有关的方面答了,比如说提到了 arcaea 的查分器,我想要给自己 bot 也实现一个查分功能,我还说了自己喜欢写 galgame 综评,经典之 GitHub 主页用来做个人漫评博客,以及用 md 写一万七千字的 “小文章”,面试官觉得很有趣) 45 | 8. 平时在学校内的学习环境怎么样,为什么现在掌握的这些技能和学校专业教学的东西完全不相关 46 | 9. 反问,我问了一下咱们部门主要负责的内容,答案是用户隐私安全,面试官说的比较详细,然后就没有然后了 47 | 48 | 三面的面试官人真的非常好,和蔼可亲,原本以为会是那种扑面而来的王者气息,没想到给我的感觉竟然像是一个亲切的学长,然后问的问题也不难,更多的像是前辈在和后辈闲聊,两个人的交流都是非常通畅和顺利的。 49 | 50 | 还有一点,我是三面完以后写的面经,肯定有很多一面和二面问了我的问题不记得了,总之都是些基础问题,大概凑合着吧,应该差别不大( 51 | 52 | **希望人没事** -------------------------------------------------------------------------------- /ByteDance/上海创新业务_后端_CrowFea.md: -------------------------------------------------------------------------------- 1 | # 字节跳动_上海_后端_CrowFea 2 | 3 | ### 一面 45min 4 | 5 | * 自我介绍 6 | * 项目(问了比较多,为什么做、主要工作、数据表结构、多个人访问一个请求怎么处理) 7 | * Http和Https区别 8 | * Https的安全性 9 | * 为什么Https要生成会话密钥 10 | * 概率题:一个等概率硬币,A扔正面赢、B扔反面赢,A先扔,赢的概率(一时间没反应上来……面试官提醒了很多次最后明白了……) 11 | * 算法:判断满二叉树 12 | * 闲聊(后期打算啊什么的) 13 | 14 | ### 二面 50min 15 | 面试官会问一面的情况,项目聊过了就不再聊了。算法也是,一面做的是树相关的,二面就出了链表和dp。 16 | * 自我介绍 17 | * 了解哪些加密方法(网络相关) 18 | * RSA的原理 19 | * 对称加密和非对称区别 20 | * SSL协议 21 | * 身份认证的方法 22 | * cookie和session的区别 23 | * session的具体实现 24 | * tcp/ip模型以及各层协议 25 | * tcp三次握手四次握手 为什么四次 26 | * 面向对象特点 27 | * const关键字 28 | * static关键字 29 | * sizeof() 30 | * 32位64位区别 31 | * 成员static方法只能访问static变量,为什么 32 | * 命名空间与static方法 33 | * 算法 34 | * 判断链表是否公共节点,打印该节点(这里给出了双指针o(m+n)的解法,面试官提醒如果链很长如何处理,并没有想出来……) 35 | * 变相的01背包 36 | 37 | ### 三面 70min 38 | 三面压力比较大,有些问题都忘了…… 39 | * 写单例模式(写了个懒汉式) 40 | * 多线程访问该模式有什么问题 41 | * 静态变量什么时候加载 42 | * 多态实现机制 43 | * 算法 44 | * 给浮点数精度开方 45 | * LIS 46 | * N个排序数组求最小的K个值(给出了NlogK的复杂度,但是面试官表示还有更好的) 47 | 48 | -------------------------------------------------------------------------------- /ByteDance/上海创新业务_后端_mionger.md: -------------------------------------------------------------------------------- 1 | 状态 : 收到offer 2 | 3 | 4.25一面(49min) 4 | 1. 自我介绍 5 | 2. 手撕代码股票买卖,只能买一次卖一次?如果能买多次卖多次呢? 6 | 3. tcp协议和udp协议区别? 7 | 4. 操作系统进程管理? 8 | 5. 死锁造成的原因? 9 | 6. c++实现百分之百死锁的程序的思路?(后面一直在追问这个) 10 | 7. 反问 11 | 12 | 4.25二面(45min) 13 | 1. 自我介绍 14 | 2. 你对c++的认识? 15 | 3. 你用过的c++特性?智能指针了解吗? 16 | 4. 对象的申请和释放原理,以new一个int举例? 17 | 5. 类的构造函数一般写哪些东西?构造函数申请内存失败怎么办? 18 | 6. 虚函数知道吗?虚函数的实现原理? 19 | 7. 编译器是如何实现的函数重载? 20 | 8. STL了解吗?介绍一下用过的STL容器? 21 | 9. vector是线程安全的吗?(此时回答多线程没学过) 22 | 10. vector的resize用过吗,原理是什么? 23 | 11. 手撕代码,实现一个简单的vector 24 | 12. 哈希冲突了解吗?如何解决?多线程读取哈希表如何观察并发性? 25 | 13. 读写锁了解吗?操作系统中哪里有读写锁?除了读写锁还知道什么锁?文件锁了解吗? 26 | 14. IO多路复用了解吗? 27 | 15. 手撕代码,实现strdup 28 | 16. 线程通信了解吗?同进程的各个线程的栈共享吗? 29 | 17. TCP和UDP都读到1K的包,二者各自读到多少字节数据? 30 | 18. 反问 31 | 32 | 当天给的通知二面挂了,4.26hr打电话说二面结果有争议,约4.28重新二面 33 | 34 | 4.28重新二面(53min) 35 | 1. 开场调侃了一会上次面试状态,发挥怎么样balabala 36 | 2. 问一些学过哪些专业课和日常的技术栈? 37 | 3. 用面向对象的思路描述一下保温杯? 38 | 4. 数据库的范式听说过吗?能不能说说看第三范式? 39 | 5. 实现学生选课这个功能应该如何设计数据表以满足第三范式? 40 | 6. 介绍一下你平时经常使用的linux的命令? 41 | 7. 如果一个文件的权限是644,表示什么含义? 42 | 8. 单核cpu上能不能跑多进程任务? 43 | 9. 介绍一下了解的进程调度方法? 44 | 10. 按下ctrl+c终止程序操作系统的工作? 45 | 11. 二叉树了解吗?什么是完全二叉树?如何判断完全二叉树有多少叶子结点? 46 | 12. 两个程序访问0x1234567访问的是同一段地址吗? 47 | 13. 文章评论转换,时间序->楼序 48 | 14. 反问 49 | 50 | 4.30三面(63min) 51 | 1. 自我介绍 52 | 2. 如何理解c++的构造函数和析构函数?构造函数分为几种?为什么需要构造函数? 53 | 3. 重载赋值操作符的意义是什么? 54 | 4. 介绍一下static关键字? 55 | 5. 用c++写一个单例模式? 56 | 6. C++11了解吗? 57 | 7. nullptr存在的意义是什么? 58 | 8. 智能指针的实现原理了解吗? 59 | 9. 标准io和文件io有什么区别?read/fread、write/fwrite有什么区别? 60 | 10. fread的缓存在进程crash之后还存在吗?高速缓存的管理了解吗? 61 | 11. 缓存淘汰算法了解的有哪些? 62 | 12. 手撕代码,LRU 63 | 13. 反问 64 | -------------------------------------------------------------------------------- /ByteDance/创新业务_后台开发_bozhi.md: -------------------------------------------------------------------------------- 1 | ## 字节跳动面经 2 | 3 | ### 3.21一面 4 | 5 | 自我介绍 6 | 7 | **计算机网络:** 8 | 9 | 1. https中间人攻击,加密方式,过程,CA认证 10 | 2. TCP三次握手四次挥手过程,client端time_wait阶段意义 11 | 12 | **操作系统** 13 | 14 | 1. fork系统调用过程 15 | 2. 系统颠簸原因,缺页调度算法,内存管理单元,自己的对缺页调度算法有什么优化思路 16 | 17 | ``` 18 | 在LRU的基础上优化,具体优化可以参考mysql的内存优化思路 19 | ``` 20 | 21 | 3. 除了底层缺页调度算法的优化,应用层如何优化解决系统颠簸 22 | 23 | **数据库** 24 | 25 | 1. 数据库了解多少? 26 | 27 | 基本概念以及CURD,知道explain查看执行效率,常见优化方法 28 | 29 | 2. innodb了解吗?什么是B+树? 30 | 31 | (虽然没有用过,但是这些内容复习基础时还是会复习到的。) 32 | 33 | **语言基础** 34 | 35 | 1. struct和union的区别 36 | 37 | 内存占用和内存对齐问题 38 | 39 | 2. 智能指针说一下 40 | 41 | ``` 42 | 复习时看到了,理解在于循环引用问题,但是没有实际用过,当时回答面试官知道名字,但是没用过 43 | ``` 44 | 45 | **项目** 46 | 47 | 1. 项目难点是什么,当时怎么解决的 48 | 49 | **算法** 50 | 51 | 52 | 长度为n的数组,求最小未出现的正整数 53 | 例子: 54 | [3,1,2,-9,100,20,8,9,7,4,5] 55 | 输出:6 56 | 时间复杂度要求为O(n) 57 | 额外空间复杂度O(1) 58 | 59 | ``` 60 | 思路: 61 | 很容易想到借助额外的哈希表来操作,这样时间复杂度满足要求,但是空间复杂度为O(n) 62 | 提示:将原数组作为哈希表,原地修改 63 | 64 | ``` 65 | 66 | ### 3.21二面 67 | 68 | 二面面试官开场比较温柔。没有按照一面的分块问问题 69 | 开场白: 70 | 71 | 72 | 一面面试官问了项目,我就不问了。一面发挥如何?是否还紧张 73 | 74 | 1. http的方法有哪些 75 | 76 | ``` 77 | 常见方法必会了,自己对比了一下get和post,算是get到点吧 78 | ``` 79 | 80 | 2. http返回码 81 | 82 | ``` 83 | 项目中用到,就了解了一下,所以记得比较清楚 84 | 面试官看我记得比较多,问我你用过吗? 85 | A:项目中用到了http相关,就了解到了,用了200和400。平时浏览网页也会碰到404,502,500的返回码,就了解了一下。 86 | ``` 87 | 88 | 3. linux用过什么命令 89 | 90 | ``` 91 | 这个问题比较常见,也算是自己学习积累吧。 92 | 说了,top,ps,dh之类 93 | ``` 94 | 95 | 4. 数据库的索引一面问了,问了数据库基本理论,第三范式,以及第三范式优缺点 96 | 5. 二叉树,满二叉树的定义,叶子节点数目和总结点数目的关系 97 | 6. 数据结构数组和链表的理解说一下 98 | 7. 数据结构:栈和队列的理解说一下,用栈模拟队列coding 99 | 100 | ``` 101 | 两个栈模拟队列,主栈和辅助栈即可 102 | ``` 103 | 104 | 8. 按下CTRL+C,从按下键盘到进程停止,发生了什么,详细过程? 105 | 9. 场景题: 106 | 107 | ``` 108 | 常见的社交软件评论有两种形式: 109 | 1.微博的评论,所有回复A用户的都在一起 110 | 2.微信朋友圈的评论,按照时间排序的,A回复B:*** 111 | 问题:如何将微信的评论形式,转换为微博评论形式。 112 | A:map+list,写了伪代码,总流程,然后解释。 113 | 面试官看了觉得思路可以,就过了 114 | ``` 115 | 116 | 反问环节: 117 | 1.人才培养方案:mentor+leader制度,定期分享会 118 | 2.目前岗位主要工作事项 119 | 120 | ### 3.21三面 121 | 122 | 三面应该是leader,没有自我介绍,直接开始面试 123 | 124 | **语言基础** 125 | 126 | 1. C语言如何实现C++的封装多态继承(回答指针) 127 | 2. C++的多态如何实现 128 | 129 | **项目** 130 | 131 | 1. 项目设计,项目中的技术难题当时如何解决 132 | 2. 数据库的了解。当时为什么用mariadb,没有用其他的?如果现在,还会用什么数据库?会怎么设计? 133 | 134 | ``` 135 | (这里一直逼问,算是有点压力push吧)最近有了解到其他数据库,会综合采用 136 | ``` 137 | 138 | 3. 自己项目难点如何解决的,为什么提出这样的解决方法?有没有参考别的软件做法?项目有什么完善的地方? 139 | 140 | **算法** 141 | 项目中涉及网络,说说字节序? 142 | 143 | 1. 如何判断字节序? 144 | 145 | ``` 146 | (此时已经晚上七点,三面刚刚压力push完,脑子有点发热)判断字节序有两种方法,都是基于对内存本质的理解。在写的时候漏了一个强制类型转换,面试官说问题不大。 147 | ``` 148 | 149 | 2. k个一组反转链表 150 | 151 | ``` 152 | 常见链表训练题了,没有采用递归,使用O(n)的做法。 153 | 写完没有让运行,看了一眼就给过了 154 | ``` 155 | 156 | **个人了解** 157 | 158 | 1.个人评价,优缺点是什么,平时和队友如何相处 159 | 2.项目中矛盾如何解决 160 | 3.如何评价字节跳动 161 | 162 | ``` 163 | 说了一下智能推荐系统,大数据+机器学习。 164 | ``` 165 | 166 | 4.个人规划,到岗时间 167 | 168 | ``` 169 | 这一点字节比较宽松吧,虽然投递的是暑期实习,但是可以提前去实习,看同学们的时间(哈哈哈哈哈哈) 170 | ``` 171 | 172 | ### -------------------------------------------------------------------------------- /ByteDance/商业变现_后端日常实习_tongji4m3.md: -------------------------------------------------------------------------------- 1 | # 一面(53min) 2 | 3 | 1. 代码:LeetCode15:三数之和 时间复杂度 4 | 2. HashMap结构、扩容操作、如果扩容红黑树节点会转回去吗 5 | 3. synchronized的原理、synchronized是否可重入、synchronized如何实现可重入、synchronized锁自旋会先来先到吗 6 | 4. 单例模式(写个自己觉得最好的) 7 | 5. Spring AOP的了解、Spring如何通过Cglib实现的动态代理 8 | 6. 写一个SQL语句:student(名字、课程、成绩),找出所有成绩超过80的学生名字 9 | 7. 聚簇索引了解不、select * from 表,咋执行 10 | 8. MySQL默认的隔离级别 11 | 9. token的结构、项目中登录的逻辑(简述)、token有什么问题、其他保持状态的方式 12 | 10. 对负载均衡有了解吗、项目瓶颈在哪,如何判断项目瓶颈? 13 | 11. 反问 14 | 15 | # 二面(65min) 16 | 17 | 1. 表现得不太好,疯狂挖项目,题写得也有点小问题,万幸给过了。 18 | 2. 个人觉得,项目不一定很大,但一定有充分的思考,为什么这样设计,并且把亮点都挖出来 19 | 3. 自我介绍(主要介绍项目) 20 | 4. 项目的登录逻辑、设置token的过期时间、如果token被拦截伪造登录了咋办、单点登录 21 | 5. Redis除了缓存还用在了哪 22 | 6. 下单操作 23 | 7. 压测关注什么指标、压的是哪个接口、压测时用了缓存没、过于响应时间的压测指标(关注哪个)、大致的压测配置 24 | 8. 负载均衡 25 | 9. 建立了哪些索引,联合索引哪个放在了前面 26 | 10. 索引的底层结构 27 | 11. 项目中的演出座位库存,写出他的sql逻辑、现在演出座位都是有编号的,现在给你现场设计,你如何设计 28 | 12. 第二个权限管理项目AOP的用法 29 | 13. 负载均衡的轮询策略 30 | 14. 用阿里云部署那有没有了解K8S 31 | 15. 使用expain时比较关心哪些参数? 32 | 16. 什么是覆盖索引 33 | 17. 对Java并发有什么了解、对哪个了解得比较深(synchronized,他发现上次问过了..)、公平锁非公平锁、ReentrantLock传参后是如何实现的公平锁 34 | 18. HashMap等集合在for循环中自己调用remove方法可以不 35 | 19. 代码:LeetCode39:组合总和 36 | 20. 做项目时怎么学习一门技术的,做项目前如何前期调研 37 | 21. 读过哪些开源项目的源码 38 | 22. Spring IOC了解吗 39 | 23. 反问 40 | 41 | # 三面(35min) 42 | 43 | 1. 自我介绍 44 | 2. 对字节有什么了解? 45 | 3. 智力题:9个人,一枚色子,选出两人,怎么比较公平? 46 | 4. 使用expain时比较关心哪些参数?(和二面问的一样) 47 | 5. Redis的持久化机制 48 | 6. 代码:LeetCode79:单词搜索 49 | 7. 反问 50 | 51 | # Hr面(30min) 52 | 53 | 1. 自我介绍 54 | 2. 是否有继续深造的打算,为什么不打算深造 55 | 3. 三轮面试的感受,三轮面试除技术外的感受,对哪个面试官印象比较深刻,面试回去后做了什么提升 56 | 4. 到岗时间,最快入职时间 57 | 5. 为什么投递字节商业变现后端?为什么选择后端? 58 | 6. 有投递其他公司吗 59 | 7. 简单介绍一下项目,是团队项目吗 60 | 8. 最有成就感的一件事 61 | 9. 学习途径 62 | 10. 用三个词进行自我评价 63 | 11. 你周围最欣赏的人,最欣赏的品质是什么? 64 | 12. 希望字节这个平台能给自己带来什么 65 | 13. 除了实习之外以后的职业规划 66 | 14. 心目中的大厂是什么 67 | 15. 反问 68 | -------------------------------------------------------------------------------- /ByteDance/基础库研发_前端_weixiang.md: -------------------------------------------------------------------------------- 1 | # 字节跳动 小程序部门基础库研发 前端 2 | 由于面试时间是在大三上学期,基础课程没有学完,所以问的知识点比较简单,大三上找实习的可以参考 3 | ### 一面 1小时 同事面 4 | * 没有自我介绍和项目介绍,直接做题 5 | * 遍历一棵二叉树树的每一层,只打印每层最左边的节点 6 | * 给定 n 和 k, 在一个数组中找到和为 k 的 n 个数,打印出所有情况 7 | * 判断满二叉树 8 | * 找一个数组中出现的第 k 个最大的数 9 | * 还有题实在不记得了,太久远了 10 | 11 | ### 二面 1小时 直属leader 面试 12 | * 自我介绍 + 项目介绍 大概半小时 13 | * 从输入 url 到浏览器渲染的主要流程 14 | * 正则表达式将下划线式命名转为驼峰式 15 | * 问了进程和线程,**但是没学**,和面试官说只学了操作系统存储管理,面试官让我把存储管理整章的内容复述一下,主要介绍了 16 | * 页式存储原理 17 | * 替换算法 18 | * 浏览器的请求状态码有哪些,分别表示什么含义 19 | * 浏览器存储数据的几种方式,都有什么区别 20 | * 代码实现 观察者模式 21 | * 代码实现 函数柯里化 22 | * 三次握手四次挥手 的过程,没学,跳过 23 | * http 常见请求方式,区别是什么 24 | * 反问:就问一面面试官对我评价怎么样 25 | ### 三面 1小时 部门leader 面试 26 | * 聊项目,大概三十分钟 27 | * c++ 实现一个四则运算 大概15分钟 28 | * 反问:问面试官听了自己的项目架构,有什么可以改进的建议 -------------------------------------------------------------------------------- /ByteDance/基础架构_C++客户端_Maoyao233.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/ByteDance/基础架构_C++客户端_Maoyao233.md -------------------------------------------------------------------------------- /ByteDance/基础架构_代码中台_skyleaworlder.md: -------------------------------------------------------------------------------- 1 | # 字节跳动面经 2 | 3 | * 部门:产品研发和基础架构 4 | * 岗位:代码中台 5 | * 地点:上海 6 | 7 | 个人简历摘要: 8 | 9 | * 语言:C / C++ / Python / golang; 10 | * 项目:一个前端项目,一个数据库课设,还有一堆平常自己写着玩的小玩意儿。 11 | 12 | ## 一面 65 min 13 | 14 | 我的一面面试官很和善,问的问题都围绕着我的项目和开发经历,并且当面告诉我过了一面。我也发现面试官并没有特别刁难我,真的非常感谢。 15 | 16 | * 项目:自己写的 RPC 框架中的协议应用了什么协议; 17 | * 常识:关于哈希算法: 18 | * 使用一致性哈希时,环上分配不均匀怎么办; 19 | * 了解多少种哈希算法; 20 | * 项目:关于文件服务器的文件存储: 21 | * 项目使用什么方式存储文件; 22 | * 如何处理大量具有相似前缀的文件存储; 23 | * 项目:项目的意义何在,具体应用场景是什么; 24 | * 常识:写前端时,如何与后端 / 团队线上合作; 25 | * 常识:关于数据库: 26 | * 熟悉哪些数据库的使用; 27 | * 集群中主从 MySQL 如何同步数据; 28 | * 语言:Python 如何优雅地测试函数的运行时间; 29 | * 算法:有序数组旋转后,求旋转后数组中的最小值; 30 | * 反问。 31 | 32 | ## 二面 47 min 33 | 34 | 二面面试官人很好,听到我这也不会那也不会,比我还先一步戴上痛苦面具。后面一直通过我的项目给我找话题,问的也都很简单,万分感激。 35 | 36 | * 常识:对 nginx 的有何了解: 37 | * 对 nginx 的组件有何了解; 38 | * 如何理解 nginx 的反向代理; 39 | * nginx 中添加负载均衡节点的语法是什么; 40 | * nginx 都有哪些状态码,5 开头的表示什么,500 / 502 / 503 是什么意思; 41 | * 常识:如何理解 MVVM: 42 | * MVVM 是做什么的; 43 | * MVVM 对于团队开发有什么优势和劣势; 44 | * 语言:Python 中的 is 和 == 有什么区别; 45 | * 项目:关于项目的权限管理: 46 | * 项目中的 RBAC 是如何做到的; 47 | * RBAC 相较于其他方式的优势是什么; 48 | * 设计模式:手写工厂模式,工厂模式的特点是什么; 49 | * 常识:关于 RPC: 50 | * HTTP 和 RPC 的差别是什么; 51 | * 如果一个系统同时使用 HTTP 和 RPC,二者会被分别应用于系统哪几类接口上; 52 | * 常识:关于 REST-ful 的思想: 53 | * REST-ful 风格 API 设计方式; 54 | * 常识:关于 HTTPS: 55 | * HTTPS 和 HTTP 有何区别; 56 | * SSL/TLS 是如何加密的; 57 | * 简述 HTTPS 握手; 58 | * 恶意第三方如何威胁 HTTPS; 59 | * 算法:岛屿计数问题; 60 | * 未来一段时间的安排情况和实习可能时间; 61 | * 反问。 62 | 63 | ## 三面 50 min 64 | 65 | 我的三面很奇怪,并没有问任何基础知识和项目细节,与其说是面试,不如说是唠家常。看之前学长学姐以及同届同学的面经,三面都会问一些比较困难,但与实际应用场景有关的问题。我大意了,没有闪。 66 | 67 | * 家常:关于 app 的日常使用: 68 | * 平常用得最多的应用是什么; 69 | * 用的时候觉得它最大的缺陷是什么; 70 | * 你作为使用者,是如何规避这个缺陷对你带来的影响的。 71 | * 项目:关于自己的项目: 72 | * 为什么会写这些项目; 73 | * 项目使用人数多吗; 74 | * 如果没有人用,你为什么要坚持写这些小项目,一直以来的动力是什么; 75 | * 项目:关于文档: 76 | * 觉得文档最重要的是什么; 77 | * 文档应该由几个部分组成; 78 | * 读过哪些优秀的文档,它们的特点是什么; 79 | * 有没有用 Java 注解生成过 API 文档呢; 80 | * 项目:关于测试: 81 | * 做项目的时候写测试吗; 82 | * 测试都有哪些方法; 83 | * 算法:二叉树的最大路径和。 84 | 85 | ## HR 面 65 min 86 | 87 | 我非常诚实,这 65 分钟没说半句假话。 88 | 89 | 求生欲是源自内心的、对车补餐补的疑问是源自内心的、对请假流程的试探是源自内心的、对自己性格 / 经历 / 未来发展方向的回答也是源自内心的。我是个怎样的人,我展现出来的就是一个怎样的人。 90 | 91 | 需要注意的是,嘉定校区离字节太远了,通勤时间非常长,据 HR 所说来回就是 3 个小时。所以 HR 很有可能会问 “是否已经确定好住处”,好像听起来 “是否确定住处” 和 “发 offer” 还是有一定关系似的,这有些让我感到迷惑。 92 | 93 | HR 面的结果让我等了整整一周,听同学讲,这是面试过程表现欠佳的表现——流程完美的参试者会当时拍板要人,而过程表现并不出色的参试者则会被拿来和其他同时期参试者进行比较,如果被比下去了,那就会被挂掉。 94 | 95 | ## 感想 96 | 97 | 学期初我就尝试过,但那时感觉自己实力不够,于是便放弃了。暑假面试的这次机会是学校给的,如果说之前学姐学长发邀请码叫 “内推”,那这应该就是 “校推”。可能也因此,面试相对学期内的比较轻松,问题也相对而言简单一些。(而且没有笔试,好像同时间的 “提前批” 一样,太爽了) 98 | 99 | 对我这种跟着学校培养方案学习的普通人来说,最大的短板应该是 “算法和数据结构”。在学校里面学习,理论基础和知识面想来不会有问题,所以八股文什么的,反而没必要准备。 100 | 101 | 我觉得找实习还是得趁早,越早越好。听说一位同学过了三面,HR 面的时候被告知招满了,让换个岗再面三次,这谁顶得住呀。早找实习的话,不会那么卷,选择肯定也更多。 -------------------------------------------------------------------------------- /ByteDance/大力智能_测开_josefRen.md: -------------------------------------------------------------------------------- 1 | # 字节-教育 测开 2 | 3 | 个人技术栈:C++ 4 | 5 | 项目经历:Robomaster机器人比赛 6 | 7 | 岗位类型:日常实习 8 | 9 | ## 一面 1h 10 | 11 | - 自我介绍 12 | - 问项目(面试官最后闲聊时坦白并不关心项目内容,只是考察个人在项目中的参与度以及表现) 13 | - C++ 14 | - 重写和重载的区别 15 | - 多态如何实现 16 | - 还有一些忘记了。。 17 | - 八股文 18 | - 计网 19 | - TCP三次握手原理,三次握手原因 20 | - 输入网址到打开网页全过程,越详细越好 21 | - 操作系统 22 | - 多线程和多进程各自优缺点 23 | - 测试的知识(软工课件或牛客网都有) 24 | - 黑盒白盒测试 25 | - 测试的意义(吹!) 26 | - 算法题 27 | - N皇后(3题选1题,面试官说这题最难XD) 28 | 29 | 一面的面试官很亲切,聊的很开心,问C++的时候直接坦白自己不会(但有题库),还分享了自己的从业心得,很乐。 30 | 31 | ## 二面 1h 32 | 33 | 二面与一面间隔一周,可能因为一面是周五面的。 34 | 35 | - 自我介绍 36 | - 问项目 37 | - C++ 38 | - 多线程(项目有用到) 39 | - 函数栈帧 40 | - 内存结构 41 | - 八股文 42 | - 忘了。。 43 | - 算法题 44 | - 两个线程依次输出0-100(和多线程过不去了) 45 | 46 | 47 | 48 | 二面的面试官很冷峻,不苟言笑的样子让我压力很大,但还好,问的问题都复习过,也顺利通过 49 | 50 | ## 三面 1h 51 | 52 | 三面与二面间隔一周,因为二面还是周五面的。 53 | 54 | - 自我介绍 55 | - 问项目 56 | - C++ 57 | - 忘了。。。 58 | - 测试思维 59 | - 如何测试电梯,写出所有待测项 60 | - 算法题 61 | - 不难 忘了。。。 62 | 63 | 三面面试官也很和蔼,找不到会议室直接在工位面的。问题都不算难,感觉过了前两轮技术面后面就比较稳了。 64 | 65 | ## HR面 30min 66 | 67 | - 个人 68 | - 在校参加过什么活动 69 | - 生活中遇到什么问题 70 | - 是否读研 71 | - 计划实习多久 72 | - 为什么选择这个岗位 73 | - 团队思维 74 | - 如果协作团队出了重大事故,你怎么办(检查自己团队是否有纰漏,警钟长鸣) 75 | - 参加的项目是怎么分工的 76 | 77 | HR面只要记住一切回答都是为了offer就行了:不读研、实习时间满足公司最低要求、对岗位有热情……考察性格和团队思维的问题至少不能表现出自己这方面存在缺陷(不然八股和算法白刷了)。 78 | 79 | 80 | 81 | ## 总结 82 | 83 | 测开虽然属于QA但现在也逐渐变卷,OS、DB、计网的知识点都必须准备好。实际问题难度和牛客网的复习资料相当。字节的算法题也确实爱出hard,N皇后在leetcode上是hard,算是捡了个漏。 84 | 85 | -------------------------------------------------------------------------------- /ByteDance/抖音_客户端_asheng.md: -------------------------------------------------------------------------------- 1 | # 字节跳动 _抖音客户端 _阿生 2 | 3 | ## 一面 50min 4 | 5 | - ·自我介绍 6 | 7 | - 项目相关 8 | 9 | mips相关知识,面试官最后推荐可以看看arm64,实际的生产环境用到 10 | 11 | 由于项目经历里写了个数据结构的课设,用到了迪杰斯特拉,追问了很多图论方面的内容 12 | 13 | 编译原理,重点问了LR(1)的过程,以及四元式相关 14 | 15 | - c++内存空间组织 16 | 17 | - 数据库ACID特性,事务的定义 18 | 19 | - 事务的基本操作 20 | 21 | - 小岛海洋问题(给定二维数组,1为陆地,上下左右可扩展,判断总共有几个陆地) 22 | 23 | 使用递归解决,面试官推荐看看floodfill算法 24 | 25 | - 区间数组合并(讲讲思路,先排序,一次扫描合并) 26 | 27 | 28 | 29 | ## 二面 1h10min 30 | 31 | - 自我介绍 32 | 33 | - 项目相关 34 | 35 | 重点询问了mips cpu的开发过程、难点、调试方法 36 | 37 | - 网络分层、分层的原因、各层涉及到的协议 38 | 39 | - TCP/UDP区别,分别涉及到的协议 40 | 41 | - TCP为什么是安全的 42 | 43 | - http状态码 44 | 45 | - 虚函数的作用 46 | 47 | - 指针和引用的区别 48 | 49 | - 网址字符串翻转(以. 分开) 50 | 51 | - 先序遍历二叉树(递归、非递归) 52 | 53 | - 闲聊(技术博客的使用) 54 | 55 | 56 | 57 | ## 三面50min 58 | 59 | - 自我介绍 60 | 61 | - 项目相关 62 | 63 | 再次细问mips指令集架构、格式 64 | 65 | 编译的各阶段及作用 66 | 67 | - 数据库索引的适用条件 68 | 69 | - 数据库ORM模型 70 | 71 | - 数据库如何防注入 72 | 73 | - 对称加密和非对称加密的区别,为什么https在数据传输阶段使用对称加密、为什么使用https仍然可以被抓包 74 | 75 | - http或https如何实现缓存机制 76 | 77 | - 多态的实现方式(在平时开发中是否用过并举例) 78 | 79 | - 开放题:json格式如何存储图片(回答使用像素坐标加rgb值,未get到点,矢量图无法使用此方法,,boss提醒可以去看看编码算法) 80 | 81 | - 翻转链表 82 | 83 | - 压缩字符串 84 | 85 | - 反问环节 86 | 87 | ## 四面 50min 88 | 89 | - 自我介绍 90 | 91 | - 为什么选择客户端开发 92 | 93 | - 项目相关 94 | 95 | mips相关:模块化设计的好处、指令集架构、CISC和RISC区别和应用场景 96 | 97 | - 操作系统的复制和粘贴具体阐述、进程通信、深浅复制 98 | 99 | - 算法:输入一个数字字符串,寻找比它大的数中最小的一个,如1234,找到1243 100 | 101 | - 场景题:抖音的优缺点、缺点的改进思路(我说了它的刷新机制) 102 | 103 | - 闲聊:了解的最新技术动态、客户端开发的学习路径 104 | 105 | 106 | ## 总结 107 | 108 | 此次春招,准备时间很短,直到很晚抱着尝试的态度找实习。可能因为我确实太菜,三次面试的算法题目都非常简单,更加注重细节及边界条件,但我的表现,一言难尽。 109 | 110 | 一点建议的话,就看面经的同时尽可能的多深入了解一下,同时要加强刷题,剑指、leetcode都可以,我的算法能力是严重短板。 111 | 112 | 许愿offer!!! 113 | 114 | -------------------------------------------------------------------------------- /ByteDance/朝夕光年_游戏引擎实习二面凉_qingquan(23).md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/ByteDance/朝夕光年_游戏引擎实习二面凉_qingquan(23).md -------------------------------------------------------------------------------- /ByteDance/飞书_服务端实习_wasd003.md: -------------------------------------------------------------------------------- 1 | **状态**: 收到offer 2 | 3 | # 一面 4 | 5 | 一面没有问基础知识,问了许多企业级开发会涉及到的东西,算是比较出乎意料,事先也没有准备过,个人感觉答的比较一般。不过面试官人非常nice,一些问题虽然不会但是也都聊得比较好。 6 | 7 | ## 基本问题 8 | 9 | 1. 对redis的了解 10 | 2. 微服务与单体项目的比较 11 | 3. docker中的网络 12 | 4. MySQL的底层原理,回答了B树实现,又追问了B树与B+树的区别 13 | 5. ACID的含义 14 | 6. 由于项目经历里写了数仓的项目,因此问了ETL是什么意思,项目当中ETL具体做了哪些工作 15 | 7. MySQL的缓存策略 16 | 8. 对负载均衡的了解,回答了云计算里学过的一致性哈希算法 17 | 18 | ## 算法题 19 | 20 | 事后才知道两道都是leetcode原题,一道mid难度,一道hard难度 21 | 22 | ### problem1 23 | 24 | #### 题目描述 25 | 26 | 给定一个非负整数数组nums ,最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。 27 | 28 | #### 解题过程 29 | 30 | 一开始想的是dp,但是dp的话不太好判断应该从哪里转移,然后想到了贪心,维护当前可到达的最右边界即可。 31 | 32 | ### problem2 33 | 34 | #### 题目描述 35 | 36 | 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。 37 | 38 | #### 解题过程 39 | 40 | 这个题是上一道题的变种,正解是利用单调性进行dp,思路比较有跳跃性,临场想到的是维护两个指针进行贪心,感觉有点问题,不过面试官给过了。 41 | 42 | # 二面 43 | 44 | 二面面试官比较严肃,会追着技术细节问,有些压力。 45 | 46 | ## 项目相关问题 47 | 48 | 1. 软工项目同时用了android和vue作为前端,问为什么android不使用Nginx,这个答的不好,我之前一直以为Nginx是web端才要用的,根本没想过和android有什么关系 49 | 2. 直播功能是如何实现的,流媒体服务器架构 50 | 3. 接入支付宝后交易的执行流程,这个地方应该就是想看我们的项目会不会接受支付宝发来的异步通知,确保收到款项 51 | 52 | ## 基础知识 53 | 54 | 1. 在浏览器输入一个url到显示页面发生了什么 55 | 2. spring如何并发处理多个http请求,MySQL又如何处理多个同时到达的请求 56 | 57 | ## 算法题 58 | 59 | ### 题目描述 60 | 61 | 每个文件都会有一系列时间戳,找到一个最小区间使得这个区间可以将所有文件的至少一个时间戳包含在内。 62 | 63 | ### 解答过程 64 | 65 | 很容易想到在每一个文件上都设置一个指针指向当前时间戳,关键是要快速找到当前所有指向的时间戳的最大值和最小值并设计指针移动策略,因此想到了同时开最大堆和最小堆,面试官说想复杂了,后来反应过来时间戳是单调递增的,指针移动过程中最大值只会变大,因此维护一个最大值+最小堆就行了。写完代码后面试官看完就过了。 66 | 67 | # hr面 68 | 69 | 对飞书的了解,个人优缺点,项目中的贡献等等 70 | 71 | # 建议 72 | 73 | 1. 只是使用过的技术就不要写到简历中了,面试如果问技术都会问底层实现,如果没有特意研究过很容易答不出来。 74 | 2. 基础知识方面不能只靠学校课程的笔记进行复习,学校里教授的内容和面试考察的内容侧重点不一样。比如计网,课内比较重视链路层和网络层,但是面试基本只考应用层和传输层。再比如数据库,课内比较重视SQL,各种范式,ER图还有ER到表的转换,甚至连物理存储都讲过,但是面试比较注重考查事务,缓存还有具体的DBMS这些东西 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /HuaWei/readme.md: -------------------------------------------------------------------------------- 1 | 华为面试经验 2 | -------------------------------------------------------------------------------- /MeituanDianPing/readme.md: -------------------------------------------------------------------------------- 1 | # 美团点评面经 2 | -------------------------------------------------------------------------------- /MeituanDianPing/基础研发平台_后端开发_yhd.md: -------------------------------------------------------------------------------- 1 | ### 2020暑期实习--美团面试 2 | 3 | ### 1. 笔试 4.23 120min 4 | 5 | 笔试爆炸,没想到会被安排面试 6 | 7 | ### 2. 一面 4.28 25min 8 | 9 | 一面出乎意料的快..应该凉凉 10 | 11 | - 自我介绍 12 | 13 | - 项目介绍 14 | 15 | - 记不记得笔试题目?(不记得) 16 | 17 | 笔试完有没有搜答案?(没有) 18 | 19 | 有没有在刷题?刷了多少?(最近才开始准备,没刷多少) 20 | 21 | - 了解sql?(no) 22 | 23 | 数据库索引的类型?(普通、唯一、全文、组合) 24 | 25 | 索引匹配规则?(不了解) 26 | 27 | - 第k大的数(快排,map) 28 | 29 | -------------------------------------------------------------------------------- /MeituanDianPing/机器学习平台_后台开发_zhangyiwen599.md: -------------------------------------------------------------------------------- 1 | ### 2020暑期实习--美团面试 2 | 3 | 4 | 5 | ### 1. 笔试 4.2 120min 6 | 7 | 我参加的是4月2号的笔试,因为当天下午面试了腾讯,由于面的很差所以心态有点爆炸,吃完饭都已经7点了笔试也是7点开始,当时感觉自己太菜了都不想去考了,但是最后还是强迫自己去考了(所以同学们千万不要放弃啊,说不定就有公司看上你了呢)。当时估计5道题加起来ac了两道半把,这里有个小trick,如果有些题实在不会做,可以试试输出样例,有些时候能够得一点分数。 8 | 9 | 10 | 11 | ### 2. 一面 4.4 60min 12 | 13 | 美团的效率还是不错的,考完第二天就打电话预约面试,如何就约了4.4。由于时间比较久了,很多问题都记不起来了,我就大致列一下我还有印象的。 14 | 15 | * 自我介绍 16 | * 项目介绍 17 | * TCP 三次握手(这里我还延申讲了一些 SYN_cookie),四次挥手. 18 | * c++ 多态的实现 19 | * 堆和栈的区别 20 | * 数据库索引,使用什么数据结构,有什么好处 21 | * 讲一下epoll (这里我讲了一下和select的区别) 22 | * 深浅拷贝的区别 23 | * python和c++的区别 24 | 25 | 26 | 27 | ### 3. 二面 4.9 40min 28 | 29 | 这一面应该是leader面,感觉没问什么基础知识,自我介绍完了之后就直接让我将项目,我讲的是之前计网的网盘项目,然后面试官就开始让我想可以在哪些方面进行优化,这里我回答的不是很好。然后又问我如果要在移动端实现一个网盘app,和在pc有什么不同。 30 | 31 | 最后是手撕算法,算法题挺简单的,就是一个棋盘,棋子是中国象棋里面的马,给定棋盘与起始坐标输出一个能走完棋盘上所有位置的序列,我当时直接用dfs就写出来了。 32 | 33 | 最后反问环节就问了一下实习生的培养方案,然后面试官就给了口头offer 34 | 35 | 36 | 37 | ### 4. offer call 4.15 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /MeituanDianPing/美团面经.md: -------------------------------------------------------------------------------- 1 | ## 美团面经 2 | 3 | 部门:美团小象 4 | 5 | 岗位:后端开发(Java) 6 | 7 | 面试轮数:3轮技术面+1轮hr面。 8 | 9 | 个人情况:简历上有一个微信小程序的项目,以及两个课程的设计(cpu和语法分析器)。数据结构和算法能力较强,leetcode 900题。学习java时间较短,准备了两个月,只学了基础语法和JUC以及JVM相关知识。目前学框架。 10 | 11 | ### 笔试 12 | 13 | 时间: 2020-04-23 19:00~21:00 14 | 15 | 题目:5道编程题目 16 | 17 | 总体完成:3.5 18 | 19 | 整体难度:以leetcode的难度划分为,2道easy,2道mid,1道hard。 20 | 21 | 22 | 23 | ### 一面 60min 24 | 25 | 时间:2020-04-29 17:00 26 | 27 | 持续时间:60min 28 | 29 | ##### 排序算法 30 | 31 | 时间复杂度 32 | 33 | 空间复杂度 34 | 35 | ##### HashMap 36 | 37 | 1.HashMap resize过程。 38 | 39 | 2.HashMap put 40 | 41 | 3.HashMap不安全 42 | 43 | 4.HashMap的死锁问题 44 | 45 | ##### ConcurrentHashMap 46 | 47 | 1.ConcurrentHashMap为啥是线程安全的 48 | 49 | 2.ConcurrentHashMap的初始化。 50 | 51 | 3.ConcurrentHashMap的并发效率(从锁粒度去考虑) 52 | 53 | 4.ConcurrentHashMap的效率 54 | 55 | ##### Synchronized 56 | 57 | 1.Synchronized的底层原理 58 | 59 | 2.公平锁还是非公平锁 60 | 61 | 3.Synchronized的锁升级过程 62 | 63 | 4.Synchronized的非公平锁实现方式 64 | 65 | 5.什么是偏向锁 66 | 67 | 6.自旋有什么优点和缺点 68 | 69 | ##### ReentrantLock 70 | 71 | 1.ReentrantLock的原理 72 | 73 | 2.非公平锁怎么实现的 74 | 75 | ##### AQS 76 | 77 | 讲一下AQS的情况 78 | 79 | ##### Java虚拟机 80 | 81 | - 说一下垃圾回收机制 82 | - 对象一定直接在年轻代分配吗(大对象分配到老年代 83 | - jvm调优做过吗,讲一讲 84 | - 说一下Java的垃圾回收算法 85 | - 可达性分析算法有哪些 86 | - CMS清理数据的流程,什么时候会stop the world 87 | - CMS的缺点和优点 88 | 89 | ##### 数据库 90 | 91 | 1.数据库的索引 92 | 93 | - Innodb的索引 94 | - B+树特性 B-树对比 95 | - 一个结点的大小,为啥是4k 96 | - 3层B+树最多存放多少数据 97 | 98 | - 联合索引 99 | - A,B,C 100 | - A,B,C走索引吗,A,B走索引吗,A走索引吗 101 | - AC走索引吗 102 | 103 | 2.事务 104 | 105 | - ACID 106 | - 事务的隔离性,各自带来的问题以及解决了什么问题。 107 | - MVCC 108 | 109 | ##### 项目 110 | 111 | 只有一个小程序,抓着怼,怼死我了。 112 | 113 | - 1.如何避免一个按钮多次提交。 114 | - 2.大量数据突然加载的时候,怎么去做缓存。 115 | - 3.搜索功能怎么实现的。 116 | - 4.有哪些地方可以优化 117 | 118 | ##### 写代码 119 | 120 | 每一个美团外卖的订单都有一个StartTime和一个endTIme。求一天哪些时刻尚未送达的外卖订单数最多。(冒死截图 121 | 122 | ![image-20200513214017072](C:\Users\15504\AppData\Roaming\Typora\typora-user-images\image-20200513214017072.png) 123 | 124 | 思路:维护一个差分数组,定点修改,最后遍历一遍求最大值,获得最大值后根据最大值匹配时刻。 125 | 126 | 127 | 128 | 129 | 130 | ### 二面 45min 131 | 132 | 时间:2020-5-7 17:00 133 | 134 | 持续时间:45min 135 | 136 | ##### 自我介绍 137 | 138 | + 学校教的什么语言 139 | 140 | + 为什么学Java不学C++ 141 | 142 | #### 基础知识 143 | 144 | + Java的八大基本数据类型 145 | + char类型几个字节 146 | + 补码反码 147 | + 补码解决了什么问题 148 | 149 | #### JVM 150 | 151 | + 垃圾回收的内存管理 152 | + CMS和G1垃圾回收期的区别 153 | + CMS和G1垃圾回收器的适用场景 154 | + JVM调优做过吗(木有 155 | 156 | 157 | 158 | #### 数据库 159 | 160 | + 数据库隔离级别 161 | + Mysql默认隔离级别 162 | + B+树的结构 163 | + InnoDB引擎下的表存储格式 164 | + 索引 165 | + 基于B+树的区间查询流程 166 | 167 | 168 | 169 | #### 网络 170 | 171 | + TCP三次握手过程 172 | + TCP四次挥手过程(详细到每一个状态) 173 | + 滑动窗口——流量控制 174 | 175 | 176 | 177 | #### 项目 178 | 179 | + 小程序项目 180 | + 什么数据库 181 | + 怎么去查询 182 | + 用户个数多少(个位数QAQ 183 | + 你这个太简单了。。。 184 | 185 | 186 | 187 | #### 框架 188 | 189 | + 中间件什么的了解吗。(NO 190 | 191 | + Spring源码看过吗 192 | 193 | + 动态代理咋实现的 194 | + 基于JDK的动态代理和cglib的动态代理有什么区别 195 | 196 | 197 | 198 | + Java字节码了解吗(可以跳过,这里纯属面试官挖个人底层掌握深度 199 | 200 | + 一个类加载后的字节码都有哪些东西。 201 | 202 | 203 | 204 | #### Linux 205 | 206 | + 怎么查找Java相关的进程 207 | + 如何查找一个文件 208 | + Linux文件结构 209 | 210 | 211 | 212 | #### 编程 213 | 214 | + 整数反转 215 | 216 | 217 | 218 | #### 个人问题 219 | 220 | + 能不能来北京,实习多久。 221 | 222 | 223 | 224 | 225 | 226 | ### 三面 50min 227 | 228 | 时间:2020-5-12 15:00 229 | 230 | 持续时间:50min 231 | 232 | 233 | 234 | #### 自我介绍 235 | 236 | 237 | 238 | #### 项目 239 | 240 | + 做的最好的项目 241 | + 项目目的,项目设计,迭代过程,达到的结果。 242 | 243 | 244 | 245 | #### 聊天+随意提问 246 | 247 | + 说一下http协议,一个url输入道浏览器后发生了什么,特别提示:不要背,说说自己的理解以及设计原理 248 | + DNS基于TCP还是UDP,为什么 249 | + 谈一谈IP协议 250 | + 3g,4g,5g应该位于哪一层,为什么 251 | + https和http有什么不同 252 | + https的优势和过程,用到了哪些密码学技术。 253 | + 为什么不使用非对称加密,而使用对称加密。 254 | + 说一说http的请求报文段和回复报文段都有哪些属性 255 | + 表示重定向的状态码,永久是什么,临时是什么。 256 | + 十亿数据库分库分表怎么做(懵逼x1) 257 | + 分布式学过吗(懵逼X2 258 | + 今后的职业规划是啥呢小朋友 259 | + 斩钉截铁:做开发。对面(笑。。。 260 | 261 | 262 | 263 | #### 写代码 264 | 265 | + 给定一个数字12345,转换为一万两千三百四十五元。 266 | + 十分钟,能写多少写多少,尽量多考虑特殊值问题,如00001,10101,10000,0。 267 | 268 | 269 | 270 | ### HR面 20min 271 | 272 | 时间:5.12日 18:00 273 | 274 | + 读研吗 275 | + 为啥不确定 276 | + 为啥想读 277 | + 为啥不想读 278 | + 研究生你觉得会带来什么 279 | + 你喜欢什么方向 280 | + 学历重要吗 281 | 282 | + 最佩服的人是谁 283 | 284 | + 最让你感动成长的事情是什么 285 | 286 | + 大学里面有什么经历 287 | 288 | + 大学里面最有成就的事是什么 289 | 290 | + 团队合作问题 291 | 292 | + 对进入美团有什么想要求的 293 | 294 | + 最近在忙啥 295 | + 为啥忙这些 296 | + 收获了什么 297 | 298 | + 面了哪些公司 299 | + 华为过了吗 300 | + 快手到哪儿了 301 | 302 | 303 | 304 | + 有啥问我的 305 | + 远程实习 306 | + 为什么想远程实习 307 | + 为什么不能直接来 308 | + 远程实习和现场你觉得有啥区别 309 | 310 | 311 | 312 | 313 | 314 | ### 个人建议 315 | 316 | ​ 如果想要直接工作,那么找到一个大厂实习能让你在秋招中拿到不错的offer。在这里谈一些个人经验。 317 | 318 | + 算法和数据结构 319 | 320 | 我个人也参加了许多公司的笔试,基本都拿到了不错的成绩。leetcode一定要好好刷,刷的越早越好,而且我推荐一开始去刷探索,刷完简单的探索后,进行分类刷题。我推荐的刷题顺序为: 321 | 322 | + 栈 :掌握单调栈的应用。 323 | + 堆:top k问题。 324 | + 队列:滑动窗口问题 325 | + 排序 326 | + 回溯:排列组合问题 327 | + bfs,dfs:bfs结合树的层次遍历理解,dfs推荐理解解数独这道题 328 | + 递归:结合二叉树去做,去理解。 329 | + 贪心:加油站问题 330 | + dp:小偷问题,最长递增子序列,回文串相关问题。 331 | 332 | 学有余力的同学可以继续探索: 333 | 334 | + 并查集:除法处理问题。 335 | + 字典树 336 | + 图的相关问题。 337 | + 线段树,树状数组。 338 | 339 | + 项目 340 | 341 | 有一个好的项目会引起面试官极大的兴趣。而我由于没有啥好项目所以一直在被面基础,还好都答上来了。在这里,sj老师是绝对超值的选择。找实习的不二之选(好后悔为了摸鱼没选sj老师。为老师打call!!!!!!!!!!! 342 | 343 | 如果没项目的话,要选择适当的角度向面试官展示自己的学习能力和基础知识的扎实,以达到面试官确认你是一个可塑之才。 344 | 345 | 有好的项目的话,一定要把项目吃透,自己去挖掘可以优化的点,达到有话可说,不至于在聊天的时候陷入彼此沉默的境界(就是我。。 346 | 347 | 348 | 349 | + 面试经验 350 | 351 | + 专业课 352 | 353 | 在面试的时候,专业课一定要一定要攻克,我在面试的过程中也认识了一些刷下来的同学,转行的居多。可见,专业课在面试官中的比重还是非常大的。提问的时候,以数据库,计算机网络,操作系统居多,编译原理涉及的较少(对于后端开发方向)。 354 | 355 | + 基础知识 356 | 357 | 在一二面的时候,基础知识也是很大的比重,也决定了面试官对你的印象,一些简单的基础知识一定要熟练掌握,比如java的八大基本类型,各占哪些字节,Java集合,常见的排序算法等等。 358 | 359 | + 在面试的时候,要避免冷场,当问到不会的问题的时候,要选择性地说几句你觉得相关的,或者说直接转置相关你熟练的问题,比如在一面的时候,面试官问我synchronized是如何实现可重入的时候, 我当时很懵,因为根本没去看过底层, 然后我转移到了ReentrantLock这个锁的可重入实现上方式,打开了新的话题。 另外就是一些不会的东西直接说不会就可以,比如二面的时候面试官给我了一段程序,问我编译后字节码是啥样子的,这里是为了测试下你对底层的理解程度,不会也可以原谅,会了是个加分的操作。又如三面的时候,分布式的相关知识根本不了解,扯都没法扯,只能不会了。 360 | 361 | + 手撕代码的时候,一定要多多去考虑边界以及优化。比如整数反转这么一个很简单的问题,要考虑到负数和边界两个问题。要虚心接受面试官给的优化建议,在他给了建议后,可以尝试直接在原基础上更改,表现出自己的积极主动性,也是个加分操作。手撕代码一个是看你的代码能力如何,另外一个也是看你的代码风格。千万不要a,b,c,d胡乱起名,这样很容易引起面试官的方案。在写代码的时候,实在写不出来了,可以给面试官介绍下自己的思路以及认识,这样也有可能过去。 362 | 363 | 364 | 365 | -------------------------------------------------------------------------------- /Netease/网易互娱_游戏研发实习一面二面凉_qingquan(23).md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/Netease/网易互娱_游戏研发实习一面二面凉_qingquan(23).md -------------------------------------------------------------------------------- /Tencent/IEG_后台开发_josefRen.md: -------------------------------------------------------------------------------- 1 | # 腾讯IEG——后台开发 2 | 3 | 个人技术栈:C++ 4 | 5 | 项目经历:Robomaster机器人比赛 6 | 7 | 实习经历:字节测开-日常实习 8 | 9 | 岗位类型:暑期实习 10 | 11 | ## 一面 1h 12 | 13 | - 自我介绍 14 | - 问项目 15 | - C++ 16 | - 内存结构(很要命,给忘了。。) 17 | - 虚函数(问得很深) 18 | - 内存对齐 19 | - 八股文 20 | - 计网 21 | - socket网络编程(没看。。) 22 | - TCP三次握手 23 | - 操作系统 24 | - 说说协程(没看。。) 25 | - 进程和线程的区别 26 | - 算法题 27 | - 二分查找首个小于目标值的元素所在位置(分有无重复元素两种情况) 28 | 29 | 字节实习强度太大。一面技术面只准备了两周不到,好多简单的问题都忘光了。。。还好算法题回答的不错(不用手撕,口述思路),面试官评价:“算法思维刷出来了”。感觉这次是低空飞过。 30 | 31 | ## 二面 1h 32 | 33 | 二面与一面间隔一周。 34 | 35 | - 自我介绍 36 | - 问项目 37 | - 情景设计题 38 | - 设计一个数据结构,满足:可插入数据;高性能查找数据;淘汰最久未使用的数据(LRU) 39 | - 个人 40 | - 为什么想做游戏 41 | - 对游戏后台的理解 42 | 43 | 二面总监面更多在考察个人素质而不是技术。 44 | 45 | 46 | 47 | ## HR面 30min 48 | 49 | - 个人 50 | - 字节实习有什么收获 51 | - 是否读研 52 | - 计划实习多久 53 | - 为什么选择这个岗位 54 | - 职业规划 55 | - 如何克服工作中的困难 56 | 57 | HR面中规中矩,和面试官正常聊就可以。 58 | 59 | ## 总结 60 | 61 | 腾讯面试官似乎不太爱开摄像头,两轮技术面都没开,以为要被挂了。C++问得较深,自己这次准备不足但还是勉强通过了,主要是因为自己算法题刷的比较多吧。闲聊时面试官有提到socket网络编程,如果明确希望走后端方向的话可以多准备下socket编程,会是一个很大的加分项。 62 | -------------------------------------------------------------------------------- /Tencent/IEG_游戏引擎开发_Zheng.md: -------------------------------------------------------------------------------- 1 | # 腾讯IEG—游戏引擎开发 2 | 3 | 4 | 5 | 岗位要求:至少掌握一种游戏开发常用编程语言,具备C++/C#开发经验;对图形、物理、动画、AI等某一领域比较书序;熟悉Unreal、Unity等商业引擎,曾参与过自研或开源游戏引擎的开发者优先。 6 | 7 | 8 | 9 | 因为我是打算出国的,暑假也找了暑研,所以实习投的是11月入职的日常实习(想在申请前再拿一封实习老板的推荐信),但是不知道为啥好像把我放在暑期实习这一批一起面了,而且因为是提前批也就没有笔试的环节,对我这种Leetcode才刚开始刷一周的人来说太友好了。由于我个人也没有游戏引擎开发的相关经验,但是有计算机图形学的基础也有一个利用OpenGL实现的一个小游戏的大作业,另外在AI方向有几个CV方向的项目,故我在面试的时候,把重点放在了图形学和CV两个方面。 10 | 11 | 12 | 13 | --- 14 | 15 | ### 一面 16 | 17 | * 首先是自我介绍,然后开始聊项目 18 | 19 | 20 | 21 | * CV项目的深挖 22 | 23 | * 主要是问我的项目是偏ML一些还是CV一些,问了模型的细节,因为都是自己在学校实验室做的,所以都能解释清楚 24 | * 然后问我认为Deep Learning与传统Machine Learning的区别与优势,另外追问我觉得Deep Learning带来的巨大计算消耗与获取提升相比是否值得?工业界上无法承受这样的计算消耗怎么办?我主要是谈了一下实验模型正确率提高的意义,然后说自己的项目做的也都是小样本的分类任务,所以也没处理过这种计算开销过大的问题 25 | 26 | 27 | 28 | * 图形学项目的深挖 29 | 30 | * 我先说了自己学过计算机图形学,然后面试官先考了一波图形学的基础知识: 31 | 32 | * Z-fight是什么?如何解决? 33 | * 图形学中的坐标系和坐标变换 34 | * 简述一下Ray-Tracing的算法 35 | 36 | * 然后我用视频展示了一下自己的大作业,就是一个用OpenGL写的小游戏 37 | 38 | * 面试官问我里面用了什么光照模型?——我说是Phong Lighting Model 39 | * 然后他继续问我你知道现在的3A游戏是什么光照模型?——我说光追 40 | * 那关掉光追之后呢? ——然后我就不清楚了 41 | * 然后又继续问了我代码的细节,使用了哪些API之类的,只能凭印象说了 42 | 43 | 44 | 45 | * 然后是关于游戏的一些问题 46 | 47 | * 你玩过哪些游戏?最喜欢什么游戏?你想做什么样的游戏 48 | 49 | * 我说像塞尔达那种优秀的充满游戏性的3A大作 50 | 51 | * 你觉得国内为啥不做这样的3A大作呢? 52 | 53 | * 我主要是谈了一下国内国外的游戏玩家结构和习惯,然后面试官跟我透露他们组就是在做一款耗资比较大的3A新游(这里应该是正好match了面试官的想法,跟他聊天可以感觉到他是真的想做好游戏的那种人) 54 | 55 | * 游戏中的bot你了解过是如何实现的吗? 56 | 57 | * 这个我没接触过,但是我当时猜测了一下,说应该是用Reinforcement Learning的方式训练得到的 58 | * 然后面试官说,可以明确告诉你大部分都没有用你说的ML的那一套,那你觉得是如何实现的? 59 | * 然后我就又猜,应该是用状态机来做的吧,然后面试官就问了我问我如果让你来设计你怎么做?我就随便瞎扯了...(不过应该还是沾到边了,所以不懂的时候可以冷静分析,提出想法,比单纯说不知道要好很多) 60 | 61 | 62 | 63 | * 最后问了我有没有接触过Unity之类的游戏引擎? 64 | 65 | * 我说我自己没有真正使用过,但是周边有同学用Unity开发小程序的,听说上手没有特别难,自己应该有能力花一定时间去掌握(这里被面试官嘲笑了:那你是觉得开发游戏很简单咯?连忙解释...) 66 | 67 | 68 | 69 | 70 | 71 | --- 72 | 73 | ### 二面 74 | 75 | 一面后3天接到二面的通知,上午通知下午就面试 76 | 77 | 二面上来也是自我介绍,聊了一下项目 78 | 79 | 出了一些关于C++问题,具体问了啥有点记不清了 80 | 81 | 然后就开始聊对游戏行业的理解、想要做什么类型的游戏、为什么要选择游戏引擎开发这个岗位,谈到一半面试官突然接通知说有事,然后说一面的技术面已经过关,他这边主要是了解我对游戏的一些想法和他们组是否match,这边也没什么问题,就先给我过了... 总共不到半小时吧... 82 | 83 | 84 | 85 | 86 | 87 | --- 88 | 89 | ### HR面 90 | 91 | (不要觉得HR面就是稳了,还是会刷人的) 92 | 93 | 二面完2小时,我在吃晚饭的时候HR电话就打过来问我有没有空谈一下,放下筷子就去面试去了... 94 | 95 | 主要问了一下问题: 96 | 97 | * 为什么选择游戏引擎开发岗? 98 | * 未来想在哪里发展?为什么呢? 99 | * 出国or读研or工作?——我说的是原本想出国,但现在疫情形势不明朗开始准备工作 100 | * 那又为什么不保研呢? 101 | * 理想中的工作是怎么样的? 102 | * 谈谈自己的核心竞争力在哪? 103 | * 谈谈自己的缺点? 104 | 105 | 一共大概30min,感觉HR面就是抛出一些带坑的问题,然后期待你漫不经心踩坑。我觉得最好就是顺着HR思路来答,比如问你想在哪发展,肯定是回答他们部门所在地,然后实习当然是比较希望你直接工作,就不要把话说死了就行了。 106 | 107 | 108 | 109 | --- 110 | 111 | ### 总结 112 | 113 | 这次能拿到腾讯的游戏引擎开发的offer,感觉运气还是帮了挺大的忙。图形学自己复习过回答的还不错,应该是比较大的加分项,然后自己对游戏的想法又和面试官比较match,也算是运气比较好的地方,要是被开发手游的部门捞去,说不定就过不了了,哈哈哈 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /Tencent/IEG_运营开发_bozhi.md: -------------------------------------------------------------------------------- 1 | ## 腾讯2020暑期实习面经 2 | 3 | ### 腾讯WXG一面 4 | 5 | 6 | 3.16-20:10 腾讯电话面 7 | 8 | **先是四个简短算法题** 9 | 10 | 1. 非递减链表中去除重复元素 11 | 2. 两个数组,A和B,找到A中任意一个元素和B中任意一个元素,两个元素的差绝对值,求最小差绝对值 12 | 13 | ``` 14 | 栽这了,一开始暴力 15 | 排序,查找两个集合重叠地方,一个从大往小,一个从小往大 16 | 最后排序二路归并,,没想到,提示了 17 | ``` 18 | 19 | 3. 找出unint32 二进制串中连续0的最大长度 20 | 21 | ``` 22 | 开了一个数组有点冗余了 23 | ``` 24 | 25 | 4. 矩阵,左上角到右下角,移动路径之和最大值 26 | 27 | ``` 28 | dp,剑指上有,一开始m*n空间,提示优化 29 | 说了思路,过了 30 | ``` 31 | 32 | **基础问题以及项目** 33 | 34 | 5.然后问了问项目 35 | 36 | ``` 37 | 详细说项目设计。面试官提出一点设计不合理的问题:服务器磁盘的操作会多一次读取和写入。当时设计项目时考虑的代码好实现,没有考虑这个问题。 38 | ``` 39 | 40 | 6. 最后一个问题,100亿个url,存放在一个文件里,来了一个新的url,查找是否在里面 41 | 42 | ``` 43 | 1. 先答了分布式,到n个服务器,每个服务器存某一类url,主服务器存索引,但查找还是慢,log(n) 44 | 2.然后B+树,存索引, 45 | 最后还是没到点上。 46 | 答案:hash,两次hash。 47 | ``` 48 | 49 | ### 运营开发电话面+视频面 50 | 51 | 均为基础知识考察: 52 | 1.TCP 53 | 2.进程和线程区别 54 | 3.select、poll、epoll三者说说 55 | 4.网络socket通信流程,socket,bind,listen流程。完整的网络通信大概流程,详细说。 56 | 57 | 基本算法手撕。 58 | 59 | 60 | ### 运营开发复试 61 | 62 | 1。30G的文件,判断某一个QQ号是否存在。 63 | 64 | * 两次hash。 65 | 66 | 1.1 能不能排序? 67 | 68 | * 我说了一遍如何排序 69 | 70 | 1.2 你排序和hash要一个个读取。能不能直接对比? 71 | 72 | * (我懵了,,30G一个个对比?) 73 | 74 | 2.排序比较 75 | 76 | 3.select和epoll比较 77 | 78 | 4.进程互斥问题,如何实现 79 | 80 | 5.智力题 81 | 82 | 5.1 十瓶药丸,有一瓶变质,比较重。称一次,怎么找? 83 | 84 | 5.2 一个3L的容器和5L的容器,量4L的水 85 | 86 | 87 | 没让我问问题。如果我这里过了,后续会有面试官联系你。然后过了 88 | 89 | ### 运营开发hr面 90 | 91 | 个人评价,投递该岗位的优势和劣势是什么,工作地点问题,实习时间 92 | 93 | ``` 94 | 经常问到了劣势和优势问题 95 | 劣势:第一次实习,还是本科生,经验不足和缺乏大项目工程经验了 96 | 优势:(大家自由发挥) 97 | ``` 98 | 99 | ## -------------------------------------------------------------------------------- /Tencent/IMWeb_前端_xpnice.md: -------------------------------------------------------------------------------- 1 | ## 写在前面 2 | 17级不知名学长,渣哥高程+计网(课设跑路)弟子,面试意向岗为前端,技术栈:精通JavaScript, 熟练掌握Vue和React, 熟练掌握Linux编程和C++网络编程。2020.4.20拿到了腾讯[CSIG](https://join.qq.com/business.php)事业群[IMWeb](https://imweb.io/)团队的实习生offer,负责在线教育产品的 Web 全栈架构设计和研发以及IMWeb Team 的开源项目建设和工具研发。 3 | *** 4 | ## 以怎样的心态和方法阅读这篇文档 5 | 如果你点开了这篇文档,相信你是一个对于自己的技术有要求,对人生有规划的同济学子,这篇文档只适用于想在**大三**甚至**大二**斩获**大厂技术岗**的**实习offer**的同学。希望你抱着不是大厂我不去的心态,辩证得阅读这篇文档。 6 | *** 7 | ## 我为什么选择实习 8 | 我的个人人生规划是在本科结束后要去美国读研究生,实习一方面可以丰富我的简历;一方面可以通过企业这个锻炼开发能力的最好温床来提升我的专业技能;一方面也是给自己留条后路,如果疫情严重出国不得不搁置,我还有转正的路可以选择。 9 | *** 10 | ## 我为什么选择前端 11 | 我是一个对开发能达到极端享受的人,我近乎狂热得喜欢思考和解决一切涉及到用户需求的过程,这种热爱既体现在我个人性格上的感性一面,也体现在我对代码的苛求上,对于后一点,如果你们能看到这篇文档,你自然懂(手动狗头)。而在这一基础上,前端对我来讲是最能同时满足以上两点的技术,因而我从大二下就开始接触全栈开发,并有意得了解和接管项目中的前端部分,这也帮助我在这次求职过程中提高了一定的竞争力。 12 | *** 13 | ## 我是如何准备的实习 14 | **基础不是靠突击能得来的**\ 15 | **基础不是靠突击能得来的**\ 16 | **基础不是靠突击能得来的** 17 | 18 | 但是如果你能看到这篇文档,只要你不是实习想去跟扎克伯格协同开发,那么乐观的讲是完全来得及去夯实你的基础的,因为你们现在可能还没有基础(手动狗头2.0)。 19 | 20 | 我的实习准备周期大约是40天(3.10~4.18),总体上包括15天的前端技术栈复习(Vue+React+JavaScript+HTTP+HTML/CSS)以及25天的算法编程练习([LeetCode](https://leetcode-cn.com/)剑指Offer系列全部刷完,余下根据个人情况查缺补漏,可以针对企业偏好集中联系)和15天的基础知识复习(计算机网络+操作系统+数据库) 21 | 22 | 对于准备实习的细节我不想多谈因为现有很多成熟科学的文档和总结供大家阅读且离大家比较远,等真正到了这个时间点你们可能已经找不到这篇文档了,我在这里只提供一篇由腾讯的技术人员撰写的[大厂技术岗复习指南](https://mp.weixin.qq.com/s/uSDbyss-SNcQ3-YCNxaDfQ),我从中受益匪浅,推荐给你。 23 | 24 | 更多的我想谈一谈在大厂面试和笔试他们真正关注的是什么。首先我想从一句调侃开始: 25 | 26 | 面试造火箭,进去种水稻。 27 | 我不得不很遗憾的告诉你,至少在面试阶段这个火箭你必须要造,还得能飞,但后半句我不敢苟同,这个是和你的团队,你的能力和你的野心直接挂钩的,因为我还没有入职,你们可以通过一些已经入职工作一段时间的学长学姐给出更权威的建议,我不敢妄言。那么对于前半句我们要思考为什么大厂对面试的流程和要求如此之高,很大程度上是大厂对于实习生是以培养和储备人才为目的的,当然根本上还是要创造业务价值为企业创收,但通过实习的工作了解你培养你并最后留下你也不失为一种方法。所以大厂会出现这样的我不关注你能做什么,我更看重你**可能做什么**,也就是你的潜力,这是可以直接从你的基础得以体现的,因而我在段首强调了基础的重要性。这也是为什么有下面这一句盛行的观点: 28 | 29 | 大厂看基础,小厂看技术。 30 | *** 31 | ## 腾讯面试经历 32 | * 4.10 向腾讯投递简历 33 | * 4.12 第一次部门组员技术面试 34 | * 4.14 第二次部门组长技术面试 35 | * 4.15 第三次部门总监技术面试 36 | * 4.16 第四次CSIG教育线HR面试 37 | * 4.20 收到offer 38 | ### 腾讯一面 39 | * 自我介绍 40 | * 网盘项目怎么实现大文件上传和多用户上传 41 | * 怎么记录用户登录态 42 | * XSS和CSRF是什么,怎么避免 43 | * webpack接触过吗 说说 44 | * 网盘后端你做了什么工作 45 | * 说说Vue和React的异同 46 | * 写代码1 两个整数求和会超过int范围 怎么运算 47 | * 写代码2 BFS非递归 先序遍历 48 | ### 腾讯二面 49 | * 自我介绍 50 | * 介绍一下网盘项目 51 | * 你负责了什么工作 52 | * 前后端是怎么交互的 53 | * 用过什么请求方法 54 | * GET和POST的区别 55 | * GET凭什么没有POST安全? 56 | * POST能携带的数据大小限制? 57 | * 浏览器会做限制吗 服务端怎么修改 58 | * POST会发两个TCP包这个是确信的吗 你怎么验证 59 | * 怎么抓包 60 | * 一个TCP包多大 61 | * OPTIONS预请求什么流程 62 | * 什么是跨域简单请求 63 | * 网盘大文件上传你们是怎么分块的 64 | * BLOB怎么用的 65 | * 怎么处理的断点续传和多用户上传 66 | * 你们怎么记录一个文件传到哪里了 67 | * 高并发你数据库怎么维护 68 | * JS是单线程的吗 为什么是单线程的 69 | * CSS盒子 70 | * 原生html写ul和li 71 | * 有一个16G的日志文件 获取登录次数最多的IP 72 | * 容斥原理 73 | * 平常怎么学习 74 | * 入职时间 75 | * 投了哪些其他公司 76 | ### 腾讯三面 77 | * 为什么要做这几个项目 78 | * 遇到的最大的困难是什么 79 | * 进程和线程的区别 80 | * 线程池 81 | * select、epoll和poll区别 82 | * 输入url到页面加载的过程 越详细越好 83 | * 聊人生 84 | ### 腾讯HR面 85 | * 自我介绍一下 86 | * 你为什么做前端 87 | * 你怎么看我们部门 88 | * 你了解过我们是做什么的吗 89 | * 你平常怎么学习 90 | * 你的未来规划是什么 91 | * 你父母是做什么的 92 | * 你有女朋友吗 93 | * 你女朋友不让你来深圳怎么办 94 | * 深圳好远啊 你不怕怕吗 95 | * 什么时候能入职 能做多久 96 | ### Offer Call 97 | * 恭喜你,你被录用了。 98 | *** 99 | ## 写在最后 100 | 希望学弟学妹们把握自己的大学生活,你们时间还够但也不够,祝你们有一个光明而伟大的前程,成为一个有个性有技术有担当的**工程师**。祝好。 -------------------------------------------------------------------------------- /Tencent/WXG_后端_Alivers.md: -------------------------------------------------------------------------------- 1 | ## 2020暑期实习——wxg面试历程(微信支付) 2 | 3 | ### 一面——3.27,90min+ 4 | 5 | 1. 介绍一下自己、加项目 6 | 2. 前端开发框架的了解??? 7 | 3. httpd的实现原理,说一说??? 8 | 4. php和httpd是如何通信的??? 9 | 5. 说一说httpd和nginx的区别??? 10 | 6. select、epoll区别。。。 11 | 7. tcp 12 | 1. tcp连接的唯一标识 13 | 2. close() 关闭连接的具体做法(发出关闭请求立即返回还是?) 14 | 3. client 在while(true)中先connect,发一个包,然后close,能否一直connect下去 15 | 4. client和server通信过程中,server突然宕机,client会如何?server拔掉网线呢? 16 | 5. tcp的第四次挥手去掉会如何 17 | 6. tcp/udp的区别 18 | 8. 对称加密和非对称加密,效率对比,设计一个综合了效率和安全的通信方式(就是问https?)。。。 19 | 9. 数据库 20 | 1. 索引 21 | 2. 事务、隔离级别 22 | 3. rr和rc的区别,如何解决不可重复读,rr又出现了什么问题,如何解决? 23 | 10. n个线程,大小为n的数组,每个线程i对下标为i的元素自增,会有什么问题?(cache一致) 24 | 11. 进程通信的方式、什么方式最快、为什么最快、为什么直接操作内存就快。。。您哪来这么多为什么呢? 25 | 12. c++空类,编译器会给自动生成什么成员(函数/变量)?c++11中,默认会多生成哪几个成员函数? 26 | 13. c++ new一个对象都发生了什么,该对象会立即占用物理空间吗? 27 | 14. 多个cpp文件,同时include同一个头文件,最终这些cpp生成的目标文件将被连接成一个可执行文件,这样include有什么问题。。。 28 | 15. 复杂度为nlogn的排序算法?为什么这些算法复杂度都会有一个logn的项?快排的最坏时间复杂度、为什么会产生最坏情况、如何避免?c++的stl中的sort是不是快排实现的,如果不是,哪是什么?具体谈一谈。。。。 29 | 16. c++中的map是如何实现的,为什么要用红黑树,红黑树为什么要分红黑结点? 30 | 17. glibc中malloc的底层实现原理 31 | 18. 算法题:atoi。。。要求向用户返回字符串是否合法的判断,处理溢出什么的 32 | 33 | ### 二面——4.2,40min+ 34 | 35 | 1. 无序双端链表能否转为二叉搜索树(原地),如何转? 36 | 2. c++多态的体现、虚函数、虚继承 37 | 3. https的加密通信过程 38 | 4. MySql事务隔离级别 39 | 5. 进程通信方式,然后哪个耗费系统资源最少?为什么? 40 | 6. MySql Innodb联合索引的实现,B+树中的联合索引字段是如何存储的? 41 | 7. 共享屏幕看我代码。。。你为毛不用epoll用select? 42 | 8. tcp四次挥手为毛是四次? 43 | 44 | ### hr面——4.9,40min+ 45 | 46 | 家庭情况、个人爱好、入职时间。。。 47 | 48 | ### offer call——4.12 -------------------------------------------------------------------------------- /Tencent/readme.md: -------------------------------------------------------------------------------- 1 | # Tencents 2 | 3 | 鹅厂面经 4 | -------------------------------------------------------------------------------- /images/readme.md: -------------------------------------------------------------------------------- 1 | ## readme 2 | 3 | 文件夹存放一些图片,方便大家在写md文件时图片引用 4 | -------------------------------------------------------------------------------- /offer备战手册/牛客独家春招实习备战手册-技术篇.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/offer备战手册/牛客独家春招实习备战手册-技术篇.pdf -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # 项目说明 2 | 3 | 本仓库由同济大学2017级计算机专业的几名本科生创建,分享了我们在2021届暑期和日常实习应聘过程中的准备资料、复习心得、笔经面经等等,旨在帮助学弟学妹们在大三找实习的阶段能少走弯路,斩获自己心仪的offer 4 | ## 笔面经命名规范 5 | 部门_岗位_昵称.后缀名 (如 IMWeb_前端_xpnice.pdf) 6 | 7 | 后缀名不限,但是尽量md,方便线上阅读,也创立了images文件夹方便上传保存图片,谢谢大家! 8 | ## 联系我们 9 | 腾讯_CSIG_IMWeb前端_xpnice 10 | * email : xp970805@gmail.com 11 | * github : [xpnice](https://github.com/xpnice) 12 | 13 | 字节_Data_AML机器学习平台_chong1144 14 | * email : 1144165853@qq.com 15 | * github : [chong1144](https://github.com/chong1144) 16 | 17 | ## 加入我们 18 | 19 | 如果你也想分享自己的资料,可邮件: 20 | 1042364214@qq.com 加入协作者 21 | 22 | -------------------------------------------------------------------------------- /知识点/前端技术栈/HTTP相关知识.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/知识点/前端技术栈/HTTP相关知识.docx -------------------------------------------------------------------------------- /知识点/前端技术栈/JS相关知识.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/知识点/前端技术栈/JS相关知识.docx -------------------------------------------------------------------------------- /知识点/前端技术栈/vue相关知识点.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/知识点/前端技术栈/vue相关知识点.docx -------------------------------------------------------------------------------- /知识点/基础知识/Algorithm.md: -------------------------------------------------------------------------------- 1 | # 算法Algorithm 复习 2 | 3 | ## 排序类 4 | 5 | 6 | 7 | ## 二叉树类 8 | 9 | -------------------------------------------------------------------------------- /知识点/基础知识/ComputerNetwork.md: -------------------------------------------------------------------------------- 1 | # ComputerNetwork 2 | 3 | 学习自牛客网面试宝典以及GitHub 4 | 参考博客内容: 5 | 6 | * 7 | * 8 | * 9 | * 10 | * [面试/笔试第一弹 —— 计算机网络面试问题集锦](https://blog.csdn.net/justloveyou_/article/details/78303617) 11 | 12 | 参考书籍 13 | 14 | * 计算机网络, 谢希仁 15 | --- 16 | 17 | ## 计算机网络概述部分,有待补充 18 | 19 | ### OSI七层协议模型 20 | 21 | * 七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。 22 | * 五层体系结构包括: 应用层,运输层,网络层,数据链路层和物理层。五层知识OSI和TCP/IP 的综合,实际应用还是TCP/IP的四层结构,为了方便可以把下两层称为网络接口 23 | * 四层TCP/IP模型: 应用层(Telent,FTP等),传输层(TCP和UDP),网络层(IP,ICMP,IGMP),链路层 24 | 25 | 26 | 27 | 详细参考: 28 | 29 | [OSI 七层模型和TCP/IP模型及对应协议(详解)--CSDN](https://blog.csdn.net/qq_41923622/article/details/85805003) 30 | 31 | 32 | 33 | --- 34 | 35 | ### 五层协议 36 | 37 | 五层协议由上到下 38 | 39 | * **应用层** :为特定应用程序提供数据传输服务。应用层的协议有很多,例如 支持万维网应用的HTTP协议、支持文件传送的DNS协议 等协议。数据单位为报文。 40 | 41 | * **传输层** :为进程提供通用数据传输服务。由于应用层协议很多,定义通用 42 | 的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,**提供面向连接、可靠的数据传输服务**,数据单位为报文段;用户数据报协议 UDP,**提供无连接、尽最大努力的数据传输服务**,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务。 43 | 44 | * **网络层** :为**主机**提供数据传输服务。而传输层协议是为**主机中的进程**提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。网络层主要包括两个任务:(1)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报。(2)选中合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。常见协议:IP,ICMP,IGMP,ARP,RARP 45 | 46 | * **数据链路层** :常简称为链路层。网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。 47 | 48 | * **物理层** :考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。**透明的传输比特流** 49 | 50 | --- 51 | 52 | ## 应用层 53 | 54 | 参考了计网课件 55 | 56 | ### 域名系统 57 | 58 | DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。 59 | 60 | 域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名 61 | 62 | DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输: 63 | 64 | * 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。 65 | * 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。 66 | 67 | ### 文件传送协议 68 | 69 | 常见的有FTP协议,SFTP协议等。 70 | 71 | FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件: 72 | 73 | * 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。 74 | * 数据连接:用来传送一个文件数据。 75 | 76 | 根据数据连接是否是服务器端主动建立,FTP 有主动和被动两种模式: 77 | 78 | * 主动模式:服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端的端口号随机,但是必须大于 1024,因为 0~1023 是熟知端口号。 79 | * 被动模式:客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端的端口号随机。 80 | 81 | 主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。 82 | 83 | #### 动态主机配置协议 84 | 85 | DHCP (Dynamic Host Configuration Protocol) 提供了即插即用的连网方式,用户不再需要手动配置 IP 地址等信息。 86 | 87 | DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。 88 | 89 | #### 远程登陆协议 90 | 91 | TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。 92 | 93 | TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统系统的换行符定义。 94 | 95 | #### 电子邮件协议 96 | 97 | 一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。 98 | 99 | 邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。 100 | 101 | #### web页面请求过程 102 | 103 | //TODO web页面请求过程待补充 104 | 105 | 1.浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询; 106 | 107 | 2.浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手; 108 | 109 | 3.TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求; 110 | 111 | 4.服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器; 112 | 113 | 5.浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源; 114 | 115 | 6.浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。 116 | 117 | 118 | ```txt 119 | 其中: 120 | 121 | 1、DNS协议,http协议,https协议属于应用层 122 | 123 | 应用层是体系结构中的最高层。应用层确定进程之间通信的性质以满足用户的需要。这里的进程就是指正在运行的程序。应用层不仅要提供应用进程所需要的信息交换和远地操作,而且还要作为互相作用的应用进程的用户代理,来完成一些为进行语义上有意义的信息交换所必须的功能。应用层直接为用户的应用进程提供服务。 124 | 125 | 2、TCP/UDP属于传输层 126 | 127 | 传输层的任务就是负责主机中两个进程之间的通信。因特网的传输层可使用两种不同协议:即面向连接的传输控制协议TCP,和无连接的用户数据报协议UDP。面向连接的服务能够提供可靠的交付,但无连接服务则不保证提供可靠的交付,它只是“尽最大努力交付”。这两种服务方式都很有用,备有其优缺点。在分组交换网内的各个交换结点机都没有传输层。 128 | 129 | 3、IP协议,ARP协议属于网络层 130 | 131 | 网络层负责为分组交换网上的不同主机提供通信。在发送数据时,网络层将运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,分组也叫作IP数据报,或简称为数据报。网络层的另一个任务就是要选择合适的路由,使源主机运输层所传下来的分组能够交付到目的主机。 132 | 4、数据链路层 133 | 134 | 当发送数据时,数据链路层的任务是将在网络层交下来的IP数据报组装成帧,在两个相邻结点间的链路上传送以帧为单位的数据。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制、以及流量控制信息等)。控制信息使接收端能够知道—个帧从哪个比特开始和到哪个比特结束。控制信息还使接收端能够检测到所收到的帧中有无差错。 135 | 5、物理层 136 | 137 | 物理层的任务就是透明地传送比特流。在物理层上所传数据的单位是比特。传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆等,并不在物理层之内而是在物理层的下面。因此也有人把物理媒体当做第0层。 138 | ``` 139 | 140 | 141 | ## 传输层 142 | 143 | 网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。 144 | 145 | 传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细 146 | 节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。 147 | 148 | 重要的是TCP的三次握手、四次挥手,可靠传输的原理,滑动窗口的理解 149 | 150 | ### UDP和TCP 151 | 152 | * 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。 153 |
154 | * 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。 155 | 156 | ### UDP 和 TCP 的首部格式 157 | 158 | 参照课件或者网上博客 159 | 160 | 首部格式中重要的是序列号seq,确认号ack,以及标志位 161 | 162 | * 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。 163 | * 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。 164 | 165 | | 字段 | 含义 | 166 | | ---- | :----------------------------------------------------------: | 167 | | URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 | 168 | | ACK | 确认号是否有效,一般置为1。 | 169 | | PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 | 170 | | RST | 对方要求重新建立连接,复位。 | 171 | | SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 | 172 | | FIN | 希望断开连接。 | 173 | 174 | 175 | 176 | 177 | ### **TCP的三次握手** 178 | 179 | * 第一次握手:Client将SYN置1,ACK置0,随机产生一个初始序列号seq=x,发送请求连接报文给给Server,进入SYN_SENT状态; 180 |
181 | * 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number(确认号ack)=x+1,并随机产生一个自己的初始序列号seq=y,发送给客户端;进入SYN_RCVD状态; 182 |
183 | * 第三次握手:客户端检查acknowledge number是否为序列号x+1,ACK是否为1;检查正确之后将自己的ACK置为1、产生一个acknowledge number(确认号ack)=服务器发的序列号y+1、产生序列号seq=x+1发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number(确认号ack)为序列号x+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。 184 | 185 | #### 三次握手的原因 186 | 187 | 参考: 188 | 牛客网讨论区 189 | 190 | * 191 | * 192 | 193 | 1>从资源角度 194 | 防止: 已经失效的连接请求报文段有传到了服务器端 195 | 196 | ```txt 197 | client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的 198 | 滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已 199 | 失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 200 | 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连 201 | 接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。 202 | 由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认, 203 | 也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直 204 | 等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三 205 | 次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 206 | server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要 207 | 求建立连接。 208 | ``` 209 | 210 | 2> 可能会产生死锁 211 | 212 | * 3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。 213 | 214 | ```txt 215 | 现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S 216 | 和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确 217 | 认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数 218 | 据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备 219 | 好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这 220 | 种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确 221 | 认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。 222 | ``` 223 | 224 | 前两点回答的重点是不能两次握手 225 | 第三点是四次握手 226 | 3> 四次握手,可以但没必要 227 | 228 | * 降低传输的效率。 229 | 230 | 四次握手是指:第二次握手:Server只发送ACK和acknowledge number;而Server的SYN和初始序列号在第三次握手时发送;原来协议中的第三次握手变为第四次握手。出于优化目的,四次握手中的二、三可以合并。 231 | 232 | #### 三次握手中客户端的ACK未送达服务器,会怎样? 233 | 234 | * 由于Server没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接),Client收到后会重新传ACK给Server。如果Client向服务器发送数据,服务器会以RST包响应 235 | 236 | #### 如果建立完成,但是客户端出现了故障,如何处理? 237 | 238 | * 服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。 239 | 240 | ### TCP四次挥手 241 | 242 | * 第一次挥手:Client将FIN置为1,发送一个序列号seq=x给Server;进入FIN_WAIT状态; 243 | * 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=x+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。 244 | * 第三次挥手:Server将FIN置1,发送一个序列号y给Client;进入LAST_ACK状态; 245 | * 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=y+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。 246 | 247 | #### 四次挥手的原因 248 | 249 | ##### 第二次挥手和第三次挥手不能合并的原因 250 | 251 | 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。(CLOSE_WAIT状态的意义所在)。 252 | 253 | ##### 客户端TIME_WAIT状态的意义 254 | 255 | 第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重 256 | 发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在 257 | 2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收 258 | 到ACK而不断重发FIN。 259 | 260 | MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。 261 | 262 | ### TCP可靠传输 263 | 264 | TCP 通过: 265 | 266 | 1. 序列号、确认应答、超时重传 267 | 2. 窗口控制与高速重发控制/快速重传(重复确认应答) 268 | 3. 拥塞控制 269 | 270 | 方式来保证传输的可靠性 271 | 272 | #### 序列号、确认应答、超时重传 273 | 274 | 数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。 275 | 276 | #### 窗口控制与高速重发控制/快速重传(重复确认应答) 277 | 278 | TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。 279 | 280 | 使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发 281 | 282 | #### 拥塞控制 283 | 284 | 如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵(大家都在用网,你在这狂发,吞吐量就那么大,当然会堵),甚至造成网络的瘫痪。所以TCP在为了防止这种情况而进行了拥塞控制。 285 | 286 | ### TCP滑动窗口 287 | 288 | 窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。 289 | 290 | 发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。 291 | 292 | ### TCP流量控制 293 | 294 | 流量控制是为了控制发送方发送速率,保证接收方来得及接收。 295 | 296 | 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。 297 | 298 | 若将接收窗口字段设置为 0,称为零窗口。如果接收方没有能力接收数据,则将接收窗口置为0,此时发送方不能发送数据。当时会启动一个持续计时器,到期后发送一个大小为1字节的探测数据包探测接收窗口状态,如果能接收数据,则在返回的报文中更新接收窗口大小,恢复数据传送 299 | 300 | #### 流量控制和拥塞控制的区别 301 | 302 | * 流量控制是端到端的控制,例如A通过网络给B发数据,A发送的太快导致B没法接收(B缓冲窗口过小或者处理过慢),这时候的控制就是流量控制,原理是通过滑动窗口的大小改变来实现。 303 | 304 | 305 | 306 | * 拥塞控制是A与B之间的网络发生堵塞导致传输过慢或者丢包,来不及传输。防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络性能有关的所有因素。 307 | 308 | 流量控制是点对点(端对端),拥塞控制是针对整个网络。 309 | 310 | ### TCP拥塞控制的算法 311 | 312 | 网络拥塞的缺点:如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。 313 | 314 | 拥塞控制的四个算法: 315 | 316 | #### 慢启动 317 | 318 | 刚开始发送数据时,先把拥塞窗口(congestion window)设置为一个最大报文段MSS的数值,每收到一个新的确认报文之后,就把拥塞窗口加1个MSS。这样每经过一个传输轮次(或者说是每经过一个往返时间RTT),拥塞窗口的大小就会加倍 319 | 320 | #### 拥塞避免 321 | 322 | 当拥塞窗口的大小达到慢开始门限(slow start threshold)时,开始执行拥塞避免算法,拥塞窗口大小不再指数增加,而是线性增加,即每经过一个传输轮次只增加1MSS. 323 | 324 | --- 325 | 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。(这是不使用快重传的情况) 326 | 327 | --- 328 | 329 | #### 快重传 330 | 331 | 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。 332 | 333 | #### 快恢复 334 | 335 | 当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞。也有的快重传是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3*MSS 。这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络的资源而是停留在接收方的缓存中。可见现在网络中减少了三个分组。因此可以适当把拥塞窗口扩大些。 336 | 337 | ### TCP与UDP小结 338 | 339 | 1. TCP是面向连接的,UDP是无连接的。 340 | 什么是无连接?UDP发送数据之前不需要建立连接 341 | 342 | 2. TCP是可靠的,UDP是不可靠的 343 | UDP接收方收到报文之后,不需要给出任何确认 344 | 345 | 3. TCP只支持点对点通信,UDP支持一对一,一对多,多对一,多对多通信 346 | 347 | 4. TCP是面向字节流的,UDP面向报文的 348 | 面向字节流是指发送数据时以字节为单位,一个数据包可以拆分成若干组进行发送;UDP一个报文只能一次发完 349 | 350 | 5. TCP有拥塞控制机制,UDP则没有。 351 | 6. TCP头开销需要20字节,UDP只需要8字节 352 | 7. UDP的主机不需要维持复杂的连接状态 353 | 354 | 一些应用实时性要求较高的,选择UDP,比如游戏,媒体通信,实时视频流(直播),这些即使出现传输错误也是可以容忍的。其他大部分情况下,HTTP都用TCP,因为要求传输的内容可靠(UDP是不可靠的),不出现丢失。 355 | 356 | * 有关TCP粘包、有界无界问题,参考博客: 357 | 358 | [面向报文(UDP)和面向字节流(TCP)的区别--CSDN](https://blog.csdn.net/ce123_zhouwei/article/details/8976006) 359 | 360 | 361 | 362 | ## 网络层 363 | 364 | 网络层仅列出大纲,可以参看计网课程课件 365 | 366 | * IP数据报格式 367 | * IP地址编址方式 368 | 369 | * 分类 370 | * 子网划分 371 | 372 | * 地址解析协议-ARP 373 | * 网络控制报文协议ICMP 374 | * 虚拟专用网络 VPN 375 | * 网络地址转换 NAT 376 | * 路由器的结构 377 | * 路由器分组转发流程 378 | * 路由选择协议 379 | * 内部网关协议 380 | * RIP 381 | * OSPF 382 | * 外部网关协议 383 | * BGP 384 | 385 | 386 | 387 | #### ARP协议 388 | 389 | **ARP协议完成了IP地址与物理地址的映射**。每一个主机都设有一个 ARP 高速缓存,里面有**所在的局域网**上的各主机和路由器的 IP 地址到硬件地址的映射表。当源主机要发送数据包到目的主机时,会先检查自己的ARP高速缓存中有没有目的主机的MAC地址,如果有,就直接将数据包发到这个MAC地址,如果没有,就向**所在的局域网**发起一个ARP请求的广播包(在发送自己的 ARP 请求时,同时会带上自己的 IP 地址到硬件地址的映射),收到请求的主机检查自己的IP地址和目的主机的IP地址是否一致,如果一致,则先保存源主机的映射到自己的ARP缓存,然后给源主机发送一个ARP响应数据包。源主机收到响应数据包之后,先添加目的主机的IP地址与MAC地址的映射,再进行数据传送。如果源主机一直没有收到响应,表示ARP查询失败。 390 | 391 | 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。 392 | 393 | **ARP劫持?**: 394 | 395 | 396 | 397 | ## 数据链路层 398 | 399 | 数据链路层可以看计网课程课件,此处只列出大纲 400 | 401 | * 基本问题 402 | * 1. 封装成帧 403 | * 2. 透明传输 404 | * 3. 差错检测 405 | * 信道分类 406 | * 1. 广播信道 407 | * 2. 点对点信道 408 | * 信道复用技术 409 | * 1. 频分复用 410 | * 2. 时分复用 411 | * 3. 统计时分复用 412 | * 4. 波分复用 413 | * 5. 码分复用 414 | * CSMA/CD 协议 415 | * PPP 协议 416 | * MAC 地址 417 | * 局域网 418 | * 以太网 419 | * 交换机 420 | * 虚拟局域网 421 | * 六个基本数据链路层协议(模拟实现,见计网作业) 422 | 423 | # http/https 相关 424 | --- 425 | 参考博客 426 | 427 | 1. 428 | 2. 429 | 3. 430 | 431 | 432 | 433 | ### 响应码 434 | 435 | 436 | 437 | 438 | 439 | ### Get和Post的区别 440 | 441 | 442 | 443 | 444 | 445 | ### Cookie和Session 446 | 447 | 448 | 449 | #### CA证书 450 | 451 | [CA认证的原理和流程及https原理](https://www.cnblogs.com/yunlongaimeng/p/9417276.html) 452 | 453 | 454 | 455 | #### 输入url的过程 456 | 457 | [HTTP协议详解以及URL具体访问过程](https://www.cnblogs.com/phpstudy2015-6/p/6810130.html) 458 | 459 | 从大致上来讲经历了 460 | 461 | 客户端获取URL - > DNS解析 - > TCP连接 - >发送HTTP请求 - >服务器处理请求 - >返回报文 - >浏览器解析渲染页面 - > TCP断开连接 462 | 463 | 详细文字讲解! 464 | 465 | 客户端: 466 | 467 | (应用层开始)获取URL,通过负责域名解析的DNS服务获取网址的IP地址,根据HTT协议生成HTTP请求报文(应用层结束) 468 | 469 | (传输层开始)根据TCP协议连接从客户端到服务端(通过三次握手)客户端给服务端发送一个带SYN(同步)标志的数据包给客户端,然后客户端接收到信息再给客户端回传一个带有SYN / ACK(确认)标志的数据包以示传达确认信息,客户求最后端的再传送一个带ACK标志的数据包,代表“握手”结束,连接成功.TCP协议在把请求报文按序号分割成多个报文段(传输层结束) 470 | 471 | (网络层开始)根据IP协议(传输数据),ARP协议(获取MAC地址),OSPF协议(选择最优路径),搜索服务器地址,一边中转一边传输数据(网络层结束) 472 | 473 | (数据链路层开始)到达后通过数据链路层,物理层负责0,1比特流与物理设备电压高低,光的闪灭之间的互换。数据链路层负责将0,1序列划分为数据帧从一个节点传输到临近的另一个节点,这些节点是通过MAC来唯一标识的(MAC,物理地址,一个中主机会有一个MAC地址)。 (数据链路层结束) 474 | 475 | 服务端 476 | 477 | 通过数据链路层 - >通过网络层 - >再通过传输层(根据TCP协议接收请求报文并重组报文段) - >再通过应用层(通过HTTP协议对请求的内容进行处理) - >再通过应用层 - >传输层 - >网络层 - >数据链路层 - >到达客户端 478 | 479 | 客户端 480 | 481 | 通过数据链路层 - >网络层 - >传输层(根据TCP协议接收响应报文并重组) - >应用层(HTTP协议对响应进行处理) - >浏览器渲染页面 - >断开连接协议四次挥手) 482 | 483 | 四次挥手 484 | 485 | 主动方发送标志位:(ACK + FIN)+(发送序号= 200 +确认序号= 500)第一次挥手 486 | 487 | 被动方接收后发送标志位:ACK +(发送序号=主动方确认序号500 +确认序号=主动方发送序号+1201)第二次挥手 488 | 489 | 标志位:(ACK + FIN)+(发送序号=主动方确认序号+1 501)第三次挥手 490 | 491 | 主动方接收后发送标志位:(ACK)+(发送序号=被动方的确认序号201 +确认序号=被动方的发生序号+1502) 492 | 493 | 494 | # Socket 相关 495 | --- 496 | 参考博客: 497 | 498 | 499 | 500 | 501 | 502 | ### select : 503 | 504 | 505 | 506 | ### poll: 507 | 508 | 509 | 510 | 511 | 512 | ### epoll 513 | 514 | #### 请你回答一下epoll怎么实现的: 515 | 516 | Linux epoll机制是通过红黑树和双向链表实现的。 首先通过epoll_create()系统调用在内核中创建一个eventpoll类型的句柄,其中包括红黑树根节点和双向链表头节点。然后通过epoll_ctl()系统调用,向epoll对象的红黑树结构中添加、删除、修改感兴趣的事件,返回0标识成功,返回-1表示失败。最后通过epoll_wait()系统调用判断双向链表是否为空,如果为空则阻塞。当文件描述符状态改变,fd上的回调函数被调用,该函数将fd加入到双向链表中,此时epoll_wait函数被唤醒,返回就绪好的事件。 517 | 518 | 519 | 520 | 521 | 522 | 523 | # 相关基础知识 524 | 525 | #### 大小端问题 526 | 527 | 528 | 529 | [大小端及网络字节序--CSDN](https://blog.csdn.net/z_ryan/article/details/79134980) 530 | 531 | #### ping命令 532 | 533 | **PING是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP或UDP** 534 | 535 | ping是一个基本的网络命令,用来确定网络上具有某个特定IP地址的主机是否存在以及是否能接收请求。 536 | 537 | Ping命令通过向计算机发送**ICMP回应报文**并且监听回应报文的返回,以校验与远程计算机或本地计算机的连接。对于每个发送报文,Ping最多等待1秒,并打印发送和接收把报文的数量。比较每个接收报文和发送报文,以校验其有效性。默认情况下,发送四个回应报文,每个报文包含64字节的数据(周期性的大写字母序列)。 538 | 539 | 网络层包括:IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol) 540 | 控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向地址转换协议。 541 | IP是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务。 542 | ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。 543 | Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。 544 | 545 | 546 | 547 | #### 交换机和路由器的区别 548 | 549 | 路由器是网络层,根据ip地址进行寻址,使用IPv4或者IPv6协议 550 | 551 | 交换机是在数据链路层,根据mac地址进行寻址,使用mac寻址 552 | 553 | 554 | 555 | 转发表(MAC)、ARP表、路由表总结参考博客: 556 | 557 | [转发表(MAC表)、ARP表、路由表总结](https://cloud.tencent.com/developer/article/1173761) 558 | 559 | 560 | 561 | 562 | 563 | #### MSS MTU 564 | 565 | ***MTU***: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是IP层)最大一次传输数据的大小;以普遍使用的以太网接口为例,缺省MTU=1500 Byte,这是以太网接口对IP层的约束,如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。 566 | 567 | ***MSS***:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。 568 | 569 | -------------------------------------------------------------------------------- /知识点/基础知识/DataBaseBasic.md: -------------------------------------------------------------------------------- 1 | # DataBase 2 | 3 | 参考连接: 4 | [CS-Notes/数据库系统原理 -- GitHub](https://github.com/CyC2018/CS-Notes/blob/master/notes/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86.md) 5 | [史上最全的数据库面试题](https://www.cnblogs.com/wenxiaofei/p/9853682.html) 6 | [Waking-UP 数据库](https://github.com/wolverinn/Waking-Up/blob/master/Database.md) 7 | 8 | --- 9 | 10 | ## 数据库基础概念 11 | 12 | ### 事务的概念和特性 13 | 14 | 概念:事务(Transaction)是一个操作序列,不可分割的工作单位,以BEGIN TRANSACTION开始,以ROLLBACK/COMMIT结束。是满足ACID特性的的一组操作 15 | 16 | #### ACID特性 17 | 18 | ##### 1. 原子性(Atomicity) 19 | 20 | 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 21 | 22 | 回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。 23 | 24 | ##### 2. 一致性(Consistency) 25 | 26 | 数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。 27 | 28 | ##### 3. 隔离性(Isolation) 29 | 30 | 一个事务所做的修改在最终提交以前,对其它事务是不可见的。 31 | 32 | ##### 4. 持久性(Durability) 33 | 34 | 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 35 | 36 | 系统发生奔溃可以用重做日志(Redo Log)进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改。 37 | 38 | --- 39 | 40 | 事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系: 41 | 42 | * 只有满足一致性,事务的执行结果才是正确的。 43 | * 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。 44 | * 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 45 | * 事务满足持久化是为了能应对系统崩溃的情况。 46 | 47 | ##### AUTOCOMMIT 48 | 49 | --- 50 | MySQL 默认采用自动提交模式。也就是说,如果不显式使用START TRANSACTION语句来开始一个事务,那么每个查询操作都会被当做一个事务并自动提交。 51 | 52 | 53 | ### 并发一致性问题 54 | 55 | --- 56 | 在并发环境下,事务的隔离性很难保证,因此会出现并发一致性问题 57 | 58 | 以下描述中,事务用字母T表示 59 | 60 | #### 丢失修改 61 | 62 | T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。 63 | 64 | #### 读脏数据 65 | 66 | T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。 67 | 68 | #### 不可重复读 69 | 70 | T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。 71 | 72 | #### 幻影读 73 | 74 | T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。(和不可重复读的区别:针对的是一个数据整体/范围;并且需要是插入操作) 75 | 76 | --- 77 | 产生并发不一致性问题的主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。 78 | 79 | 80 | ### 封锁 81 | 82 | --- 83 | 84 | #### 封锁粒度 85 | 86 | MySQL中有两种封锁粒度 87 | 88 | #### 封锁类型 89 | 90 | ##### 1. 读写锁 91 | 92 | * 互斥锁(Exclusive),简写为 X 锁,又称写锁。 93 | * 共享锁(Shared),简写为 S 锁,又称读锁。 94 | 95 | 有以下两个规定: 96 | 97 | * 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。 98 | * 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。 99 | 100 | ##### 2.意向锁 101 | 102 | 使用意向锁(Intention Locks)可以更容易地支持多粒度封锁。 103 | 104 | 在存在行级锁和表级锁的情况下,事务 T 想要对表 A 加 X 锁,就需要先检测是否有其它事务对表 A 或者表 A 中的任意一行加了锁,那么就需要对表 A 的每一行都检测一次,这是非常耗时的。 105 | 106 | 意向锁在原来的 X/S 锁之上引入了 IX/IS,IX/IS 都是表锁,用来表示一个事务想要在表中的某个数据行上加 X 锁或 S 锁。有以下两个规定: 107 | 108 | * 一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁; 109 | * 一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。 110 | 111 | 通过引入意向锁,事务 T 想要对表 A 加 X 锁,只需要先检测是否有其它事务对表 A 加了 X/IX/S/IS 锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务 T 加 X 锁失败。 112 | 113 | 关于锁的兼容关系解释: 114 | 115 | * 任意 IS/IX 锁之间都是兼容的,因为它们只表示想要对表加锁,而不是真正加锁; 116 | * 这里兼容关系针对的是表级锁,而表级的 IX 锁和行级的 X 锁兼容,两个事务可以对两个数据行加 X 锁。(事务 T1 想要对数据行 R1 加 X 锁,事务 T2 想要对同一个表的数据行 R2 加 X 锁,两个事务都需要对该表加 IX 锁,但是 IX 锁是兼容的,并且 IX 锁与行级的 X 锁也是兼容的,因此两个事务都能加锁成功,对同一个表中的两个数据行做修改。) 117 | 118 | #### 封锁协议 119 | 120 | --- 121 | 122 | #### 三级封锁协议 123 | 124 | **一级封锁协议** 125 | 126 | 事务 T 要修改数据 A 时必须加 X 锁,直到 T 结束才释放锁。 127 | 128 | 可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖。 129 | 130 | **二级封锁协议** 131 | 132 | 在一级的基础上,要求读取数据A是必须加S锁,读取完马上释放S锁 133 | 134 | 可以解决读脏数据问题,因为如果一个事务在对数据A进行修改,根据一级封锁协议,会加X锁,那么就不能加S锁了,也就是不会读入数据 135 | 136 | **三级封锁协议** 137 | 138 | 在二级的基础上,要求读取数据A时必须加S锁,直到事务结束了才能释放S锁 139 | 140 | 可以解决不可重复读的问题,因为读A时,其他事务不能对A加X锁,从而避免了在读期间发生数据改变 141 | 142 | #### 两段锁协议 143 | 144 | 加锁和解锁分为两个阶段进行 145 | 146 | **可串行化调度**是指:通过并发控制,使得并发的事务与某个串行执行的事务结果相同。串行执行的事务互不干扰,不会出现并发一致性问题 147 | 148 | 事务遵循两段锁协议时保证可串行化调度的充分条件。 149 | 150 | ### 隔离级别 151 | 152 | --- 153 | 154 | #### 未提交读(READ UNCOMMITTED) 155 | 156 | 在一个事务提交之前,它的执行结果对其它事务也是可见的。会导致脏读、不可重复读、幻读 157 | 158 | #### 提交读(READ COMMITTED) 159 | 160 | 一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。 161 | 162 | 可避免脏读问题; 163 | 164 | #### 可重复度(REPEATABLE READ) 165 | 166 | 可以确保同一个事务在多次读取同样的数据时得到相同的结果。(MySQL的默认隔离级别)。可避免不可重复读 167 | 168 | #### 可串行化(SERIALIZABLE) 169 | 170 | 强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。 171 | 172 | 该隔离级别需要加锁实现,因为要使用加锁机制保证同一时间只有一个事务执行,也就是保证事务串行执行 173 | 174 | ### 多版本并发控制(MVCC) 175 | 176 | 多版本并发控制(Multi-Version Concurrency Control, MVCC),MVCC在每行记录后面都保存有两个隐藏的列,用来存储创建版本号和删除版本号。 177 | 178 | * 创建版本号:创建一个数据行时的事务版本号(事务版本号:事务开始时的系统版本号;系统版本号:每开始一个新的事务,系统版本号就会自动递增); 179 | * 删除版本号:删除操作时的事务版本号; 180 | * 各种操作: 181 | 182 | * 插入操作时,记录创建版本号; 183 | * 删除操作时,记录删除版本号; 184 | * 更新操作时,先记录删除版本号,再新增一行记录创建版本号; 185 | * 查询操作时,要符合以下条件才能被查询出来:删除版本号未定义或大于当前事务版本号(删除操作是在当前事务启动之后做的);创建版本号小于或等于当前事务版本号(创建操作是事务完成或者在事务启动之前完成) 186 | 187 | 通过版本号减少了锁的争用,提高了系统性能;可以实现提交读和可重复读两种隔离级别,未提交读无需使用MVCC 188 | 189 | #### 快照读与当前读 190 | 191 | ##### 快照读 192 | 193 | MVCC 的select 操作时快照中的数据,不需要进行加锁操作 194 | 195 | ```mysql 196 | SELECT * FROM table ...; 197 | ``` 198 | 199 | ##### 当前读 200 | 201 | MVCC 其它会对数据库进行修改的操作(INSERT、UPDATE、DELETE)需要进行加锁操作,从而读取最新的数据。可以看到 MVCC 并不是完全不用加锁,而只是避免了 SELECT 的加锁操作。 202 | 203 | ### 数据库范式 204 | 205 | 可以具体见课本 206 | 207 | #### 函数依赖 208 | 209 | 记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。 210 | 211 | 如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。 212 | 213 | 对于 A->B,如果能找到 A 的真子集 A',使得 A'-> B,那么 A->B 就是部分函数依赖,否则就是完全函数依赖。 214 | 215 | 对于 A->B,B->C,则 A->C 是一个传递函数依赖。 216 | 217 | #### 异常的产生 218 | 219 | 不符合范式的关系,会产生很多异常,主要有以下四种异常 220 | 221 | * 冗余数据:数据会冗余出现 222 | * 修改异常:修改一个记录中的信息,但是另一个记录中相同的信息却没有被修改 223 | * 删除异常:删除一个信息,那么也丢失其他信息。 224 | * 插入异常: 225 | 226 | #### 范式 227 | 228 | ##### 第一范式 229 | 230 | 属性不可分 231 | 232 | ##### 第二范式 233 | 234 | 每一个非主属性完全函数依赖于码 235 | 236 | ##### 第三范式 237 | 238 | 非主属性不传递函数依赖于键码。 239 | 240 | ### 几种表的连接方式 241 | 242 | #### 内连接(inner join) 243 | 244 | 仅将两个表中满足连接条件的行组合起来作为结果集 245 | 246 | * 自然连接: 只考虑属性相同的元组对 247 | * 等值连接: 给定条件进行查询 248 | 249 | #### 外连接(outer join) 250 | 251 | * 左连接:左边表中的所有数据都有显示出来,右边的表数据志显示共有的那部分,没有对应的部分补null 252 | * 右连接: 和左连接相反 253 | * 全外连接:查询出左表和右表所有数据,但是去除两表的重复数据 254 | 255 | #### 交叉连接(cross join) 256 | 257 | * 返回两表的笛卡儿积 258 | 259 | ### 存储过程以及其优缺点 260 | 261 | 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。想要实现相应的功能时,只需要调用这个存储过程就行了(类似于函数,输入具有输出参数)。 262 | 263 | 优点: 264 | 265 | * 预先编译,而不需要每次运行时编译,提高了数据库执行**效率**; 266 | * 封装了一系列操作,对于一些数据交互比较多的操作,相比于单独执行SQL语句,可以**减少网络通信量**; 267 | * 具有**可复用性**,减少了数据库开发的工作量; 268 | * **安全性高**,可以让没有权限的用户通过存储过程间接操作数据库; 269 | * 更**易于维护** 270 | 271 | 272 | 缺点: 273 | 274 | * **可移植性差**,存储过程将应用程序绑定到了数据库上; 275 | * **开发调试复杂**:没有好的IDE; 276 | * **修改复杂**,需要重新编译,有时还需要更新程序中的代码以更新调用 277 | 278 | ### Drop/Delete/Truncate的区别 279 | 280 | * Delete用来删除表的全部或者**部分数据**,执行delete之后,用户需要**提交之后**才会执行,会触发表上的DELETE**触发器**(包含一个OLD的虚拟表,可以只读访问被删除的数据),DELETE之后表结构还在,删除很慢,一行一行地删,因为会记录日志,可以利用日志还原数据; 281 | * Truncate删除表中的所有数据,这个操作**不能回滚**,也不会触发这个表上的触发器。操作比DELETE快很多(直接把表drop掉,再创建一个新表,删除的数据不能找回)。如果表中有自增(AUTO_INCREMENT)列,则重置为1; 282 | * Drop命令从数据库中**删除表**,所有的数据行,索引和约束都会被删除;不能回滚,不会触发触发器; 283 | 284 | #### 触发器 285 | 286 | 触发器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)来触发运行的操作(不能被直接调用,不能接收参数)。在数据库里以独立的对象存储,用于**保证数据完整性**(比如可以检验或转换数据)。 287 | 288 | 289 | ### 视图和游标 290 | 291 | * **视图**:从数据库的基本表中通过查询选取出来的数据组成的虚拟表(数据库中存放视图的定义)。可以对其进行增/删/改/查等操作。特别地,对视图的修改不影响基本表。好处: 292 | * 通过只给用户访问视图的权限,保证数据的安全性; 293 | * 简化复杂的SQL操作,隐藏数据的复杂性(比如复杂的连接); 294 | * **游标(Cursor)**:用于定位在查询返回的结果集的特定行,以对特定行进行操作。使用游标可以方便地对结果集进行移动遍历,根据需要滚动或对浏览/修改任意行中的数据。主要用于交互式应用。 295 | 296 | 297 | ### 数据库索引 298 | 299 | ***索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。***索引的实现通常使用B_TREE及其变种。索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。 300 | 301 | #### 索引实现的原理 302 | 303 | 使用B+树来实现 304 | 305 | ###### 使用B树和B+树的比较 306 | 307 | InnoDB的索引使用的时B+树,B+树对比B树的优点有: 308 | 309 | * IO次数少:B+树的中间结点只存放索引,数据都存在叶结点中,因此中间结点可以存更多的数据,让索引树更加矮胖; 310 | * 范围查询效率更高:B树需要中序遍历整个树,只B+树需要遍历叶结点中的链表; 311 | * 查询效率更加稳定:每次查询都需要从根结点到叶结点,路径长度相同,所以每次查询的效率都差不多 312 | 313 | ##### 为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引? 314 | 315 | * B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针(红色部分),因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了; 316 | 317 | * B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当; 318 | 319 | * 数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。 320 | 321 | ##### 文件索引和数据库索引为什么使用B+树? 322 | 323 |   文件与数据库都是需要较大的存储,也就是说,它们都不可能全部存储在内存中,故需要存储到磁盘上。而所谓索引,则为了数据的快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。数据库系统巧妙利用了局部性原理与磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,而红黑树这种结构,高度明显要深的多,并且由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。最重要的是,B+树还有一个最大的好处:方便扫库。B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持,这是数据库选用B+树的最主要原因。 324 | 325 | 326 | ###### 使用B树索引和哈希索引的比较 327 | 328 | 哈希索引能以 O(1) 时间进行查找,但是只支持精确查找,无法用于部分查找和范围查找,无法用于排序与分组;B树索引支持大于小于等于查找,范围查找。哈希索引遇到大量哈希值相等的情况后查找效率会降低。哈希索引不支持数据的排序。 329 | 330 | #### 使用索引的优点 331 | 332 | * 大大加快了数据的检索速度; 333 | * 可以显著减少查询中分组和排序的时间; 334 | * 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性; 335 | * 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起) 336 | 337 | 缺点: 建立和维护索引会耗费一定的时间和空间,更新索引很慢 338 | 339 | #### 索引失效 340 | 341 | * 以“%(表示任意0个或多个字符)”开头的LIKE语句; 342 | * OR语句前后没有同时使用索引; 343 | * 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型); 344 | * 对于多列索引,必须满足 最左匹配原则/最左前缀原则 (最左优先,eg:多列索引col1、col2和col3,则 索引生效的情形包括 col1或col1,col2或col1,col2,col3); 345 | * 如果MySQL估计全表扫描比索引快,则不使用索引(比如非常小的表) 346 | 347 | #### 适合做索引的情况 348 | 349 | * 某列经常作为最大最小值; 350 | * 经常被查询的字段; 351 | * 经常用作表连接的字段; 352 | * 经常出现在ORDER BY/GROUP BY/DISDINCT后面的字段 353 | 354 | ##### 创建索引时应该注意 355 | 356 | * 只应建立在小字段上,而不要对大文本或图片建立索引(一页存储的数据越多一次IO操作获取的数据越大效率越高); 357 | * 建立索引的字段应该非空,在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。应该用0、一个特殊的值或者一个空串代替NULL; 358 | * 选择数据密度大(唯一值占总数的百分比很大)的字段作索引 359 | 360 | #### 索引的分类 361 | 362 | * **普通索引** 363 | * **唯一索引 UNIQUE**:索引列的值必须唯一,但允许有空值; 364 | * **主键索引 PRIMARY KEY**:必须唯一,不允许空值(是一种特殊的唯一索引;MySQL创建主键时默认为聚集索引,但主键也可以是非聚集索引); 365 | * **单列索引和多列索引/复合索引(Composite)**:索引的列数; 366 | * **覆盖(Covering)索引**:索引包含了所有满足查询所需要的数据,查询的时候只需要读取索引而不需要回表读取数据; 367 | * **聚集(Clustered)索引/非聚集索引**:对磁盘上存放数据的物理地址重新组织以使这些数据按照指定规则排序的一种索引(数据的物理排列顺序和索引排列顺序一致)。因此每张表只能创建一个聚集索引(因为要改变物理存储顺序)。优点是查询速度快,因为可以直接按照顺序得到需要数据的物理地址。缺点是进行修改的速度较慢。对于需要经常搜索范围的值很有效。非聚集索引只记录逻辑顺序,并不改变物理顺序; 368 | 369 | * **虚拟索引(Virtual)**:模拟索引的存在而不用真正创建一个索引,用于快速测试创建索引对执行计划的影响。没有相关的索引段,不增加存储空间的使用 370 | 371 | ### 数据库的优化 372 | 373 | #### SQL语句的优化 374 | 375 | * 尽量避免在where子句中使用!=,<,>操作符或者对字段进行null置判断,否则引擎将会放弃使用索引而全表扫描 376 | * 只返回必要的列,尽量减少select * 这样的语句 377 | * 只返回必要的行 378 | * 将大连接查询分解,分解成对每一个表的单表查询,然后在应用程序中进行关联 379 | 380 | #### 索引优化 381 | 382 | 尽量减少引起索引失效的情况,在合适的地方建立索引,多使用索引 383 | 384 | #### 数据库表结构的优化 385 | 386 | * 设计表的结构时,符合三大范式,减异常出现的可能性 387 | * 选择合适的数据类型,减少null字段的存储,使用简单的数据类型 388 | * 表的水平切分:将同一个表中的记录拆分到多个结构相同的表中(可以通过哈希取模或者根据ID范围来分)。这样能将数据分布到集群的不同节点上 389 | * 表的垂直切分:将一张表按列分成多个表。 390 | 391 | #### 系统配置的优化 392 | 393 | 增加TCP支持的队列数量,增加MySQL的缓存池大小和个数 394 | 提升硬件配置 395 | 396 | ## 待补充 397 | 398 | Redis相关内容(本人暂时没用过) 399 | [CyC2018-redis.md](https://github.com/CyC2018/CS-Notes/blob/master/notes/Redis.md) 400 | [Redis常见面试题](cnblogs.com/jasontec/p/9699242.html) 401 | [几率大的Redis面试题(含答案)](https://blog.csdn.net/Butterfly_resting/article/details/89668661) 402 | hive相关内容 403 | 404 | [Hive面试题(一)](https://blog.csdn.net/qq_36174081/article/details/89945050) 405 | [HIVE基础知识及优化(面试必备)](https://blog.csdn.net/u011331430/article/details/79038103?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 406 | -------------------------------------------------------------------------------- /知识点/基础知识/LanguageBaseBasic.md: -------------------------------------------------------------------------------- 1 | # Language Base 2 | 3 | 语言基础问题 4 | 5 | --- 6 | 7 | #### const 和define 区别: 8 | 9 | **C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下:** 10 | 11 | * 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换; 12 | 13 | * 用const float MAX = 255; 定义的常量有类型名字,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝,而#define 所定义的宏变量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存要比const变量的大得多; 14 | 15 | * 用define定义的常量是不可以用指针变量去指向的,用const定义的常量是可以用指针去指向该常量的地址的; 16 | 17 | * 用define可以定义一些简单的函数,const是不可以定义函数的. 18 | 19 | 具体来说,有以下几方面的区别: 20 | 21 | 1.编译器处理方式 22 | define – 在预处理阶段进行替换 23 | const – 在编译时确定其值 24 | 25 | 2.类型检查 26 | define – 无类型,不进行类型安全检查,可能会产生意想不到的错误 27 | const – 有数据类型,编译时会进行类型检查 28 | 29 | 3.内存空间 30 | define – 不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大 31 | const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝 32 | 33 | 4.其他 34 | 在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。 35 | 宏替换只作替换,不做计算,不做表达式求解。 36 | 37 | 宏定义的作用范围仅限于当前文件。 38 | 默认状态下,const对象只在文件内有效,当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。 39 | 如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字(在声明和定义时都要加)。 40 | 41 | ```txt 42 | 规则 43 | 在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。 44 | ``` 45 | 46 | --- 47 | 48 | #### new 和 malloc 区别 49 | 50 | 参考: 51 | [动态内存分配、malloc与new的区别-CSDN博客](https://blog.csdn.net/qq_40840459/article/details/81268252?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 52 | 53 | 解释还行:能应付基础面试,但是没有涉及基础根本 54 | 55 | [经典面试题之new和malloc的区别](https://blog.csdn.net/nie19940803/article/details/76358673?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 56 | 57 | --- 58 | 59 | #### C/C++程序内存的分配 60 | 61 | 参考博客可以在`视图`菜单中关闭 62 | [C/C++程序内存的分配](https://blog.csdn.net/cherrydreamsover/article/details/81627855) 63 | 64 | 有内存分配的理解,可以更深刻理解内存分配问题 65 | 66 | [C/C++动态内存管理malloc/new、free/delete的异同](https://blog.csdn.net/cherrydreamsover/article/details/81022039) 67 | 68 | [浅谈“C语言动态内存管理:malloc/calloc/realloc/free”](https://blog.csdn.net/cherrydreamsover/article/details/81019360) 69 | 70 | 关于C++中自由存储区的解释,参考 71 | 72 | [C++ 自由存储区是否等价于堆?](https://www.cnblogs.com/QG-whz/p/5060894.html) 73 | 74 | 75 | 76 | --- 77 | 78 | #### C++ static 79 | 80 | [c++中static的用法详解--CSDN](https://blog.csdn.net/majianfei1023/article/details/45290467?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 81 | 82 | #### memcpy 和memmove 区别,以及strcpy 83 | 84 | 85 | 86 | **memcpy和menmove区别主要在于内存重叠的处理问题** 87 | 88 | * memcpy :不判断是否重叠问题,从头开始复制 89 | 90 | * memmove: 会判断是否有内存重叠问题。若内存重叠,则从后往前复制,避免内存重叠 91 | 92 | [memmove 和 memcpy的区别以及处理内存重叠问题](https://blog.csdn.net/li_ning_/article/details/51418400) 93 | 94 | 95 | 96 | **strcpy和mencpy** 97 | 98 | * strcpy主要是字符串的拷贝 99 | * mencpy是内存的拷贝,可以是字符串,也可以是结构体,针对的是内存 100 | 101 | 参考 102 | 103 | 104 | 105 | [strcpy、strncpy与memcpy的区别与使用方法--CSDN](https://blog.csdn.net/taric_ma/article/details/7383713?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 106 | 107 | 108 | 109 | --- 110 | 111 | #### vector和数组的区别 112 | 113 | [c++ 的vector、array和数组的比较--CSDN](https://blog.csdn.net/haust_wang/article/details/49848169?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 114 | 115 | [STL vector的内部实现原理及基本用法--CSDN](https://blog.csdn.net/u012658346/article/details/50725933?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 116 | 117 | --- 118 | 119 | #### C++堆和栈的区别 120 | 121 | 主要区别有以下几点 122 | 123 | * 管理方式 124 | * 系统响应 125 | * 空间大小 126 | * 碎片问题 127 | * 生长方向 128 | * 分配方式 129 | * 分配效率 130 | 131 | 具体参考: 132 | 133 | [C++:堆和栈的区别--博客](https://www.cnblogs.com/yiluyisha/p/9049051.html) 134 | 135 | 136 | 137 | --- 138 | 139 | #### C++中深拷贝浅拷贝问题 140 | 141 | 简单的说:浅拷贝就是使用同一块内存,拷贝后实际上还是指向同一块内存; 142 | 143 | 深拷贝之后,每个对象都有自己的内存,而不是指向相同一块内存 144 | 145 | [C++面试题之浅拷贝和深拷贝的区别](https://blog.csdn.net/caoshangpa/article/details/79226270) 146 | 147 | 148 | 149 | --- 150 | 151 | #### [为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数](https://www.cnblogs.com/yuanch2019/p/11625460.html) 152 | 153 | 154 | 155 | **将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。** 156 | 157 | C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。 158 | 159 | 160 | 161 | **请你说一说你理解的虚函数和多态** 162 | 多态的实现主要分为静态多态和动态多态,***静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。***举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加virtual也是虚函数。 163 | 虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。 164 | 165 | 166 | 167 | 构造函数不能声明为虚函数(**虚函数只有和对象结合才能呈现多态,构造函数时对象正在生成**)。 168 | 169 | 170 | 171 | --- 172 | 173 | #### 支配规则、赋值兼容、虚函数的区别 174 | 175 | **支配规则**: 通过自身对象、指针、引用访问(***自身的***)虚函数、普通函数 176 | 177 | **赋值兼容规则**:通过基类指针、对象、引用访问(***派生类中基类部分的***)的普通函数 178 | 179 | **虚函数**:通过基类指针、引用访问(***基类和派生类的同名***)虚函数 180 | 181 | 182 | 183 | 184 | 185 | --- 186 | 187 | #### Struct 和 Union区别 188 | 189 | 参考博客 190 | 191 | [Struct 和 Union区别--CSDN](https://blog.csdn.net/firefly_2002/article/details/7954458) 192 | 193 | 194 | 195 | --- 196 | 197 | #### 红黑树和AVL树的定义,特点,以及二者区别 198 | 199 | 平衡二叉树(AVL树): 200 | 201 | 平衡二叉树又称为AVL树,是一种特殊的二叉排序树。其左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1。一句话表述为:以树中所有结点为根的树的左右子树高度之差的绝对值不超过1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。 202 | 203 | 204 | 205 | 红黑树: 206 | 207 | 红黑树是一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,通常使用红黑树。 208 | 209 | 性质: 210 | 211 | 1. 每个节点非红即黑 212 | 213 | 2. 根节点是黑的; 214 | 215 | 3. 每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的; 216 | 217 | 4. 如果一个节点是红色的,则它的子节点必须是黑色的。 218 | 219 | 5. 对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点; 220 | 221 | 222 | 223 | 区别: 224 | 225 | AVL 树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,算是一种折中,插入最多两次旋转,删除最多三次旋转。 226 | 227 | 228 | 229 | 230 | 231 | --- 232 | 233 | #### 请你说一说map和unordered_map的底层实现 234 | 235 | map底层是基于红黑树实现的,因此map内部元素排列是有序的。而unordered_map底层则是基于哈希表实现的,因此其元素的排列顺序是杂乱无序的。 236 | 237 | 对于map,其底层是基于红黑树实现的,优点如下: 238 | 239 | 1)有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作 240 | 241 | 2)map的查找、删除、增加等一系列操作时间复杂度稳定,都为logn 242 | 243 | 缺点如下: 244 | 245 | 1)查找、删除、增加等操作平均时间复杂度较慢,与n相关 246 | 247 | 对于unordered_map来说,其底层是一个哈希表,优点如下: 248 | 249 | 查找、删除、添加的速度快,时间复杂度为常数级O(c) 250 | 251 | 缺点如下: 252 | 253 | 因为unordered_map内部基于哈希表,以(key,value)对的形式存储,因此空间占用率高 254 | 255 | Unordered_map的查找、删除、添加的时间复杂度不稳定,平均为O(c),取决于哈希函数。极端情况下可能为O(n) 256 | 257 | 258 | 259 | --- 260 | 261 | #### vector 实现原理 262 | 263 | 264 | 265 | --- 266 | 267 | #### 数组和链表的区别 268 | 269 | 270 | 271 | --- 272 | 273 | #### C++内存泄漏问题 274 | 275 | [C++造成内存泄漏的原因汇总--CSDN](https://blog.csdn.net/qq_18824491/article/details/78902636?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 276 | 277 | 278 | 279 | --- 280 | 281 | #### 自旋锁和互斥锁 282 | 283 | 自旋锁是一种互斥锁的实现方式而已,相比一般的互斥锁会在等待期间放弃cpu,自旋锁(spinlock)则是不断循环并测试锁的状态,这样就一直占着cpu。 284 | 285 | **自旋锁与互斥锁的区别**:线程在申请自旋锁的时候,线程不会被挂起,而是处于忙等的状态。 286 | 287 | [自旋锁和互斥锁的区别--简书](https://www.jianshu.com/p/a7f349ddcf82) 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | --- 302 | 303 | 304 | 305 | 306 | 307 | # 常见面试题目 308 | 309 | 常见C++岗位面试题目 310 | 311 | 收集 312 | 313 | 314 | 315 | --- 316 | 317 | 318 | 319 | --- 320 | 321 | ## 大数据处理类型 322 | 323 | 324 | 325 | 326 | 327 | 比如说100Gurl,内存只有1G,求topk问题 328 | 329 | * hash+分治 330 | 331 | 332 | 333 | --- 334 | 335 | ## 计算机体系结构问题 336 | 337 | 338 | 339 | --- 340 | 341 | #### 计算机缓存Cache以及Cache Line详解 342 | 343 | 参考 344 | 345 | [计算机中的cacheline--CSDN](https://blog.csdn.net/qq_21125183/article/details/80590934) 346 | 347 | 高速缓存其实就是一组称之为缓存行(cache line)的固定大小的数据块,其大小是以突发读或者突发写周期的大小为基础的。 348 | 349 | 每个高速缓存行完全是在一个突发读操作周期中进行填充或者下载的。即使处理器只存取一个字节的存储器,高速缓存控制器也启动整个存取器访问周期并请求整个数据块。缓存行第一个字节的地址总是突发周期尺寸的倍数。缓存行的起始位置总是与突发周期的开头保持一致。 350 | 351 | 当从内存中取单元到cache中时,会一次取一个cacheline大小的内存区域到cache中,然后存进相应的cacheline中。 352 | 353 | 例如:我们要取地址 (t, s, b) 内存单元,发生了cache miss,那么系统会取 (t, s, 00…000) 到 (t, s, FF…FFF)的内存单元,将其放入相应的cacheline中。 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | ## 最近常见面试算法题 364 | 365 | 366 | 367 | 368 | 369 | [[面试题07. 重建二叉树](https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/)] 370 | 371 | [[面试题09. 用两个栈实现队列](https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/)] 372 | 373 | [[面试题10- II. 青蛙跳台阶问题](https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/)] 374 | 375 | [[面试题12. 矩阵中的路径](https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/)] 376 | 377 | [[面试题19. 正则表达式匹配](https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/)] 378 | 379 | [[面试题22. 链表中倒数第k个节点](https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/)] 380 | 381 | [[面试题24. 反转链表](https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/)] 382 | 383 | [[面试题25. 合并两个排序的链表](https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/)] 384 | 385 | [[面试题27. 二叉树的镜像](https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/)] 386 | 387 | [[面试题35. 复杂链表的复制](https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/)] 388 | 389 | [[面试题33. 二叉搜索树的后序遍历序列](https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/)] 390 | 391 | [[面试题40. 最小的k个数](https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/)] 392 | 393 | [[面试题47. 礼物的最大价值](https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/)] 394 | 395 | [[面试题48. 最长不含重复字符的子字符串](https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/)] 396 | 397 | [[面试题52. 两个链表的第一个公共节点](https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/)] 398 | 399 | [[面试题54. 二叉搜索树的第k大节点](https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/)] 400 | 401 | [[面试题51. 数组中的逆序对](https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/)] 402 | 403 | [[面试题63. 股票的最大利润](https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/)] 404 | 405 | [[面试题68 - I. 二叉搜索树的最近公共祖先](https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/)] 406 | 407 | [[面试题59 - I. 滑动窗口的最大值](https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/)] 408 | 409 | [[42. 接雨水](https://leetcode-cn.com/problems/trapping-rain-water/)] 410 | 411 | [[4. 寻找两个有序数组的中位数](https://leetcode-cn.com/problems/median-of-two-sorted-arrays/)] 412 | 413 | [[146. LRU缓存机制](https://leetcode-cn.com/problems/lru-cache/)] * 必刷 414 | 415 | [[25. K 个一组翻转链表](https://leetcode-cn.com/problems/reverse-nodes-in-k-group/)] * 必刷 416 | 417 | [[215. 数组中的第K个最大元素](https://leetcode-cn.com/problems/kth-largest-element-in-an-array/)] 418 | 419 | [[93. 复原IP地址](https://leetcode-cn.com/problems/restore-ip-addresses/)] 420 | 421 | [[46. 全排列](https://leetcode-cn.com/problems/permutations/)] 422 | 423 | 424 | 425 | 426 | 427 | -------------------------------------------------------------------------------- /知识点/基础知识/OperatingSystemBasic.md: -------------------------------------------------------------------------------- 1 | # 操作系统 2 | 3 | 4 | 5 | 资料参考: 6 | 7 | 1. 牛客网面试宝典操作系统部分 8 | 9 | 2. 10 | 11 | 3. 12 | 4. [面试/笔试第二弹 —— 操作系统面试问题集锦](https://blog.csdn.net/justloveyou_/article/details/78304294?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 13 | 14 | --- 15 | 16 | ## 操作系统概述 17 | 18 | ### 基本特征 19 | 20 | --- 21 | 22 | #### **1. 并发与并行** 23 | 24 | 操作系统通过引入进程和线程,使得程序能够并发运行。 25 | 26 | 并发(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,你的指令之间穿插着我的指令,我的指令之间穿插着你的,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率。 27 | 28 | 并行(parallelism):指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。这样说来并行的确提高了计算机的效率。所以现在的cpu都是往多核方面发展。并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。 29 | 30 | #### **2. 共享** 31 | 32 | 共享是指系统中的资源可以被多个并发进程共同使用。 33 | 34 | 有两种共享方式:互斥共享和同时共享。 35 | 36 | 互斥共享的资源称为临界资源,例如打印机等,在同一时刻只允许一个进程访问,需要用同步机制来实现互斥访问。操作临界资源的代码段成为临界区。 37 | 38 | 临界资源--》同步机制--》 信号量(PV操作),事件 ,(锁)互斥量 39 | 40 | #### **3. 虚拟** 41 | 42 | 虚拟技术把一个物理实体转换为多个逻辑实体。 43 | 44 | 主要有两种虚拟技术:时(时间)分复用技术和空(空间)分复用技术。 45 | 46 | 多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。进程、线程的调度,时分复用。 47 | 48 | 虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。(虚拟地址详细见后面) 49 | 50 | ### 操作系统的基本功能 51 | 52 | --- 53 | 54 | #### **1.进程管理** 55 | 56 | 进程控制、进程同步、进程通信、死锁处理、处理机调度等。 57 | 58 | 进程控制:进程的概念,僵尸进程 59 | 进程同步:临界资源的保护 60 | 进程通信:管道,系统IPC,锁 等。 61 | 死锁处理:死锁产生的原理,如何避免,处理 62 | 处理机调度:调度算法,经典的算法:先来先服务等。 63 | 64 | --- 65 | 66 | #### **2.内存管理** 67 | 68 | 内存分配、地址映射、内存保护与共享、虚拟内存等。 69 | 70 | 内存分配:可执行文件的内存分配,BSS,data,text段的分配。 71 | 地址映射:虚拟地址的映射,二级->三级 地址映射 72 | 内存保护: 73 | 虚拟内存: 74 | 75 | --- 76 | 77 | #### **3.文件管理** 78 | 79 | 文件存储空间的管理、目录管理、文件读写管理和保护等。 80 | 81 | 课设内容:实现的简单的文件系统。UNIXV6++的文件存储空间分布,diskinode和inode,文件表的关系,Unix的inode管理 82 | 83 | --- 84 | 85 | #### **4.设备管理** 86 | 87 | 完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。 88 | 89 | 主要包括缓冲管理、设备分配、设备处理、虛拟设备等。 90 | 91 | 缓冲管理:缓冲队列,自由队列 92 | 93 | ### **系统调用** 94 | 95 | --- 96 | 97 | 进程在用户态使用内核功能时,转换为内核态,操作系统负责完成。Linux的基本系统调用有 98 | 99 | |任务|命令函数| 100 | |-|-| 101 | |进程的控制|fork() ;exit();wait(); 102 | |进程通信| pipe(); shmget();mmap(); 103 | |文件操作| open();read();write(); 104 | |设备操作| read();wriet(); 105 | |进程相关| getpid();getppid();sleep();usleep(); 106 | |系统安全| chmod(); umask();chown() 107 | 108 | ### **中断** 109 | 110 | --- 111 | 112 | #### **1.外设备中断** 113 | 114 | --- 115 | io完成,输入输出设备的中断 116 | 117 | #### **2.异常** 118 | 119 | --- 120 | 由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。 121 | 122 | #### **3.系统调用** 123 | 124 | --- 125 | 程序中使用系统调用,会引发中断 126 | 127 | #### **4.时钟中断** 128 | 129 | --- 130 | 时钟中断会引发一系列操作,时钟计数,进程的调度,进程优先级的重新计算等等。 131 | 132 | ## 进程部分 133 | 134 | 这一部分为操作系统知识的详细解释,可能成为直接面试题目 135 | 136 | --- 137 | 138 | ### **进程和线程的联系与区别** 139 | 140 | --- 141 | **1. 基本概念** 142 | 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发; 143 | 144 | 145 | 线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。也就是说: 146 | |线程共享的数据|线程独占的数据| 147 | |:--|-| 148 | |进程代码段
进程的公有数据(全局变量、静态变量..
进程打开的文件描述符
进程的当前目录
信号处理器/信号处理函数:对收到的信号的处理方式
进程ID与进程组ID|线程ID
一组寄存器的值
线程自身的栈(堆是共享的)
错误返回码:线程可能会产生不同的错误返回码,一个线程的错误返回码不应该被其它线程修改;
信号掩码/信号屏蔽字(Signal mask):表示是否屏蔽/阻塞相应的信号(SIGKILL,SIGSTOP除外)| 149 | 150 | **2.区别** 151 | 1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。 152 | 153 | 2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。) 154 | 155 | 3.进程是资源分配和调度的最小单位,线程是CPU调度和分派的最小单位; 156 | 157 | 4.系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。 158 | 159 | 5.通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预。进程的通信需要以进程间通信(IPC)的方式进行。(下一点会有详细解释)。 160 | 161 | 6.进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。 162 | 163 | 7.进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉。 164 | 165 | 8.进程适应于多核、多机分布;线程适用于多核 166 | 167 | 9.多进程和多线程的不同:进程是资源分配的最小单位,而线程时CPU调度的最小单位。多线程之间共享同一个进程的地址空间,线程间通信简单,同步复杂,线程创建、销毁和切换简单,速度快,占用内存少,适用于多核分布式系统,但是线程间会相互影响,一个线程意外终止会导致同一个进程的其他线程也终止,程序可靠性弱。而多进程间拥有各自独立的运行地址空间,进程间不会相互影响,程序可靠性强,但是进程创建、销毁和切换复杂,速度慢,占用内存多,进程间通信复杂,但是同步简单,适用于多核、多机分布。 168 | 169 | --- 170 | **3.进程之间的通信** 171 | 进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。 172 | 173 | 1.管道: 174 | 175 | 管道主要包括无名管道和命名管道:管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信 176 | 177 | 1.1 普通管道PIPE: 178 | 179 | 1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端 180 | 181 | 2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间) 182 | 183 | 3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。 184 | 185 | 1.2 命名管道FIFO: 186 | 187 | 1)FIFO可以在无关的进程之间交换数据 188 | 189 | 2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。 190 | 191 | 192 | 1. 系统IPC: 193 | 194 | 2.1 消息队列 195 | 196 | 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标记。 (消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点)具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息; 197 | 198 | 特点: 199 | 200 | 1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。 201 | 202 | 2)消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。 203 | 204 | 3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。 205 | 206 | 4)读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。 207 | 208 | 2.2 信号量semaphore 209 | 210 | 信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。 211 | 212 | 特点: 213 | 214 | 1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。 215 | 216 | 2)信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。 217 | 218 | 3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。 219 | 220 | 4)支持信号量组。 221 | 222 | 223 | 2.3 信号signal 224 | 225 | 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 226 | 227 | 可以使用系统信号,也可以自定义使用信号,#35-#63 信号,其他由系统定义。 228 | 229 | 2.4 共享内存(Shared Memory) 230 | 231 | 它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等 232 | 233 | 特点: 234 | 235 | 1)共享内存是最快的一种IPC,因为进程是直接对内存进行存取 236 | 237 | 2)因为多个进程可以同时操作,所以需要进行同步 238 | 239 | 3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问 240 | 241 | 242 | 3.套接字SOCKET: 243 | 244 | socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机之间的进程通信。 245 | 246 | 网络socket 可以不同主机之间的进程通信,也可以本机通信。 247 | unix socket 可以用于本机进程之间的通信,原理与网络socket类似。 248 | 249 | ### 进程之间的通信 250 | 251 | 参考 252 | 253 | [进程间通信IPC (InterProcess Communication)--简书](https://www.jianshu.com/p/c1015f5ffa74) 254 | 255 | [进程间通信--管道](http://blog.chinaunix.net/uid-26833883-id-3227144.html) 256 | 257 | [进程间通信---共享内存](http://blog.chinaunix.net/uid-26833883-id-3230564.html) 258 | 259 | [进程间通信——共享内存(Shared Memory)--CSDN](https://blog.csdn.net/ypt523/article/details/79958188?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task) 260 | 261 | [进程间同步---system v ipc 对象信号灯集--PV信号量操作](http://blog.chinaunix.net/uid-26833883-id-3230813.html) 262 | 263 | 264 | 265 | ### **进程同步** 266 | 267 | --- 268 | 269 | **1. 临界区** 270 | 对临界资源进行访问的那段代码称为临界区。 271 | 为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。 272 | **2. 同步与互斥** 273 | 274 | * 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。 275 | * 互斥:多个进程在同一时刻只有一个进程能进入临界区。 276 | 277 | #### 经典同步问题 278 | 279 | 1.生产者-消费者问题 280 | 281 | ```C++ 282 | 问题描述:使用一个缓冲区来存放数据,只有缓冲区没有满,生产者才可以写入数据;只有缓冲区不为空,消费者才可以读出数据 283 | 284 | // 伪代码描述 285 | // 定义信号量 full记录缓冲区物品数量 empty代表缓冲区空位数量 mutex为互斥量 286 | semaphore full = 0, empty = n, mutex = 1; 287 | 288 | // 生产者进程 289 | void producer(){ 290 | do{ 291 | P(empty); 292 | P(mutex); 293 | 294 | // 生产者进行生产 295 | 296 | V(mutex); 297 | V(full); 298 | } while(1); 299 | } 300 | 301 | void consumer(){ 302 | do{ 303 | P(full); 304 | P(mutex); 305 | 306 | // 消费者进行消费 307 | 308 | V(mutex); 309 | V(empty); 310 | } while(1); 311 | } 312 | ``` 313 | 314 | 2.哲学家就餐问题 315 | 316 | ```C++ 317 | 318 | ``` 319 | 320 | 3.读写者问题 321 | 322 | ```C++ 323 | 324 | ``` 325 | 326 | 327 | ### **进程状态以及调度** 328 | 329 | ***进程有三种基本的状态:*** 330 | 331 | * 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源 332 | * 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数 333 | * 阻塞状态: 进程等待某种条件,在条件满足之前无法执行 334 | 335 | #### 进程调度算法 336 | 337 | --- 338 | 339 | ##### 批处理系统 340 | 341 | 批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。 342 | 343 | **1 先来先服务 first-come first-serverd(FCFS)** 344 | 非抢占式的调度算法,按照请求的顺序进行调度。 345 | 346 | 有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。 347 | 348 | **2 短作业优先 shortest job first(SJF)** 349 | 非抢占式的调度算法,按估计运行时间最短的顺序进行调度。 350 | 351 | 长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。 352 | 353 | **3 最短剩余时间优先 shortest remaining time next(SRTN)** 354 | 最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。 355 | 356 | **4 最高响应比优先 Highest Response Ratio Next(HRRN)** 357 | 响应比 = 1+ 等待时间/处理时间。同时考虑了等待时间的长短和估计需要的执行时间长短,很好的平衡了长短进程。非抢占,吞吐量高,开销可能较大,提供好的响应时间,无饥饿问题。 358 | 359 | ##### 交互式系统 360 | 361 | 交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。 362 | 363 | **1 时间片轮转** 364 | 将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。 365 | 366 | 时间片轮转算法的效率和时间片的大小有很大关系: 367 | 368 | 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。 369 | 而如果时间片过长,那么实时性就不能得到保证。 370 | 371 | **2.2 优先级调度** 372 | 为每个进程分配一个优先级,按优先级进行调度。 373 | 374 | 为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。 375 | 376 | **3 多级反馈队列** 377 | 一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。 378 | 379 | 多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。 380 | 381 | 每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。 382 | 383 | 可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。 384 | 385 | --- 386 | 387 | ### 僵尸进程 388 | 389 | ***僵尸进程的概念*** 390 | 一个子进程结束后,它的父进程并没有等待它(调用wait或者waitpid),那么这个子进程将成为一个僵尸进程。僵尸进程是一个已经死亡的进程,但是并没有真正被销毁。它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程表中保留一个位置,记载该进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)供父进程收集,除此之外,僵尸进程不再占有任何内存空间。这个僵尸进程可能会一直留在系统中直到系统重启。 391 | 392 | 危害:占用进程号,而系统所能使用的进程号是有限的,在高并发的系统中,若存在大量的僵死进程,占用进程号,则导致系统无法创建更多进程,系统效率降低;占用内存,造成内存紧张,系统消耗会增大。 393 | 394 | linux中ps命令查看进程状态。 395 | 396 | ***以下情况不会产生僵尸进程*** 397 | 398 | * 该进程的父进程先结束了。每个进程结束的时候,系统都会扫描是否存在子进程,如果有则用Init进程接管,成为该进程的父进程,并且会调用wait等待其结束。 399 | * 父进程调用wait或者waitpid等待子进程结束(需要每隔一段时间查询子进程是否结束)。wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。waitpid则可以加入WNOHANG(wait-no-hang)选项,如果没有发现结束的子进程,就会立即返回,不会将调用waitpid的进程阻塞。同时,waitpid还可以选择是等待任一子进程(同wait),还是等待指定pid的子进程,还是等待同一进程组下的任一子进程,还是等待组ID等于pid的任一子进程; 400 | * 子进程结束时,系统会产生SIGCHLD(signal-child)信号,可以注册一个信号处理函数,在该函数中调用waitpid,等待所有结束的子进程(注意:一般都需要循环调用waitpid,因为在信号处理函数开始执行之前,可能已经有多个子进程结束了,而信号处理函数只执行一次,所以要循环调用将所有结束的子进程回收); 401 | * 也可以用signal(SIGCLD, SIG_IGN)(signal-ignore)通知内核,表示忽略SIGCHLD信号,那么子进程结束后,内核会进行回收。 402 | 403 | 404 | ***孤儿进程*** 405 | 406 | * 一个父进程已经结束了,但是它的子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程会被Init(进程ID为1)接管,当这些孤儿进程结束时由Init完成状态收集工作。 407 | 408 | --- 409 | 410 | ### 线程同步的方式 411 | 412 | #### 信号量 413 | 414 | * 信号量是一种特殊的变量,可用于线程同步。它只取自然数值,并且只支持两种操作: 415 | 416 | ```txt 417 | P(SV):如果信号量SV大于0,将它减一;如果SV值为0,则挂起该线程。 418 | 419 | V(SV):如果有其他进程因为等待SV而挂起,则唤醒,然后将SV+1;否则直接将SV+1。 420 | 421 | 其系统调用为: 422 | 423 | sem_wait(sem_t *sem):以原子操作的方式将信号量减1,如果信号量值为0,则sem_wait将被阻塞,直到这个信号量具有非0值。 424 | 425 | sem_post(sem_t *sem):以原子操作将信号量值+1。当信号量大于0时,其他正在调用sem_wait等待信号量的线程将被唤醒。 426 | ``` 427 | 428 | #### 互斥量 429 | 430 | 互斥量又称互斥锁,主要用于线程互斥,不能保证按序访问,可以和条件锁一起实现同步。当进入临界区 时,需要获得互斥锁并且加锁;当离开临界区时,需要对互斥锁解锁,以唤醒其他等待该互斥锁的线程。其主要的系统调用如下: 431 | 432 | ```txt 433 | pthread_mutex_init:初始化互斥锁 434 | 435 | pthread_mutex_destroy:销毁互斥锁 436 | 437 | pthread_mutex_lock:以原子操作的方式给一个互斥锁加锁,如果目标互斥锁已经被上锁,pthread_mutex_lock调用将阻塞,直到该互斥锁的占有者将其解锁。 438 | 439 | pthread_mutex_unlock:以一个原子操作的方式给一个互斥锁解锁 440 | ``` 441 | 442 | #### 条件变量 443 | 444 | 条件变量,又称条件锁,用于在线程之间同步共享数据的值。条件变量提供一种线程间通信机制:当某个共享数据达到某个值时,唤醒等待这个共享数据的一个/多个线程。即,当某个共享变量等于某个值时,调用 signal/broadcast。此时操作共享变量时需要加锁。其主要的系统调用如下: 445 | 446 | ```txt 447 | pthread_cond_init:初始化条件变量 448 | 449 | pthread_cond_destroy:销毁条件变量 450 | 451 | pthread_cond_signal:唤醒一个等待目标条件变量的线程。哪个线程被唤醒取决于调度策略和优先级。 452 | 453 | pthread_cond_wait:等待目标条件变量。需要一个加锁的互斥锁确保操作的原子性。该函数中在进入wait状态前首先进行解锁,然后接收到信号后会再加锁,保证该线程对共享资源正确访问。 454 | ``` 455 | 456 | ### 多进程和多线程的使用场景 457 | 458 | * 多线程模型主要优势为线程间切换代价较小,因此适用于I/O密集型的工作场景,因此I/O密集型的工作场景经常会由于I/O阻塞导致频繁的切换线程。同时,多线程模型也适用于单机多核分布式场景。 459 | 460 | * 多进程模型,适用于CPU密集型。同时,多进程模型也适用于多机分布式场景中,易于多机扩展。 461 | 462 | ### 互斥量与临界区的区别 463 | 464 | 互斥量是可以命名的,可以用于不同进程之间的同步;而临界区只能用于同一进程中线程的同步。创建互斥量需要的资源更多,因此临界区的优势是速度快,节省资源。 465 | 466 | ### 什么是IO多路复用?实现方法? 467 | 468 | #### io复用概念以及原理 469 | 470 | IO多路复用(IO Multiplexing)是指单个进程/线程就可以同时处理多个IO请求。 471 | 472 | 实现原理:用户将想要监视的文件描述符(File Descriptor)添加到select/poll/epoll函数中,由内核监视,函数阻塞。一旦有文件描述符就绪(读就绪或写就绪),或者超时(设置timeout),函数就会返回,然后该进程可以进行相应的读/写操作。 473 | 474 | * 三个函数的使用见计网作业。 475 | 476 | #### select/poll/epoll三个方式的使用 477 | 478 | ##### select: 479 | 480 | * 将文件描述符放入一个集合中,调用select时,将这个集合从用户空间拷贝到内核空间,由内核根据就绪状态修改该集合的内容。集合大小有限制,32位机默认是1024(64位:2048);采用水平触发机制。select函数返回后,需要通过遍历这个集合,找到就绪的文件描述符,当文件描述符的数量增加时,效率会线性下降; 481 | * **select的缺点:** 每次都要复制,开销大; 集合的大小有限,默认1024/2048的大小,连接数量有限;轮询的方式效率较低,每次都要轮询集合中的文件描述符 482 | 483 | ##### poll: 484 | 485 | * 和select几乎没有区别,区别在于文件描述符的存储方式不同,poll采用链表的方式存储,没有最大存储数量的限制。 486 | * 缺点:和select类似,但是:不用复制,只需要将文件描述符加入数组即可。仍然采用轮询的方式查询数组中的文件描述符,效率较低。 487 | * 采用水平触发的方式。 488 | 489 | ##### epoll: 490 | 491 | * 通过内核和用户空间共享内存,避免了不断复制的问题;支持的同时连接数上限很高(1G左右的内存支持10W左右的连接数);文件描述符就绪时,采用回调机制,避免了轮询(回调函数将就绪的描述符添加到一个链表中,执行epoll_wait时,返回这个链表);支持水平触发和边缘触发,采用边缘触发机制时,只有活跃的描述符才会触发回调函数。 492 | * epoll的ET模式是默认模式,这也是select和poll的模式,即只要有事件发生,那么就会被epoll_wait所捕获,如果一次读写没有完成,那么会在下一次epoll_wait调用时接着被捕获;而ET边沿触发模式是读写没完成,下次不会被捕获,之后新的数据到达时才会触发。 493 | 494 | ###### 水平触发和边缘触发 495 | 496 | * 水平触发(LT,Level Trigger)模式下,只要一个文件描述符就绪,就会触发通知,如果用户程序没有一次性把数据读写完,下次还会通知; 497 | * 边缘触发(ET,Edge Trigger)模式下,当描述符从未就绪变为就绪时通知一次,之后不会再通知,直到再次从未就绪变为就绪(缓冲区从不可读/写变为可读/写)。用户需要判断数据是否读完,否则需要等待下一次文件描述符变就绪状态才能接收到通知。 498 | * 区别:边缘触发效率更高,减少了被重复触发的次数,函数不会返回大量用户程序可能不需要的文件描述符。 499 | * 为什么边缘触发一定要用非阻塞(non-block)IO:避免由于一个描述符的阻塞读/阻塞写操作让处理其它描述符的任务出现饥饿状态。 500 | 501 | ***select/poll/epoll小结:*** 502 | 503 | * 线程能连接的最大数量 504 | * 文件描述符的传递方式 505 | * 水平触发 or 边缘触发 506 | * 查询文件描述符的方式 : 轮询or回调 507 | * 表面上看epoll的性能最好,但是在连接数量较少的并且十分都活跃的情况下,select和poll的性能可能要高与epoll,因为epoll设计到函数的回调。三种方式的效率需要根据实际情况来考虑。 508 | 509 | #### 常见的io模型 510 | 511 | * 同步阻塞IO(Blocking IO):用户线程发起IO读/写操作之后,线程阻塞,直到可以开始处理数据;对CPU资源的利用率不够; 512 | * 同步非阻塞IO(Non-blocking IO):发起IO请求之后可以立即返回,如果没有就绪的数据,需要不断地发起IO请求直到数据就绪;不断重复请求消耗了大量的CPU资源; 513 | * IO多路复用 514 | * 异步IO(Asynchronous IO):用户线程发出IO请求之后,继续执行,由内核进行数据的读取并放在用户指定的缓冲区内,在IO完成之后通知用户线程直接使用。 515 | 516 | --- 517 | 518 | ## 死锁部分 519 | 520 | ### 死锁的概念以及死锁产生的必要条件 521 | 522 | ***死锁的概念*** 523 | 524 | * 在两个或者多个并发进程中,每个进程持有某种资源而又等待其它进程释放它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁(deadlock)。 525 | 526 | ***产生死锁的四个条件*** 527 | 528 | * **互斥条件:** 进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源 529 | 530 | * **请求和保持条件:** 进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源。 531 | 532 | * **不可剥夺条件:** 进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用后自己释放 533 | 534 | * **环路等待条件:** 进程发生死锁后,必然存在一个进程-资源之间的环形链 535 | 536 | ### 死锁的处理方法 537 | 538 | * 鸵鸟策略 539 | * 死锁检测与死锁恢复 540 | * 死锁预防 541 | * 死锁避免 542 | 543 | #### 落鸟策略 544 | 545 | 是指忽略死锁。当死锁不会对用户造成太大影响或者发生死锁的概率很低时,可以采取鸵鸟策略 546 | 547 | #### 死锁检测与恢复 548 | 549 | 不试图阻止死锁,当检测到死锁时,采取措施进行恢复 550 | 551 | ##### 死锁解锁 552 | 553 | 可以利用有向图检测是否存在环 554 | 555 | ##### 死锁恢复的方法 556 | 557 | * 利用抢占恢复: 挂起某些进程,然后抢占这些进程的资源,但是需要恢复这些被挂起进程的状态 558 | * 利用回滚恢复: 让后写进程回退到足以解除死锁的状态,进程回退时资源释放资源 559 | * 通过杀死进程恢复: 强制杀死某些进程以解锁死锁 560 | 561 | 562 | #### 死锁预防 563 | 564 | ***死锁预防的基本思想是破坏形成死锁的基本条件*** 565 | 566 | #### 死锁避免 567 | 568 | 在程序运行时避免死锁的发生 569 | 570 | 银行家算法: 只要存在一种资源分配方式,使得系统是安全的即可。 571 | 572 | --- 573 | 574 | ## 下一部分为内存管理 575 | 576 | ### 虚拟内存 577 | 578 | 每个程序都拥有自己的地址空间,这个地址空间被分成大小相等的页,这些页被映射到物理内存;但不需要所有的页都在物理内存中,当程序引用到不在物理内存中的页时,由操作系统将缺失的部分装入物理内存。这样,对于程序来说,逻辑上似乎有很大的内存空间,只是实际上有一部分是存储在磁盘上,因此叫做虚拟内存。 579 | 580 | 虚拟内存的优点是让程序可以获得更多的可用内存。 581 | 582 | #### linux的虚地址空间 583 | 584 | * linux虚地址空间即是虚拟内存 585 | 586 | 虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。 事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。 587 | 588 | 请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。 589 | 590 | #### 虚拟内存的好处 591 | 592 | * 1.扩大地址空间; 593 | * 2.内存保护:每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改。 594 | * 3.公平内存分配。采用了虚存之后,每个进程都相当于有同样大小的虚存空间。 595 | * 4.当进程通信时,可采用虚存共享的方式实现。 596 | * 5.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存 597 | * 6.虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。在内存中可以保留多个进程,系统并发度提高 598 | * 7.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片 599 | 600 | #### 虚拟内存的代价 601 | 602 | * 1.虚存的管理需要建立很多数据结构,这些数据结构要占用额外的内存 603 | * 2.虚拟地址到物理地址的转换,增加了指令的执行时间。 604 | * 3.页面的换入换出需要磁盘I/O,这是很耗时的 605 | * 4.如果一页中只有一部分数据,会浪费内存。 606 | 607 | ### 内核中内存的管理 608 | 609 | 一个程序的本质是由BSS段,data段(数据),text段(代码段)组成的。一个可执行程序没有调入内存之前,分为代码段,数据,未初始化数据区三个部分。调入内存之后,内存中由低地址到高地址依次为: 代码段,数据段{已初始化数据段,未初始化数据段(BBS)},堆(heap,向高地址增长),栈(stack,向低地址增长),命令行参数和环境变量。 610 | 611 | **BSS段** :(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 612 | **数据段** :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域。数据段属于静态内存分配。 613 | **代码段**: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 只读 , 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些 只读的常数变量 ,例如字符串常量等。程序段为程序代码在内存中的映射.一个程序可以在内存中多有个副本. 614 | **堆(heap)** :堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减) 615 | **栈(stack)** :栈又称堆栈, 存放程序的 局部变量 (但不包括static声明的变量, static 意味着 在数据段中 存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。储动态内存分配,需要程序员手工分配,手工释放 616 | 617 | * 参考博客: 618 | 619 | 620 | 621 | ### 分系统中虚地址与物理内存的映射 622 | 623 | * **内存管理单元(MMU)**管理着逻辑地址和物理地址的转换,其中的页表(Page table)存储着页(逻辑地址)和页框(物理内存空间)的映射表,页表中还包含包含有效位(是在内存还是磁盘)、访问位(是否被访问过)、修改位(内存中是否被修改过)、保护位(只读还是可读写)。逻辑地址:页号+页内地址(偏移);每个进程一个页表,放在内存,页表起始地址在PCB/寄存器中。 624 | 625 | * 虚地址与物理地址的映射,unix最原始的为二级页表,随着系统的增长,三级页表,四级页表系统会出现。二级页表详情见操作系统上课讲义(期末考过,记住)。 626 | 627 | ### 页面置换算法 628 | 629 | #### 最佳页面置换算法OPT(Optimal replacement algorithm) 630 | 631 | * 置换以后不需要或者最远的将来才需要的页面,是一种理论上的算法,是最优策略;实现上来说不知道不知道哪一个页面是将来不需要或者很久之后才需要的页面,因此实际无法操作 632 | 633 | #### 先进先出FIFO 634 | 635 | * 置换在内存中驻留时间最长的页面。缺点:有可能将那些经常被访问的页面也被换出,从而使缺页率升高;先进先出策略,将cache作为栈看作,需要记录页面进入时间。 636 | 637 | #### 第二次机会算法SCR 638 | 639 | * 按FIFO选择某一页面,若其访问位为1,给第二次机会,并将访问位置0; 640 | 641 | #### 时钟算法 Clock 642 | 643 | * SCR中需要将页面在链表中移动(第二次机会的时候要将这个页面从链表头移到链表尾),时钟算法使用环形链表,再使用一个指针指向最老的页面,避免了移动页面的开销; 644 | 645 | #### 近未使用算法NRU(Not Recently Used) 646 | 647 | * 检查访问位R、修改位M,优先置换R=M=0,其次是(R=0, M=1); 648 | 649 | #### 最近最少使用算法LRU(Least Recently Used) 650 | 651 | * 置换出未使用时间最长的一页;实现方式:维护时间戳,或者维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。 652 | 653 | #### 最不经常使用算法NFU 654 | 655 | * 置换出访问次数最少的页面 656 | 657 | #### 在学校操作系统课程中,自己的关于页面的一个想法 658 | 659 | * 将cache分为两个部分,一个部分为hot部分,占cache的3/8,hot部分存放的是近期使用过k次(及以上)的页面;剩下部分为cool部分,占cache的5/8。发生页面置换时,若页面已经在hot部分,则增加改页面最近的访问次数,hot值降低;若页面在cool部分,则该页面hot+1,若该页面最近访问次数达到k,则置换到cache的hot部分,hot部分被置换出来的页面保留在cool部分;若页面不在cache中,则将页面置换到cool部分,将cool部分的某一个近期没有使用过的页面置换出来 660 | 661 | ### 分页、分段 662 | 663 | 该部分详细见操作系统讲义 664 | 665 | #### 分段 666 | 667 | 段式存储:用户进程地址空间按照自身逻辑关系划分为若干个段(segment)(如代码段,数据段,堆栈段),内存空间被动态划分为长度不同的区域,分配时以段为单位,每段在内存中占据连续空间,各段可以不相邻; 668 | 669 | #### 分页 670 | 671 | 页式存储:用户空间划分为大小相等的部分称为页(page),内存空间划分为同样大小的区域称为页框,分配时以页为单位,按进程需要的页数分配,逻辑上相邻的页物理上不一定相邻; 672 | 673 | #### 段页 674 | 675 | 段页式存储:用户进程先按段划分,段内再按页划分,内存划分和分配按页。 676 | 677 | #### 三者区别联系 678 | 679 | ##### 目的不同 680 | 681 | 分页的目的是管理内存,用于虚拟内存以获得更大的地址空间;分段的目的是满足用户的需要,使程序和数据可以被划分为逻辑上独立的地址空间; 682 | 683 | ##### 大小不同 684 | 685 | 段的大小不固定,由其所完成的功能决定;页的大小固定,由系统决定; 686 | 687 | ##### 地址空间维度不同 688 | 689 | 分段是二维地址空间(段号+段内偏移),分页是一维地址空间(每个进程一个页表/多级页表,通过一个逻辑地址就能找到对应的物理地址); 690 | 691 | ##### 碎片和信息保护 692 | 693 | * 分段没有内碎片,但是会产生外碎片;分页没有外碎片,但是会产生内碎片,一个页填不满的情况 694 | * 分段便于信息的保护和共享;分页的共享收到了限制; 695 | 696 | ### 局部性原理 697 | 698 | * 时间上:最近被访问的页在不久的将来还会被访问; 699 | * 空间上:内存中被访问的页周围的页也很可能被访问。 700 | 701 | ### 颠簸现象 702 | 703 | * 颠簸本质上是指频繁的页调度行为。进程发生缺页中断时必须置换某一页。然而,其他所有的页都在使用,它置换一个页,但又立刻再次需要这个页。因此会不断产生缺页中断,导致整个系统的效率急剧下降,这种现象称为颠簸。 704 | * 内存颠簸的解决策略包括: 705 | 706 | * 修改页面置换算法; 707 | * 降低同时运行的程序的数量; 708 | * 终止该进程或增加物理内存容量。 709 | 710 | --- 711 | 712 | ## 设备管理 713 | 714 | 详情看操作系统讲义 715 | 716 | --- 717 | 718 | ## 程序的编译 719 | 720 | ### 源码到可执行程序的过程 721 | 722 | #### 1)预编译 723 | 724 | 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下 725 | 726 | * 1、删除所有的#define,展开所有的宏定义。 727 | 728 | * 2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。 729 | 730 | * 3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。 731 | 732 | * 4、删除所有的注释,“//”和“/**/”。 733 | 734 | * 5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。 735 | 736 | * 6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。 737 | 738 | #### 2)编译 739 | 740 | 详细见编译原理课程讲义 741 | 742 | 把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。 743 | 744 | * 1、词法分析:利用类似于“有限状态机”的算法,将源代码程序输入到扫描机中,将其中的字符序列分割成一系列的记号。 745 | 746 | * 2、语法分析:语法分析器对由扫描器产生的记号,进行语法分析,产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树。 747 | 748 | * 3、语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。 749 | 750 | * 4、优化:源代码级别的一个优化过程。 751 | 752 | * 5、目标代码生成:由代码生成器将中间代码转换成目标机器代码,生成一系列的代码序列——汇编语言表示。 753 | 754 | * 6、目标代码优化:目标代码优化器对上述的目标机器代码进行优化:寻找合适的寻址方式、使用位移来替代乘法运算、删除多余的指令等。 755 | 756 | ### 3)汇编 757 | 758 | 将汇编代码转变成机器可以执行的指令(机器码文件)。 汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Windows下)、xxx.obj(Linux下)。 759 | 760 | #### 4)链接 761 | 762 | 将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。链接分为静态链接和动态链接 763 | 764 | ### 关于链接 765 | 766 | 链接分为动态链接和静态链接,详细见计网作业 767 | 参考博客 768 | 769 | * 770 | 771 | #### 静态链接 772 | 773 | 函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。 774 | 775 | 空间浪费:因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以如果多个程序对同一个目标文件都有依赖,会出现同一个目标文件都在内存存在多个副本; 776 | 777 | 更新困难:每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。 778 | 779 | 运行速度快:但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。 780 | 781 | #### 动态链接 782 | 783 | 动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。 784 | 785 | 共享库:就是即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分,副本,而是这多个程序在执行时共享同一份副本; 786 | 787 | 更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。 788 | 789 | 性能损耗:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。 790 | 791 | #### 区别 792 | 793 | 静态链接和动态链接的区别见上面详细介绍。 794 | 实际在计网作业中发现,静态链接而成的可执行程序往往要比动态链接的可执行程序要大,因为将所需要的库都包含在一个可执行文件中了。linux中默认为动态链接,可以根据编译选项,选择静态编译 795 | 796 | ## 文件系统 797 | 798 | 详见操作系统课程讲义 799 | 800 | --- 801 | ## Linux操作系统中常见的一些问题 802 | --- 803 | 804 | #### ./ source sh 三个命令执行shell文件的区别 805 | 806 | 参考: 807 | [linux 下的 source,sh,./三者区别--简书](https://www.jianshu.com/p/aa978c32935c) 808 | [linux 下的 source,sh,./三者区别--CSDN-1](https://blog.csdn.net/s740556472/article/details/78176087) 809 | -------------------------------------------------------------------------------- /知识点/基础知识/计算机网络备战面试笔记.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TJ-CSCCG/TJCS-Interview/6703ff352747f7b38ea9f255e01a59a35cf6c4f2/知识点/基础知识/计算机网络备战面试笔记.docx --------------------------------------------------------------------------------