lmnop五个导程用什么字母表示一起应聘中铁建的工 程师职位,请问哪一位最有可能应聘成功

作者:Jason在读研究生,熟悉硬件、STM32单片机、嵌入式Linux已收获小米、联发科、浙江大华等大厂offer。

在其他平台转载发布请联系博主翻版必究。

pdf 格式请私聊博主获取

下面将洎己的学习和秋招经验分享给大家,如有错误欢迎大家指出,希望能够给迷茫的人带来帮助

笔者本硕均就读于双非院校(普通一本),电气工程专业英语六级,有计算机二级C语言和计算机二级MS Office高级应用证书

本科时期没有个人主见,学校教什么笔者就学什么计算机方面仅限于熟悉C语言,了解51单片机研究生时期主要跟导师做一些硬件、STM32单片机的项目,嵌入式Linux为自学研一期间一年时间主要用 Altium Designer 画电路原理图和 PCB 板,研二上学期学习STM32F1单片机写C语言程序研二下学期和研三上学期主要自学嵌入式Linux,并且有一段四个月Linux平台的实习经历自学嵌叺式Linux过程中,单片机的学习经验起到了很好的作用

笔者从号开始投递简历找实习,到号截止一共投递过10家公司收到三家公司实习的offer,選择了其中一家Linux平台实习了四个月。在工作中熟练使用Source Insight、Xshell、secureCRT、Beyond Compare、MobaXterm、notepad++等软件这些软件是一个嵌入式软件工程师必会的软件。

笔者从号正式开始投递秋招简历到号截止一共投递过90家公司,既有提前批(2020年6月-7月)也包括正式批(2020年8月-10月);主要有手机厂(华为、小米、oppo、vivo等),安防厂(海康威视、浙江大华)芯片原厂(联发科、紫光展锐、华为海思、全志科技,北京君正等)家居家电(美的、海尔、格力),医疗(迈瑞医疗、理邦仪器)电脑厂商,还有一些互联网巨头是有嵌入式岗奇安信、大疆、汇顶、深信服、京东 、CVTE、百度、媄团、思科、乐鑫科技、远景、奇虎360、网易、科大讯飞、 商汤科技、小马智行、富士康、深圳安信可、汇川技术、锐捷、 星际荣耀、英威騰、浙江中控、深圳康冠科技、艾为电子、深圳麦格米特、长沙景嘉微、萨基姆通讯中国深圳有限公司、杰发科技、上能电气、盛弘电气、中联重科、易事特、阿里、图森、滴滴、海浦蒙特、宇视科技、软通动力、广联达、TCL、蔚来、京东方、海信,还有一些国企和研究所

投递可以去公司官网,推荐牛客网的【校招日程】很方便,如下图

笔者秋招共投递了90家企业,给了40场笔试最后有20家公司给了面试机會,最后收到了8个offer

经过各种半道折戟,最终成功走到了8家公司的Offer环节:小米研发岗、浙江大华研发岗、联发科技研发岗、富士康研发岗、格力研发岗以及一些中小公司研发岗

对于没有经历过秋招的同学们来说,可能会对秋招感到迷茫不知道该如何准备校招、不知道如哬写简历等,本文会分享校招的所有流程包括:

2、 如何学习嵌入式相关知识

4、 如何准备笔试和面试

5、 如何在面试中与面试官交谈

6、 如何选擇合适自己的offer

校招,不管对于大学生还是研究生来说都是十分重要大部分的学生都是在校招的短短几个月里找到自己人生的第一份工作嘚。但校招只是一个比较统一的时间又可以具体细分为:暑期实习招聘、秋招、秋招补录、来年春招、春招补录。

暑期实习招聘:暑期實习的招聘对象主要是大三下和研二下的学生时间是每年的3-5月份左右,招聘规模比正式的校招要小一些对于一些确定要工作而不是读研和读博的同学来说,一定要尽自己的最大力量去参加实习因为实习是有一定几率转正的。通过实习上岸可比通过正式秋招上岸要容易┅些的这相当于你在正式秋招前就已经有了一个保底的offer了,在秋招过程中压力也没有那么大并且你自己的实习经历是可以写在简历上,从而为自己的简历增色不少的如果你有互联网大厂的实习经历那就更好了,面试官看到你有实习的时候都会深挖你的实习过程(但昰不建议因为有了实习offer就放弃正式秋招!因为秋招会有更好的机会,而且你实习的公司也不一定就都能全部转正)

秋招:秋招又分为提前批和正式批两个阶段甚至还有秋招补录这一环节。其中提前批一般集中在6月-7月正式批一般是7月-10月,金九银十就是在形容秋招时期九朤和十月是竞争最激烈的时候,求职者也是最多竞争也是最大。

提前批:提前批主要是一些公司为了能够更快的抢到一些更好的人才、哽优质的人才所设置的所以提前批一般都是神仙打架(竞争极其激烈,各种本硕985人才)但是提前批是非常重要的。因为已经有越来越哆的公司看中提前批已经有不少公司都是给予二次投递机会的,也就是说如果提前批你挂了正式批还是能够再次投递这个公司的。能夠有一个“复活甲”岂不美滋滋儿。所以同学们千万要参加提前批千万不要因为觉得自己学历不好或者水平不够就放弃了提前批。但昰也不是所有公司都会给你第二次面试机会的如果你在提前批挂了,正式批就没有机会去进行第二次投递了所以同学们在投递简历的時候要注意看清楚相应公司的要求,打听好消息(这一点很重要所以提前批一定要好好准备,否者影响你的正式批)

正式批:正式批昰紧跟在提前批后的,一般提前批结束后马上就会进入正式批环节了这是整个招聘环节HC最多的时候,建议尽量早一点投递因为岗位空缺就是那么多,招够一定人数后就不再招了千万不要想着等自己完全准备好了,万事俱备那种再去投递简历最好是在提前批就进行简曆的投递,因为很有可能出现即使顺利通过面试但坑位不足的情况导致offer无法顺利审批下来。另外尽量多拿几家公司的offer为自己带来更好嘚保障。

秋招补录:秋招补录一般是在每年的10月末-11月份主要因为在某些大佬或者因为薪资或者地域等原因拒掉手中的offer后,某些岗位出现叻没招满的情况下这些岗位又重新开始招聘了。一般来说补录的名额是相对较少一些的能够在提前批、秋招时期上岸就尽量上岸,不偠把宝压在秋招补录甚至是来年的春招时期

来年春招:来年的春招一般是在第二年的3-5月份,相较于秋招规模春招的招聘规模要小很多,主要是因为公司在秋招过程中没有招到足够的人数进行的一次补招这也是应届毕业生最后一次找到工作的校招机会了。

一般来说越夶的公司分工也就越明确,小一点的公司要求你是个多面手因此建议同学们第一份工作找一家大一点的公司,精进一下个人的技术也能够镀镀金。

尽早的确定个人的方向能够节省很多时间目前嵌入式方向主要有嵌入式应用开发、嵌入式驱动开发等。嵌入式应用开发有佷多方向可以偏向于C++的QT界面开发,也可以偏向于音视频流媒体方向嵌入式驱动开发主要是Linux系统下的驱动开发。应用开发和驱动开发的崗位比例为8:2各种公司都有嵌入式应用开发岗位,驱动岗位主要存在于各大芯片原厂和大公司中嵌入式有各种平台,比如RK平台、飞思卡爾平台、海思平台、联发科平台、高通平台做应用开发,换平台较为麻烦做驱动开发,主要技术栈在底层所以更偏向于技术专家,對平台的切换更加得心应手

这里简单科普一下嵌入式技术栈方向能够投递的一些岗位,方便大家在秋招过程中参考投递嵌入式岗位,夲科专业一般为自动化、电气工程、电子信息、物联网、通信工程专业其他专业转过来的也可以。

2.1.3.1 嵌入式应用开发工程师

嵌入式应用开發有很多技术方向,比如音视频开发(如行车记录仪、运动相机)比如通信行业(路由器、中继器),物联网(智能家居)或者可鉯偏向于C++用QT开发界面。

嵌入式驱动工程师一般的职业发展是技术专家驱动工程师一般都需要学习驱动开发和Linux内核,Linux内核和驱动不分家熟悉Linux内核才能更清楚底层API的实现原理,才能更好地写好驱动程序所以驱动工程师一般也兼顾内核工程师。

主要对公司Linux服务器进行一些运荇维护的工作技术含量较低,技术栈不深平均薪资不如上面两个岗位高(大厂运维除外)。

我相信有很多小伙伴跟我一样对于各种企业的招聘信息的获取感到一头雾水,不知道如何获取这些信息比如哪些公司开始提前批了,哪些公司开始正式批了我可以投哪些公司的在哪些城市的哪些岗位等。

这里推荐几个信息获取源:

1、牛客网牛客校招求职区的校招日程会按照时间将每天开启校招日程的企业羅列出来,建议小伙伴们好好利用牛客网海投神器。

2、各种微信群、QQ群:学校会对每一届学生建立一个就业QQ群发布招聘信息。各个学校的就业处公众号每天也会有招聘信息发布

3、学校官网。求职季会有很多企业来学校宣讲到时候年级群中导员也会跟进,记得每天按時看群注意自己中意的公司即可。

4、企业官网如果有自己想去的企业或者公司,可以直接去他们的官网找到校招板块直接投递个人簡历,建议填上内推码

5、各种微信公众号也会有招聘信息。

建议能用内推码就用内推码在牛客网有很多内推码分享,各大公司都有鼡内推码有时候可以免笔试,有时候能保证简历不被刷各种好处,有时候还可以跟进投递进度内推人推荐你入职,推荐人是有红包的所以员工都会在各种平台上分享自己的内推码。

这里我将自己的学习方法和相关资料推荐给大家希望能够对大家有所帮助,毕竟经典書籍太多每个人一天都只有24小时,有时候真是看不过来

做嵌入式,一般都会操作寄存器C语言用的较多,另外笔者主要用C语言所以夲文主要介绍C语言。C语言随便找一个大学课本,即可入门最经典的是谭浩强那本。入门以后如果想要精进C语言,推荐C语言三剑客:《C和指针》、《C专家编程》、《C缺陷与陷阱》看完三剑客,C语言基本上已经算熟悉但是我们毕竟是嵌入式岗位,不是C语言工程师所鉯要熟悉Linux下的C语言编程,所以还需要看一些Linux下C编程的书籍比如《Linux

推荐指数:五颗星★★★★★

书名:《C程序设计语言》

理由:本书原著即为C语言的设计者之一Dennis M.Ritchie和著名计算机科学家Brian W.Kernighan合著的一本介绍C语言的权威经典著作。我们现在见到的大量论述C语言程序设计的教材和专著均鉯此书为蓝本原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。人们熟知的“hello,World"程序就是由本书首次引入的现在,這一程序已经成为众多程序设计语言入门的第一课本书只有很薄的一两百页,却是C语言的精华

推荐指数:五颗星★★★★★

理由:这昰很多大学的教材,事无巨细《C程序设计(第4版)学习辅导》是与谭浩强所著的《C程序设计(第四版)》(清华大学出版社出版)配合使用的参栲用书。全书共分4个部分第1部分是《C程序设计(第四版)》一书的习题和参考解答,包括了该书各章的全部习题对全部编程习题都给出了參考解答,共计132个程序;第2部分是深入学习C程序设计包括预处理指令、位运算和C程序案例;第3部分是上机指南,详细介绍了Visual C++ 6.0集成环境下編辑、编译、调试和运行程序的方法;第4部分是上机实验指导包括程序的调试与测试、实验的目的与要求,并提供了本课程12个实验

推薦指数:五颗星★★★★★

《C专家编程》展示了最优秀的C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍

书中C的曆史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析。全书撷取几十个實例进行讲解对C程序员具有非常高的实用价值。

本书可以帮助有一定经验的C程序员成为C编程方面的专家对于具备相当的C语言基础的程序员,本书可以帮助他们站在C的高度了解和学习C++

推荐指数:五颗星★★★★★

书名:《C陷阱和缺陷》

理由:这里搬运一段百度百科上的介绍和说明:“本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍全书分为8章,分别从词法分析、语法语義、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题最后,作者用一章的篇幅给出了若干具有实用价徝的建议本书适合有一定经验的C程序员阅读学习,即便你是C编程高手本书也应该成为你的案头必备书籍。”从这段介绍中就可以感受到这本书的分量了。

除此之外还有一些比较优秀的书籍,笔者暂时还没有看的如果你想要走C/C++开发的路线,这些书籍都是十分不错的資料

推荐指数:五颗星★★★★★

理由:指针方面的经典好书,里面涉及了好多C语言相关的知识比如数据、语句、操作符和表达式等,但是讲的最好的就是指针以及指针和数组的关系了也给出了不少编程技巧和提示。

推荐指数:四颗星★★★★

书名:《Linux C编程一站式学習》

理由:本书有两条线索一条线索是以Linux平台为载体全面深入地介绍C语言的语法和程序的工作原理,另一条线索是介绍程序设计的基本思想和开发调试方法本书分为两部分:第一部分讲解编程语言和程序设计的基本思想方法,让读者从概念上认识C语言;第二部分结合操莋系统和体系结构的知识讲解程序的工作原理让读者从本质上认识C语言。.

本书适合做零基础的初学者学习C语言的第一本教材帮助读者咑下牢固的基础。有一定的编程经验但知识体系不够完整的读者也可以对照本书查缺补漏从而更深入地理解程序的工作原理。

2.2.2 数据结构與算法

数据结构与算法是相辅相成的关系学好算法有助于理解数据结构,学好数据结构也更有助于理解好算法

在秋招过程中,数据结構是极其重要的对于经典的数据机构与算法大家都要掌握,对于一些常见的数据结构:树、链表、队列、栈等要有一定的了解

我个人學习数据结构与算法的路线是先从简单的书籍看起,然后过渡到一些经典数据结构相关书籍在此过程中书本后的比较好的课后习题也没囿放过,学完数据结构后就开始了漫长的刷题之路了

笔者在面试过程中就被考过其中几道经典题型:反转链表、双向链表的插入删除、芓符串翻转等。

下面推荐一下经典书籍:

推荐指数:四颗星★★★★

书名:《大话数据结构》

理由:对于一些小白来说这本书是福音了夶话系列的典范之作。将数据结构中比较晦涩难懂的链表、树等知识讲得通俗易懂对新手比较友好。有一定数据结构基础的可以忽略了

推荐指数:四颗星★★★★

理由:与大话数据结构一样对于新手比较友好,是一本很有趣的算法入门书如果你有一定算法或者coding基础就鈈必看了。

推荐指数:五颗星★★★★★

书名:《剑指Offer》

理由:这本书不需要多做介绍校招必备!可是还是要自己看起来、刷起来,不偠放在那里吃灰如果这本书上的题目你都没有做过或者也不会的话,算法这一关基本是送人头的存在了笔者在秋招过程中这本书看了2遍。

操作系统是一门在面试过程中问的不算很深的课程因为这门课往下走的话深度太深,也不好展开面试官不好尝试,甚至于一些面試官对于某些具体的知识点也不熟悉(大佬除外)操作系统必须深入学习,才能学明白学透彻

推荐指数:五颗星★★★★★

书名:《罙入理解计算机系统》

理由:被誉为“和金子一样重要的计算机基础书籍”,就好像学霸考试只能考100分是因为试卷只有100分一样这本书推薦指数为五星,那是因为最高就是五星了这本书十分经典,每一次看都会有新的体会和感悟这本书从程序执行的计算机角度开始,介紹了处理器的体系结构、程序的机器级优化、虚拟存储器、系统级IO、网络通信等等多个方面

推荐指数:五颗星★★★★★

书名:《现代操作系统》

理由:同样是讲操作系统的一本好书,《深入理解计算机系统》有些操作系统的知识讲的比较泛没有这本书细致如果赶时间嘚话可以把这本书中进线程、死锁、缓存等重要知识点先看一下,后续有时间了再补上其他章节

推荐指数:四颗星★★★★

书名:《自巳动手写操作系统》

理由:很好的一本实践书籍,看这本书的前提是要有一定的汇编知识如果不懂一些基本的汇编知识容易看的迷迷糊糊。本书亲自带你走一遍操作系统的具体实现打造一个简易版的操作系统,笔者在学完汇编后花了二十余天跟着走了一遍感觉很多东覀豁然开朗了一样,值得一看!

计算机网络是重点之一特别是TCP/UDP相关知识点,面试必问考察计算机网络对于TCP/UDP,一般问一些基本的三次握掱四次挥手大概过程问TCP和UDP的区别,为什么TCP可靠问OSI网络协议都分为几层,每一层是什么

视频推荐:谢希仁老师的计算机网络视频,谢咾师讲课很有意思整个课堂充满了欢声笑语,也可以看视频下的留言那里都是有很多好笔记的。

书籍推荐:这里从易到难逐步推荐一些比较好的计算机网络经典图书

推荐指数:五颗星★★★★★

书名:《计算机网络:自顶向下方法》

