1.代码题,二叉树转成双向链表
递归+中序
2.代码题,多线程环境下的单例模式
双重检查,注意private构造函数、拷贝构造函数和赋值函数,注意static静态实例和静态方法
3.系统内存的划分,堆栈区和堆区的区别,全局变量区,常量区
(1) 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
(2) 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
(3) 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的
(4) 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
(5) 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
4.GDB常用指令,为什么GDB能够监视到另外一个进程中的数据?
GDB能够监视并接管另外一个程序的执行是依靠ptrace系统调用,它提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。主要用来实现断点调试和系统调用跟踪。
(1) 内核在执行用户请求的系统调用之前回检查当前进程是否处于被“跟踪”状态,如果是的话内核暂停当前进程并将控制权交给调试进程,使跟踪调试进程可以查看甚 至修改被调试进程的内存,寄存器等数据。而ptrace函数的作用就是告诉内核在执行子进程的系统调用之前做的动作。所有的动作都可以通过request 进行传入。
(2) 设置断点原理:通过查找输入的断点和具体代码位置对应起来,并在该位 置替换为一条断点指令,并且保存以前的指令,到目标程序运行到该断点处时,产生SIGTRAP信号,该信号被GDB捕获,GDB查找断点列表来确定是否命 中断点。继续执行的时候则会把保存的指令重新放回并执行。n/s/ni/si/finish/uitil也会自动设置断点。
(3) 内核传递给被调试进程所有的信号,都会先传递给GDB再由gdb采取定义的动作来和被调试进程之间进行相互协调操作。gdb暂停目标程序运行的方法是向其 发送SIGSTOP信号,GDB对于随机信号(非GDB产生的)的处理包括,可以通过handle signals命令来预定义
5.守护进程怎么启动?
(1).创建子进程,父进程退出
(2).在子进程中创建新会话
(3).改变当前目录为根目录
(4).重设文件权限掩码
(5).关闭文件描述符
(6).守护进程里,忽略SIGCHLD信号 (即使fork两次,新进程由init接管,不进行signal(SIGCHLD,SIG_IGN)操作,也会产生僵尸进程。)
6.socket服务端启动连接的过程,select与epoll两种函数是作什么用的?
socket()→bind()→listen()→accept()→send()/recv()→close()
select与epoll见:http://blog.csdn.net/this_capslock/article/details/39649001
7.RSA算法的原理,主要应用
非对称加密算法,基于大数分解的数学难题
选两个素数p和q,令r=p*q,计算相对于(p-1)*(q-1)的两个逆元d和e,(r,e)为公钥,(r,d)为私钥
主要应用:数据加密,数字签名
8.线程间有什么通信方式?
(1) 锁机制:包括互斥锁、条件变量、读写锁
*互斥锁提供了以排他方式防止数据结构被并发修改的方法。
*读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
*条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
(2) 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
(3) 信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。