操作系统面试题

1.静态链接库和动态链接库

静态链接库:参与编译,把(lib)文件中用到的函数代码直接链接到可执行程序中,在可执行文件生成以后,静态链接库.lib文件可以不用。

动态链接库:把调用的函数所在模块(DLL)和调用函数在文件中的位置等信息链接进可执行文件。程序在运行时再从DLL中查找相关函数代码,因此需要DLL文件支持。

注意:静态链接库不能再包含其他动态或静态链接库,但是动态链接库可以包含其他动态库或静态库。

动态链接库相对静态链接库的优点:

1)动态链接库可以更新而不需要重新编译链接,便于扩展。

2)动态链接库允许多个进程同时使用动态链接库。

3)节省内存空间。

缺点:运行时需要依赖DLL文件,且运行速度比静态慢。


2.什么是临界区?临界区和互斥量的区别?临界区怎样解决冲突?

1)每个进程中对共享变量进行访问的片段称为临界区,每次只允许一个进程进入临界区。

2)区别:

a.互斥量可以用于线程和进程间的同步,而临界区只能用于进程间同步。

b.互斥量属于内核对象,所以速度较快;临界区不属于内核对象,速度较慢。

(内核对象是操作系统为一些系统级对象(如进程、线程、信号量)维护的数据结构。)

3)解决冲突方法如下:

a.不能有2个进程同时处于临界区。

b.临界区外的进程不得阻塞其他进程。

c.不能假设CPU的速度和数量。

d.不能让进程无限等待进入临界区。


3.说说分段和分页。

windows内存管理的方式:段式管理、页式管理、段页式管理。

分页:将各个进程的虚拟空间分成若干个大小相等的页,然后把页式虚拟地址与内存地址建立一一对应的页表,不用将程序的所有页装入内存,只需使用合适的页面置换算法调入需要的页面。优点是没有碎片,缺点是需要相应的硬件支持。

分段:把程序按内容或过程函数分成段,每段有自己的名字。以段为单位分配内存,通过段号和段内地址把虚拟地址转为实际内存的物理地址。优点是可以分别编写和编译,对不同类型的段采用不同的保护,缺点是会产生碎片。


4.说说硬链接和软链接。

硬链接:就是一个文件使用了多个别名,硬链接是有着相同的inode号仅文件名不一样的文件,因此删除一个硬链接并不影响其他有着相同inode号的文件。

软链接:又叫符号链接,软链接文件的实际内容包含了该软链接所指向的文件的名字。

区别:

1)软链接可对文件或目录创建,硬链接只能对文件创建。

2)若软连接指向的文件被删除,则软链接不可以访问,硬链接指向的文件删除,硬链接还可以访问。

3)软链接可以跨越磁盘分区,硬链接不能。

补充:

硬链接创建用link或者ln

link oldfile newfile 
ln oldfile newfile
软链接创建加-s

ln -s old.file soft.link
ln -s old.dir soft.link.dir

5.说说程序的内存分配方式(堆和栈区别)。

一个C/C++程序占用的内存分为下面几个部分:

栈区:由编译器自动分配和释放,存放函数的参数值,局部变量的值等。

堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

全局区(静态区):存放全局变量和静态变量,初始化的全局变量和初始化的静态变量放在一块,未初始化的全局变量和为初始化的静态变量放在相邻的两块区域,程序结束后由操作系统回收。

文字常量区:存放常量字符串,程序结束由系统回收。

程序代码区:存放函数的二进制文件。


bss段:用来存放未初始化的全局变量和静态变量的区域。bss段属于静态内存分配。

data段:用来存放已经初始化的全局变量。

text段:用来存放程序执行代码的区域,也存放一些只读的常量。


6.多进程和多线程的优缺点

多进程优点:

1)每个进程相互独立,不影响主程序的稳定性,子进程崩溃没关系;

2)通过增加CPU,就可以扩充性能;

3)可以尽量减少线程加锁/解锁的影响,极大提高性能;

4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。

多进程缺点:

1)逻辑控制复杂,需要和主程序交互;

2)需要跨进程边界,如果有大数据量传送,就不太好;

3)多进程调度开销比较大。

多线程优点:

1)无需跨进程边界;

2)程序逻辑和控制方式简单;

3)所有线程可以共享内存和变量等;