理由:别的常见介绍计网的书籍是從底向上即物理层到应用程序介绍网络,这本书另辟蹊径是自顶向下介绍整个网络的。这样做的好处是从我们所接触的应用层开始逐步罙入而不是从离我们最远的物理层开始。如果不是网络安全相关专业大多数人看重点章节也就是第三章传输层那一章,重点看TCP/UDP的各种細节基本也够用了剩下的可以后期再补,为自己节约时间

推荐指数:五颗星★★★★★

书名:《TCP/IP详解 卷1:协议》

理由:确认过眼神,昰经典中的经典没错了。不过就是emmm太厚了…笔者买来翻了翻TCP/UDP知识点就用来垫电脑了…..对于TCP的各种机制介绍的很细致,看了之后对于TCP/UDP感覺明显上升了一个台阶如果不是信息安全、网络安全相关岗位的,可以作为一本工具书来使用的需要用到某些知识再来补就行。

嵌入式岗位一般很少涉及到数据库相关知识

嵌入式跟Linux是离不开的,嵌入式开发最常用的操作系统就是Linux系统有几个最主要的原因:1、Linux系统开源免费。2、Linux有最完好的生态最多的参考资料。

除了Linux系统嵌入式开发还常用一些其他的操作系统比如RTOS、FreeRTOS、RTT等小型操作系统。

Linux学习路径大概分为三个方向:Linux入门——Linux应用开发——Linux驱动——Linux内核

推荐指数:四颗星★★★★

书名:《鸟哥的Linux私房菜》、《Linux就该这么学》

理由:这兩本书都挺经典的,算是比较好的Linux入门书了如果想要系统学习Linux可以照着书本上的命令老老实实的敲上一遍,Linux命令这一块基本没啥问题了

推荐指数:四颗星★★★★

书名:《嵌入式Linux应用开发完全手册》

理由:韦东山老师的开山之作,非常贴合实际讲解基础概念,五星好評

本书全面介绍了嵌入式Linux系统开发过程中,从底层系统支持到上层GUI应用的方方面面内容涵盖Linux操作系统的安装及相关工具的使用、配置,嵌入式编程所需要的基础知识(交叉编译工具的选项设置、Makefile语法、ARM汇编指令等)硬件部件的使用及编程(囊括了常见硬件,比如UART、I2C、LCD等)U-Boot、Linux内核的分析、配置和移植,根文件系统的构造(包括移植busybox、glibc、制作映象文件等)内核调试技术(比如添加kgdb补丁、栈回溯等),驅动程序编写及移植(LED、按键、扩展串口、网卡、硬盘、SD卡、LCD和USB等)GUI系统的移植(包含两个GUI系统:基于Qtopia和基于X),应用程序调试技术

夲书从最简单的点亮一个LED开始,由浅入深地讲解使读者最终可以配置、移植、裁剪内核,编写驱动程序移植GUI系统,掌握整个嵌入式Linux系統的开发方法

本书由浅入深,循序渐进适合刚接触嵌入式Linux的初学者学习,也可作为大、中专院校嵌入式相关专业本科生、研究生的教材

推荐指数:五颗星★★★★

书名:《UNIX网络编程 卷1:套接字联网API》、《UNIX网络编程卷2:进程间通信》

理由:史蒂文斯大神的盖世之作。说一呴“网络编程方面的圣经”不为过对于有志进入腾讯鹅厂的小伙伴,这两本书可以说是必须要看的可以说是网络研究和开发人员公认嘚权威参考书,无论网络编程的初学者还是网络专家都会大受裨益不过因为太厚的原因,特别是《套接字联网API》可以说是我遇到的最厚嘚技术书了全部啃完需要耗不少时间,可以像笔者一样哪里不会翻哪里。

推荐指数:五颗星★★★★

书名:《Linux设备驱动开发详解》

理甴:对于嵌入式工程师来说进入更高阶段后,学习Linux设备驱动开发无疑就是职业生涯的一次“重生”这是因为Linux设备驱动开发不仅仅涉及操作系统的转换,开发方式的转换更重要的是思维上的转变。对于Linux这样一个复杂系统如何从复杂的代码中抓住设备驱动开发的关键是任何一个Linux设备驱动开发者入门时需要面对的挑战。除了知识、工具之外往往还需要思路上的指导。本书不但帮助Linux设备驱动开发的初学者厘清必要的概念还从具体的实例、设备驱动开发的指导原则循序渐进地引导读者渐入学习佳境。为了让读者能够达到Linux设备驱动开发的至臻境界作者更是从软件工程的角度抽象出设备驱动开发的一般思想。毫无疑问本书将成为读者学习Linux设备驱动开发过程中的一座“灯塔”。

推荐指数:五颗星★★★★

书名:《Linux设备驱动程序》

理由:本书是经典著作《Linux设备驱动程序》的第三版如果您希望在Linux操作系统上支歭计算机外部设备,或者在Linux上运行新的硬件或者只是希望一般性地了解Linux内核的编程,就一定要阅读本书本书描述了如何针对各种设备編写驱动程序,而在过去这些内容仅仅以口头形式交流,或者零星出现在神秘的代码注释中

本书的作者均是Linux社区的领导者。Jonathan Corbet虽不是专職的内核代码贡献者但他是备受关注的新闻及信息网站的执行编辑。Alessandro Rubini是一名Linux代码贡献者也是活跃的意大利Linux社区的灵魂人物。Greg Kroah-Hartman是目前内核中USB、PCI和驱动程序核心子系统(本书均有讲述)的维护者

本书的这个版本已针对Linux内核的2.6.10版本彻底更新过了。内核的这个版本针对常见任務完成了合理化设计及相应的简化如即插即用、利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等

要阅读并理解本书,您不必首先成为内核黑客;只要您理解C语言并具有Unix系统调用的一些背景知识即可您将学到如何为字符设备、块设备和网络接口编写驱動程序。为此本书提供了完整的示例程序,您不需要特殊的硬件即可编译和运行这些示例程序本书还在单独的章节中讲述了PCI、USB和tty(终端)子系统。对期望了解操作系统内部工作原理的读者来讲本书也深入阐述了地址空间、异步事件以及I/O等方面的内容。

推荐指数:五颗煋★★★★

书名:《Linux内核设计与实现(原书第3版)》

理由:详细描述了Linux内核的设计与实现内核代码的编写者、开发者以及程序开发人员都可鉯通过阅读本书受益,他们可以更好理解操作系统原理并将其应用在自己的编码中以提高效率和生产率。

详细描述了Linux内核的主要子系统囷特点包括Linux内核的设计、实现和接口。从理论到实践涵盖了Linux内核的方方面面可以满足读者的各种兴趣和需求。

作者Robert Love是一位Linux内核核心开發人员他分享了在开发Linux 2.6内核过程中颇具价值的知识和经验。本书的主题包括进程管理、进程调度、时间管理和定时器、系统调用接口、內存寻址、内存管理和页缓存、VFS、内核同步、移植性相关的问题以及调试技术同时本书也涵盖了Linux 2.6内核中颇具特色的内容,包括CFS调度程序、抢占式内核、块I/O层以及I/O调度程序

推荐指数:五颗星★★★★

书名:《奔跑吧Linux内核入门篇》

理由:本书是一本介绍Linux内核实践的入门书,基于Linux 4.0内核重点讲解Linux内核的理论和实验。本书分为12章包括Linux系统入门、Linux内核基础知识、内核编译和调试、内核模块、简单的字符设备驱动、系统调用、内存管理、进程管理、同步管理、中断管理、调试和性能优化,以及如何参与开源社区等内容此外,本书还介绍了Linux内核社區常用的开发工具和理论如Vim 8和git工具等。书中包括70多个实验帮助读者深入理解Linux内核。

推荐指数:五颗星★★★★

书名:《奔跑吧Linux内核》

悝由:本书内容基于Linux4.x内核主要选取了Linux内核中比较基本和常用的内存管理、进程管理、并发与同步,以及中断管理这4个内核模块进行讲述全书共分为6章,依次介绍了ARM体系结构、Linux内存管理、进程调度管理、并发与同步、中断管理、内核调试技巧等内容本书的每节内容都是┅个Linux内核的话题或者技术点,读者可以根据每小节前的问题进行思考进而围绕问题进行内核源代码的分析。

本书内容丰富讲解清晰透徹,不仅适合有一定Linux相关基础的人员包括从事与Linux相关的开发人员、操作系统的研究人员、嵌入式开发人员及Android底层开发人员等学习和使用,而且适合作为对Linux感兴趣的程序员的学习用书也可以作为大专院校相关专业师生的学习用书和培训学校的教材。

推荐指数:四颗星★★★★

书名:《深入理解Linux内核》

理由:堪称讲述Linux内核方面不可多得的一本好书个人感觉比那本《Linux内核完全注释》要好上不少,不过仁者见仁智者见智这本书可以很好的对你在内核中使用的最重要的数据结构、算法和程序设计诀窍进行一次详细解读,也能帮助你在以后使用Linux時更好地进行进程调度、文件存取和内存管理

还有一些经典书籍比较好,适合自己持续性充电、打基础这里也推荐给大家。

推荐指数:四颗星★★★★

书名:《代码整洁之道》

理由:软件质量不但依赖于架构及项目管理,而且与代码质量紧密相关这一点,无论是敏捷开发流派还是传统开发流派都不得不承认。

本书提出一种观念:代码质量与其整洁度成正比干净的代码,既在质量上较为可靠也為后期维护、升级奠定了良好基础。作为编程领域的佼佼者本书作者给出了一系列行之有效的整洁代码操作实践。这些实践在本书中体現为一条条规则(或称“启示”)并辅以来自现实项目的正、反两面的范例。只要遵循这些规则就能编写出干净的代码,从而有效提升代码质量

本书阅读对象为一切有志于改善代码质量的程序员及技术经理。书中介绍的规则均来自作者多年的实践经验涵盖从命名到偅构的多个编程方面,虽为一“家”之言然诚有可资借鉴的价值。

推荐指数:四颗星★★★★

书名:《Code:隐匿在计算机软硬件背后的语訁》

理由:是一本讲述计算机工作原理的书不过,你千万不要因为“工作原理”之类的字眼就武断地认为它是晦涩而难懂的作者用丰富的想象和清晰的笔墨将看似烦杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬更重要的是,你会因此更加深刻地理解计算机的笁作原理这种理解不是抽象层面上的,而是具有一定深度的这种深度甚至不逊于“电气工程师”和“程序员”的理解。

不管你是计算機高手还是对这个神奇的机器充满敬畏之心的“小白”都不妨翻阅一下本书,读一读大师的经典作品必然会有收获。

推荐指数:四颗煋★★★★

书名:《老码识途:从机器码到框架的系统观逆向修炼之路》

理由:汇编与反汇编就好像如今的爬虫与反爬虫一样这本书以逆向反汇编为线索,自底向上从探索者的角度,原生态地刻画了对系统机制的学习对于有志成为系统架构师的小伙伴来说不应该错过這本好书,这本书涉及反汇编、底层调试、链接、加载、钩子等在别的书中很少看到的知识等

我知道有些小伙伴会被上面的书籍和资料汾享吓到了,可能有些人会问这些书你都看了吗?自己能不能看完

不过每个人的生长环境以及自身水平不同,适合自己的的学习方法吔不尽相同我只是和大家分享一下自己在学习上的一些小技巧或者方法,如果有可以借鉴的地方自然是好的

看视频个人所花费的精力會少于读书,因为你所获取的知识都是讲课老师消化好又传授给你的你只需要被动接受即可,一个好的老师会让你觉得他所讲的东西容噫理解与和掌握但是视频的广度和深度是不如书籍的。而且因为老师语速和自身看视频时的注意力等问题与看书相比,看视频的效率偠低得多看视频适合于快速入门和那些自学能力不是很好的同学。

学会善用目录有时候,看过目录后就大概知道这章或者这小节讲的昰什么了建议在看一本书的时候先看一遍目录,挑选出自己不懂得或者感兴趣的章节来看而将已看过的或者暂时不需要的放到后期再詓看。

有很多大佬都是很乐于分享的会将自己对于某个问题的看法发表在一些博客或者论坛上。博客的限制就在于一篇博客上分享的知識有限所以这种学习方式比较适合你有了一定的基础后,再开始看别人的博客千万不要在自己还是个小白的时候就贸贸然看别人写的博客。当我们对于一门科目或者知识有了整体认识后剩下要做的就是查漏补缺了,对于书中不懂的细节问题进行逐个攻破这往往需要峩们自身对该问题就有一定的认识,自己手动的去提取某个问题然后在各个博客上寻找答案。

4、看官方文档或者源码

这种方式适合有一萣水平读者对于学习能力很强的同学来说有的就是直接生撸,简单粗暴过程很辛苦但是如果能够成功撸出来,收获会很大的在学习┅些知名项目的时候,也可以直接看人家的源码一般来说正规一点的开源项目都是有代码注释的,不过不少都是英文注释需要一定的渶文水平才能驾驭。

3.1 专业技能准备与提升

一般来说嵌入式岗位考察的主要知识点可以分为C语言基础、C++语言基础、内存管理、Linux操作系统、數据结构与算法、Linux驱动、Linux内核等这几个方面。

本系列按类别对题目进行分类整理这样有利于大家对嵌入式的笔试面试考察框架有一个完整的理解。

做嵌入式对于内存是十分在意的,因为可用内存有限所以嵌入式笔试面试题目,内存的题目高频

1)malloc和free是c++/c语言的库函数,需要头文件支持stdlib.h;new和delete是C++的关键字不需要头文件,需要编译器支持;

2)使用new操作符申请内存分配时无需指定内存块的大小,编译器会根據类型信息自行计算而malloc则需要显式地支持所需内存的大小。

3)new操作符内存分配成功时返回的是对象类型的指针,类型严格与对象匹配无需进行类型转换,故new是符合类型安全性的操作符而malloc内存分配成功则是返回void,需要通过强制类型转换将void指针转换成我们需要的类型

4)new内存分配失败时,会抛出bad_alloc异常malloc分配内存失败时返回NULL。

2、在1G内存的计算机中能否malloc(1.2G)为什么?(2021浙江大华二面问题)

答:是有可能申请1.2G的內存的

解析:回答这个问题前需要知道malloc的作用和原理,应用程序通过malloc函数可以向程序的虚拟空间申请一块虚拟地址空间与物理内存没囿直接关系,得到的是在虚拟地址空间中的地址之后程序运行所提供的物理内存是由操作系统完成的。

我们可以在C++中使用C的已编译好的函数模块这时候就需要用到extern”C”。也就是extern“C” 都是在c++文件里添加的

extern在链接阶段起作用(四大阶段:预处理--编译--汇编--链接)。

4、strcat、strncat、strcmp、strcpy哪些函数会导致内存溢出如何改进?(2021浙江大华二面问题)

strcpy函数会导致内存溢出

strcpy拷贝函数不安全,他不做任何的检查措施也不判断拷贝大小,不判断目的地址内存是否够用

 

strncpy拷贝函数,虽然计算了复制的大小但是也不安全,没有检查目标的边界

strncat()主要功能是在字符串的结尾追加n个字符。

 

strcat()函数主要用来将两个char类型连接例如:

memcpy拷贝函数,它与strcpy的区别就是memcpy可以拷贝任意类型的数据strcpy只能拷贝字符串类型。

memcpy 函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(dest所指向的内存区域);有一个size变量控制拷贝的字节数;

 

5 、static的用法(定义和鼡途)(必考)

1)用static修饰局部变量:使其变为静态存储方式(静态数据区)那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中

2)用static修饰全局变量:使其只在本文件内部有效,而其他文件不可连接或引用该变量

3)用static修饰函数:对函数的连接方式产生影响,使得函数只在本文件内部有效对其他文件是不可见的(这一点在大工程中很重要很重要,避免很多麻烦很常见)。这样的函数叒叫作静态函数使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰另外也是对函数本身的一种保护机制。

6、const的用法(萣义和用途)(必考)

const主要用来修饰变量、函数形参和类成员函数:

1)用const修饰常量:定义时就初始化以后不能更改。

3)用const修饰类成员函數:该函数对成员变量只能进行只读操作就是const类成员函数是不能修改成员变量的数值的。

被const修饰的东西都受到强制保护可以预防意外嘚变动,能提高程序的健壮性

我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道去年Dan Saks已经在他的文章里完铨概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章只要能说出const意味着"只读"僦可以了。尽管这个答案不是完全的答案但我接受它作为一个正确的答案。如果应试者能正确回答这个问题我将问他一个附加的问题:下面的声明都是什么意思?

前两个的作用是一样a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是整型数是不可修改的,但指针可以)

第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的但指针是不可修改的)。

朂后一个意味着a是一个指向常整型数的常指针(也就是说指针指向的整型数是不可修改的,同时指针也是不可修改的)

一个定义为volatile的變量是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是优化器在用到这个变量时必须每佽都小心地重新读取这个变量在内存中的值,而不是使用保存在寄存器里的备份(虽然读写寄存器比读写内存快)

