`
fj_ding
  • 浏览: 37172 次
社区版块
存档分类
最新评论

面试心得与总结-——答案整理_6 持续更新

阅读更多

1.进程与线程的区别

1:进程是系统进行资源分配和调度的基本单位,而线程是进程的一个实体,是系统调度和分派的基本单位;

2:进程中各个线程可以共享进程的资源,线程之间可以相互的控制(并发编程),而进程之间不能共享资源(特殊情况除外,操作系统中有两个方法就就可以让一个进程直接去读取另外一个进程的内存,但是是高度保密的);进程之间共享资源有相互的通信模式。

3:进程只是一个概念,他真是存在的实体是进程控制块(PCB),他存储进程的相关信息,创建一个进程就是创建一个进程控制块,销毁一个进程就是销毁该进程的进程控制块;进程控制块包含的信息:如进程的程序和数据在内存中中的起始地址等,进程的名字,进程的父亲,进程的儿子,进程调度信息(就绪,阻塞,执行等信息);

4:线程中也有TCP,线程控制块,线程的实体,线程中的tcb所保存的线程的状态比pcb的状态要多,因为tcp设计到各个线程之间的相互协调等。

5:进程间通信的三种方式:共享存储系统,消息传送系统,和管道系统;

2. 死锁的必要条件,怎么处理死锁。

1:进程死锁的必要条件:

1,互斥(也就是一个资源多个进程共享,如打印机)

2是资源的不可抢占(一个资源只能被拥有它的进程释放,不能被别的进程抢占,如打印机就是不可以,但是cpu可以抢占)

3是请求和保持(进程已经占有一个资源,但是又去申请新的资源,而该资源被别的进程占有)

4是环路等待;(也就是一个进程占用了一个资源,然后去申请别进程占有的资源,而别的进程占有该资源,然后又来申请之前线程占有的资源,形成一个环路)

2:只要发生死锁,这四个条件一定同时成立,同时成立则不一定造成死锁。

3:解决线程死锁的方法:

1死锁的预防(让一个线程占有所有的资源,使用完以后才可以给别的线程使用):去破环产生死锁的四个条件(效率比较低,破环了多道程序的并发执行,破坏资源共享原则)

2死锁的避免(银行家算法:在分配一个资源个进程的时候,先检查资源是否处于安全状态。如此次分配不会导致系统从安全状态转变为不安全状态,便可以将该资源分配给进程。):在进程运行时采取措施,而不是破环必要条件,在进程申请资源时避免系统进入不安全状态(不安全状态的检查);

3死锁的检查和解除:系统检查到死锁,然后采用杀死进程的方法解除死锁

4:发生死锁采用人工重启(个人电脑可以采用这种方式,比较重要的就不可以)

 

3. Window内存管理方式:段存储,页存储,段页存储。

1:分页存储:将程序的逻辑地址空间划分为固定大小的页(page),而物理内存划分为同样大小的页框(page frame)。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续。

页式存储优点:没有外碎片,但会有内碎片,可以不连续存储,缺点: 要求程序全部装入内存,没有足够的内存,程序就不能执行。

页表:页号(一个进程中的逻辑页号,从0开始)和块号(物理内存中的实际块号,整个内存空间的块号是唯一的,是从0开始的)

逻辑地址到物理地址的转换:先获取逻辑地址,并按照页的划分将逻辑地址划分为页号和页内偏移地址,进程物理映射的时候,先通过页表获取对应物理地址的块号,然后将将偏移量直接映射到物理块的偏移量中。如何计算实际地址:如果一页大小为1k,对应的物理地址的块号是5,则对应的地址就是5*1024(物理地址是从0开始计算块号的)+页内偏移地址就是逻辑对应的实际地址。

如何保证各个进程的块不冲突呢?整个系统有一张页面表,记录了物理内存的拿一些块被占用,拿一些块没有被占用,只要在分配内存的时候去查找一下这张页面表,也就不会去造成内存分配冲突。

对页表的优化:一般来说,页表都存贮在主存当中,这样,处理器要进行读写数据的时候,要进行两次操作,第一次用来查找页表将操作数的逻辑地址变换为物理地址;第二次完成真正的读写操作。这样写一次内存需要两次操作内存,耗费资源和时间,因此就出现了块表。

快表:将页表读入cpu的一个寄存器(cpu的高速缓冲器)中,由于高速缓存器容量有限,只能存储一部分页表(可以采用LRU算法存储常用的页表映射(块表)),当cpu计算出逻辑地址以后,直接去快表中读取对应的块号,而不到注册中获取,如果没有对应的映射,就到主存中去存取。

 

 

2:段式存储:(相对于页存储来说,是为了满足用户的需求而出现的一种内存分配方式)用户将自己的应用程序按照逻辑将内存地址分成若干个段,每个段都有一个自己的名字,而且每个段都是从0开始编址的,然后程序加载的时候,直接将各个段映射到内存中去,各个段在内存之间可以是不连续的,但是在段内是连续的。

段式存储的优点:各个段是一个完整的逻辑地址,因此可以对各个段施加不同的安全保护。还有就是没有内碎片,形成的外碎片也可以通过内存压缩来解决。缺点:就是要将各个段全部加载到内存,不能使用虚拟内存。

段表物理地址的计算:段地址由两部分组成,段号和段内地址。通过段号在段表中找到对应的段号,然后通过段表段号对应的段的基地址+段内偏移地址就可以计算出物理地址。

段页式存储:将内存安装程序逻辑关系分割成多个段,段内采用页式划分;

优点:可以充分提高内存利用率,也可以采用分段的方式按逻辑划分内存地址。

4. 进程的几种状态。

就绪态,阻塞态,运行态,对进程的状态可以进行细化(挂起,激活,主要是方便用户在进程运行的时候中间过程是可控的,可以在运行期间暂停某些进程,减轻系统负荷或者暂停进程故障排查(我们eclipse中断点应该就是这么实现的))。

细分以后就成了:活动就绪态,静止就绪态,活动阻塞态,静止阻塞态,运行态,(为什么叫静止时因为挂起以后如果不激活,他会一直挂起)

五种状态的转换,阻塞态必须先转换成就绪态才能到运行态,运行态可以直接到阻塞态,或者就绪态(或者直接被挂起,进入静止阻塞态,静止阻塞必须要转换成阻塞就绪,然后转换成活动就绪态)。

 

5. IPC几种通信方式。

1:共享内存模式:共享同一内存区间(我们的复制粘贴就是采用共享内存实现的)

2:消息队列模式:一个进程将消息发送到一个公共的消息队列缓存区中,然后另一个线程自己去该公共消息队列缓存区去读取是否有自己的消息(间接通信),还有一种是直接通信,通过一个进程通过内核直接将消息发送到一个进程自己的消息缓存队列缓存区(而不是公共消息队列缓冲区),然后目标线程有空就去读取(缺点,只能实现P2P通信,优点:就是比较快)。

3:管道模式:主要就是借助一个中间临时文件,一个进程向该文件中写数据,另一个进程从该管道中获取数据。(该中间文件与我们一般使用的文件的区别就是,先进先出,而且具有数据不可再现性(被读取以后就没有了),无名管道关机后自动删除该文件,该文件并不存放到硬盘中)

4:File文件通信:通过文件流的形式进行通信,然后一个从通过文件流从该文件中读取消息。(特点就是慢)

5RPC远程进程间通信,也就是Socket通信。主要是用于远程通信

6LPC本地进程通信,对RPC的改进。同一台主机中两个进程通过端口进行通信。

 

6. 什么是虚拟内存。

虚拟内存就是将硬盘中划分出一部分区域来当内存使用,是将部分内存的持久化到硬盘,当需要的时候就从内存中去读取。并将暂时不需要的内存信息存储到硬盘中去。

请求分页系统(重点),请求分段系统,请求段页式)就是针对虚拟内存的。通过请求实现内存与外存的信息置换。

置换算法:

  FIFO先进先出算法,该操作在操作系统中经常被用到,比如作业调度(主要实现简单,很容易想到)。

  LRULeast recently use)最近最少使用算法。根据使用时间到现在的长短来判断。

  LFULeast frequently use)最少使用次数算法。根据使用次数来判断。

  OPTOptimal replacement)最优置换算法,理论的最优,理论;就是要保证置换出去的是不再被使用的页,或者是在实际内存中最晚使用的算法。

7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。

虚拟地址:程序自身定义的地址,需要转换成物理地址才能使用

逻辑地址:段内偏移地址,也是虚拟地址。

物理地址:内存中的实际地址。

线性地址:cpu可寻址的地址,段内偏移地址+段基址。然后该地址就是实际的了地址。

因为是做android的这一块问得比较少一点,还有可能上我简历上没有写操作系统的原因。

 

推荐书籍:《深入理解现代操作系统》

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics