内核概念相关
- 什么是死锁?其条件是什么?怎样避免死锁?
(1) 死锁的概念
在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。(2) 产生死锁的必要条件:
(1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;
(2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能强行剥夺;
(3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;
(4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。(3)死锁的解除与预防:
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。(4)死锁的处理策略:
鸵鸟策略、预防策略、避免策略、检测与恢复策略。 - 进程和线程的区别是什么?什么是堆栈?线程是否拥有独立的堆栈?
(1) 进程是资源分配的单位,线程是CPU调度的基本单位。
(2) 略
(3) 线程是CPU调度的单位,因此拥有自己的调用栈,线程共享进程的堆。 - 虚拟内存机制有什么用?假设把操作系统的页面文件(或称为交换分区)的大小设置为0,其虚拟内存机制还存在吗?
(1) 可以从程序的内存连续性等方面进行解释。
(2) 虚拟内存机制是非常底层的内存管理机制,即使页面文件大小为0,虚拟内存机制依然存在。
程序基础
- 缓冲区溢出是什么?为什么可以利用缓冲区溢出来控制程序的执行?
略
- 动态库和静态库的区别是什么?
略
- C代码的编译有预处理、编译和链接,这几个阶段分别完成了什么工作?
略
C、C++基础
- C的struct、C++的struct、C++的class这三者之间有什么区别?
C的struct为单纯的数据集合,而C++的struct和class都是面向对象思想中的“类”,后两者的区别是struct默认成员为public,class默认成员为private。
- C++中虚函数的实现机制是什么?
要提到虚表和虚函数指针
- 下面两段代码是否存在问题?
//代码段1 char *GetMemory( void ) { char p[] = “hello world”; return p; } void Test1( void ) { char *str = NULL; str = GetMemory(); printf( str ); } //代码段2 void Test2( void ) { char *str = (char *) malloc( 1000 ); strcpy(str,"hello world"); printf(str); }
代码段1中,GetMemory返回后,p指向的空间会被释放
代码段2中,一般情况下不会有问题。但假设能够指出malloc可能分配不成功则最好。 char p1[10]; char *p2 = malloc(10);
那么sizeof(p1)和sizeof(p2)分别是多少?
第一个是10;第二个是地址长度(32为4,84位为8)。
- C++代码中想要使用C代码的函数为什么要用extern C标记来声明函数?
被extern “C”修饰的变量和函数是按照C语言方式编译的。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。
例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。