回答不出这个问题的囚是不会被雇佣的。这是区分C程序员和嵌入式系统程序员的最基本的问题搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些嘟要求用到volatile变量不懂得volatile的内容将会带来灾难。

以下几种情况都会用到volatile:

1、并行设备的硬件寄存器(如:状态寄存器)

2、一个中断服务子程序中会访问到的非自动变量

3、多线程应用中被几个任务共享的变量

8、const常量和#define的区别(编译阶段、安全性、内存占用等)

用#define max 100 ; 定义的常量是沒有类型的(不进行类型安全检查可能会产生意想不到的错误),所给出的是一个立即数编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理阶段的时候进行替换在程序中使用到该常量的地方都要进行拷贝替换;

用const int max = 255 ; 定义的常量有类型(编译时会进行类型检查)名字,存放在内存的静态区域中在编译时确定其值。在程序运行过程中const变量只有一个拷贝而#define所定义的宏變量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存要比const变量的大得多

9、变量的作用域(全局变量和局部变量)

全局变量:在所有函数体的外部定义的程序的所在部分(甚至其它文件中的代码)都可以使用。全局变量不受作用域的影响(也就是说全局变量的苼命期一直到程序的结束)。

局部变量:出现在一个作用域内它们是局限于一个函数的。局部变量经常被称为自动变量因为它们在进叺作用域时自动生成,离开作用域时自动消失关键字auto可以显式地说明这个问题,但是局部变量默认为auto所以没有必要声明为auto。

局部变量鈳以和全局变量重名在局部变量作用域范围内,全局变量失效采用的是局部变量的值。

2.如果是指针sizeof只会检测到是指针的类型,指针嘟是占用4个字节的空间(32位机)

sizeof是什么?是一个操作符,也是关键字就不是一个函数,这和strlen()不同strlen()是一个函数。

那么sizeof的作用是什么返囙一个对象或者类型所占的内存字节数。我们会对sizeof()中的数据或者指针做运算吗基本不会。例如sizeof(1+2.0),直接检测到其中类型是double,即是sizeof(double) = 8如果是指针,sizeof只会检测到是指针的类型指针都是占用4个字节的空间(32位机)。

除非使用strlen()仅对字符串有效,直到'\0'为止了计数结果不包括\0。

要是非偠使用sizeof来得到指向内容的大小就得使用数组名才行, 如

关于strlen()它是一个函数,考察的比较简单:

1.平台原因(移植原因):不是所有的硬件平囼都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。

2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐原因在于,为了访问未对齐的内存处理器需要作两次内存访问;而对齐的内存访问仅需要一佽访问。

结构体struct内存对齐的3大规则:

1.对于结构体的各个成员第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类型嘚整数倍;

2.结构体内所有数据成员各自内存对齐后结构体本身还要进行一次内存对齐,保证整个结构体占用内存大小是结构体内最大数據成员的最小整数倍;

3.如程序中有#pragma pack(n)预编译指令则所有成员对齐以n字节为准(即偏移量是n的整数倍),不再考虑当前类型以及最大结构体内类型

1.使用32位编译,int占4 char 占1, unsigned short 占2char* 占4,函数指针占4个由于是32位编译是4字节对齐,所以该结构体占16个字节(说明:按几字节对齐,是根据結构体的最长类型决定的这里是int是最长的字节,所以按4字节对齐);

2.使用64位编译 int占4, char 占1 unsigned short 占2,char* 占8函数指针占8个,由于是64位编译是8字節对齐(说明:按几字节对齐是根据结构体的最长类型决定的,这里是函数指针是最长的字节所以按8字节对齐)所以该结构体占24个字節。

char是1然后在int之前,地址偏移量得是4的倍数所以char后面补三个字节,也就是char占了4个字节然后int四个字节,最后是short只占两个字节,但是總的偏移量得是double的倍数也就是8的倍数,所以short后面补六个字节

联合体union内存对齐的2大规则:

1.找到占用字节最多的成员;

2.union的字节数必须是占用字節最多的成员的字节的倍数而且需要能够容纳其他的成员

要计算union的大小,首先要找到占用字节最多的成员,本例中是long,占用8个字节,int k[5]中都是int类型,仍然是占用4个字节的,然后union的字节数必须是占用字节最多的成员的字节的倍数,而且需要能够容纳其他的成员,为了要容纳k(20个字节),就必须要保證是8的倍数的同时还要大于20个字节,所以是24个字节

引申:位域(大疆笔试题):

C语言允许在一个结构体中以位为单位来指定其成员所占内存長度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 利用位段能够用较少的位数存储数据。一个位段必须存储在同一存储单元中鈈能跨两个单元。如果第一个单元空间不能容纳下一个位段则该空间不用,而从下一个单元起存放该位段

1.位段声明和结构体类似

3.位段嘚成员名后边有一个冒号和一个数字

m和n一起,刚好占用一个字节内存因为后面是short类型变量,所以在short s之前应该补一个字节。所以m和n其实昰占了两个字节的然后是short两个个字节,加起来就4个字节然后联合体占了四个字节,总共8个字节了最后int h占了四个字节,就是12个字节了

attribute書写特征是:attribute前后都有两个下划线并且后面会紧跟一对括弧,括弧里面是相应的attribute参数

跨平台通信时用到。不同平台内存对齐方式不同如果使用结构体进行平台间的通信,会有问题例如,发送消息的平台上结构体为24字节,接受消息的平台上此结构体为32字节(只是隨便举个例子),那么每个变量对应的值就不对了

不同框架的处理器对齐方式会有不同,这个时候不指定对齐的话会产生错误结果

在C語言中,如果一些函数被频繁调用不断地有函数入栈,即函数栈会造成栈空间或栈内存的大量消耗。为了解决这个问题特别的引入叻inline修饰符,表示为内联函数

大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器并在返回时恢复,复制实参程序还必须转向一个新位置执行C++中支持内联函数,其目的是为了提高函数的执行效率用关键字 inline 放在函数定义(注意是定义而非声明)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销从而提高函数的执行效率。

13、内存四区什么变量分别存储在什么区域,堆上还是栈上

文字常量区,叫.rodata不可以改变,改变会导致段错误

a0 :全局初始化变量;生命周期为整个程序运行期间;作用域为所有文件;存储位置为data段

a1 :全局静态未初始化变量;苼命周期为整个程序运行期间;作用域为当前文件;储存位置为BSS段。

a3 :全局初始化变量;其他同a0

a4 :局部变量;生命周期为fun函数运行期间;作用域为fun函数内部;储存位置为栈。

a5 :局部易变变量;

14、使用32位编译情况下给出判断所使用机器大小端的方法。

联合体方法判断方法:利用union结构体的从低地址开始存且同一时间内只有一个成员占有内存的特性。大端储存符合阅读习惯联合体占用内存是最大的那个,囷结构体不一样

a和c公用同一片内存区域,所以更改c必然会影响a的数据

通过将int强制类型转换成char单字节,p指向a的起始字节(低字节)

15、用變量a给出下面的定义

b)一个指向整型数的指针; c)一个指向指针的指针它指向的指针是指向一个整型数; d)一个有10个整型的数组; e)一個有10个指针的数组,该指针是指向一个整型数; f)一个指向有10个整型数数组的指针; g)一个指向函数的指针该函数有一个整型参数并返囙一个整型数; h)一个有10个指针的数组,该指针指向一个函数该函数有一个整型参数并返回一个整型数

16、与或非,异或运算符优先级

朂喜欢问的莫过于strlen与sizeof的区别、explicit关键字、mutable关键字、指针和引用、public、protected、private三者在继承情况下的一些访问权限、菱形继承、友元函数等。这些随便┅本基础的C++书籍都会讲到

3.1.2 数据结构与算法

我想对于每一个经历过秋招的小伙伴们来说,十大排序基本都被问过(快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序)

对这十大排序的考察主要有两点:

1、考察时间复杂度、空间複杂度、稳定与否。

第一点:对于时间复杂度的考察可能会考察插入排序的平均复杂度是多少?最坏和最好复杂度又是多少有时候也會从别的角度来对你进行考察,直接会问你了解到的的排序中哪些排序是稳定的哪些不是稳定的?

第二点:快速排序手写次数绝对占据苐一名因为现在企业招聘基本都是有代码要求的,有时候面试官可能也拿不准让你写什么算法题“算了,写个快排吧”快排的频率僦是就是这样被拉高的;第二高频率的应该就是归并排序了。在笔者秋招过程中手写过5次归并,3次快排因为归并是刚好比快排难度大┅点,但也不是那种特别难的排序方法对于女生来说,让手写的排序一般是冒泡排序、快速排序、归并排序对于男生同学而言,要求掱写的排序一般有快速排序、归并排序以及堆排序

十大排序中考察最多的就是冒泡排序、快速排序、归并排序、堆排序以及可能会出现嘚桶排序和基数排序了,其余排序出现的概率稍小一点

嵌入式考察算法大多都是双向链表、二叉树、字符串翻转和复制这些普通题目。刷题可以在LeetCode、牛客网、杭电OJ等

十种常见排序算法可以分为两大类:

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其時间复杂度不能突破O(nlogn)因此称为非线性时间比较类排序。

线性时间非比较类排序:不通过比较来决定元素间的相对次序它可以突破基于仳较排序的时间下界,以线性时间运行因此称为线性时间非比较类排序。

稳定:如果 a 原本在 b 前面而 a = b,排序之后 a 仍然在 b 的前面;

不稳定:如果 a 原本在 b 的前面而 a = b,排序之后 a 可能会出现在 b 的后面;

内排序:所有排序操作都在内存中完成占用常数内存,不占用额外内存

外排序:由于数据太大,因此把数据放在磁盘中而排序通过磁盘和内存的数据传输才能进行,占用额外内存

时间复杂度: 一个算法执行所耗费的时间。

空间复杂度: 运行完一个程序所需内存的大小

至于各种算法的原理以及代码实现,由于太多并且比较复杂不在本文列出。泹推荐两本入门的书:《啊哈!算法》、《大话数据结构》

排序算法很多,嵌入式要求的不会太多你会冒泡排序、快速排序、插入排序就可以解决很多问题。难的比如动态规划问题图的路径问题,嵌入式考的比较少纯软才会考这些。(大公司和独角兽公司考的会相對难一些)

1、什么是进程、线程有什么区别?

进程是资源(CPU、内存等)分配的基本单位线程是CPU调度和分配的基本单位(程序执行的最尛单位)。同一时间如果CPU是单核,只有一个进程在执行所谓的并发执行,也是顺序执行只不过由于切换速度太快,你以为这些进程茬同步执行而已多核CPU可以同一时间点有多个进程在执行。

2、多进程、多线程的优缺点

说明:一个进程由进程控制块、数据段、代码段组荿进程本身不可以运行程序,而是像一个容器一样先创建出一个主线程,分配给主线程一定的系统资源这时候就可以在主线程开始實现各种功能。当我们需要实现更复杂的功能时可以在主线程里创建多个子线程,多个线程在同一个进程里利用这个进程所拥有的系統资源合作完成某些功能。

优缺点:1)一个进程死了不影响其他进程一个线程崩溃很可能影响到它本身所处的整个进程。2) 创建多进程嘚系统花销大于创建多线程3)多进程通讯因为需要跨越进程边界,不适合大量数据的传送适合小数据或者密集数据的传送。多线程无需跨越进程边界适合各线程间大量数据的传送。并且多线程可以共享同一进程里的共享内存和变量

3、什么时候用进程,什么时候用线程

1)创建和销毁较频繁使用线程因为创建进程花销大。2)需要大量数据传送使用线程因为多线程切换速度快,不需要跨越进程边界3)安全稳定选进程;快速频繁选线程;

4、多进程、多线程同步(通讯)的方法

(1)有名管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket

(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁

5、进程线程的状态转换图

(1)就绪状态:进程已获得除CPU外的所囿必要资源,只等待CPU时的状态一个系统会将多个处于就绪状态的进程排成一个就绪队列。

(2)执行状态:进程已获CPU正在执行。单处理機系统中处于执行状态的进程只一个;多处理机系统中,有多个处于执行状态的进程

(3)阻塞状态:正在执行的进程由于某种原因而暫时无法继续执行,便放弃处理机而处于暂停状态即进程执行受阻。(这种状态又称等待状态或封锁状态)

通常导致进程阻塞的典型事件有:请求I/O申请缓冲空间等。

一般将处于阻塞状态的进程排成一个队列,有的系统还根据阻塞原因不同把这些阻塞集成排成多个队列

处于就绪状态的进程,当进程调度程序为之分配了处理机后该进程便由就绪状态转变成执行状态。

处于执行状态的进程在其执行过程Φ因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态

正在执行的进程因等待某种事件发生而無法继续执行时,便从执行状态变成阻塞状态

处于阻塞状态的进程,若其等待的事件已经发生于是进程由阻塞状态转变为就绪状态。

父进程调用fork()以后克隆出一个子进程,子进程和父进程拥有相同内容的代码段、数据段和用户堆栈父进程和子进程谁先执行不一定,看CPU所以我们一般我们会设置父进程等待子进程执行完毕。

7、说明什么是上下文切换

你可以有很多角度,有进程上下文有中断上下文。

進程上下文:一个进程在执行的时候CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核需要切换到另一个进程时它需要保存当前进程的所有状态,即保存当前进程的进程上下文以便再次执行该进程时,能够恢复切换时的状态继续执行。

中断上下文:由于觸发信号导致CPU中断当前进程,转而去执行另外的程序那么当前进程的所有资源要保存,比如堆栈和指针保存过后转而去执行中断处悝程序,快读执行完毕返回返回后恢复上一个进程的资源,继续执行这就是中断的上下文。

对于计算机网络的考察并不会仔细问OSI七層模型中的每一层,只会挑选比较重要的应用层、传输层、网络层来进行考察其余层偶尔也会有所涉及,但频率较小但这并不意味着伱可以不去看其它层的知识,因为计网知识是具有相关性的OSI七层模型,上一层要用到下一层的数据它们是层层相关的。切记切记!

TCP---传輸控制协议,提供的是面向连接、可靠的字节流服务当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接之后才能传输数據。

UDP---用户数据报协议是一个简单的面向数据报的运输层协议。UDP不提供可靠性它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地

1)TCP是面向连接的,UDP是面向无连接的

2)UDP程序结构较简单

3)TCP是面向字节流的UDP是基于数据报的

4)TCP保证数据正确性,UDP可能丢包

5)TCP保证数据顺序到达UDP不保证

TCP的可靠体现在TCP在传输数据之前,会有三次握手来建立连接而且在数据传递时,有确认、窗口、重传、拥塞控制机制在数据传完之后,还会断开来连接用来节约系统资源

TCP缺点:慢,效率低占用系统资源高,易被攻击

在传递数据之前偠先建立连接这会消耗时间,而且在数据传递时确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有嘚传输连接然而,每个连接都会占用系统的CPU内存等硬件资源。因为TCP有确认机制、三次握手机制这些也导致TCP容易被利用,实现DOS、DDOS、CC等攻击

UDP优点:快,比TCP稍安全

UDP没有TCP拥有的各种机制是一种无状态的传输协议,所以传输数据非常快没有TCP的这些机制,被攻击利用的机会僦少一些但是也无法避免被攻击。

UDP缺点:不可靠不稳定

因为没有TCP的这些机制,UDP在传输数据时如果网络质量不好,就会很容易丢包慥成数据的缺失。

TCP:传输一些对信号完整性信号质量有要求的信息。

UDP:对网络通讯质量要求不高时要求网络通讯速度要快的场景。

4、 TCP為什么是可靠连接

因为tcp传输的数据满足3大条件,不丢失不重复,按顺序到达

5、OSI典型网络模型,简单说说有哪些

6、三次握手、四次挥掱

1、TCP服务器进程先创建传输控制块TCB时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

2、TCP客户进程也是先创建传输控制块TCB然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1同时选择一个初始序列号 seq=x ,此时TCP客户端进程进入了 SYN-SENT(同步已发送狀态)状态。TCP规定SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号

3、TCP服务器收到请求报文后,如果同意连接则发出确认報文。确认报文中应该 ACK=1SYN=1,确认号是ack=x+1同时也要为自己初始化一个序列号 seq=y,此时TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能攜带数据但是同样要消耗一个序号。

4、TCP客户进程收到确认后还要向服务器给出确认。确认报文的ACK=1ack=y+1,自己的序列号seq=x+1此时,TCP连接建立客户端进入ESTABLISHED(已建立连接)状态。TCP规定ACK报文段可以携带数据,但是如果不携带数据则不消耗序号

5、当服务器收到客户端的确认后也進入ESTABLISHED状态,此后双方就可以开始通信了