4)线程销毁总资源方式比进程好。

多线程缺点:

1)每个线程与主程序共用地址空间,受限于2GB地址空间;

2)线程之间的同步和加锁比较麻烦;

3)一个线程崩溃可能影响整个程序的稳定性;

4)到达一定的线程数后,即使再增加CPU也无法提高性能。

进程和程序的区别:

1)程序是永存的,进程是暂时的;

2)程序是静态的,进程是动态的;

3)进程具有并发性,而程序没有;

4)进程是计算机资源分配的基本单位,而程序不是;

5)多个进程可执行同一程序,一个进程可以执行多个程序。


7.malloc申请得到的内存后,再free释放它的时候,操作系统会立即回收那块内存吗?

不会,如果每次free掉一些小内存给操作系统,那么内存就会弄得不连续,里面有很多gap。为了避免这种情况,内存管理系统会有一个free block list,free掉的东西就放在这里。如果释放一些散乱的内存过来,这里会尝试合并这些散乱的block。malloc首先也是在block free list里面查找,如果没合适的,再从OS申请新的内存。


8.对一个内存free多次问题:

1)如果一个非空指针free多次,结果未定义,编译时不会报错,可能出现运行时错误;

2)对空指针free多次,不会报错。

所以:养成良好习惯,将一个指针指向的内存free后,就要将指针值空,这样即使再次free也不回出现错误。


9.内存分配算法及优缺点

1)首次适应算法:从空闲分区链首开始查找,直至找到一个能够满足其大小的空闲分区。优点:保留了高地址部分的大空闲区,为以后分配大的内存空间创造了条件;缺点:低地址部分不断被划分,留下许多难以利用、非常小的空闲区,而每次又从低地址开始查找,增加查找开销。

2)循环首次适应算法:不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足需求的空闲分区。优点:空闲区的内存分布更加均匀;缺点:缺乏较大的空闲分区。

3)最佳适应算法:总是找到最接近的空闲分区来分配内存。优点:保留了较大的空闲区,避免造成内存随意分割;缺点:每次分配后要重新排序,增加开销,而且会留下许多难以利用的小分区。

4)最差适应算法:按大小递减的顺序形成空闲链,分配时从第一个空闲区分配。优点:避免留下许多小碎片;缺点:保留大的空闲区的可能性减小了,而且排序增加开销。

下面补充一种算法:

伙伴算法:把内存分配成8/16/32/64/128等大小的链表。分配内存时,首先找到合适的链表,然后分配内存。如果内存空间不够,再往高一级链表申请。


10.堆和栈的区别

堆栈空间分配的区别:
1)堆区:是由程序员分配和释放,若程序员不释放,程序退出时由操作系统回收,分配方式类似于链表;

2)栈区:由操作系统分配和释放,存放函数的参数,局部变量等值,其操作方式类似于数据结构中的栈。

堆栈缓存方式区别:

1)堆存放在二级缓存中:其生命期由虚拟机的垃圾回收算法决定;

2)栈存放在一级缓存中:他们通常被使用时处于存储空间中,调用完成后立即释放。

堆栈数据结构的区别:
1)栈是一种先进后出的数据结构;

2)堆可以被看做一棵树。


11.什么是死锁?死锁的必要条件?死锁的解决方法?

死锁:两个或以上的进程在执行过程中,因争夺资源而互相等待的现象,若无外力作用,他们都将无法推进下去。

死锁的必要条件:

1)互斥条件:一个资源每次只能被一个进程占用。

2)请求和保持条件:一个进程因请求资源而发生阻塞时,对已经占用的资源不释放。

3)不可剥夺条件:进程已经获得的资源,在未使用完成之前,不能被强行剥夺。

4)循环等待条件:若干进程形成首尾相接循环等待资源的关系。

死锁解决方法:

1)预防死锁:资源一次分配(请求和保持条件),可剥夺资源(即当某进程新的资源请求未满足时,可以释放占用的资源),资源有序分配法(系统给每类资源赋予一个编号,每个进程按编号递增的顺序请求资源,破坏循环等待条件)。

2)避免死锁:银行家算法。

3)解除死锁:剥夺资源(从其他进程剥夺足够数量的资源给死锁进程,以解除死锁),撤销进程(可以直接撤除死锁进程或代价最小的进程,直至有足够多的资源用)



