zoukankan      html  css  js  c++  java
  • 操作系统常见面试题

    https://blog.csdn.net/nawuyao/article/details/52703384

    一个非常好的总结:https://www.jianshu.com/p/d254b138de03

     内存方面的概念总结:https://blog.csdn.net/oMengLiShuiXiang1234/article/details/51536771

    <.......................................正文......................................>

    Q1:什么是进程,什么是线程,简述进程与线程的区别。

    进程:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位(具有动态、并发、独立、异步的特性,以及就绪、运行、阻塞3种状态);引入进程是为了使多个程序可以并发的执行,以提高系统的资源利用率和吞吐量。

    线程:是比进程更小的可独立运行的基本单位,可以看做是轻量级的进程(具有轻型实体,独立调度分派单位,可并发执行,共享进程资源等属性);引入目的是为了减少程序在并发执行过程中的开销,使OS的并发效率更高。

    两者的对比:

    1. 调度方面:在引入线程的OS中,线程是独立的调度和分派单位,而进程作为资源的拥有单位。由于线程不拥有资源,因此可以显著的提高并发度以及减少切换开销。

    2. 并发性:引入了线程的OS中,进程间可以并发,而且一个进程内部的多个线程之间也是可以并发的,有效的提高了系统资源利用率和吞吐量。

    3. 拥有资源:无论OS是否支持线程,进程都是基本的资源拥有单位,线程只拥有很少的基本的资源,但是线程可以访问所隶属的进程的资源(进程的代码段,数据段和所拥有的系统资源如fd)

    4. 系统开销:创建或者撤销进程的时候,系统要为之创建或回收PCB,系统资源等,切换时也需要保存和恢复CPU环境。而线程的切换只需要保存和恢复少量的寄存器,不涉及存储器管理方面的工作,所以开销较小。此外,统一进程中的多个线程由于共享地址空间,所以通信同步等都比较方便。

    Q2.进程间通信的方式有哪些?进程的运行状态有哪些?孤儿进程?僵尸进程?

    方式:共享内存、消息队列、管道、信号量。(再详细些请见《进程》随笔) ;

    管道:https://blog.csdn.net/skyroben/article/details/71513385

    信号量:https://blog.csdn.net/skyroben/article/details/72513985

    运行状态:见《进程》随笔;

    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作(没有什么危害)

    僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

     如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

    Q3.线程同步的方式有哪些?互斥的方式有哪些?回顾生产者与消费者问题。

     秒杀多线程系列:https://blog.csdn.net/morewindows/article/details/7442639

    Q4.用户线程与内核线程区别。用户态与内核态区别。用户态如何切换到内核态?

     

    Q5.有哪些进程调度算法?相关的时间计算。

     https://www.cnblogs.com/dzy521/p/9144786.html

    Q6.什么是死锁?导致死锁的原因,产生死锁的四个必要条件是什么?如何避免死锁?

     https://www.cnblogs.com/dzy521/p/9462902.html

    Q7.分页和分段的区别。

    页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的外部碎片,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

    段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要

    页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面

    段的长度不固定决定于用户所编写的程序,通常由编译程序在对源程序进程编辑时,根据信息的性质来划分。

    分页的作业地址空间是一维的,即单一的线性空间,程序员只需利用一个记忆符,即可表示一地址

    分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址

    Q8.线程池

      池化技术:提前保存大量的资源,以备不时之需以及重复使用
      由于在实际应用当做,分配内存、创建进程、线程都会涉及到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。
      线程池:线程池的原理类似于操作系统中的缓冲区的概念,流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。
      进程池与线程池同理。
      内存池:内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放。

     

    Q9.物理内存与虚拟内存

     虚拟内存:使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),允许程序员编写并允许比实际系统拥有的内存大得多的程序,这使得许多大型软件项目能够在具有有限内存资源的系统上实现。

                         而实际上,它通常被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

    Q10.常见的页面置换算法

     (1)FIFIO:选最旧的页来置换

     (2)OPT/MIN:最优置换    置换(未来)最长时间不会使用的页

    (3)LRU:  最近最少使用算法     置换最长时间没使用的页。(过去距离现在越远,越应该被替换

    (4)近似LRU:二次机会:当要选择一个页时,检查其引用位,如果其值为0,则直接置换该页。若引用位为1,则给该页第二次机会,并将其引用位清零,且其到达时间设为当前时间,并选择下一个FIFO页。

    (5) LFU MFU.

    Q11.动态链接库与静态链接库

     静态链接:函数库的一份拷贝是可执行文件的物理组成一部分。  可移植性强。但文件所占内存大。

     动态链接:可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库。    可移植性弱,但文件所占内存小。

    Q12.内部碎片与外部碎片

    内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

    外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

    Q13 物理地址 逻辑地址 线性地址 虚拟地址

    虚拟地址是指由程序产生的由段选择符合段内偏移地址组成的地址。这两部分组成的地址并没有直接访问物理内存,而是要通过分段地址的变换处理后才会对应到相应的物理内存地址。

    逻辑地址指由程序产生的段内偏移地址有时直接把逻辑地址当成虚拟地址,两者并没有明确的界限。。

    线性地址是指虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段基址就生成了一个线性地址如果启用了分页机制,那么线性地址可以再经过变换产生物理地址。若没有采用分页机制,那么线性地址就是物理地址。

    物理地址是指限制CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果

    Q14 锁的种类?如互斥锁,读写锁之类:

    (1)互斥锁(Mutex)

    加锁原语,排他性访问共享数据,用于保护临界区。可细分为递归锁/非递归锁。
    如果存在某个线程依然使用原先的程序(即不尝试获得mutex,而直接修改共享变量),互斥锁不能阻止其修改。所以,互斥锁机制需要程序员自己来写出完善的程序来实现互斥锁的功能(以下锁 一样)。

    image

    (2)条件变量(Condition Variable)

    互斥锁用于上锁,条件变量用于等待,条件变量的使用是与互斥锁共通使用的。

    条件变量学名叫管程

    image

    (3)读写锁

    读写锁也叫做 共享-独占锁,允许更高的并发度。

    互斥量要么是锁住状态,要么是不加锁状态,而且一次只有一个线程对其加锁。
    读写锁可以有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可用同时占有读模式的读写锁。

    image

    读写锁可以通过使用互斥锁和条件变量来实现。

    (4)自旋锁

        为了解决忙等待。当一个进程位于其临界区时,任何其他试图进入其临界区的进程都必须在其进入代码中连续地循环。这种连续循环在实际多道程序系统中是问题,因为只有一个处理器为多个进程所共享。忙等待浪费了CPU时钟,这本可以有效得为其他进程所使用,这种类型的信号量成为自旋锁,因为进程在等待锁时还在运行

    优点:进程在等待锁时不进行上下文切换,而上下文切换需花费相当长时间,因此适用于锁的占用时间短的情况。

               常用于多处理器系统,这样一个线程在一个处理器自旋,另一个线程可在另一个处理器上在其临界区内执行。

    自旋锁常作为底层原语,用于实现其他类型的锁。

    (5)记录锁

  • 相关阅读:
    8.14-T1村通网(pupil)
    8.10-Day2T3 镇守府
    8.10-Day2T2 吃喝大法好
    8.10-Day2T1最小值
    8.10-DayT3游走(wander)
    8.10-Day1T2圈(circle)
    8.10-Day1T1-数字(number)
    bzoj2462: [BeiJing2011]矩阵模板
    8.7-Day1T1
    k8s高可用部署后续:SLB
  • 原文地址:https://www.cnblogs.com/dzy521/p/9401661.html
Copyright © 2011-2022 走看看