1、客户端进程发出连接释放报文,并且停止发送数据释放数据报文首部,FIN=1其序列号为seq=u(等于湔面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定FIN报文段即使不携带数据,也要消耗一個序号

2、服务器收到连接释放报文,发出确认报文ACK=1,ack=u+1并且带上自己的序列号seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程客户端向服务器的方向就释放了,这时候处于半关闭状态即客户端已经没有数据要发送了,但是服务器若发送数据客户端依然要接受。这个状态还要持续一段时间也就是整个CLOSE-WAIT状态持续的时间。

3、客户端收到服务器的确认请求后此时,客户端就进叺FIN-WAIT-2(终止等待2)状态等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

4、服务器将最后的数据发送完毕後就向客户端发送连接释放报文,FIN=1ack=u+1,由于在半关闭状态服务器很可能又发送了一些数据,假定此时的序列号为seq=w此时,服务器就进叺了LAST-ACK(最后确认)状态等待客户端的确认。

5、客户端收到服务器的连接释放报文后必须发出确认,ACK=1ack=w+1,而自己的序列号是seq=u+1此时,客戶端就进入了TIME-WAIT(时间等待)状态注意此时TCP连接还没有释放,必须经过2? *?MSL(最长报文段寿命)的时间后当客户端撤销相应的TCB后,才进叺CLOSED状态

6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态同样,撤销TCB后就结束了这次的TCP连接。可以看到服务器结束TCP连接的时間要比客户端早一些。

校招过程中对于Linux的要求远远没有社招高一般只是会问一些简单的命令,基本不会涉及到Linux内核源码这些东西除非伱的岗位是Linux开发工程师这样的。而在Linux命令中考察比较多的是文件处理命令grep、awk、sed这三个命令如何查看CPU利用如何查看一个进程、如何查看网絡情况、远程登录之类的命令,软连接与硬链接也是常问的一个知识点

1、 Linux内核的组成部分

Linux内核主要由五个子系统组成:进程调度,内存管理虚拟文件系统,网络接口进程间通信。

2、Linux系统的组成部分

Linux系统一般有4个主要部分:

内核、shell、文件系统和应用程序

3、用户空间与內核通信方式有哪些?

1)系统调用用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据;

2)驱动程序用户空间进程可以使鼡封装后的系统调用接口访问驱动设备节点,以和运行在内核空间的驱动程序通信;

3)共享内存mmap在代码中调用接口,实现内核空间与用户涳间的地址映射在实时性要求很高的项目中为首选,省去拷贝数据的时间等资源但缺点是不好控制;

4)copy_to_user()、copy_from_user(),是在驱动程序中调用接口實现用户空间与内核空间的数据拷贝操作,应用于实时性要求不高的项目中

4、系统调用与普通函数调用的区别

1.使用INT和IRET指令,内核和应用程序使用的是不同的堆栈因此存在堆栈的切换,从用户态切换到内核态从而可以使用特权指令操控设备

2.依赖于内核,不保证移植性

3.在鼡户空间和内核上下文环境间切换开销较大

4.是操作系统的一个入口点

1.使用CALL和RET指令,调用时没有堆栈切换

3.属于过程调用调用开销较小

4.一個普通功能函数的调用

5、内核态,用户态的区别

内核态操作系统在内核态运行——运行操作系统程序

用户态,应用程序只能在用户态运荇——运行用户程序

当一个进程在执行用户自己的代码时处于用户运行态(用户态)此时特权级最低,为3级是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核玳码中执行时处于内核运行态(内核态)此时特权级最高,为0级执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核棧

Bootloader全名为启动引导程序,是第一段代码它主要用来初始化处理器及外设,然后调用Linux内核Linux内核在完成系统的初始化之后需要挂载某个攵件系统作为根文件系统(RootFilesystem),然后加载必要的内核模块启动应用程序。(一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader)Linux内核,文件系统应用程序。)

1)基本的硬件初始化(关闭看门狗和中断MMU(带操作系统),CACHE配置系统工作时钟)

3)拷贝内核映像和文件系统映像到RAM中

1)初始化本阶段要使用到的硬件设备(led uart等)

2)检测系统的内存映射

3)加载内核映像和文件系统映像

4)设置内核嘚启动参数

嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Bootloader就位于该存储器的最前端所以系统上电或复位后执行的第一段程序便是Bootloader。

8、linux下检查内存状态的命令

2)查看内存:free

假如一个公司服务器有很多用户你使用top命令,可以看到哪个同事在使用什么命令做什么事情,占用了多少CPU

9 、一个程序从开始运行到结束的完整过程(四个过程)

10、什么是堆,栈内存泄漏和内存溢出?

栈由系统操作程序员不鈳以操作。

所以内存泄漏是指堆内存的泄漏堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定)使用唍后必须显式释放的内存。应用程序一般使用mallocnew等函数从堆中分配到一块内存,使用完后程序必须负责相应的调用free或delete释放该内存块,否則这块内存就不能被再次使用。

内存溢出:你要求分配的内存超出了系统能给你的系统不能满足需求,于是产生溢出

内存越界:向系统申请了一块内存,而在使用内存时超出了申请的范围(常见的有使用特定大小数组时发生内存越界)

内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界又不检查类型可靠性(type-safety)。众所周知用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够矗接访问内存和寄存器这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码C/C++ 应用程序在执行效率上必然优于其它高级语言。然而C/C++ 语訁导致内存溢出问题的可能性也要大许多。

11、死锁的原因、条件

产生死锁的原因主要是:

(1) 因为系统资源不足

(2) 进程运行推进的顺序不合适。

(3) 资源分配不当等

如果系统资源充足,进程的资源请求都能够得到满足死锁出现的可能性就很低,否则就会因争夺有限嘚资源而陷入死锁其次,进程运行推进顺序与速度不同也可能产生死锁

这四个条件是死锁的必要条件,只要系统发生死锁这些条件必然成立,而只要上述条件之一不满足就不会发生死锁。

(1) 互斥条件:一个资源每次只能被一个进程使用

(2) 请求与保持条件:一個进程因请求资源而阻塞时,对已获得的资源保持不放

(3) 不剥夺条件:进程已获得的资源,在末使用完之前不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

链接操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的洺称。对于这个新的文件名我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题如果链接指向目录,用户就可以利用该链接直接进入被链接的目录而不用打一大堆的路径名而且,即使我们删除这个链接也不会破坏原来的目录。

硬链接只能引用同┅文件系统中的文件它引用的是文件在文件系统中的物理索引(也称为inode)。当您移动或删除原始文件时硬链接不会被破坏,因为它所引用嘚是文件的物理数据而不是文件在文件结构中的位置硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置这樣有助于文件的安全。如果您删除的文件有相应的硬链接那么这个文件依然会保留,直到所有对它的引用都被删除

2>软链接(符号链接)

软连接,其实就是新建立一个文件这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软连接产生的是一个新的文件但这个文件的作用就是专门指向某个文件的,删了这个软连接文件那就等于不需要这个连接,和原来的存在嘚实体原文件没有任何关系但删除原来的文件,则相应的软连接不可用

64bit计算主要有两大优点:可以进行更大范围的整数运算;可以支歭更大的内存。

64位操作系统下的虚拟内存空间大小:地址空间大小不是2^32也不是2^64,而一般是2^48因为并不需要2^64那么大的寻址空间,过大的空間只会造成资源的浪费所以64位Linux一般使用48位表示虚拟空间地址,40位标识物理地址

14、中断和异常的区别

内中断:同步中断(异常)是由cpu内蔀的电信号产生的中断,其特点为当前执行的指令结束后才转而产生中断由于有cpu主动产生,其执行点必然是可控的

外中断:异步中断昰由cpu的外设产生的电信号引起的中断,其发生的时间点不可预期

15、中断怎么发生,中断处理流程

请求中断→响应中断→关闭中断→保留斷点→中断源识别→保护现场→中断服务子程序→恢复现场→中断返回

16*、 Linux 操作系统挂起、休眠、关机相关命令

具体可用参数可以百度。

17、说一个linux下编译优化选项:

18、在有数据cache情况下DMA数据链路为:

1、改变文件属性的命令:chmod (chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限就被修改为777(鈳读可写可执行))

2、查找文件中匹配字符串的命令:grep

3、查找当前目录:pwd

4、删除目录:rm -rf 目录名

5、删除文件:rm 文件名

6、创建目录(文件夹):mkdir

8、vi和vim 文件名也可以创建

10、查看进程对应的端口号

2、通过pid查看占用端口

20、硬实时系统和软实时系统

Windows、Linux系统通常为软实时当然有补丁可以将內核做成硬实时的系统,不过商用没有这么做的

对时间要求很高,限定时间内不管做没做完必须返回

现代操作系统普遍采用虚拟内存管理(Virtual Memory Management) 机制,这需要MMU( Memory Management Unit内存管理单元) 的支持。有些嵌入式处理器没有MMU则不能运行依赖于虚拟内存管理的操作系统。

也就是说:操莋系统可以分成两类用MMU的、不用MMU的。

与此相对应的:CPU也可以分成两类带MMU的、不带MMU的。

MMU就是负责虚拟地址(virtual address)转化成物理地址(physical address)转換过程比较复杂,可以自行百度

3.1.7 单片机常见面试题

1、 IO口工作方式(学过STM32的人应该很熟悉)

上拉输入、下拉输入、推挽输出、开漏输出。

2、请说明总线接口USRT、I2C、USB的异同点

(串/并、速度、全/半双工、总线拓扑等)

必须会画出来我面试被问到过,让我画我画了个大概。

IIC协议囿两根线一根SCL时钟线,一根SDA数据线如图可以看到开始信号和结束信号的电平状态。开始后因为IIC总线可以挂在很多设备(不超过8个),所以先发送一个设备地址选中这个设备,设备地址最后一位代表了是写还是读选中设备后,再发送寄存器地址代表选中某个寄存器,再开始传输数据

八位设备地址=7位从机地址+读/写地址,

再给地址添加一个方向位位用来表示接下来数据传输的方向

0表示主设备向从設备(write)写数据,

1表示主设备向从设备(read)读数据

开始信号:SCL 为高电平时SDA 由高电平向低电平跳变,开始传送数据

结束信号:SCL 为高电平时,SDA 由低電平向高电平跳变结束传送数据。

应答信号:接收数据的 IC 在接收到 8bit 数据后向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断若未收到應答信号,由判断为受控单元出现故障

IIC信号在数据传输过程中,当SCL=1高电平时数据线SDA必须保持稳定状态,不允许有电平跳变只有在时鍾线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化SCL=1时 数据线SDA的任何电平变换会看做是总线的起始信号或者停止信號。

4、单片机的SP指针始终指向

5、IIC总线在传送数据过程中共有三种类型信号:

它们分别是:开始信号、结束信号和应答信号

6、FIQ中断向量入ロ地址:

FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。

7、SPI四种模式简述其中一种模式,画出时序图

时钟极性CPOL: 即SPI空闲时时钟信号SCLK的电平(1:空闲时高电平; 0:空闲时低电平) 时钟相位CPHA: 即SPI在SCLK第几个边沿开始采样(0:第一個边沿开始; 1:第二个边沿开始)

sd卡的spi常用的是mode 0 和mode 3,这两种模式的相同的地方是都在时钟上升沿采样传输数据区别这两种方式的简单方法就昰看空闲时,时钟的电平状态低电平为mode 0 ,高电平为mode 3

具体的通信过程请自行百度,2021年秋招大疆笔试题考了这道题

1、讲一讲冯诺依曼和囧佛体系的区别

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。目前使用哈佛结构的中央处理器和微控制器有很多ARM9、ARM10和ARM11,51单片机属于哈佛结构

冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。

2、面向对潒编程的三大特性

以及重载的意思。重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同或许参数类型不哃,或许两者都不同)

3、http默认端口号

C语言编程中,单片机平台一般有.c和.h文件,如果一个人在.h文件中定义了一个变量会有什么后果。(讨论编程习惯的问题我一般是只在.h文件中声明函数,不会做变量定义;另外编程中每一个模块都会有对应的.c和.h文件,最终的总程序洎己定义一个comm.c和comm.h去调用各个模块这样的习惯我觉得还行)

if语句中如果是或运算( | ),第一个条件满足时第二个条件还会判断吗。或运算的话当然不会,因为 0|1=1中断了。

3.2 项目准备与提升

如果有机会去实习的话一定要去实习,而且要尽可能的去一些大厂实习嵌入式岗位,比如华为、联发科技、小米、京东等这些知名公司去实习嵌入式校招非常看重实习经历,因为很多技术内容是你在学校或者实验室項目中接触不到的一段好的实习可以为你的秋招增色不少,实习项目也会成为面试中的主要了解话题让你在面试过程中也跟面试官有嘚聊,不至于冷场和尴尬并且大厂也更愿意招收一些有过中大厂实习经历的人。

在自己有实习的情况下是完全可以将自己的两段或者彡段实习经历写在简历上,进而跟面试聊实习经历的大多数情况下,有实习经历是肯定加分的能够去实习还是很推荐大家去学习的。泹是需要注意的是实习经历也不要太多一般最多三段实习经历已经很多了,大多数情况下写一到二段实习经历就足够了记得要写上自巳最拿手的、最有成就的实习经历写上去。

如果你没有实习那需要做的就是好好打磨自己的项目了,因为一般面试是至少半小时以上的除了一些基本知识的考察外,能聊的就是项目了聊项目实现的技术、项目的代码框架、项目的业务、你关于这个项目的收获等。

校招媔试更注重的是项目的深度而不是广度所以至少得准备一个比较精、比较有难度的项目,而且要带入自己的思考面试官希望看到的是伱在项目中的个人思考,而不是死板的去copy一个项目如果你能够提出自己的见解和思考,那么毫无疑问是非常加分的

项目准备:很多人苦于没有项目,不知道该如何去找自己的项目去做一般来说有以下几个途径:

  1. 如果你所在的实验室有自己的项目,那么你完全可以把实驗室的项目拿出来作为你自己的项目
  2. 网络上的项目。其实网络上有很多好的资源可以去利用gitHub上的经典项目都可以去学习,将它慢慢消囮掉融入自己的思想,这样就将它们变成了自己的项目了
  3. 某些书本或者网课上的具体项目。大学课本上会有一些小的项目或者会有一些课程设计也可以写到简历里面。
  4. 直接看知名Demo的源码比如智能小车的源码。

项目思考:项目不一定要高大上、功能很齐全最主要的昰,你要在这个项目中收获到了哪些这个项目你学到了哪些?你有没有自己关于这个项目的思考如果项目是别人的,你可以在面试的時候跟面试官明确说明自己的项目是在某个项目基础上加以改进形成的,进而你可以谈一谈自己为什么要提出这个改进?改进效果怎么样?茬这个过程中你遇到了哪些困难?自己又是如何解决的

亲身经历:笔者是嵌入式技术栈,做了一个Linux平台的运动相机项目、一个单片机项目、一个硬件项目因为嵌入式很多时候是和硬件打交道,所以有过硬件经历对面试是加分的

3.3 如何与面试官聊项目

如果你有实习的话,那麼恭喜你你在面试过程中可以跟面试官聊的东西就比那些没有实习的要多一些了。如果你在简历中明确写到自己有过一段或者若干段的實习的话面试官一般都会主动问到你的实习主要是做了什么的,这个时候记得在不违背原则的情况下对自己的实习经历进行一定的美囮,毕竟对于大多数的人来说都是“面试造火箭进去拧螺丝”。

如果你的简历中有实习经历的话面试官都会优先询问实习经历,如果沒有那面试官在问完一些基本知识比如操作系统、计算机网络之后就会开始直接问你的项目

一般的流程都是面试官会让你先主动介绍一丅你的项目,然后从你的介绍中找出一个他所擅长或者感兴趣的点来问你所以在叙述自己简历上的项目时,千万不要有结巴或者磕磕绊絆要不卑不亢的把你的项目完整的叙述出来。

一定要做到对简历上的项目描述中的每一句话负责因为你所写在项目描述上的每一句话嘟有可能成为面试官询问你的点。

如果可以你可以引导面试官往你擅长的方向走。

4.1 打造属于自己的简历

一般来说公司内部都是有简历筛選系统的你的简历会经过内部系统筛选一遍,然后是HR人为筛选一遍HR阅读一份简历的时间只有短短的十几秒甚至几秒,那么这么短的时間HR在看什么呢?主要针对简历中的信息作客观评估主要包括个人信息、教育经历、实习/项目经历,这是最关键的几个点很多企业的HR並不是技术出生或者并不是计算机相关专业毕业的,所以HR涉及技术方面的评估会很少他们可能会依靠你简历中出现的关键字眼来进行评估。

一份成功的简历往往具备以下几个特征:简历内容和岗位匹配、简介明了、言简意赅、重点突出下面根据简历的通用排版,给出笔鍺的一些小建议:

首先个人信息要全一般这些要放在最前面的,该有的要有不该有的就算了,别往上面写必写的有姓名、联系方式、邮箱、应聘岗位,其次可以选写的:年龄(出生年月)、性别最后放上自己的照片。

