
C++中面试概念题
N1314N
有志者事竟成
展开
-
百度+阿里+腾讯+笔试题目(2020届)
百度度秘事业部百度是我第一家面试的公司,而且还是bat的大厂级别,那时的我也不知道自己啥水平,接到面试电话慌的不行,面试第一次非常难忘。下午3点,面试40分钟!百度一面:1、实验室项目里面使用什么建模的2、进程和线程具体的区别3、协程4、ngnix高性能服务器,为啥高性能5、输入一个URL,如何显示页面的过程6、TCP三次握手7、为什么需要三次握手8、Time_w...原创 2019-07-06 14:45:46 · 5415 阅读 · 0 评论 -
请你说一下源码到可执行文件的过程
参考回答:1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。4、删除所有的注释,“//”和“...原创 2019-06-28 19:59:17 · 392 阅读 · 0 评论 -
请你来说一下微内核与宏内核
参考回答:宏内核:除了最基本的进程、线程管理、内存管理外,将文件系统,驱动,网络协议等等都集成在内核里面,例如linux内核。优点:效率高。缺点:稳定性差,开发过程中的bug经常会导致整个系统挂掉。微内核:内核中只有最基本的调度、内存管理。驱动、文件系统等都是用户态的守护进程去实现的。优点:稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃缺点:效率低。典型代表QN...原创 2019-06-28 10:05:32 · 1197 阅读 · 0 评论 -
请你来说一说用户态到内核态的转化原理
参考回答:1)用户态切换到内核态的3种方式1、系统调用这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80h中断。2、异常当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此。异常的内核...原创 2019-06-28 10:04:05 · 2375 阅读 · 0 评论 -
请你来手写一下fork调用示例
1、概念:Fork:创建一个和当前进程映像一样的进程可以通过fork( )系统调用:成功调用fork( )会创建一个新的进程,它几乎与调用fork( )的进程一模一样,这两个进程都会继续运行。在子进程中,成功的fork( )调用会返回0。在父进程中fork( )返回子进程的pid。如果出现错误,fork( )返回一个负值。最常见的fork( )用法是创建一个新的进程,然后使用exec(...原创 2019-06-28 10:02:29 · 556 阅读 · 0 评论 -
请你来说一说协程
参考回答:1、概念:协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。例如:def A() :print '1'print '2'print '3'def B() :print 'x'print 'y'print 'z'由协程运行结果可能是12x3yz。在执行A的过...原创 2019-06-28 09:54:13 · 359 阅读 · 0 评论 -
请你回答一下操作系统为什么要分内核态和用户态
参考回答:为了安全性。在cpu的一些指令中,有的指令如果用错,将会导致整个系统崩溃。分了内核态和用户态后,当用户需要操作这些指令时候,内核为其提供了API,可以通过系统调用陷入内核,让内核去执行这些操作。...原创 2019-07-03 14:55:49 · 1585 阅读 · 0 评论 -
请你说一说Linux虚拟地址空间
参考回答:为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。 事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立...原创 2019-06-24 17:23:15 · 702 阅读 · 0 评论 -
你都使用什么线程模型
1、Future模型该模型通常在使用的时候需要结合Callable接口配合使用。Future是把结果放在将来获取,当前主线程并不急于获取处理结果。允许子线程先进行处理一段时间,处理结束之后就把结果保存下来,当主线程需要使用的时候再向子线程索取。Callable是类似于Runnable的接口,其中call方法类似于run方法,所不同的是run方法不能抛出受检异常没有返回值,而call...原创 2019-06-27 09:25:34 · 509 阅读 · 0 评论 -
请你说一说死锁产生的必要条件?
参考回答:1.互斥条件:一个资源每次只能被一个进程使用。2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。...原创 2019-06-27 09:21:58 · 329 阅读 · 0 评论 -
请你回答一下软链接和硬链接区别
参考回答:为了解决文件共享问题,Linux引入了软链接和硬链接。除了为Linux解决文件共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若1个inode号对应多个文件名,则为硬链接,即硬链接就是同一个文件使用了不同的别名,使用ln创建。若文件用户数据块中存放的内容是另一个文件的路径名指向,则该文件是软连接。软连接是一个普通文件,有自己独立的inode,但是其数据块内容比较特...原创 2019-06-27 09:20:44 · 422 阅读 · 0 评论 -
请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别
参考回答:1、互斥锁和读写锁区别:互斥锁: mutex,用于保证在任何时刻,都只能有一个线程访问该对象。 当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。读写锁: rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程 同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获 取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意: 写锁会阻塞其...原创 2019-06-27 09:18:36 · 5089 阅读 · 0 评论 -
请你详细介绍一下C++11中的lambda这个新特性。
[3] Lambda表达式:Lambda表达式定义一个匿名函数,并且可以捕获一定范围内的变量,其定义如下:[capture](params)mutable->return-type{statement}其中,[capture]:捕获列表,捕获上下文变量以供lambda使用。同时[]是lambda寅初复,编译器根据该符号来判断接下来代码是否是lambda函数。(Params):参数...原创 2019-06-24 08:50:07 · 581 阅读 · 0 评论 -
请你详细介绍一下C++11中的右值引用新特性。
[2] 右值引用:C++中,左值通常指可以取地址,有名字的值就是左值,而不能取地址,没有名字的就是右值。而在指C++11中,右值是由两个概念构成:将亡值和纯右值。纯右值是用于识别临时变量和一些不跟对象关联的值,比如1+3产生的临时变量值,2、true等,而将亡值通常是指具有转移语义的对象,比如返回右值引用T&&的函数返回值等。C++11中,右值引用就是对一个右值进行引用...原创 2019-06-24 08:49:04 · 239 阅读 · 0 评论 -
请你详细介绍一下C++11中的可变参数模板这个新特性
[1] 可变参数模板:C++11的可变参数模板,对参数进行了高度泛化,可以表示任意数目、任意类型的参数,其语法为:在class或typename后面带上省略号”。例如:Template<class ... T>void func(T ... args){cout<<”num is”<<sizeof ...(args)<<endl;}...原创 2019-06-24 08:46:53 · 549 阅读 · 0 评论 -
请你说一下僵尸进程
参考回答:1)正常进程正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到:在每个进程退出的时...原创 2019-06-28 20:03:05 · 1321 阅读 · 0 评论 -
请你说一说异步编程的事件循环
参考回答:事件循环就是不停循环等待时间的发生,然后将这个事件的所有处理器,以及他们订阅这个事件的时间顺序依次依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。即如果某个事件绑定了两个处理器,那么第二个处理器会在第一个处理器执...原创 2019-06-28 20:04:46 · 564 阅读 · 0 评论 -
server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?
参考回答:这个需要看服务端的编程模型,如果如上一个问题的回答描述的这样,则处于阻塞状态,如果使用了epoll,select等这样的io复用情况下,处于运行状态...原创 2019-06-28 20:06:31 · 1313 阅读 · 0 评论 -
C++工程师校招面试题汇总(附考点)
https://www.nowcoder.com/discuss/164721(感谢牛客网,为了方便学习,直接放了链接)原创 2019-07-06 09:46:18 · 768 阅读 · 0 评论 -
请你来说一说hash表的实现,包括STL中的哈希桶长度常数
参考回答:hash表的实现主要包括构造哈希和处理哈希冲突两个方面:(1) 对于构造哈希来说,主要包括直接地址法、平方取中法、除留余数法等。(2) 对于处理哈希冲突来说,最常用的处理冲突的方法有开放定址法、再哈 希法、链地址法、建立公共溢出区等方法。SGL版本使用链地址法,使用一个 链表保持相同散列值的元素。虽然链地址法并不要求哈希桶长度必须为质数, 但SGI STL仍然以质数来...原创 2019-06-30 09:43:17 · 1447 阅读 · 0 评论 -
请你回答一下hash表如何rehash,以及怎么处理其中保存的资源
参考回答:C++的hash表中有一个负载因子loadFactor,当loadFactor<=1时,hash表查找的期望复杂度为O(1). 因此,每次往hash表中添加元素时,我们必须保证是在loadFactor <1的情况下,才能够添加。 因此,当Hash表中loadFactor==1时,Hash就需要进行rehash。rehash过程中,会模仿C++的vector扩容方式,...原创 2019-06-30 09:40:57 · 2006 阅读 · 0 评论 -
strcat、strcpy、strcmp三种函数用法
[1] strcat函数其一般形式为:strcat(字符数组1,字符数组2)strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。例如: char str1[30]={″People′s Republic of ″};char str2[]={″China″};printf(″%s″,s...原创 2019-07-10 15:34:14 · 4253 阅读 · 0 评论 -
面试常问--归并排序
面试常问–归并排序排序过程:归并说到底其实是分制的思想,每次将数组一份为二,再对左半边的数组排序,右半边的数组排序,再对这两个半边的数组进行归并。归并过程:先开辟一个数组复制要归并的两个数组,指针i,j分别指向两个数组的第一个元素。两个指针移动来进行比较,小的元素放入原来的数组。public class Main{public static void main(String[] a...原创 2019-07-05 09:59:27 · 355 阅读 · 0 评论 -
缺页中断——FIFO、LRU、OPT这三种置换算法
1、 缺页中断在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。(1)缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤: 1. 保护CPU现场 2. 分析中断原因 3. 转入缺页中断处理程序进行处理 4....原创 2019-07-05 09:42:14 · 1094 阅读 · 0 评论 -
请你回答一下栈和堆的区别,以及为什么栈要快
参考回答:堆和栈的区别:【1】堆是由低地址向高地址扩展;栈是由高地址向低地址扩展【2】堆中的内存需要手动申请和手动释放;栈中内存是由OS自动申请和自动释放,存放着参数、局部变量等内存【3】堆中频繁调用malloc和free,会产生内存碎片,降低程序效率;而栈由于其先进后出的特性,不会产生内存碎片【4】堆的分配效率较低,而栈的分配效率较高栈的效率高的原因:栈是操作系统提供的...原创 2019-06-29 15:16:20 · 1161 阅读 · 2 评论 -
请你回答一下Array&List, 数组和链表的区别
参考回答:数组的特点:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。数组的插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。但数组的随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据。如果应用需要快速访问数据,很少或不插入和删除元素,就...原创 2019-06-29 15:11:35 · 2153 阅读 · 0 评论 -
请你来说一下TCP三次握手四次挥手的过程,为什么tcp连接握手需要三次, time_wait状态
参考回答:1)TCP连接(三次握手)过程:客户端A:发送SYN连接报文,序列号为x,进入SYNC-SENT状态。服务端B:发送SYN连接确认报文(SYN=1,ACK = 1),序列号为y(seq = y),确认报文x(ack = x + 1),进入SYNC-RCVD状态。客户端A:发送ACK确认报文(ACK = 1),序列号为x+1(seq = x + 1),确认报文y+1(ack...原创 2019-06-29 08:34:50 · 510 阅读 · 0 评论 -
请你来说一下TCP拥塞控制?
参考回答:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。过程cwnd的大小呈指数增长,直到...原创 2019-06-29 08:32:06 · 689 阅读 · 0 评论 -
请你说一下TCP怎么保证可靠性,并且简述一下TCP建立连接和断开连接的过程
参考回答:TCP保证可靠性:(1)序列号、确认应答、超时重传数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。(2)窗口控制与高速重发控制/快速...原创 2019-06-28 20:46:05 · 1775 阅读 · 0 评论 -
请你来说一下linux内核中的Timer 定时器机制
参考回答:1)低精度时钟Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式:1、系统启动后,会读取时钟源设备(RTC, HPET,PIT…),初始化当前系统时间。2、内核会根据HZ(系统定时器频率,节拍率)参数值,设置时钟事件设备,启动tick(节拍)中断。HZ表示1秒种产生多少个时钟硬件中断,tick就表示连续两个中断的间隔时间。3、设置时钟事件设备后,时...原创 2019-06-28 20:11:13 · 1439 阅读 · 0 评论 -
请问怎么实现线程池
参考回答:1.设置一个生产者消费者队列,作为临界资源2.初始化n个线程,并让其运行起来,加锁去队列取任务运行3.当任务队列为空的时候,所有线程阻塞4.当生产者队列来了一个任务后,先对队列加锁,把任务挂在到队列上,然后使用条件变量去通知阻塞中的一个线程...原创 2019-06-28 20:08:38 · 340 阅读 · 0 评论 -
请你说一下多线程的同步,锁的机制
参考回答:同步的时候用一个互斥量,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。在这种方式下,...原创 2019-06-28 20:07:44 · 452 阅读 · 0 评论 -
请问C++11有哪些新特性?
C++11 最常用的新特性如下:auto关键字:编译器可以根据初始值自动推导出类型。但是不能用于函数传参以及数组类型的推导nullptr关键字:nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型;而NULL一 般被宏定义为0,在遇到重载时可能会出现问题。智能指针:C++11新增了std::shared_ptr、std::weak_ptr等类型的智能指针,用...原创 2019-06-24 08:44:33 · 711 阅读 · 0 评论 -
链表各类操作详解
链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它...原创 2019-07-07 16:16:25 · 612 阅读 · 0 评论 -
请你说一说操作系统中的缺页中断
参考回答:malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存是,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到...原创 2019-06-25 20:13:35 · 1727 阅读 · 0 评论 -
请自己设计一下如何采用单线程的方式处理高并发
参考回答:在单线程模型中,可以采用I/O复用来提高单线程处理多个请求的能力,然后再采用事件驱动模型,基于异步回调来处理事件来原创 2019-06-22 09:24:11 · 1922 阅读 · 0 评论 -
请你来回答一下new和malloc的区别
参考回答:1、new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配;2、new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回 值一般都需要进行类型转化。3、new不仅分配一段内存,而且会调用构造函数,malloc不会。4、new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候 会调用对象...原创 2019-06-22 09:23:18 · 709 阅读 · 0 评论 -
请你来回答一下什么是memory leak,也就是内存泄漏
参考回答:内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的分类:1. 堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从 堆中分配的一块内存,再是完成后...原创 2019-06-22 09:21:51 · 3399 阅读 · 2 评论 -
请你说一说C++的内存管理是怎样的?
在C++中,虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。数据段:存储程序中已初始化的全局变量和静态变量BSS 段:存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量。堆区:调用new/malloc函数时在堆区动态分配内存,同时需要调用...原创 2019-06-21 14:32:00 · 687 阅读 · 0 评论 -
请你来回答一下include头文件的顺序以及双引号和尖括号的区别?
Include头文件的顺序:对于include的头文件来说,如果在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量类型未声明错误。双引号和尖括号的区别:编译器预处理阶段查找头文件的路径不一样。对于使用双引号包含的头文件,查找头文件路径的顺序为:当前头文件目录编译器设置的头文件路径(编...原创 2019-06-21 14:30:03 · 1117 阅读 · 0 评论