面试题目
N1314N
有志者事竟成
展开
-
程序在内存中的分布
在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。从低地址到高地址,可分为下面几段:预留内存地址(操作系统维护的内存地址,不可访问)程序代码区(只读,存代码和一些其他的东西);d...原创 2019-07-07 11:40:36 · 404 阅读 · 0 评论 -
请你说一下源码到可执行文件的过程
参考回答:1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。4、删除所有的注释,“//”和“...原创 2019-06-28 19:59:17 · 381 阅读 · 0 评论 -
请你来说一下微内核与宏内核
参考回答:宏内核:除了最基本的进程、线程管理、内存管理外,将文件系统,驱动,网络协议等等都集成在内核里面,例如linux内核。优点:效率高。缺点:稳定性差,开发过程中的bug经常会导致整个系统挂掉。微内核:内核中只有最基本的调度、内存管理。驱动、文件系统等都是用户态的守护进程去实现的。优点:稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃缺点:效率低。典型代表QN...原创 2019-06-28 10:05:32 · 1153 阅读 · 0 评论 -
请你来说一说用户态到内核态的转化原理
参考回答:1)用户态切换到内核态的3种方式1、系统调用这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80h中断。2、异常当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此。异常的内核...原创 2019-06-28 10:04:05 · 2341 阅读 · 0 评论 -
请你来手写一下fork调用示例
1、概念:Fork:创建一个和当前进程映像一样的进程可以通过fork( )系统调用:成功调用fork( )会创建一个新的进程,它几乎与调用fork( )的进程一模一样,这两个进程都会继续运行。在子进程中,成功的fork( )调用会返回0。在父进程中fork( )返回子进程的pid。如果出现错误,fork( )返回一个负值。最常见的fork( )用法是创建一个新的进程,然后使用exec(...原创 2019-06-28 10:02:29 · 536 阅读 · 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 · 334 阅读 · 0 评论 -
server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?
参考回答:这个需要看服务端的编程模型,如果如上一个问题的回答描述的这样,则处于阻塞状态,如果使用了epoll,select等这样的io复用情况下,处于运行状态...原创 2019-07-03 14:58:16 · 449 阅读 · 0 评论 -
请你回答一下为什么要有page cache,操作系统怎么设计的page cache
参考回答:加快从磁盘读取文件的速率。page cache中有一部分磁盘文件的缓存,因为从磁盘中读取文件比较慢,所以读取文件先去page cache中去查找,如果命中,则不需要去磁盘中读取,大大加快读取速度。在 Linux 内核中,文件的每个数据块最多只能对应一个 Page Cache 项,它通过两个数据结构来管理这 些 Cache项,一个是radix tree,另一个是双向链表。Radix...原创 2019-07-03 14:57:09 · 968 阅读 · 0 评论 -
请你说一说Linux虚拟地址空间
参考回答:为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。 事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立...原创 2019-06-24 17:23:15 · 678 阅读 · 0 评论 -
你都使用什么线程模型
1、Future模型该模型通常在使用的时候需要结合Callable接口配合使用。Future是把结果放在将来获取,当前主线程并不急于获取处理结果。允许子线程先进行处理一段时间,处理结束之后就把结果保存下来,当主线程需要使用的时候再向子线程索取。Callable是类似于Runnable的接口,其中call方法类似于run方法,所不同的是run方法不能抛出受检异常没有返回值,而call...原创 2019-06-27 09:25:34 · 491 阅读 · 0 评论 -
请你说一说死锁产生的必要条件?
参考回答:1.互斥条件:一个资源每次只能被一个进程使用。2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。...原创 2019-06-27 09:21:58 · 311 阅读 · 0 评论 -
请你回答一下软链接和硬链接区别
参考回答:为了解决文件共享问题,Linux引入了软链接和硬链接。除了为Linux解决文件共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若1个inode号对应多个文件名,则为硬链接,即硬链接就是同一个文件使用了不同的别名,使用ln创建。若文件用户数据块中存放的内容是另一个文件的路径名指向,则该文件是软连接。软连接是一个普通文件,有自己独立的inode,但是其数据块内容比较特...原创 2019-06-27 09:20:44 · 401 阅读 · 0 评论 -
请你说一下僵尸进程
参考回答:1)正常进程正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到:在每个进程退出的时...原创 2019-06-28 20:03:05 · 1309 阅读 · 0 评论 -
请你说一说异步编程的事件循环
参考回答:事件循环就是不停循环等待时间的发生,然后将这个事件的所有处理器,以及他们订阅这个事件的时间顺序依次依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。即如果某个事件绑定了两个处理器,那么第二个处理器会在第一个处理器执...原创 2019-06-28 20:04:46 · 547 阅读 · 0 评论 -
server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?
参考回答:这个需要看服务端的编程模型,如果如上一个问题的回答描述的这样,则处于阻塞状态,如果使用了epoll,select等这样的io复用情况下,处于运行状态...原创 2019-06-28 20:06:31 · 1268 阅读 · 0 评论 -
百度+阿里+腾讯+笔试题目(2020届)
百度度秘事业部百度是我第一家面试的公司,而且还是bat的大厂级别,那时的我也不知道自己啥水平,接到面试电话慌的不行,面试第一次非常难忘。下午3点,面试40分钟!百度一面:1、实验室项目里面使用什么建模的2、进程和线程具体的区别3、协程4、ngnix高性能服务器,为啥高性能5、输入一个URL,如何显示页面的过程6、TCP三次握手7、为什么需要三次握手8、Time_w...原创 2019-07-06 14:45:46 · 5374 阅读 · 0 评论 -
C++工程师校招面试题汇总(附考点)
https://www.nowcoder.com/discuss/164721(感谢牛客网,为了方便学习,直接放了链接)原创 2019-07-06 09:46:18 · 739 阅读 · 0 评论 -
请你来说一说hash表的实现,包括STL中的哈希桶长度常数
参考回答:hash表的实现主要包括构造哈希和处理哈希冲突两个方面:(1) 对于构造哈希来说,主要包括直接地址法、平方取中法、除留余数法等。(2) 对于处理哈希冲突来说,最常用的处理冲突的方法有开放定址法、再哈 希法、链地址法、建立公共溢出区等方法。SGL版本使用链地址法,使用一个 链表保持相同散列值的元素。虽然链地址法并不要求哈希桶长度必须为质数, 但SGI STL仍然以质数来...原创 2019-06-30 09:43:17 · 1430 阅读 · 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 · 1954 阅读 · 0 评论 -
面试常问--归并排序
面试常问–归并排序排序过程:归并说到底其实是分制的思想,每次将数组一份为二,再对左半边的数组排序,右半边的数组排序,再对这两个半边的数组进行归并。归并过程:先开辟一个数组复制要归并的两个数组,指针i,j分别指向两个数组的第一个元素。两个指针移动来进行比较,小的元素放入原来的数组。public class Main{public static void main(String[] a...原创 2019-07-05 09:59:27 · 350 阅读 · 0 评论 -
缺页中断——FIFO、LRU、OPT这三种置换算法
1、 缺页中断在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。(1)缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤: 1. 保护CPU现场 2. 分析中断原因 3. 转入缺页中断处理程序进行处理 4....原创 2019-07-05 09:42:14 · 1042 阅读 · 0 评论 -
请你来说一下TCP拥塞控制?
参考回答:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。过程cwnd的大小呈指数增长,直到...原创 2019-06-29 08:32:06 · 681 阅读 · 0 评论 -
请你说一下TCP怎么保证可靠性,并且简述一下TCP建立连接和断开连接的过程
参考回答:TCP保证可靠性:(1)序列号、确认应答、超时重传数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。(2)窗口控制与高速重发控制/快速...原创 2019-06-28 20:46:05 · 1740 阅读 · 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 · 1404 阅读 · 0 评论 -
请问怎么实现线程池
参考回答:1.设置一个生产者消费者队列,作为临界资源2.初始化n个线程,并让其运行起来,加锁去队列取任务运行3.当任务队列为空的时候,所有线程阻塞4.当生产者队列来了一个任务后,先对队列加锁,把任务挂在到队列上,然后使用条件变量去通知阻塞中的一个线程...原创 2019-06-28 20:08:38 · 315 阅读 · 0 评论 -
请你说一下多线程的同步,锁的机制
参考回答:同步的时候用一个互斥量,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。在这种方式下,...原创 2019-06-28 20:07:44 · 434 阅读 · 0 评论 -
请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别
参考回答:1、互斥锁和读写锁区别:互斥锁: mutex,用于保证在任何时刻,都只能有一个线程访问该对象。 当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。读写锁: rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程 同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获 取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意: 写锁会阻塞其...原创 2019-06-27 09:18:36 · 4966 阅读 · 0 评论 -
请你详细介绍一下C++11中的lambda这个新特性。
[3] Lambda表达式:Lambda表达式定义一个匿名函数,并且可以捕获一定范围内的变量,其定义如下:[capture](params)mutable->return-type{statement}其中,[capture]:捕获列表,捕获上下文变量以供lambda使用。同时[]是lambda寅初复,编译器根据该符号来判断接下来代码是否是lambda函数。(Params):参数...原创 2019-06-24 08:50:07 · 559 阅读 · 0 评论 -
请你详细介绍一下C++11中的右值引用新特性。
[2] 右值引用:C++中,左值通常指可以取地址,有名字的值就是左值,而不能取地址,没有名字的就是右值。而在指C++11中,右值是由两个概念构成:将亡值和纯右值。纯右值是用于识别临时变量和一些不跟对象关联的值,比如1+3产生的临时变量值,2、true等,而将亡值通常是指具有转移语义的对象,比如返回右值引用T&&的函数返回值等。C++11中,右值引用就是对一个右值进行引用...原创 2019-06-24 08:49:04 · 227 阅读 · 0 评论 -
请你说一说并发(concurrency)和并行(parallelism)
参考回答:并发(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。但是从微观上看两个程序的指令是交织着运行的,你的指令之间穿插着我的指令,我的指令之间穿插着你的,在单个周期内只运行了一个指令。这种并发并不能提高计算机的性能,只能提高效率。并行(parallelism):指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,...原创 2019-06-25 20:22:04 · 447 阅读 · 0 评论 -
请你说一说操作系统中的程序的内存结构
一个程序本质上都是由BSS段、data段、text段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分。BSS段(未初始化数据区): 通常用来存放程序中未初始化的全局变量和静态变量 的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。数据段:存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配...原创 2019-06-25 20:20:19 · 1149 阅读 · 0 评论 -
请你回答一下fork和vfork的区别
参考回答:fork的基础知识:fork:创建一个和当前进程映像一样的进程可以通过fork( )系统调用:#include <sys/types.h>#include <unistd.h>pid_t fork(void);成功调用fork( )会创建一个新的进程,它几乎与调用fork( )的进程一模一样,这两个进程都会继续运行。在子进程中,成功的fork...原创 2019-06-25 20:16:06 · 250 阅读 · 0 评论 -
请你说一说操作系统中的缺页中断
参考回答:malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存是,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到...原创 2019-06-25 20:13:35 · 1686 阅读 · 0 评论 -
红黑树面试题目---华为C++工程师
1.stl中的set底层用的什么数据结构? 红黑树2.红黑树的数据结构怎么定义?[cpp] view plain copy 1 enum Color 2. { 3. RED = 0, 4. BLACK = 1 5. }; 6. 7. struct RBTreeNode 8. { 9. stru...原创 2019-05-06 19:19:04 · 2254 阅读 · 0 评论 -
服务器基础:聊聊Linux中的5种I/O模型----面试题目2019年
1 概念说明在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO1.1 用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用...原创 2019-04-20 09:49:22 · 827 阅读 · 0 评论 -
构造函数与析构函数区别之面试题目
一、构造函数构造函数是特殊的成员函数。构造函数的特殊之处:(1)创建类类型的新对象,系统会自动调用构造函数(2)构造函数是为了保证对象的每个数据成员都被初始化 构造函数的特点: A:函数名和类名完全相同 B:不能定义构造函数的类型(返回类型)也不能使用void C:通常情况下构造函数应声明为共有函数,否则它不能像其他成员函数那样被显示调用 ...原创 2019-04-24 20:20:59 · 416 阅读 · 0 评论 -
红黑树和B树的区别--2019年面试题目
背景:这几天在看《高性能Mysql》,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使用B+Tree这种数据结构,和其它树相比,它能体现的优点在哪里? 看完这篇文章你就会了解到这些数据结构的原理以及它们各自的应用场景.二叉查找树(BST)简介二叉查找树也称为有序二叉查找树,满足二叉查找树的一...原创 2019-04-20 09:56:21 · 8895 阅读 · 0 评论 -
2019年总结C++概念面试题目
一、有了malloc/free,为什么还要new/delete?malloc与free是C/C++的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象的消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控...原创 2019-04-20 09:31:23 · 644 阅读 · 0 评论 -
C++中常考的概念(多态、拷贝、vector、memcpy、strcpy、虚函数、纯虚函数等)----面试题目
一、多态的实现:(1)编译时的多态性。编译时的多态性是通过重载来实现的。对于非虚的成员来说。系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。(2)运行时的多态性。运行时的多态性就是直到系统运行时,才根据实际情况决定实现何种操作。C++中,运行时的多态性通过虚函数实现。二、浅拷贝和深拷贝的区别:浅拷贝对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如...原创 2019-04-20 09:15:24 · 951 阅读 · 0 评论 -
海康威视面试(C++研发岗位)
单选题:1、 已知中序遍历的序列为abcdef,高度最小的不可能的二叉树的前序遍历是(C) A、dbacfe B、cbaedf C、cabefd D、dbacef2、下列运算符中,在C++语言中不能重载的是(D) A、* B、delete C、>= D、::说明:C++中不能重载的运算符:“?:”、“.”、“::”、“sizeof”和”.*”。3、下面哪个函数...原创 2019-05-05 17:33:23 · 3742 阅读 · 0 评论