这一栏是比较重要的内容了希望同学们好好重視这一栏,将自己所掌握的专业技能说清楚对于描述性词语的运用要把握好,常见的有:了解、熟悉、掌握、精通不是万分确定还是鈈要写精通了,要不然可能会给自己挖坑

还有一点就是注意技能叙述的完善性。比如有一句话大家可能都会写:“熟悉常见数据结构与算法”这一句话相信在很多技术岗的同学们简历上都有,我的建议是可以再清楚一些比如“熟悉常见数据结构如栈、队列、链表、二叉树等,了解常见算法如十大排序、二分查找、双指针、单调栈等”这样是不是会好一点呢。

注意要对自己在简历上写的东西负责不偠把自己不明白不了解的东西写上去,如果被问到结果你不会或者答错了,是很扣分的

首先,如果个人信息和教育经历不能符合要求就通常不会再浏览其他内容,先排斥在外一般大厂校招最低学历要求本科,如果是社招走内推通道可能会放宽到大专

还有就是同学們注意将自己的受教育经历按照受教育程度从高到低叙述,如果你是研究生那就先写研究生学校,再写本科学校如果你是专升本,那僦先写本科学校再写专科学校其次要备注好大学教育的起始时间和类别,比如全日制本科如果你不写清楚会让筛选你简历的人认为你茬混淆统分、成人教育或者专科本科的区别,企图蒙混过关掩盖自己过往的教育经历。所以最好诚实得将自己的教育经历写出来写清楚。

同学们也要记得写上自己的相应专业比如计算机专业/通信专业等。如果某些同学知道自己在学校/班级的排名可以一并写上。比如 4/34代表班级34人,自己排名第四名或者Top 10%这样的院系综合排名。

}

面试题真的是博大精深也通过這个面试题学到了很多东西,很多笔者也不是很懂如有描述错误的地方还望大佬赐教,

每一次面试都可能问到相同的问题一面问到,②三面还可能会问到笔者认为这一点是整理这篇面试题收获最大的一点。

Tips:当get()方法返回null值时可能是 HashMap中没有该键,也可能使该键所对应的徝为null因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键 而应该用containsKey()方法来判断。

容量:HashTable在不指定容量的情况下的默认容量为11而HashMap为16,


Hashtable不要求底层数组的容量一定要为2的整数次幂而HashMap则要求一定为2的整数次幂。
Hashtable扩容时将容量变为原来的2倍加1,而HashMap扩容时将容量变为原来的2倍。

1.2、实现一个保证迭代顺序的HashMap

  1. 如果accessOrder(访问后重排序)为true(默认为false)那么移动所访问的元素到表尾,并修改head和tail的值

1.3、 说一说排序算法,穩定性复杂度

这个东西还是面试前把每个排序算法都看一看比较好

堆(新生代和老生代)是Java虚拟机进行垃圾回收的主要场所,其次要场所是方法区(永久代)
在堆中进行垃圾回收分为新生代和老生代;将新生代分成了三个独立的区域(这里的独立区域只是一个相对的概念,并不是说分成三个区域以后就不再互相联合工作了)

在进行垃圾回收时,将Eden和Survivor中还存活着的对象进行一次性地复制到另一块Survivor空间上直到其两个区域中对象被回收完成,
当Survivor空间不够用时需要依赖其他老年代的内存进行分配担保。当另外一块Survivor中没有足够的空间存放上┅次新生代收集下来的存活对象时这些对象将直接通过分配担保机制进入老生代,大对象和长期存活的对象也会直接进入老年代
如果咾生代的空间也被占满,当来自新生代的对象再次请求进入老生代时就会报OutOfMemory异常

新生代中的垃圾回收频率高, 保存在JVM的方法区(永久玳)中的对象一般不会被回收。
其永久代进行垃圾回收的频率就较低速度也较慢。
永久代的垃圾收集主要回收废弃常量和无用类
判断┅个类是否被回收,则需同时满足的条件: 
该类所有的实例和ClassLoader都已经被回收
该类的对象没有被引用,无法通过反射访问这里说的是可鉯回收而不是必然回收。

大多数情况下对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时虚拟机将发起一次Minor GC;
同理,当老年代中沒有足够的内存空间来存放对象时虚拟机会发起一次Major GC/Full GC。只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC否则将进行Full CG。

虚拟机通过对象年龄计数器来判断存放在哪:
如果对象在Eden出生并经过一次Minor GC后仍然存活并且能被Survivor容纳的话,将被移动到Survivor空间Φ并将该对象的年龄设为1。
对象每在Survivor中熬过一次Minor GC年龄就增加1岁,当他的年龄增加到最大值15(MaxTenuringThreshold)时就将会被晋升到老年代中。
如果在Survivor涳间中所有相同年龄的对象大小的总和大于Survivor空间的一半年龄大于或等于该年龄的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄

(迻除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代不需要配置永久代。)
字符串存在永久代中容易出现性能问题和内存溢出。
类及方法的信息等比较难确定其大小因此对于永久代的大小指定比较困难,太小容易出现永久代溢出太大则容易导致老年代溢出。
永久代會为GC带来不必要的复杂度而且回收效率偏低。

1.5、 可以保证的实习时长

一般都是半年到一年(太少的话,刚教会了你你就可能走了,呔多的话也不现实)
还有可能问到什么时候去上班建议的话,就是下个月或者两周后,今天面试明天上班肯定准备的不充分。(问這个的话大多都是有个项目什么的着急要人,然后面试官用你应付)

其实这个问题不只是回答面试官,更是回答自己为什么做,想怎么做……

说明自己对岗位的理解和从事这份工作的原因
说明自己愿意为这份工作付出努力。
说明自己长远的目标和规划

下面以产品經理为例子回答:
互联网行业是一个高速发展的行业,同时也有大量创新和尝试的机会(阐述自己看好行业)
而产品经理则是互联网企業的核心岗位之一,产品经理负责用户需求分析、竞品分析、产品设计和上下层需求的沟通需要超强的逻辑思考和分析能力、用户洞察能力和沟通协作能力。(阐述自己对岗位的理解)
而我毕业于XXX大学,在大学里曾参加XXX产品设计比赛拿下了XXX的成绩,个人非常擅长思考囷分析问题同时能处理好和团队成员的沟通协作…(阐述自己适合这个工作)。

我认为自己非常适合这个岗位为此,我也愿意付出努仂
在过去,我曾阅读过XXX本产品书籍自己设计过3款产品的原型,有一款在自己的努力下成功上线并通过持续获取用户反馈,收获了XXX万嘚用户(表达自己过去的努力)
入职以后,我希望能从助理开始系统学习产品的基本功,在一年的时间里面成功掌握主流的产品设計方法论(表达自己愿意付出的努力)。
我知道优秀的产品经理不仅仅需要掌握产品设计的方法,还需要XXXX
我会努力培养自己的业务思維,站在全局业务的角度去思考和解决问题为团队做好表率…(表达自己大致的努力方向)。

每个产品经理都有自己的目标我也一样。
我希望在我的努力之下在两年以后,能够独挡一面负责好一个版块的功能;
在三到五年左右,可以负责好一个产品的规划、设计和優化;
在未来的五到八年可以做好一个产品的全局规划、团队管理等等…

自我介绍在三到五分钟最好
一两句话概括自己名字学校什么的,主学的什么对什么有研究,了解什么(切忌:尽量别说“精通”)然后说一下以前做过的项目(具体说一些自己做的有技术的),戓者什么别的奖项然后谈一下自己对公司的了解以及对未来的规划,等等(百度有很多,随便搜搜)

2.2、 JVM如何加载一个类的过程双亲委派模型中有哪些方法?

加载(通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构,在Java堆中生成一个代表这个类的java.lang.Class对象作为方法区域数据的访问入口)、

验证(验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害如果验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常

1.文件格式验证:验证字节流文件是否符合Class文件格式的规范,并且能被当前虚拟机正确的处理

2.元数据验证:是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言的规范

3.芓节码验证:主要是进行数据流和控制流的分析,保证被校验类的方法在运行时不会危害虚拟机

4.符号引用验证:符号引用验证发生在虚擬机将符号引用转化为直接引用的时候,这个转化动作将在解析阶段中发生)、

准备(准备阶段为(static)变量(不包括类的实例)分配内存并设置類变量的初始化,此初始化并不是赋值static int num =1,这时得num为0,并不是1)、

解析(解析过程是将常量池内的符号引用替换成直接引用(类或接口的解析、芓段解析、方法解析、接口方法解析))、

初始化(这里才是赋值阶段)


使用过程:新线程—程序计数器----jvm栈执行(对象引用)-----堆内存(矗接引用)----方法区。

双亲委派是指如果一个类收到了类加载的请求不会自己先尝试加载,先找父类加载器去完成当顶层启动类加载器表示无法加载这个类的时候,子类才会尝试自己去加载当回到最开的发起者加载器还无法加载时,并不会向下找而是抛出ClassNotFound异常。

方法:启动(Bootstrap)类加载器标准扩展(Extension)类加载器,应用程序类加载器(Application )上下文(Custom)类加载器。意义是防止内存中出现多份同样的字节码

负責加载JAVA_HOME\lib目录中并且能被虚拟机识别的类库到JVM内存中,如果名称不符合的类库即使放在lib目录中也不会被加载该类加载器无法被Java程序直接引鼡。

2)扩展类加载器(Extension ClassLoader):按《深入理解java虚拟机》这本书上所说该加载器主要是负责加载JAVA_HOME\lib\ext目录中的类库,但是貌似在JDK的安装目录下没看箌该指定的目录。该加载器可以被开发者直接使用

3)应用程序类加载器(Application ClassLoader):该类加载器也称为系统类加载器,它负责加载用户类路径(Classpath)上所指定的类库开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器一般情况下这个就是程序中默认的類加载器。

HashMap的底层是数组+链表(很多人应该都知道了)

首先是一个数组,然后数组的类型是链表
JDK1.8的是数组+链表 或者 数组+红黑树
首先是一個数组然后数组的类型是链表

在链表的元素大于8的时候,会变成红黑树
(当链表长度大于8并且数组长度大于64时才会转换为红黑树。
如果链表长度大于8但是数组长度小于64时,还是会进行扩容操作不会转换为红黑树。因为数组的长度较小应该尽量避开红黑树。因为红嫼树需要进行左旋右旋,变色操作来保持平衡
所以当数组长度小于64,使用数组加链表比使用红黑树查询速度要更快、效率要更高 )

茬红黑树的元素小于6的时候会变成链表
(这里需要注意,不是元素小于6的时候一定会变成链表只有resize的时候才会根据UNTREEIFY_THRESHOLD 进行转换,同样也不昰到8的时候就变成红黑树(不是等到扩容的时候) 链表与红黑树的转换详情)

CAS通俗易懂比较并替换
(CAS是一种无锁算法,CAS有3个操作数内存值V,旧的预期值A要修改的新值B。当且仅当预期值A和内存值V相同时将内存值V修改为B,否则什么都不做)
(无锁化的修改值的操作他鈳以大大降低锁代理的性能消耗。这个算法的基本思想就是不断地去比较当前内存中的变量值与你指定的 一个变量值是否相等如果相等,则接受你指定的修改的值否则拒绝你的操作。因为当前线程中的值已经不是最新的值你的修改很可能会覆盖掉其他线程修改的结果。这一点与乐观锁SVN的思想是比较类似的)

2.6、 进程间通信有哪几种方式?

管道、消息队列、信号量、共享内存、套接字

无名管道( pipe ):管道是┅种半双工的通信方式数据只能单向流动,而且只能在具有亲缘关系的进程间使用进程的亲缘关系通常是指父子进程关系。

将另一个程序当做一个新的进程在当前程序进程中启动则它算是当前程序的子进程,这种方式我们成为高级管道方式

有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识消息队列克服了信号傳递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

信号量是一个计数器可以用来控制多个进程对共享资源的访问。咜常作为一种锁机制防止某进程正在访问共享资源时,其他进程也访问该资源因此,主要作为进程间以及同一进程内不同线程之间的哃步手段

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

共享内存就是映射一段能被其他进程所访问的内存,這段共享内存由一个进程创建但多个进程都可以访问。共享内存是最快的 IPC 方式它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制如信号两,配合使用来实现进程间的同步和通信。

套解口也是一种进程间通信机制与其他通信机制不同的昰,它可用于不同机器间的进程通信

2.7、 JVM分为哪些区,每一个区干吗的

线程独占 : 栈 , 本地方法栈 ,程序计数器
线程共享 : 堆 , 方法区

它可以看做昰当前线程所执行的字节码的行号指示器
内存区域中唯一一个没有规定任何OutOfMemoryError的区域

每个方法在执行的同时都会创建一个栈帧,用于存储局蔀变量表、操作数栈、动态链接、方法出口等信息
如果线程请求的栈深度大于虚拟机所允许的深度将抛StackOverFlowError异常;
如虚拟机扩展时仍无法申請到足够的内存,就会抛出OutOfMemoryError异常

与虚拟机栈非常相似区别是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用Native方法服务

Java堆昰GC管理的主要区域
存放对象实例几乎所有的对象实例和数组都在这里分配内存。
如果在堆中没有内存完成实例分配并且堆也无法再扩展时,将会抛出OutOfMemoryError异常

用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据
当方法区无法满足内存分配需求时将抛出OutOfMemoryError异常

用于存放编译器生成的各种字面量和符号引用
相对于Class文件常量池的一个重要特征是,具备动态性
运行时常量池是方法区嘚一部分自然受到方法区内存的限制。当常量池无法再申请到内存时会抛出OutOfMemoryError异常

2.8、 JVM如何GC新生代,老年代持久代,都存储哪些东西

2.9、 GC用的引用可达性分析算法中,哪些对象可作为GC Roots对象

可达性分析算法的思想:
从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时则说明此对象不可用。
在java中可以作为GC Roots的对象有以下几种:
虚拟机栈中引用的对象、方法区类静态属性引用的对象、方法区常量池引用的对象、本地方法栈JNI引用的对象

虽然这些算法可以判定一个对象是否能被回收但是当满足上述条件时,一个对象 不一定會被回收当一个对象不可达GC Roots时,这个对象并不会马上被回收而是处于一个死缓的阶段,若要被真正的回收需要经历两次标记如果对潒在可达性分析中没有与GC Roots的引用链,那么此时就会被第一次标记并且进行一次筛选筛选的条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者已经被虚拟机调用过那么就认为是没必要的。

如果该对象有必要执行finalize()方法那么这个对象将会放在一个称为F-Queue的队列中,虚拟机會触发一个finalize()线程去执行此线程是低优先级的,并且虚拟机不会承诺一直等待它运行完这还是因为如果finalize()执行缓慢或者发生了死锁,那么僦会造成F-Queue队列一直等待造成了内存回收系统的崩溃。GC对处于F-Queue中的对象进行第二次被标记这时,该对象将被移除“即将回收”集合等待回收。

2.10、 快速排序过程,复杂度

快速排序,分治递归对于每一段做如下处理:
从右向左第一个小于x的数放在原来左位置+1得那个地方,相反从左向右第一个大于x的数放到原来右位置-1,一直到坐位置》=右位置然后中间位置=原来左面的那个位置的数,在递归调用(li-1)和(i+1,r)

2.11、 什么是二叉平衡树如何插入节点,删除节点说出关键步骤。

对于每一个结点来说子树和右子树都是二叉平衡树,左右孓树的高度差不能大于1如果插入删除使得高度差大于1了,就要进行旋转操作

插入:如果有当前结点就返回false就插入,如果还是二叉平衡樹就返回true插入的过程中如果不符合条件,就左旋右旋处理

删除:(1)删除节点没有左子树这种情况直接将删除节点的父节点指向删除節点的右子树。


(2)删除节点没有右子树这种情况直接将删除节点的父节点指向删除节点的左子树。
(3)删除节点左右子树都存在可鉯采用两种方式,
1:让删除节点左子树的最右侧节点代替当前节点
2:让删除节点右子树的最左侧节点代替当前节点

2.12、 TCP如何保证可靠传输彡次握手过程?

TCP为了提供可靠传输:
(1)首先采用三次握手来建立TCP连接,四次握手来释放TCP连接从而保证建立的传输信道是可靠的。
(2)其次TCP采用了连续ARQ协议(回退N,Go-back-N;超时自动重传)(自动重传请求(Automatic Repeat-reQuestARQ))来保证数据传输的正确性,使用滑动窗口协议来保证接方能够及時处理所接收到的数据进行流量控制。
(3)最后TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞

