现在的位置: 首页 > 综合 > 正文

同门找工面试题总结

2018年06月06日 ⁄ 综合 ⁄ 共 3116字 ⁄ 字号 评论关闭

1、什么是微内核?

       微内核结构由一个非常简单的硬件抽象层和一组比较关键的原语或系统调用组成,这些原语仅仅包括了建立一个系统必需的几个部分,如任务的创建和删除,进程、线程管理,内存管理,进程间通信和中断处理等。在微内核结构中,操作系统的内核只需要提供最基本、最核心的一部分操作即可,而其他的管理程序(如文件系统、网络协议栈、设备驱动等)则尽可能的放在内核之外,在用户模式下运行。这些外部程序可以独立运行,并对外部用户程序提供操作系统服务,服务程序之间使用进程间通信机制进行交互,只在需要内核的协助时,才通过一套接口对内核发出调用请求。因为每个服务只是在自己的地址空间运行,所以这些服务之间彼此之间都受到了保护。微内核的目标是将系统服务的实现和系统的基本操作规则分离开来。例如,进程的输入/输出锁定服务可以由运行在微核之外的一个服务组件来提供。这些非常模块化的用户态服务用于完成操作系统中比较高级的操作,这样的设计使内核中最核心的部分的设计更简单。一个服务组件的失效并不会导致整个系统的崩溃,内核需要做的,仅仅是重新启动这个组件,而不必影响其它的部分。

       微内核系统的优点是操作系统具有良好的灵活性,它使得操作系统内部结构简单清晰,程序代码的维护非常之方便。但是也有不足之处。微内核系统由于核心态只实现了最基本的系统操作,而内核以外的外部服务程序之间由于独立运行使得系统难以进行良好的整体优化。另外,进程间互相通信的开销也较单一内核系统要大许多。从整体上看,在当前的硬件条件下,微内核在效率上的损失小于其在结构上获得的收益,故而选取微内核成为操作系统的一大潮流。

       linux是典型的宏内核架构,就是说操作系统内核本身是一个不可分割的进程。而微内核结构,是说操作系统内核是一组相互协作的进程,而最核心的进程才是OS实际的内核,这个进程一般负责其他内核进程之间的交互。微内核的设计可以将很多在宏内核中原本属于内核的程序移出内核,使得操作系统更加稳定,比如在宏内核中文件系统运行在内核态,而在微内核架构中,文件系统则运行在用户态,这样即使文件系统出问题了,也不会使操作系统崩溃。很明显微内核的架构强于宏内核的设计。现在的OS中,mac os x,gnu hurd等是属于微内核架构,而传统的unix和linux都是宏内核架构。一般来说,宏内核更容易实现,微内核实现起来难度更大,主要是因为微内核架构里,很多进程通信是异步的,这样就难于调试,并且更容易有bug,实现后也会更强大。

        学习文章:http://baike.baidu.com/view/928365.htm   
http://wenku.baidu.com/view/6f368ed576eeaeaad1f330d4.html

2、内存泄露

       内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

       一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc等函数(C++中使用new操作符)从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

        内存泄露的分类

        1).
常发
性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

  2). 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

  3). 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅一块内存发生泄漏。比如,在一个Singleton类的构造函数中分配内存,在析构函数中却没有释放该内存。而Singleton类只存在一个实例,所以内存泄漏只会发生一次。

  4). 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

       以下这段小程序演示了堆内存发生泄漏的情形:

  void MyFunction(int nSize)

  {

  char* p= new char[nSize];

  if( !GetStringFrom( p, nSize ) ){

  MessageBox(“Error”);

  return;

  }

  …//using the string pointed by p;

  delete[] p;

  }

  当函数GetStringFrom()返回零的时候,指针p指向的内存就不会被释放。这是一种常见的发生内存泄漏的情形。程序在入口处分配内存,在出口处释放内存,但是c函数可以在任何地方退出,所以一旦有某个出口处没有释放应该释放的内存,就会发生内存泄漏。

3、栈溢出

      栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。

  栈溢出就是缓冲区溢出的一种。

4、strcpy函数的编写与测试

  1. #include <cstdlib>   
  2. #include <iostream>   
  3. #include <cstring>
      
  4. using namespace std;  
  5. char *_strcpy(char *strDest, const char *strSrc)  
  6. {  
  7.     assert(strDest != NULL && strSrc != NULL);  
  8.       
  9.     const char *ptrSrc = strSrc;  
  10.     char *ptrDest = strDest;  
  11.       
  12.     while(ptrSrc != NULL && *ptrSrc != '/0')  
  13.         *ptrDest++ = *ptrSrc++;  
  14.       
  15.     *ptrDest = '/0';  
  16.       
  17.     return strDest;  
  18. }  
  19. int main(int argc, char *argv[])  
  20. {  
  21.     char *strSrc = "test string";  
  22.     char *strDest = new char[strlen(strSrc) + 1];  
  23.       
  24.     _strcpy(strDest, strSrc);  
  25.     cout << strDest << endl;  
  26.       
  27.     system("PAUSE");  
  28.     return EXIT_SUCCESS;  
  29. }  

5、c++对象大小的影响因素是什么?

抱歉!评论已关闭.