福利来啦:本文底部可获取本文PDF版,直接下载带回家!
主题一:C++
t1. int a[10]; 这个数组的数组变量和数组内容都是存在哪里的?
若是全局数组,则会被创建在静态存储区;其他情况会被分配在栈上。
t2.指针数组和数组指针的区别?
指针数组本质上是数组,每个数组元素指向一个int型变量的地址,数组占多少个字节由数组本身决定。
数组指针本质上是指针,是一个指向一个数组的指针变量,32位系统下永远占4个字节。
t3. STL中vector和list的区别?
vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。其能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。
list由双向链表实现的,因此内存空间是不连续的,且开销较大因为需要额外的指针信息。由于只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n);但由于链表的特点,其能O(1)地进行插入和删除。
主题二:操作系统
t1. 介绍一下一个进程的内存管理
-
在操作系统中,系统会给每个进程分配虚拟地址,虚拟地址的大小与处理器的位数有关,如32位处理器进程可分配4GB的虚拟内存供程序正常运行。这4GB的虚拟内存,存储单元从地址0开始进行排序,此地址为虚拟地址。
-
该虚拟地址可分为五个部分:
(1)栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。线程也有自己维护的栈。
(2)堆区:程序动态申请的空间,由程序释放或其他方式释放,若没有释放,可能导致内存泄露。
(3)全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放 。
(4)文字常量区:常量字符串就是放在这里的,程序结束后由系统释放。
(5)程序代码区:存放函数体的二进制代码。
t2. 介绍下程序的内存释放
- 当一个程序运行完毕之后,它所使用的数据就不再需要。由于内存是有限的,所以它原来占据的内存空间也应该释放给别的程序使用。对于普通变量和数组,在程序结束运行以后,系统会自动将它们的空间回收。然而对于我们自己分配的堆内存空间,大多数系统都不会将它们回收。如果我们不人为地对它们进行回收,只借不还,那么系统资源就会枯竭,电脑的运行速度就会越来越慢,直至整个系统崩溃。我们把这种只申请空间不释放空间的情况称为内存泄露。
- 在C++中,确认申请的堆内存空间不再使用后,我们用delete操作符来释放堆内存空间。如果申请的是一个堆内存变量,则delete后的[]可以省略;如果申请的是一个堆内存数组,则该[]不能省略,否则还是会出现内存泄露。另外,我们也不难发现,delete后的指针就是通过new获得的指针,如果该指针的数据被修改或丢失,也可能造成内存泄露。
t3. Linux下的常用命令
- 列出目录:ls
- 切换目录:cd
- 显示当前目录:pwd
- 创建一个新目录:mkdir
- 删除一个空的目录:rmdir
- 复制文件或目录:cp
- 移除文件或目录:rm
- 移动文件与目录,或修改文件与目录的名称:mv
- 查找文件或目录:find
- 新增、修改文本文件:vim
- 显示进程情况:ps
- 终结进程:kill
- 改变文件权限:chmod
- 打包:tar
t4. 谈一谈同步和异步
- 同步和异步关注的是消息通信机制。同步,就是调用某个东西是,调用方得等待这个调用返回结果才能继续往后执行。异步,和同步相反。调用方不会理解得到结果,而是在调用发出后调用者可用继续执行后续操作,被调用者通过状体来通知调用者,或者通过回掉函数来处理这个调用。
- 同步:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。(当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去)
- 异步:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。(当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响)
- 同步异步不能和阻塞非阻塞混为一谈。阻塞和非阻塞强调的是程序在等待调用结果时的状态,同步和异步