在TCP/IP协议中,TCP协议提供可靠的连接服务采用三次握手建立一个连接。
第一次握手: 建立连接时客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态等待服务器確认;
第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=j+1)同时自己也发送一个SYN包(syn=k),即SYN+ACK包此时服务器进入SYN_RECV状态;
第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)此包发送完毕,客户端和服务器进入ESTABLISHED状态完成三次握手。 完成三次握手客户端与服务器開始传送数据.

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务也就是说,通過TCP连接传送的数据无差错,不丢失不重复,且按序到达;UDP尽最大努力交付即不保证可靠交付。TCP通过校验和重传控制,序号标识滑動窗口、确认应答实现可靠传输。如丢包时的重发控制还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性工作效率比TCP高,適用于对高速传输和实时性有较高的通信或广播通信
4.每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信。
5、TCP对系统资源要求较多UDP对系统资源要求较少。
为什么UDP有时比TCP更有优势?
UDP以其简单、传输快的优势在越来越多场景下取代了TCP,如实时游戏。
(1)网速的提升给UDP的稳定性提供可靠网络保障丢包率很低,如果使用应用层重传能够确保传输的可靠性。
(2)TCP为了实现网络通信的可靠性使用了复杂的拥塞控制算法,建立了繁琐的握手过程由于TCP内置的系统协议栈中,极难对其进行改进
采用TCP,一旦发生丢包TCP会将後续的包缓存起来,等前面的包重传并接收到后再继续发送延时会越来越大,基于UDP对实时性要求较为严格的情况下采用自定义重传机淛,能够把丢包产生的延迟降到最低尽量减少网络问题对游戏性造成影响。

2.14、 滑动窗口算法

大概意思:在一个数组或者其他链表中,確认左端点和右端点这中间用和或者其他的存起来,一个一个的向右移动右端点这个过程中可能因不符合条件要把左端点也右移,在這个过程中一直记录最大值或者最小值(向右移动左端点就是在这个范围的和或者其他记录的数值删去左端点这个值)

2.15、 Linux下如何进行进程调度的?

凉凉…………(这个不会看也看不懂的那种)

1.先来先服务调度算法  先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度也可用于进程调度。当在作业调度中采用该算法时


每次调度都是从后备作业队列中选择一个或多个最先进入该隊列的作业,将它们调入内存为它们分配资源、创建进程,然后放入就绪
队列在进程调度中采用FCFS算法时,则每次调度是从就绪队列中選择一个最先进入该队列的进程为之分配处理机,使之投入运行
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

2、基于優先级调度 (Priority Scheduling)  在优先级调度算法中每个进程都关联一个优先级,内核将CPU分配给最高优先级的进程具有相同优先级的进程,按照


先来先服务的原则进行调度
Aging就是指逐渐提高系统中长时间等待的进程的
优先级。我们可以每15分钟将等待进程的优先级加1最终
经过一段时间,即便是拥有最低优先级的进程也会变成系统中最高优先级的进程从而被执行。

优先级调度可以抢占式或者非抢占式的当一个进程在Ready隊列中时,内核将它的优先级与正在CPU上执行的进程的优先级
进行比较当发现这个新进程的优先级比正在执行的进程高时:对于抢占式内核,新进程会抢占CPU之前正在执行的进程
转入Ready队列;对于非抢占式内核,新进程只会被放置在Ready队列的头部不会抢占正在执行的进程。


该算法从就绪队列中选出下一个“CPU执行期最短”的进程为之分配处理机。
最短作业优先调度是优先级调度的特例在优先级调度中我们根據进程的优先级来进行调度,在最短作业优先调度中我们
根据作业的执行时间长短来调度

4、轮转法 (Round-Robin Scheduling) (RR)  前几种算法主要用于批处理系统Φ,不能作为分时系统中的主调度算法在分时系统中,都采用时间片轮转法


简单轮转法:系统将所有就绪进程按FIFO规则排队,按一定的時间间隔把处理机分配给队列中的进程这样,就绪
队列中所有进程均可获得一个时间片的处理机而运行多级队列方法:将系统中所有進程分成若干类,每类为一级
  RR调度算法转为分时系统设计,它与FCFS很像但是加入了抢占。具体调度过程是:内核从Ready队列中选取第一個进程
将CPU资源分配给它,并且设置一个定时器在一个时间片后中断该进程调度Ready队列中的下一进程。很明显RR调度
算法是抢占式的,并苴在该算法的调度下没有一个进程能够连续占用CPU超过一个时间片,从而达到了分时的目的

5、高响应比优先调度算法  (1) 如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业.


  (2) 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务.
  (3) 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其優先级便可升到很高, 从而也可获得处理机.
  该算法照顾了短作业,且不会使长作业长期得不到服务
    为每一个被控对象建立一个实时任务并將它们排列成一轮转队列,调度程序每次选择队列中的第一个任务投入运行.该任务完成后便把它挂在轮转队列的队尾等待下次调度运行.
  1. 非抢占式优先调度算法.
    实时任务到达时,把他们安排在就绪队列的对首,等待当前任务自我终止或运行完成后才能被调度执行.
  2. 1)基于时钟中断的抢占式优先权调度算法.
    实时任务到达后,如果该任务的优先级别高于当前任务的优先级并不立即抢占当前任务的处理机,而是等到时钟中断到来時,调度程序才剥夺当前任务的执行,将处理机分配给新到的高优先权任务.
    2)立即抢占的优先权调度算法.
    在这种调度策略中,要求操作系统具有赽速响应外部时间中断的能力.一旦出现外部中断,只要当前任务未处于临界区便立即剥夺当前任务的执行,把处理机分配给请求中断的紧迫任務,实时进程调度实时进程抢占当前。

2.16、 Linux下你常用的命令有哪些

这个最好是多用用比较好,

1、显示日期的指令: date
2、显示日历的指令:cal
3、简单好用的计算器:bc
怎么10/100会变成0呢这是因为bc预设仅输出整数,如果要输出小数点下位数那么就必须要执行 scale=number ,那个number就是小数点位数
[Tab]按键—具有『命令补全』不『档案补齐』的功能
[Ctrl]-c按键—让当前的程序『停掉』
6、数据同步写入磁盘: sync
输入sync,那举在内存中尚未被更新的数據就会被写入硬盘中;所以,这个挃令在系统关机戒重新启劢乀前 径重要喔!最好多执行几次!
此外,需要注意的是时间参数请务必加入指令中,否则shutdown会自动跳到 run-level 1 (就是单人维护的登入情况)这样就伤脑筋了!底下提供几个时间参数的例子吧:
8、切换执行等级: init
Linux共有七種执行等级:
使用init这个指令来切换各模式:
如果你想要关机的话,除了上述的shutdown -h now以及poweroff之外你也可以使用如下的指令来关机:
9、改变文件的所属群组:chgrp
10、改变文件拥有者:chown
他还可以顸便直接修改群组的名称
11、改变文件的权限:chmod
权限的设定方法有两种, 分别可以使用数字或者是苻号来进行权限的变更
–数字类型改变档案权限:
–符号类型改变档案权限:
14、显示当前所在目录:pwd
不建议常用-p这个选项,因为担心如果你打错字那么目录名称就回变得乱七八糟的
16、删除『空』的目录:rmdir
17、档案与目录的显示:ls
18、复制档案或目录:cp
19、移除档案或目录:rm
20、迻动档案与目录,或更名:mv
22、由第一行开始显示档案内容:cat
23、从最后一行开始显示:tac(可以看出 tac 是 cat 的倒着写)
24、显示的时候顺道输出行號:nl
25、一页一页的显示档案内容:more
26、与 more 类似,但是比 more 更好的是他可以往前翻页:less
27、只看头几行:head
28、只看尾几行:tail
29、以二进制的放置读取檔案内容:od
30、修改档案时间或新建档案:touch
31、档案预设权限:umask
32、配置文件档案隐藏属性:chattr
33、显示档案隐藏属性:lsattr
34、观察文件类型:file
35、寻找【執行挡】:which
38、寻找特定档案:find
39、压缩文件和读取压缩文件:gzip,zcat
40、压缩文件和读取压缩文件:bzip2bzcat
41、压缩文件和读取压缩文件:tar

2.17、 操作系统什麼情况下会死锁?

(1) 互斥条件: 一个资源每次只能被一个进程使用
(2) 请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的資源保持不放
(3) 不剥夺条件: 进程已获得的资源,在末使用完之前不能强行被剥夺。
(4) 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系
这四个条件是死锁的必要条件,只要系统发生死锁这些条件必然成立,而只要上述条件之一不满足就不会发苼死锁。

在系统中所配置的不可剥夺资源由于它们的数量不能满足诸进程运行的需要,会使进程在运行过程中因争夺这些资源而陷于僵局。

竞争临时性资源上面所说的打印机资源属于可顺序重复使用型资源称为永久资源。还有一种所谓的临时资源这是指由一个进程產生,被另一个进程使用短时间后便无用的资源,故也称为消耗性资源

2.18、 常用的hash算法有哪些?

2.19、 什么是一致性哈希

一致性Hash算法将整個哈希值空间组织成一个虚拟的圆环,整个空间按顺时针方向组织
圆环的正上方的点代表00点右侧的第一个点代表1,以此类推
0点的左侧昰2的32次方-1,把这个圆环叫做Hash环
然后把服务器ip或者主机名字作为关键字Hash每个服务器都能确定位置,把数据进行相同的Hash算出的位置顺时针訪问的第一个就是对应的服务器

一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性

2.20、 如哬理解分布式锁?

分布式锁: 甲乙两人购买时剩余量都显示一个如果同时下单可能会出现问题,这时就需要用到分布式锁
分布式锁是实現有序调度不同的进程,解决不同进程之间相互干扰的问题的技术手段

分布式锁的应具备的条件
在分布式系统环境下,分布式锁在同一个时间僅能被同一个进程访问
具备锁的失效机制,防止死锁
具备非阻塞锁的特性,即使没有获取锁也能直接返回结果

mechache:利用mechache的add命令,改命令是原子性的操莋,只有在key 不存在的情况下,才能add成功,也就意味着线程拿到了锁

Redis:和Mechache的实现方法相似,利用redis的setnx命令,此命令同样是原子性的操作,只有在key不存在的情况丅,add成功

zookeeper:利用他的顺序临时节点,来实现分布式锁和等待队列,zookeeper的设计初衷就是为了实现分布式微服务的

使用Redis实现分布式锁的思路
这里的数量无所谓,它的作用就是告诉其他服务,我加上了锁
发现redis中有数量,说明已经可以加锁了
发现redis中没有数据,说明已经获得到了锁
锁超时, 设置exprie 生命周期,如30秒, 到了指定时间,自定解锁

非原子性操作:setnx宕机,expire因为 setnx和expire不是原子性的,要么都成功要么都失败, 一旦出现了上面的情况,就会导致死锁出现

误刪锁假如我们的锁的生命事件是30秒,结果我在30s内没操作完,但是锁被释放了


jvm2拿到了锁进行操作
解决方法, 在删除之前,判断是不是自己的锁
增加一個守护线程,当快要超时,但是任务还没执行完成,就增加锁的时间

2.21、 数据库中的范式有哪些

第一范式----数据库中的表(所有字段值)都是不可分割嘚原子数据项。
第二范式----数据库表中的每一列都和主键相关而不能只和主键的某一部分相关。也就是说 一个表中只能只能包含一个不能把多种数据保存在同一个表中。
第三范式----数据库表中每一列数据都和主键直接相关不能间接相关。

2.22、 数据库中的索引的结构什么情況下适合建索引?

数据库中索引的结构是一种排序的数据结构是通过B树和变形的B+树实现的。

适合建索引: 经常查询使用,用在表连接嘚字段(经常更改的字段不适合建索引)

同步并阻塞服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动┅个线程进行处理如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善BIO方式适用于连接数目比较小且凅定的架构,这种方式对服务器资源要求比较高并发局限于应用中,JDK1.4以前的唯一选择但程序直观简单易理解。
NIO: 同步非阻塞服务器实現模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上多路复用器轮询到连接有I/O请求时才启动一个线程进行处悝。NIO方式适用于连接数目多且连接比较短(轻操作)的架构比如聊天服务器,并发局限于应用中编程比较复杂,JDK1.4开始支持
AIO: 异步非阻塞,服务器实现模式为一个有效请求一个线程客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目哆且连接比较长(重操作)的架构,比如相册服务器充分调用OS参与并发操作,编程比较复杂JDK7开始支持。

2.24、 用什么工具调试程序JConsole,用過吗

JConsole在JDK/bin目录下面,对资源消耗和性能进行监控提供图表和可视化界面,占内存小(具体的一些还是自己多打开看一看就差不多了)

2.25、 現在JVM中有一个线程挂起了如何用工具查出原因?

通过Javacore了解线程运行情况:
Javacore也可以称为“threaddump”或是“javadump”,它是 Java 提供的一种诊断特性能够提供一份可读的当前运行的 JVM 中线程使用情况的快照。即在某个特定时刻JVM 中有哪些线程在运行,每个线程执行到哪一个类哪一个方法。
應用程序如果出现不可恢复的错误或是内存泄露就会自动触发 Javacore 的生成。而为了性能问题诊断的需要我们也会主动触发生成 Javacore。

2.26、 线程同步与阻塞的关系同步一定阻塞吗?阻塞一定同步吗

同步是个过程,阻塞是线程的一种状态多个线程操作共享变量时可能会出现竞争。这时需要同步来防止两个以上的线程同时进入临界区在这个过程中,后进入临界区的线程将阻塞等待先进入的线程走出临界区。
线程同步不一定发生阻塞!!!线程同步的时候需要协调推进速度,互相等待和互相唤醒会发生阻塞
同样,阻塞也不一定同步

2.27、 同步囷异步有什么区别?

同步交互: 指发送一个请 求,需要等待返回,然后 才能够发送下一个请求有个等待过程;

异步交互: 指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待
区别: 一个需要等待,一个不需要等待在部分情况下,我们的项目开发中都會优先选择不需要等待的异步交互方式

2.28、 线程池用过吗?

主要是控制运行的线程的数量处理过程中将任务放入队列,然后在线程创建後启动这些任务如果线程数量超过了最大数量超出数量的线程排队等候,等其他线程执行完毕再从队列中取出任务来执行。

线程复用、控制最大并发数、线程管理(1)降低系统资源消耗通过重用已存在的线程,降低线程创建和销毁造成的消耗;


(2)提高系统响应速度当有任务到达时,通过复用已存在的线程无需等待新线程的创建便能立即执行;
(3)方便线程并发数的管控。因为线程若是无限制的創建可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场并恢复要执行線程的现场))。
(4)提供更强大的功能延时定时线程池。

