开发岗基础面试题
1.堆和栈的区别
答:首先需要询问指的是操作系统层面的还是数据结构层面的。
操作系统层面:操作系统层面的堆和栈其实说的是操作系统给进程分配的内存空间里面的概念,它包括代码段、数据段、堆、栈、BSS。
- BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
- 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
- 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
- 堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
- 栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
- 按管理方式
- 栈是系统编译器启动管理,不需要程序员手动管理
- 堆的释放由程序员手动管理,不及时回收容易产生内存泄露
- 按分配方式
- 栈有两种分配方式:静态分配和动态分配
- 静态分配是系统编译器完成的,比如局部变量的分配
- 动态分配是由alloc函数进行分配的,但是栈的动态分配和堆的动态分配是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理
- 堆是动态分配和回收内存的,没有静态分配的堆
- 栈有两种分配方式:静态分配和动态分配
- 按分配大小
- 栈是向低地址扩展的数据结构,是一块连续的内存区域
- 堆是向高地址扩展的数据结构,是不连续的内存区域
2.讲解一下局部性原理?
答:局部性原理又表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后。其附近的存储单元也将被访问。
3.http和https的区别
答:简单来说,HTTPS协议是由SSL(Secure Sockets Layer,安全套接层)+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。 HTTPS和HTTP的区别主要如下:
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
4.内存泄漏和内存溢出的区别
答:内存溢出是多次内存泄漏的结果,而内存泄漏的原因是因为由于疏忽或错误造成程序未能释放已经不再使用的内存。
5.SQL查询中,只有满足联接条件的记录才包含在查询结果中,这种联接为:内部联结
- 内部联结:又称为等值连接,只选择满足条件的行
- 外联结:外连接会保存没有关联的行
- left outer join:保存左边表的所有行
- right outer join:保存右边表的所有行
- full join:保存所有没有关联的行,当某行在另一个表中没有匹配行时,则另一个表的列为空值