08.19旷世一面凉经
投的JAVA,结果面试官说他写c++,于是我就开始跟着他天马行空的思维去回答问题了。
1.多线程和多进程的区别:线程是进程的子集,一个进程可能由多个线程组成;2、多进程的数据是分开的,共享复杂,需要用进程间通信(IPC),但同步简单;3、多线程共享进程数据,共享简单,但同步复杂,这里我回答了一个多线程切换比多进程切换快,于是他又问我为什么快?(我没回答出来,这是百度到的答案)因为进程切换比线程切换多了页表的切换(操作系统为每个进程搞一张页表,可能一级也可能多级),而页表切换会导致TLB失效,TLB中的内容要全部重写,所以所以慢了,切换页表很快,就是个指针的问题,内存变动也不是原因。
2.虚拟地址的作用:
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。
不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
3.虚拟内存的作用。
4.单核多线程有意义吗? 这个就是从IO和CPU密集型的角度回答
5.HashMap和TreeMap的区别以及各自的使用场景。区别就是HashMap底层hash表,TreeMap是红黑树,key和val可以为null,hash增删改时间复杂度O(1),TreeMap为O(logn),但是TreeMap有序 实现的是sortedMap的借口。使用场景 如果需要有序的话就tree,增删改多的话就hash。
6.ThreadLocal的原理。
7.循环遍历数组和链表哪个快? cache的角度回答
8.线程安全的措施。加锁,各种锁,或者减少共享变量。忘记了MVCC。
代码题:二维滑动窗口,实现神经网络的maxpooling。