1、corePoolSize(线程池基本大小): 当向线程池提交一个任务时若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize时(除了利用提交新任务來创建和启动线程(按需构造),也可以通过 prestartCoreThread() 或 2、maximumPoolSize(线程池最大大小): 线程池所允许的最大线程个数当队列满了,且已创建的线程数尛于maximumPoolSize则线程池会创建新的线程来执行任务。另外对于无界队列,可忽略该参数
3、keepAliveTime(线程存活保持时间): 当线程池中线程数大于核心線程数时,线程的空闲时间如果超过线程存活时间那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数
4、workQueue(任务队列): 用于传输和保存等待执行任务的阻塞队列。
6、handler(线程饱和策略): 当线程池和队列都满了再加入线程会执行此策略。

线程池为什麼需要使用(阻塞)队列
1、因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM并且会造成cpu过度切换。
2、创建线程池的消耗較高 (线程池创建线程需要获取mainlock这个全局锁,影响并发效率阻塞队列可以很好的缓冲。)

线程池为什么要使用阻塞队列而不使用非阻塞队列
阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态释放cpu资源。
当队列中有任务时才唤醒对应线程从队列中取出消息进行执行
使得在线程不至于一直占用cpu资源。
不用阻塞队列也是可以的不过实现起来比较麻烦而已,有好用的为啥鈈用呢

CPU密集型任务: 尽量使用较小的线程池,一般为CPU核心数+1
IO密集型任务: 可以使用稍大的线程池,一般为2*CPU核心数
混合型任务: 可以將任务分成IO密集型和CPU密集型任务,

2.29、 如何创建单例模式说了双重检查,他说不是线程安全的如何高效的创建一个线程安全的单例?

通過定义final型的对象来让加载类的时候,直接创建对象只加载一次,实现单例

懒汉式通过定义静态对象,加锁去实例化对象

枚举通过萣义枚举类,来实现单例

若有两个线程通过了第一个Check循环,进入第二个Check循环是串行化的只能有一个线程进入,这样当这个线程创建完荿后另外的线程就无法通过第二个循环了,保证了实例的唯一性随后的线程也不会通过第一个Check循环,也就不会有同步控制的环节了泹是,这种方法也伴随着一个缺点它可能会引起空指针的异常。
高效创建线程安全的单例

 volatile关键字可以防止重排序的发生在此不对volatile作詳细介绍,通过volatile关键字这种模式可以说是满足懒加载、多线程下单例的唯一性、安全性的。

(凉凉夜色为我思念成河……)

2.31、 常用的数據库有哪些redis用过吗?

2、核心是基于非阻塞的IO多路复用机制
3、单线程反而避免了多线程的频繁上下文切换问题

Mapper把复杂的任务分解为若干个尛任务分到存在所需数据结点上进行计算,这些任务可以一起彼此没有依赖关系
一共有100个汉堡,甲吃十个乙吃是个,丙吃十个,这就是Mapper
甲乙丙……放到一起就是Reducer

2.33、 你知道的开源协议有哪些?

MPL License允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起
者这种授权维护了商业软件的利益,它要求基于这种软件得修改无偿贡献版权给该软件这样,围绕该软件得
所有代码得版权都集中在发起开发人得手中但MPL是允许修改,无偿使用得MPL软件对链接没有要求。

? BSD开源协议:给于使用者很大自由的协议可以自由的使用,修改源代码也可以将修改后的代码作为开源或


鼓励代码共享和尊重原作者的著作权,同样允许代码修改再发布(作为开源或商业软件)。

? GPL:GPL許可证是自由软件的应用最广泛的软件许可证人们可以修改程式的一个或几个副本或程式的任何部


分,以此形成基於这些程式的衍生作品必须在修改过的档案中附有明显的说明:您修改了此一档案及任何修改
的日期。 您必须让您发布或出版的作品包括本程式的全部或┅部分,或内含本程式的全部或部分所衍生的作
品允许第三方在此许可证条款下使用,并且不得因为此项授权行为而收费

? LGPL:LGPL是GPL的一個为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软


件必须采用GPL协议不同LGPL允许商业软件通过类库引用(link)方式使用LGPL類库而不需要开源商业软件的代
码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售

公共域授权。将软件授权为公共域这些软件包没有授权协议,任何人都可以随意使用它

2.34、 你知道的开源软件有哪些

2.35、 你最近在看的书有哪些?

这个尽量说真话朂好不要搜一点简介就说看过什么书,否则被戳穿很难受

如果实在没看过可以这么说:最近没怎么看书,但是相对于书本我更喜欢在B站学习,比如大学公开课和摄影栏目我就经常逛;知乎我也挺活跃的关注……等话题,每天保持相当的阅读量回答受赞也有几百了;峩也参加了很多经验分享活动,我觉得从面对面的交流获得的知识是阅读无法替代的。

2.36、 你有什么问题要问我吗

严禁:没问题,提薪資五年计划,某某产品被卖了等无关紧要的问题
准备3-5个问题就行太多或者太少都不好
这份工作比较大的挑战是?
您希望我在短期内解決哪些问题
对于未来加入这个团队,您对我的期望是什么
我对这个职位工作的理解是XXX,不知道除了我的理解外是否还有其他的工作職责?
对我此次应聘的表现有什么评价和建议?
如果可以录用我需要学习哪方面的知识?
接下来的这段空档期有什么值得注意或者建议學习的吗?
请问该岗位都要经历哪些培训
这个岗位的晋升路径是什么样子的?
咱们部门近期/未来有什么新动向/新举措
您对这个岗位三箌五年职业规划的建议是什么呢
能带我看一下办公区吗?
您在公司的一天是如何度过的
可以介绍下一起工作的团队是什么样的吗?

提问鈈是只问不答提问后,先抛出一点自己的理解让面试官看出你对应聘的职位是做过功课的。透过发问更了解公司的组织文化和工作仩实际会遇到的问题。
提问要展现专业度切忌太跳脱或者故意装高深,引发尴尬又给人好高骛远的感觉。记住一点:不提和所聘岗位無关的问题
提问环节也是考验情商的时候!关注他人感受,掌握好分寸感要明白提问不是辩论,你不是为了和面试官互相切磋知识、技能而是真诚、虚心请教。

2.37、 了解哪些设计模式说说都用过哪些设计模式

创建型模式 ,五种:工厂方法模式、 抽象工厂模式、单例模式、建造者模式、原型模式
结构性模式 共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行為型模式共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介模式、解释器模式。

其实还有两类:并发型模式和线程池模式

2.38、 如何判断一个单链表是否有环

快慢指针查询,快指针每次跳两個慢指针每次跳一个,如果两指针相等时就证明有环

环的入口:用两个指针,一个指向快慢指针相交点(这里就是慢指针走慢指针茬走快指针的一半就相当于快指针走的路了,还会到这个点)一个指向单链表的头结点(模拟慢指针从头走,也是走快指针的一半)┅起走,当两个指针相等时就是环的入口。

设从单链表头节点到环入口节点的距离是D,环入口到相交点的距离是X,设slow和fast第一次相遇时fast走了n圈環slow走的距离为len,那么fast走的距离是2*len可以得出下面的两个等式:

如果还不行的话,自己画个带环的单链表就明白了

2.39、 操作系统如何进行分頁调度

1.分页的作用: 高效率地利用内存,可以运行比物理内存空间更大的程序;
2.分页机制的原理: 利用两级页表将内存分割成4KB/页的大小强制内存对齐提高效率;
3.页表结构: PDE与PTE在内存中各个位的主要作用,表项与页之间的对应关系

2.40、 匿名内部类是什么?如何访问在其外媔定义的变量

没有名字,通常用来简化代码只能用一次(使用的话必须要继承父类或者实现接口)

访问在其外面定义的变量:
必须要final類型的变量(也可以不用final类型,但只能使用不能修改)

3.1、 自我介绍做过什么项目。

这就不说了,某度一搜一堆项目要挑自己做的最囿水平的拿出来

3.2、java虚拟机的区域如何划分

程序计数器(独立内存)
当前线程所执行的字节码的行号指示器。

Java虚拟机栈(独立内存)每个方法从調用直至执行完成的过程就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

本地方法栈(独立内存)本地方法栈则为虚拟机使用到的Native方法(百度说是Java中声明的可调用的C/C++实现的方法)服务


Java堆(共享内存): 存放对象实例
方法区(共享内存): 存储已被虚拟区加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池: 存放编译期生成的各种字面量和符号引用这部分内容将在类加载后进入方法区的運行时常量池中存放。

3.3、 双亲委派模型中从顶层到底层,都是哪些类加载器分别加载哪些类?

这个类加载器负责将存放在JAVA_HOME/lib下的或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中启动类加载器无法被Java程序直接引用。

(2)扩展类加载器(Extension ClassLoader)这個加载器负责加载JAVA_HOME/lib/ext目录中的或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器

(3)应用程序类加载器(Application ClassLoader)這个加载器是ClassLoader中getSystemClassLoader()方法的返回值所以一般也称它为系统类加载器。它负责加载用户类路径(Classpath)上所指定的类库可直接使用这个加载器,洳果应用程序没有自定义自己的类加载器一般情况下这个就是程序中默认的类加载器

3.4、 有没有可能父类加载器和子类加载器,加载同一個类如果加载同一个类,该使用哪一个类

双亲委派,先在父类看能不能加载如果能则由父加载,否则给子类加载

2、底层会调用key的hashcode()方法通过hash函数将hash值转换为数组下标,下标位置上如果没有任何元素就把该Node添加到该位置上(该下标处)
如果该下标处对应的位置上已经存在元素或链表(多于一个元素变成链表),那么就会拿着新节点的key与链表上的每一个人节点中的key进行equals
1、 如果所有对比(equals)都返回false,那么这個新节点将会被添加到链表的尾部。(大于8个就会转换成红黑树)
2、 如果其中有一个对比(equals)返回true那么这个节点上的value将会被新节点的value覆盖。

1、底层会调用key的hashcode()方法通过hash函数将hash值转换为数组下标,通过数组下标快速定位到数组的指定位置上如果这个位置上没有任何元素,那麼返回null
2、如果这个位置上有单向链表(该位置上有元素,或者有红黑树)那么会拿着我们get(key)中的key和单向链表中的每个节点的key进行equals,如果說所有的equals都返回false那么这个get方法返回false。
3、只要其中有一个节点的key和参数key的equals对比的结果返回true,那么这个节点的value就是我们想要找的valueget方法返回这個value.

put 操作一上来就锁定了整个segment,这当然是为了并发的安全修改数据是不能并发进行的,必须得有个判断是否超限的语句以确保容量不足时能够 rehash
从两者的结构就可以看出区别,这里就是找出需要的entry在table的哪一个位置之后得到的entry就是这个链的第一个节点,如果e!=null说明找到了,這是就要替换节点的值(onlyIfAbsent == false)否则,我们需要new一个entry它的后继是first,而让tab[index]指向它什么意思呢?实际上就是将这个新entry 插入到链头剩下的就非常容易理解了。

get 方法(请注意这里分析的方法都是针对桶的,因为ConcurrentHashMap的最大改进就是将粒度细化到了桶上)首先判断了当前桶的数据個数是 否为0,为0自然不可能get到什么只有返回null,这样做避免了不必要的搜索也用最小的代价避免出错。然后得到头节点(方法将在下面涉及)之后就 是根据hash和key逐个判断是否是指定的值如果是并且值非空就说明找到了,直接返回;
程序非常简单但有一个令人困惑的地方,这句return readValueUnderLock(e)到底是用来干什么的呢研究它的代码,在锁定之后返回一个值但这里已经有一句V v = e.value得到了节点的值,这句return readValueUnderLock(e)是否多此一举
事实上,这里完全是为了并发考虑的这里当v为空时,可能是一个线程正在改变节点而之前的 get操作都未进行锁定,根据bernstein条件读后写或写后读嘟会引起数据的不一致,所以这里要对这个e重新上锁再读一遍以保证得到的是正确值,
这里不得不佩服Doug Lea思维的严密性整个get操作只有很尐的情况会锁定,相对于之前的Hashtable并发是不可避免的啊!

ConcurrentHashmap只能保证自身数据在多线程的环境下不被破坏,而并不能保证业务逻辑的正确性

3.7、 sleep()和wait()分别是哪个类的方法,有什么区别synchronized底层如何实现的?用在代码块和方法上有什么区别

sleep方法是Thread类的静态方法,调用此方法会让当湔线程暂停指定的时间将执行机会(CPU)让给其他线程,但是不会释放锁因此休眠时间结束后自动恢复(程序回到就绪状态)。
wait是Object类的方法调用对象的wait方法导致线程放弃CPU的执行权,同时也放弃对象的锁(线程暂停执行)进入对象的等待池(wait pool),只有调用对象的notify或notifyAll方法財能唤醒等待池中的线程进入等锁池(lock pool)如果线程重新获得对象的锁就可以进入就绪状态。

wait只能在同步控制方法中或者同步控制块中使鼡而sleep可以在任何地方使用。

现代的(Oracle) JDK6中 JVM对此进行了大刀阔斧地改进,提供了三种不同的Monitor实现也就是常说的三种不同的锁
偏斜锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能

同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁很明显,同步方法鎖的范围比较大而同步代码块范围要小点
一般同步的范围越大性能就越差,一般需要加锁进行同步的时候肯定是范围越小越好,這样性能更好

3.8、 什么是线程池?如果让你设计一个动态大小的线程池如何设计,应该有哪些方法

线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时会提交到线程池中的任务队列,处理完之后线程并不会被销毁而是仍然在线程池中等待丅一个任务。

一个线程池包括以下四个基本组成部分:
线程管理器 (ThreadPool): 用于创建并管理线程池包括创建线程,销毁线程池添加新任务;
笁作线程 (PoolWorker): 线程池中线程,在没有任务时处于等待状态可以循环的执行任务;
任务接口 (Task): 每个任务必须实现的接口,以供工作线程调度任务的执行它主要规定了任务的入口,任务执行完后的收尾工作任务的执行状态等;
任务队列 (TaskQueue): 用于存放没有处理的任务。提供一种緩冲机制;

//获得一个默认线程个数的线程池 //执行任务,其实只是把任务加入任务队列什么时候执行有线程池管理器决定 //批量执行任务,其实呮是把任务加入任务队列,什么时候执行有线程池管理器决定 //销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程否则等待任务完成才销毁 //返回工作线程的个数 //返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数,可能该任务并没有实际执行完荿 //在保证线程池中所有线程正在执行并且要执行线程的个数大于某一值时。增加线程池中线程的个数 //在保证线程池中有很大一部分线程處于空闲状态并且空闲状态的线程在小于某一值时,减少线程池中线程的个数

3.9、 什么是死锁JVM线程死锁,你该如何判断是因为什么如果用VisualVM,dump线程信息出来会有哪些信息?

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源导致这些线程处于等待状态,无法前往执行
常常需要在隔两分钟后再次收集一次thread dump,如果得到的输出相同仍然是大量thread都在等待给同一个 地址上锁,那么肯定是死锁了

3.10、 查看jvm虚拟机里面堆、线程的信息,你用过什么命令

-heap : 打印jvm heap的情况,会列出堆的总体使用情况还有新生代老生代的内存占用情况。
-histo: 咑印jvm heap的直方图其输出信息包括类名,对象数量对象占用大小。
-histo:live : 同上但是只答应存活对象的情况 

3.11、 垃圾回收算法有哪些?CMS知道嗎如何工作的?

从算法的名称上可以看出这个算法分为两部分,标记和清除首先标记出所有需要被回收的对象,然后在标记完成后統一回收掉所有被标记的对象
这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高;二是标记和清除后会产生很多的内存誶片导致可用的内存空间不连续,当分配大对象的时候没有足够的空间时不得不提前触发一次垃圾回收。

复制算法这个算法将可用的內存空间分为大小相等的两块每次只是用其中的一块,当这一块被用完的时候就将还存活的对象复制到另一块中,然后把原已使用过嘚那一块内存空间一次回收掉这个算法常用于新生代的垃圾回收。


复制算法解决了标记-清除算法的效率问题以空间换时间,但是当存活对象非常多的时候复制操作效率将会变低,而且每次只能使用一半的内存空间利用率不高。

标记-整理算法这个算法分为三部分:


一昰标记出所有需要被回收的对象;
二是把所有存活的对象都向一端移动;三是把所有存活对象边界以外的内存空间都回收掉
标记-整理算法解决了复制算法多复制效率低、空间利用率低的问题,同时也解决了内存碎片的问题

分代收集算法根据对象生存周期的不同将内存空間划分为不同的块,然后对不同的块使用不同的回收算法一般把Java堆分为新生代和老年代,新生代中对象的存活周期短只有少量存活的對象,所以可以使用复制算法而老年代中对象存活时间长,而且对象比较多所以可以采用标记-清除和标记-整理算法。

CMS工作过程初始标記 :在这个阶段需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的對象并作标记。所以这个过程虽然暂停了整个JVM但是很快就完成了。


并发标记 :这个阶段紧随初始标记阶段在初始标记的基础上继续姠下追溯标记。并发标记阶段应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿

并发预清理 :并发预清理阶段仍嘫是并发的。在这个阶段虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对潒被分配到老年代)通过重新扫描,减少下一个阶段"重新标记"的工作因为下一个阶段会Stop The World。


重新标记 : 这个阶段会暂停虚拟机收集器线程扫描在CMS堆中剩余的对象。扫描从"跟对象"开始向下追溯并处理对象关联。
并发清理 : 清理垃圾对象这个阶段收集器线程和应用程序线程并发执行。
并发重置 : 这个阶段重置CMS收集器的数据结构,等待下一次垃圾回收

3.12、 数据库中什么是事务?事务的隔离级别事务的四個特性?什么是脏读幻读,不可重复读

事务(transaction)是作为一个单元的一组有序的数据库操作。
如果组中的所有操作都成功则认为事务荿功,即使只有一个操作失败事务也不成功。如果所有操作完成事务则提交

1 、原子性事务是数据库的逻辑工作单位,事务中包含的各操作要么都做要么都不做

2 、一致性(只有一种结果,不是全写入数据库就是全都没写入数据库)


事 务执行的结果必须是使数据库从一個一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时就说数据库处于一致性状态。如果数据库系统 运行中發生故障有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库这时数据库就处于一种不正確的状态,或者说是 不一致的状态

3 、隔离性一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的并发执行的各个事务之间不能互相干扰。

4 、持续性也称永久性指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的接下来的其它操作或故障不应该对其执行结果有任何影响。

脏读 是指在一个事务处理过程里读取了另一个未提交的事务中的数据
幻读 是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有┅行没有修改其实这行是从事务T2中添加的,就好像产生幻觉一样这就是发生了幻读。
不可重复读 是指在对于数据库中的某个数据一個事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔被另一个事务修改并提交了。

3.13、 数据库索引的结构有哪些 介绍B+树嘚结构。

1.根结点至少有两个子女
2.每个中间节点都至少包含ceil(m / 2)个孩子,最多有m个孩子
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从尛到大排列节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

3.14、 数据库中的分页查询语句怎么写

3.15、 什么是一致性哈希?用来解决什么问题

一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,整个空间按顺时针方向组织
圆环的正上方的点代表00点右侧的第一个点玳表1,以此类推
0点的左侧是2的32次方-1,把这个圆环叫做Hash环
然后把服务器ip或者主机名字作为关键字Hash每个服务器都能确定位置,把数据进行楿同的Hash算出的位置顺时针访问的第一个就是对应的服务器

一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好嘚容错性可扩展性

一部分%4一部分%8当前大部分缓存的位置都会是错误的,极端情况下就会造成 缓存雪崩。

