1. 栈和堆的内存管理。
1、栈区(stack)—由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是
2. Stl的容器有哪些,为什么map和set用的是红黑树不是平衡二叉树,vector是存在哪里的,stl是线程安全的吗。
-
STL中的容器
- vector
- dqueue 双端队列
- stack
- queue
- list
- priority_queue
- set multiset
- map multimap -
为什么set和map用的是红黑树而不是平衡二叉树
-
如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。
-
其次,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。
-
map的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL的。
- vector是存在哪里的?
vector的内容都是在堆上面的
vector<int> *a = new vector<int>
a这个指针变量在栈上面,vector对象本身是在堆上,容器里面的元素也是在堆上面
vector<int> a
a在栈上面,容器里面的元素也是在堆上面
- stl是线程安全的吗?
1.多个读取者是安全的。即多个线程可以同时读取一个容器中的内容。 即此时多个线程调用 容器的不涉及到写的接口都可以 eg find, begin, end 等.
2.对不同容器的多个写入者是安全的。即多个线程对不同容器的同时写入合法。 但是对于同一容器当有线程写,有线程读时,如何保证正确? 需要程序员自己来控制,比如:线程A读容器某一项时,线程B正在移除该项。这会导致一下无法预知的错误。 通常的解决方式是用开销较小的临界区(CRITICAL_SECTION)来做同步。以下列方式同步基本上可以做到线程安全的容器(就是在有写操作的情况下仍能保证安全)。
1.每次调用容器的成员函数的期间需要锁定。
2.每个容器容器返回迭代器的生存期需要锁定。
3.每个容器在调用算法的执行期需要锁定。
3. 编译时的多态和运行时的多态有什么区别,虚函数怎么实现多态。派生类的构造函数调用顺序和析构顺序,为什么是这个顺序。
-
编译时的多态和运行时的多态
方法重载都是编译时多态。根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法中的哪一个。方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。例如,以下声明p、m引用本类实例,调用toString()方法是编译时多态。
-
构造顺序
调用基类的构造函数->调用成员对象的构造函数->调用自身的构造函数。构造函数的调用次序完全不受构造函数初始化列表的表达式中的次序影响,与基类的声明次数和成员对象在函数中的声明次序有关。
5. 进程线程的区别,进程的通信方式,管道是全双工,半双工还是单工,Socket是什么样的,通信方式哪个最快。
多遍了,不想写
6. 进程内的单个线程死了,进程会怎么样。
同一个进程中的多个线程共享进程资源,包括主内存、文件句柄、锁资源等。那么当一个线程死了(非正常退出、死循环等)就会导致线程该占有的资源永远无法释放,从而影响其他线程的正常工作。
6. 线程之间的通信方式,线程中独享资源是哪些,共享资源是哪些。栈为什么是独享资源,堆为什么是共享资源。
- 线程之间的通信方式
- 锁机制
- 信号量机制
- 信号机制
- 屏障 - 线程中的公有和私有的资源
- 公有: 堆、地址空间、全局变量、静态变量
- 私有:线程栈、寄存器、程序寄存器 - 栈为什么是独享资源,堆为什么是共享资源。
- 栈用来存储局部变量;堆用来存储实例变量
- stack一般用来存放函数参数等,存放的是过程活动记录。共享栈会非常乱
- 共享堆的目的就是为了高效的数据共享
7. 数据库范式。
1范式: 属性不可再分
2范式: 每个非主属性完全依赖于码
3范式:非主属性不能传递依赖于码
8. Tcp和udp的区别
9. 路由器和交换机有什么区别,分别工作在哪层,mtu是什么。
区别 | 路由器 | 交换机 |
---|---|---|
工作层次 | 网络层 | 数据链路层 |
地址不一样 | IP地址 | MAC地址 |
不同网段的通信 | 同一网段的通信 | |
提供防火墙服务 | 不提供防火墙服务 |
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
10. 三次握手和4次挥手的过程,什么是半连接。
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
11. Socket和epoll有什么区别。
12. New和malloc的区别,new失败会出现什么结果。
刚看过,new 失败是会抛出异常的