操作系统常见的面试题

来源:互联网 发布:如何找淘宝供应商 编辑:程序博客网 时间:2024/05/21 18:28
1.  什么是进程(Process)和线程(Thread)?有何区别? 
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体, 是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 线程自己基本上不拥有系统资源, 只拥有一点在运行中必不可少的资源 (如程序计数器, 一组寄存器和栈), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 一个线程可以创建和撤销另一个线程; 同一个进程中的多个线程之间可以并发执行。

进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。

2.linux/windows内存管理机制

linux的内存管理原理:由于linux的线性地址是从0x00000000开始的,所以逻辑地址就是线性地址,线性地址再经过映射机制转换到物理地址中,linux系统是采用多级分页技术来实现内存管理的。分页技术就是在一个程序的地址空间中,分成多个页面,每个页表映射到物理地址的一个相同大小的页框,由于实际上的程序运行的使用的内存空间往往大于我们的实际物理内存空间,所以这里要采用虚拟内存技术,虚拟内存技术是指在程序的运行中可以有很多个页表,但并不是每个页表都要映射到实际物理内存中程序才开始运行,而是但程序要调用到哪个虚拟内存时,判断是否已经映射到物理内存中,如果在,则直接映射,如果不在的话,那就需要把不常用的页表换下,把需要映射的页表换上,重新执行程序。

另外一种技术就是分段技术,分段内存管理机制是一个不是固定的大小的机制,一个程序在运行中,分开多个段,数据段和代码段的分开便于管理,而且分段技术可以解决分页技术中一个比较大的问题,就是如果数据没有多的地址,但是代码页却还是有很多的地址没有用到,这样的话,就会导致程序无法执行,那个分段技术就是可以动态的分配每个端的大小,如果动态申请了数据,那么数据段就大些,如果删除了就小些。这个实际是分段技术的最大优势,当然了,分段技术还可以保护程序的数据不会被别的程序读取和写入。

windows中 我们一般编程时接触的都是线性地址 也就是我们所说的虚拟地址.但实际上确不存在这样的地址。换句话说我们在0x80000000(虚拟地址)的地方写入了"UESTC"这个字符串,但是我们这个字符串并不真实存在于物理地址的0x80000000这里.再说了真实的物理地址是利用一段N长的数组来定位的(额~看不懂这句话没关系,一会看到物理地址那你就明白了).但是为什么windows乃至linux都需要采取这种方式来寻址呢?原因很简单 为了安全.听说过保护模式吧?顾名思义就是这个模式下加入了保护系统安全的措施,同样采用线性地址也是所谓的安全措施之一.
    我们假设下如果没有使用线性地址,那么我们可以直接访问物理地址,但是这样的话当我们往内存写东西的时候操作系统无法检查这块内存是否可写,换句话说操作系统无法实现对页面访问控制.这点是很可怕的事情,就如win9x那样没事在应用态往内核地址写东西,还有没有天理了~~
    由于操作系统的安全需要,催生了虚拟地址的应用.在CPU中有个叫MMU(应该是Memory Manage Unit 内存管理单元)的东西,专门负责线性地址和物理地址之间的转化.我们每次读写内存,从CPU的结构看来不是都要经过ALU么,ALU拿到虚拟地址后扔给MMU转化成物理地址后再把数据读入寄存器中.过程就是如此.后面的分段和分页技术基本差不多吧。

3.什么是临界区?如何解决冲突?

临界区是指多个进程或者线程可能会同时需要某个资源,但这些代码却又是不能同时被多个进程/线程共享的代码段。

解决方法:在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线 程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操 作共享资源的目的。虽然临界区同步速度很快,但却只能用来同步本 进程内的线程,而不可用来同步多个进程中的线程。

4.互斥量、临界区和信号量的比较和差别 

互斥锁和临界区都是只允许一个进程或者线程对资源进行操作的,但是信号量是允许多个线程对资源进行操作。临界区是线程间的互斥,而互斥量则是可以满足进程间的的相互排斥。

5.进程间的通行方式:管道通信、共享内存、消息队列

6.进程同步的方式:互斥锁、信号量、内存屏障

7.linux中常用的命令:显示文件的内容:less ,查看帮助信息:man   重定向与管道:type,修改文件权限:chmod

8.Linux 文件属性有哪些?(共十位)

-rwx-rwx-rwx-l:“-”代表是哪种文件,分别有-表示普通文件;c 表示字符设备(character);b 表示块设备(block);d 表示目录(directory);

后面第一个三个连续的短横是用户权限位(User) ,第二个三个连续短横是组权限位(Group) ,第三个三个连续短横是其他权限位(Other) 。每个权限位有三个权限,r(读权限) ,w(写权限) , x (执行权限) 。如果每个权限位都有权限存在,那么满权限的情况就是: -rwxrwxrwx;权限为空的情况就是- --- --- ---。

第一个-后面的代表的是用户权限,带二个代表的是组权限,第三个代表的是其他的权限。权限的设定可以用 chmod 命令,其格式位:chomod ugo+/-/=rwx filename/directory。例如:一个文件 aaa 具有完全空的权限- --- --- ---。以下命令:

chmod u+rw aaa  (给用户权限位设置读写权限,其权限表示为:- rw- --- ---)
chmod g+r aaa (给组设置权限为可读,其权限表示为:- --- r-- ---)
chmod ugo+rw aaa  (给用户,组,其它用户或组设置权限为读写,权限表示为: - rw- rw- rw-)
如果  aaa  具有满权限  - rwx rwx rwx,以下命令为:
chmod u-x aaa  (去掉用户可执行权限,权限表示为:- rw- rwx rwx)
如果要给 aaa 赋予制定权限- rwx r-x r-x,命令为:
chmod u=rwx,go=rx aaa

9.存储过程是什么?有什么用?有什么优点?
存储过程(Stored  Procedure)是一组为了完成特定功能的 SQL  语句集,经编译后存储在数据库中。 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 存储过程是 SQL  语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。
存储过程的优点:(1)存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度;(2) 当对数据库进行复杂操作时(如对多个表进行 Update, Insert, Query, Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用;(3)存储过程可以重复使用,可减少数据库开发人员的工作量;(4)安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
存储过程的缺点:(1)如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新  GetValue()  调用,等等,这时候估计比较繁琐了。 (2) 可移植性差。 由于存储过程将应用程序绑定到  SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。

10.操作系统的内容包含文件管理、设备管理、输入输出流控制、进程管理、存储管理等。

11.线程是否具有相同的堆栈,dll 是否有独立的堆栈?线程是具有不同的堆栈,dll本身不就有堆栈,只是在进程调用dll时会创建。

12.死锁的概念和解决方法

在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它们现在保持着的资源, 否则就不能向前推进。 此时, 每个进程都占用了一定的资源,但是又不能向前推进,称这一组进程产生了死锁。  

死锁产生的原因主要是:(1)系统资源不足;(2)进程运行推进的顺序不合适;(3)资源分配不当。

产生死锁的必要条件:(1)互斥(mutual  exclusion),一个资源每次只能被一个进程使用;(2)占有且等待(hold and wait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;(3)不可抢占(no preemption),进程已获得的资源,在未使用完之前,不能强行剥夺;(4)环形等待(circular wait),若干进程之间形成一种首尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。

解决死锁的办法是:鸵鸟策略、预防策略、避免策略、检测与解除死锁



 


0 0
原创粉丝点击