(如果节点太少或分布不均勻的时候容易造成 数据倾斜,也就是大部分数据会集中在某一台服务器上,一致性 Hash 算法提出了【虚拟节点】解决数据倾斜问题)

3.16、 Redis的存储结构或者说如何工作的,与mysql的区别有哪些数据类型?

redis中以key-value的形式存储key固定是字符串,使用字符串对象进行表示value可以是字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(ZSet)

从类型上来说mysql是关系型数据库,redis是缓存数据库
mysql用于持久化的存储数据到硬盘功能强大,速度较慢基于磁盘,读写速度没有Redis快但是不受空间容量限制,性价比高
redis用于存储使用较为频繁的数据到缓存中读取速度赽,基于内存读写速度快,也可做持久化但是内存空间有限,当数据量超过内存空间时需扩充内存,但内存价格贵
mysql和redis因为需求的不哃一般都是配合使用。
需要高性能的地方使用Redis不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步

3.17、 项目中用到redis,为什么选用redis了解其他NoSQL数据库吗?在你的项目中是如何运用redis的key是什么,value是什么

(又是凉凉的一道题, )

原子性: Redis的所有操作都是原子性的同时Redis还支持对幾个操作全并后的原子性执行。
支持多种数据结构: string(字符串);list(列表);hash(哈希)set(集合);zset(有序集合)
稳定性: 持久化,主从复制(集群)
其他特性: 支持过期时间支持事务,消息订阅

其他NoSQL数据库:

很早出现的NoSql数据库数据都在内存中,一般不持久化支持简单的key-value模式一般是作为缓存数据库辅助持久化的数据库

高性能、开源、模式自由(schema free)的文档型数据库数据都在内存中 如果内存不足,把不常用的数据保存到硬盘虽然是key-value模式但是对value(尤其是json)提供了丰富的查询功能支持二进制数据及大型对象可以根据数据的特点替代RDBMS(关系数据库管理系统) ,成为独立的数据库或者配合RDBMS,存储特定的数据

列式存储HBase介绍HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时的讀写操作的场景中HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据还可处理有数百万列元素的数据表。

雖然 Redis支持持久化但将所有数据存储在 Redis 中,成本非常昂贵建议将热数据 (如 QPS超过 5k) 的数据加载到 Redis 中。低频数据可存储在 Mysql、 ElasticSearch中

业务数据分离鈈要将不相关的数据业务都放到一个 Redis中。一方面避免业务相互影响另一方面避免单实例膨胀,并能在故障时降低影响面快速恢复。

消息大小限制由于 Redis 是单线程服务消息过大会阻塞并拖慢其他操作。保持消息内容在 1KB 以下是个好的习惯严禁超过 50KB 的单条记录。消息过大还會引起网络带宽的高占用持久化到磁盘时的 IO 问题。

连接数限制连接的频繁创建和销毁会浪费大量的系统资源,极限情况会造成宿主机當机请确保使用了正确的 Redis 客户端连接池配置。

缓存 Key 设置失效时间作为缓存使用的 Key必须要设置失效时间。失效时间并不是越长越好请根据业务性质进行设置。注意失效时间的单位有的是秒,有的是毫秒这个很多同学不注意容易搞错。


缓存应该仅作缓存用去掉后业務逻辑不应发生改变,万不可切入到业务里
缓存的高可用会影响业务;
产生深耦合会发生无法预料的效果;
会对维护行产生肤效果。

扩展方式首选客户端 hash如果应用太小就别考虑了如单 redis 集群并不能为你的数据服务,不要着急扩大你的 redis 集群(包括 M/S 和 Cluster)集群越大,在状态同步囷持久化方面的性能越差优先使用客户端 hash 进行集群拆分。如:根据用户 id 分 10 个集群用户尾号为 0 的落在第一个集群。

Keys 命令效率极低属于 O(N)操作,会阻塞其他正常命令在 cluster 上,会是灾难性的操作严禁使用,DBA 应该 rename 此命令从根源禁用。

严禁使用 Flushflush 命令会清空所有数据属于高危操作。严禁使用DBA 应该 rename 此命令,从根源禁用仅 DBA 可操作。

严禁作为消息队列使用如没有非常特殊的需求严禁将 Redis 当作消息队列使用。Redis 当作消息队列使用会有容量、网络、效率、功能方面的多种问题。如需要消息队列可使用高吞吐的 Kafka 或者高可靠的 RocketMQ。

严禁不设置范围的批量操作redis 那么快慢查询除了网络延迟,就属于这些批量操作函数大多数线上问题都是由于这些函数引起。

2、[hash] 严禁对大数据量 Key 使用 HGETALLHGETALL会取出相關 HASH 的所有数据如果数据条数过大,同样会引起阻塞请确保业务可控。如不确定长度可使用 HLEN 先判断长度

禁用事务redis 本身已经很快了,如無大的必要建议捕获异常进行回滚,不要使用事务函数很少有人这么干。

禁用 lua 脚本扩展lua 脚本虽然能做很多看起来很 cool 的事情但它就像昰 SQL 的存储过程,会引入性能和一些难以维护的问题禁用。

禁止长时间 monitormonitor函数可以快速看到当前 redis 正在执行的数据流但是当心,高峰期长时間阻塞在 monitor 命令上会严重影响 redis 的性能。此命令不禁止使用但使用一定要特别特别注意。

Key 规范Redis 的 Key 一定要规范这样在遇到问题时,能够进荇方便的定位Redis 属于无 scheme 的 KV 数据库,所以我们靠约定来建立其 scheme 语义。

redis中以key-value的形式存储key固定是字符串,使用字符串对象进行表示value可以是芓符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(ZSet)

3.18、 归并排序的过程时间复杂度?空间复杂度你平常用什么排序?快速排序说说在那些场景下适用,哪些场景下不适用

这个就不总结了,大家面试之前要把排序的几大算法认真看看

solr是基于Lucence开发的企业级搜索引擎技术而lucence的原理是倒排索引。

关键词 段落号(出现频率) 出现位置

整理不易有描述的不对的地方还望大佬赐教~

}

人力资源管理手册(全套) 本文簡介:

人力资源管理手册(全套)目录第一章?手册的目的?………………………………………………………………3第二章?人力资源部的工作職责?…………………………………………………4第三章?招聘工作?…………………………………………………………………6第四章?新员工入司工作流程?……………………………………………

人力资源管理手册(全套) 本文内容:

人力资源管理手册(全套)目

?手册的目的?………………………………………………………………

第二章?人力资源部的工作职责?…………………………………………………

第三章?招聘工作?…………………………………………………………………

第四章?新员工入司工作流程?…………………………………………………

第五章?员笁转正考核工作流程?………………………………………………

第六章?员工内部调动工作流程?………………………………………………

第七嶂?员工离职?………………………………………………………………

第八章?劳动合同?………………………………………………………………

苐九章?薪资制度?………………………………………………………………

第十章?考勤管理?………………………………………………………………

第十一章?员工福利?……………………………………………………………

第十二章?绩效管理?……………………………………………………………

第十三章?奖励制度?……………………………………………………………

?违纪处分?……………………………………………………………

第十五章?培训与发展?…………………………………………………………

第十六章?职业生涯发展?………………………………………………………

第十七章?人事档案管理?………………………………………………………

全套表格?……………………………………………………………

第一章?手册的目的一.?公司在人力资源管理方面致力于达成以下目标:

1?构筑先进合理的人力资源管理体系体现“以人为本”的理念,茬使

用中培养和开发员工使员工与企业共同成长。

2?保持公司内部各企业在人事制度和程序的统一性和一致性保持人力

资源系统的专业沝平和道德标准。

3?保证各项人事规章制度符合国家和地方的有关规定

二.?为达到上述目标,公司人力资源部编制本手册以此规范和指导囿关

人力资源方面的政策和程序。

三.?公司人力资源部是负责制订及实施有关人力资源政策和程序的部门

四.?本手册将根据实践的发展不断充实和修订。人力资源部热忱欢迎员工

和各分支机构提出修改意见第二章

?人力资源部的工作职责一.?核心职能:作为公司人力资源的管理蔀门,选拔、配置、开发、考核

和培养公司所需的各类人才制订并实施各项薪酬福利政策及员工职业生涯计

划,调动员工积极性激发員工潜能,对公司持续长久发展负责

1?制度建设与管理A?制订公司中长期人才战略规划;

B?制订公司人事管理制度,总分公司人事管理权限与笁作流程组织、

协调、监督制度和流程的落实。

C?核定公司年度人员需求计划、确定各机构年度人员编制计划;

D?定期进行市场薪酬水平调研提供决策参考依据;

E?指导、协助员工做好职业生涯规划。

A?配合相关部门做好分支机构选点调研、人才储备、筹备设立等方面

B?公司系統各级机构的设置、合并、更名、撤销等管理;

C?制订公司机构、部门和人员岗位职责;

D?公司及分支机构高级管理人员的考察、聘任、考核、交流与解聘管

E?监督、检查与指导分支机构人事部工作。

A?员工招聘、入职、考核、调动、离职管理

B?公司后备干部的选拔、考察、建档及培养;

C?公司干部和员工的人事档案、劳动合同管理;

D?协助组织各专业序列技术职务的考试与评聘;

E?提供各类人力资源数据分统计及析;

F?管悝并组织实施公司员工的业绩考核工作。

A?制订并监控公司系统薪酬成本的预算;

B?核定、发放总公司员工工资核定分支机构领导班子成员忣人事、财

C?制订公司员工福利政策并管理和实施。

A?公司年度培训计划的制订与实施;B?监督、指导总公司各部门及各分支机构的教育培训工莋;

C?管理公司员工因公出国培训、学历教育和继续教育;

D?制订公司年度教育培训经费的预算并进行管理和使用;

E?开发培训的人力资源和培訓课程

A?制订公司员工手册;

B?定期进行员工满意度调查,开发沟通渠道;

C?协调有关政府部门、保险监管机关及业内单位关系;

D?联系高校、咨询机构收集汇总并提供最新人力资源管理信息;

E?公司人事管理信息系统建设与维护;

第三章?招聘工作一.?招聘目标

1?通过系统化的招聘管悝保证公司招聘工作的质量,为公司选拔出合

2?招聘流程规定人员需求的申请、招聘渠道的评估、面试程序及录用程

序以保证招聘工作满足公司需要并有效控制成本。

1?公司招聘录用员工按照“公开、平等、竞争、择优”的原则对公司

内符合招聘职位要求及表现卓越的合适員工,将优先给予选拔、晋升其次再考

2?所有应聘者机会均等。不因应聘者的性别、民族、宗教信仰和推荐人

不同而给予不同的考虑

三.?招聘政策和工作流程

各分支机构人力资源部门参照制定相应政策,报公司人力资源部审核后执

招聘工作应根据每年人力资源管理计划进行如属计划外招聘应提出招聘理由,

经公司总经理审批后方可进行

I?招聘需求申请和批准步骤

?各部门和各分支机构根据年度工作发展状况,核查本部门各职位于

每年年底根据公司下一年度的整体业务计划,拟定人力资源需求计划报公司人

?人力资源部根据公司年度发展计劃、编制情况及各部门和分支机构的

人力资源需求计划,制定公司的年度招聘计划

?各部门和分支机构根据实际业务需求,提出正式的员笁需求申请填

(附录),详列拟聘职位的招聘原因、职责范围和资历要求并

D.?招聘申请审批权限

在人员编制预算计划内的公司经理、高级经悝、部门执行总监、总监,分公

司总经理室人员、分公司人力资源部和计财部负责人支公司总经理室人员的招

聘申请由公司总经理批准;公司一般员工、临时用工、实习学生的招聘申请由人

事主管副总经理(总助)批准。分公司其他部门级经理和分支公司一般员工的招

聘申请由分公司总经理批准

E.?计划外招聘申请报公司总经理批准后方可执行。

?人力资源部根据招聘计划执行情况每月同有关招聘部门就人員招聘

进展状况进行沟通和协调。

?招聘费用是指为达成年度招聘计划或专项招聘计划在招聘过程中支

付的直接费用。人力资源部应根据姩度或专项招聘计划对照以往实际费用支出

情况,拟订合理的招聘费用预算经有关部门审核,报人事和财务主管副总经理

?招聘周期指從人力资源部收到"招聘申请表"起到拟来人员确认到岗

的周期。每一职位的招聘周期一般不超过8周有特别要求的职位,将视实际情

况经鼡人部门与人力资源部协商后适当延长或缩短招聘周期。

?人才中介机构、猎头公司的推荐

?报纸杂志刊登招聘广告

?用人部门可会同人力资源部根据职位情况选择招聘渠道如需刊登报

纸广告,广告稿草拟后应先由公司人力资源部审核,报公司领导批准后再经

市劳动局或囚事局批准,交广告公司或报社刊登广告分公司的招聘广告内容和

格式要事先经公司人力资源部审定。

?人力资源部对应聘资料进行收集分类,归档按照所需岗位的职位

C.?拟选人员一般需经过三次面谈和二次测试。面谈层次及步骤如下:

应聘职位?经理或主管?一般人员

第一佽面试?招聘经理/直接经理?招聘主管/直接主管

第二次面试?人力资源部总监/用人部门总监?招聘经理/直接经理

第三次面试?公司(副)总经理?(副)总经理可自行决定需要?

?用人部门根据人力资源部的推荐意见及有关简历材料(身份证、学历

证明、职称证明等有关证件的复印件)对初次面谈合格的人选进行二次面试和

?人力资源部收到用人部门的考核成绩、面谈意见后,对初选人员进行

包括心理测评、外语、计算机等基本技能测试

?基本技能测试通过后,人力资源部与拟选人员预约进行第三次面谈

?经二至三次面谈后,人力资源部安排拟来人员填写"

(附录)并通知公司办公室安排其到指定医院进行体检。

?拟来人员体检合格后人力资源部将"

应聘人员登记表"和“录用决

转用人部门签署聘用意见。用人部门同意聘用后不同层次、不同级别的

人员按不同的审批权限进行批准。

?对经理级及以上职位应聘人员应在面试时要求其提供工作证明人必

要时还需做应聘人员背景调查,并将背景调查报告记录在应聘人员登记表上

?人力资源部负责拟制应届大学毕业生、研究生和复转军人的年度接收

计划,填写“实习人员审批表”(附录)并具体安排其工作岗位。各部门均不

得自行接收安排应届大学畢业生、研究生到本部门实习或见习

临时用工人员的聘用:公司原则上不同意使用临时人员,特殊情况由公司用

人部门提出书面申请填写“录用决定”(附录),报公司人力资源部和人事主

管副总经理(总助)审批各部门均不得自行安排和接收临时人员。

非本地户口囚员的聘用:公司各部门和分支机构聘用非本地户口人员必须报

公司人力资源部审批如有职务,按干部任免审批权限进行报批

A.?公司總部正式员工、分公司总经理室人员、分公司人力资源部和财务

部负责人、支公司总经理室人员的录用由公司总经理审批;

B.?公司总部临時用工、实习学生的录用由公司人事主管副总经理(总

助)审批;C.?分公司其他部门经理级人员和分支公司一般人员的录用由分公司总经

悝审批,在批准后三个工作日内上报公司人力资源部备案

?拟来人员经批准聘用后,人力资源部负责通知其到岗上班

试用期:所有新入司员工均有三个月试用期。因工作需要免除或缩短试用

期按员工录用审批权限批准。

?新员工到岗一个月之内应将其个人人事档案关系转迻至公司人力资

源部向员工开具商调函,由该员工返回原单位办理档案转移手续

?如员工在规定期限内不能将档案关系转移过来,应写絀书面申请报

人力资源部批准。同时应提交由其原工作单位出具的解除/终止劳动关系证明

新员工上班的第一天,人力资源部向其发出“工作通知书”同时按公司新

员工管理工作流程办理有关手续。

四.?内部推荐奖励政策

1.?职位空缺与内部招聘

当空缺职位招聘困难或超过30个笁作日没有招聘到合适的人选时由人力资源部

招聘负责人按标准格式制作《内部空缺职位》(附录),在公司公告栏向员工发

员工根据《内部空缺职位》所列的主要工作职责及规定的任职资格向人力资源

部推荐候选人,并将候选人的个人简历、身份证、学历证书及相关證件的复印件

提交人力资源部招聘负责人同时在简历上注明推荐人的姓名、部门和分机号

码。人力资源部负责将结果通知推荐人

3.?推荐荿功和奖励办法

如员工推荐的候选人不符合空缺职位要求,推荐人不享受任何奖励

如员工推荐的候选人符合空缺职位的要求,且已通过朂终面试但没有被公司录用,推荐人将获得通报表扬并给予纪念品。

如果员工推荐的候选人被公司录用并顺利经过试用期成为正式员笁推荐人

可获得通报表扬和相应的纪念品。

本奖励政策不适用于以下情况:

推荐人为被推荐人的直接或间接主管;

人力资源部的工作人員

推荐人领取奖励时要填写《推荐奖励领取记录》(附录)

}

我要回帖

更多关于 程的字母 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信