12.sleep和wait的区别

sleep(100L)的意思是:线程占着CPU,休眠100ms

wait(100L)的意思是:线程不占用CPU,等待100ms


13.linux下跟进程有关的接口函数

1)int fork(void);

返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1.

2)int vfork(void);

fork不对父子进程的执行次序进行任何限制,而在vfork中,子进程先运行,直到子进程调用了exec或exit后,父子进程的顺序才没有限制。

3)exec函数族

在fork后的子进程中使用exec函数族,可以装入和运行其他程序。

4)pid_t wait(int *status);

先判断子进程是否存在,如果不存在,返回-1;如果存在,wait()将父进程挂起,直到子进程结束,并返回子进程结束时的状态和PID。

下面补充一些知识点:


14.linux下跟线程有关的接口函数

1)线程创建函数:pthread_create

2)等待线程结束函数:pthread_join

3)线程终止函数:pthread_exit

4)线程取消函数:pthread_cancel


操作系统的作用:1.管理系统中的各种资源。2.为用户提供友好的界面。

操作系统的定义:操作系统是位于硬件之上、所有其他系统软件层之下的一个系统软件,使得管理系统中的各种软件和硬件资源得以充分利用,方便用户使用计算机系统。

操作系统的特性:1.并发性  2.共享性     3.异步性     4虚拟性

进程的引入:在多道程序系统中运行的程序需要一个保存断点现场信息的区域,而这区域不是程序的组成部分,因此就要一个能够更准确地描述多道程序系统中执行的术语

进程状态:运行态   (相互) 就绪态       等待态  (其他顺时针)

进程组成:控制块:断点现场保存区域,进程存在的标志(数据结构)程序:1.代码  2.数据 

进程:  进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。 

进程与程序的连系与差别:进程存在的目的是执行其所对应的程序,程序是进程的组成部分

差别:1.进程是动态。有生命周期,创建存在,撤销消亡。一个进程对应一个程序

 2. 程序是静态。可以写在纸上或在某种存储介质上长期保存。一个程序可以对应多个进程

线程: 是进程内的一个相对独立的执行流,CPU调度的基本单位

线程优点:1.上下文切换快   2.系统开销小   3通信容易

中断:程序在运行过程中出现某种紧急事件,必须终止当前正在运行的程序,转去处理此事件,然后在恢复原来运行的程序。

中断装置:1. 识别中断源   2.保存现场     3.引出中断处理程序

共享变量:多个进程均需访问的变量

临界区:访问共享变量的程序

临界资源:一次允许一个进程使用的资源

进程互斥:两个或两个以上是进程不能同时进入关于同一组共享变量的临界区,否则可能发生与时间有关的错误。(进程之间的间接性相互作用)

独占型资源:1.互斥性     2.进展性    3.有限等待性

进程同步:一组进程,为了协调其推进速度,在某些点处需要相互等待或者唤醒,进程之间这种互相制约的关系称为进程同步。(有逻辑关系的作用)

死锁:一组进程中每一个进程均等待此组进程中其他进程所占有的.因而永远无法得到资源

死锁条件:1.资源独占   2.不可剥夺     3.保持申请

死锁的处理: 1。死锁预防     2. 死锁避免

进程饥饿:等待时间给进程的推进和响应带来明显的影响时

饿死:饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义。

活锁:在忙式等待条件下发生的饥饿

存储管理方式:1。单一连续区存储管理:内存空间划分:动态异长。 进程空间划分:连续。             对应关系:一个进程在内存中占有一个连续的区域

2.页式存储管理: 内存空间划分: 被静态的划分为等长区域   进程空间划分:被静态的划分为等长区域           对应关系:进程的逻辑页面是连续的,但页框不一定连续。

3.段式存储管理:内存空间划分:被动态的划分为长度各异的区域。 进程空间划分:静态长度各异的区域。对应关系:一个进程的多个逻辑段可存放与内存中不相连的物理段中。

4段页式存储管理: 内存空间划分:被划分静态等长的区域。进程空间划分;静态不等长的段,每段静态等长  对应关系: 同一段内的逻辑页面是连续的,页框未必连续。缓冲:处理数据到达速度与离去速度不一致而采用的技术


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值