
2018总结C++面试题目
N1314N
有志者事竟成
展开
-
请问单核机器上写多线程程序,是否需要考虑加锁,为什么?
参考回答:在单核机器上写多线程程序,仍然需要线程锁。因为线程锁通常用来实现线程的同步和通信。在单核机器上的多线程程序,仍然存在线程同步的问题。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。...原创 2019-06-26 09:30:20 · 1393 阅读 · 0 评论 -
面试常问--归并排序
面试常问–归并排序排序过程:归并说到底其实是分制的思想,每次将数组一份为二,再对左半边的数组排序,右半边的数组排序,再对这两个半边的数组进行归并。归并过程:先开辟一个数组复制要归并的两个数组,指针i,j分别指向两个数组的第一个元素。两个指针移动来进行比较,小的元素放入原来的数组。public class Main{public static void main(String[] a...原创 2019-07-05 09:59:27 · 355 阅读 · 0 评论 -
请你回答一下栈和堆的区别,以及为什么栈要快
参考回答:堆和栈的区别:【1】堆是由低地址向高地址扩展;栈是由高地址向低地址扩展【2】堆中的内存需要手动申请和手动释放;栈中内存是由OS自动申请和自动释放,存放着参数、局部变量等内存【3】堆中频繁调用malloc和free,会产生内存碎片,降低程序效率;而栈由于其先进后出的特性,不会产生内存碎片【4】堆的分配效率较低,而栈的分配效率较高栈的效率高的原因:栈是操作系统提供的...原创 2019-06-29 15:16:20 · 1161 阅读 · 2 评论 -
请说一说你理解的stack overflow,并举个简单例子导致栈溢出
参考回答:栈溢出概念:栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。栈溢出的原因:1. 局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。局部变量是 存储在栈中的,因此这个很好理解。解决这类问题的办法有两个,一是增大栈 空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。2. ...原创 2019-06-29 15:14:42 · 1372 阅读 · 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 评论 -
请你来说一下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 评论 -
请你说一下多线程的同步,锁的机制
参考回答:同步的时候用一个互斥量,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。在这种方式下,...原创 2019-06-28 20:07:44 · 452 阅读 · 0 评论 -
server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?
参考回答:这个需要看服务端的编程模型,如果如上一个问题的回答描述的这样,则处于阻塞状态,如果使用了epoll,select等这样的io复用情况下,处于运行状态...原创 2019-06-28 20:06:31 · 1313 阅读 · 0 评论 -
请你说一下僵尸进程
参考回答:1)正常进程正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到:在每个进程退出的时...原创 2019-06-28 20:03:05 · 1321 阅读 · 0 评论 -
请你说一下源码到可执行文件的过程
参考回答:1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。4、删除所有的注释,“//”和“...原创 2019-06-28 19:59:17 · 392 阅读 · 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 评论 -
生产者/消费者模式(阻塞队列) 一个经典的并发模型
https://blog.youkuaiyun.com/bieleyang/article/details/78024973(转)转载 2019-08-15 10:13:10 · 270 阅读 · 0 评论