C++面试题集锦

1. 动态链接库和静态链接库的区别

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,无论愿不愿意,lib指令都全部被直接包含在最终生成的EXE文件中了。但是若使用DLL, 该DLL不必被包含在最终的EXE文件中,EXE文件执行时可以动态的引用和卸载这个EXE独立的DLL文件。静态链接库和动态链接库的另外的一个区别在于静态链接库中不能再包含其他的动态链接库和静态链接库,而动态链接库中可以在包含其它的动态或静态链接库。动态库就是在需要调用其中的函数时,根据函数映射表中找到该函数然后调用堆栈中执行。如果当前工程中有多处对dll文件中同一个函数调用,那么执行时,这个函数只会留下一份拷贝。但是如果有多处对lib文件中同一个函数的调用,那么执行时,该函数在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。但是如果有多处对lib文件中同一个函数的调用,那么执行时,该函数将在当前程序的执行空间里留下多份拷贝,而且是一处调用就产生一份拷贝。

2. 用户态与内核态的区别和切换

当一个任务执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态。此时处理器处于特权机最高的内核代码。当进程处于内核态时,执行的内核代码会使用当前的内核栈。每个进程都有自己的内核栈。当进程执行用户自己的代码时,则称其处于用户态。即此时处理器在特权级最低的用户代码中运行。当正在执行用户程序而突然中断时,此时用户程序也可以象征性的处于进程的内核态。因为中断处理程序将使用当前的内核态。

内核态与用户态是操作系统的两种运行级别, cpu有三种运行模式,ring0级别最发哦,ring3级别最低。Linux进程的4GB空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放着整个内核代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,改程序创建的进程开始运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统会调用内核中的代码来完成操作,这是,必须切换到ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换Ring3,回到用户态。这样,用户态的程序就不能随意操作1内核地址空间,具有一定的安全保护作用。

用户态到内核态的3种方式: a 系统调用 b 异常 c 外围设备的中断。

3.系统调用和库函数的区别

系统调用是通向操作系统本身的接口,是面向底层硬件的。通过系统调用,可以使得用户态运行的进程和硬件设备进行交互,是操作系统留个应用程序的一个接口。库函数是把函数放到库里,供别人使用的一种方式,库函数可分为两类,一类是编译器特定的库函数,一类是C语言标准规定的库函数。

4. 虚拟内存和物理内存的区别

每个进程的4G空间只是虚拟内存空间,每次访问内存空间的某个地址,都需要把地址翻译成为实际物理内存地址; 所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。进程通过页表来知道是否在物理页面上。页表中的某一个表项分为两个部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址。当进程访问某个虚拟地址,去看页表,如果发现对应的数据不在物理内存中,则却也异常。

            

5、 哈希表的底层实现

把带有关键字i的元素存储到表的第i个位置,使其可以直接访问。关键字索引的算法不是比较关键字值进行比较,而是以关键字值作为数组的下表索引。我们对关键字索引搜索算法进行扩展,得到散列搜索算法。

猜你喜欢

转载自blog.csdn.net/qq_29869043/article/details/82823365
今日推荐