Linux经典面试题目---系统类

一、虚拟内存是什么
为了防止内存不足导致死机,系统会在硬盘上开辟一块空间,linux是一个固定的分区,windows是一个文件,就叫作虚拟内存。
系统会按照某种策略在适当的时候将物理内存中的部分数据移动到虚拟内存中,以节省物理内存。linux是当物理内存不够用的时候,使用虚拟内存。windows会将长时间未使用的数据移动到虚拟内存。
二、用户态和内核态能解释一下吗
1、当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
2、从特权级上解释就是:当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;
反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。
3、用户态切换到内核态的3种方式

  • a. 系统调用
    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断

  • b. 异常
    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

  • c.外围设备的中断
    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
    这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

三、页面置换算法有哪些? LRU 实现策略
1)最佳置换算法(OPT)(理想置换算法)
2)先进先出置换算法(FIFO)
3)最近最久未使用(LRU)
4)Clock置换算法(LRU算法的近似实现)
5)最少使用(LFU)置换算法
7)工作集时钟算法
8)老化算法(非常类似LRU的有效算法)
9)NRU(最近未使用)算法
10)第二次机会算法
LRU算法实现策略
LRU 置换将每个页面与它的上次使用的时间关联起来。当需要置换页面时,LRU选择最长时间没有使用的页面。这种策略可当作在时间上向后看而不是向前看的最优页面置换算法。
LRU 策略通常用作页面置换算法,并被认为是不错的策略。它的主要问题是如何实现 LRU 置换。LRU 页面置换算法可能需要重要的硬件辅助。它的问题是,确定由上次使用时间定义的帧的顺序。两个实现是可行的。

  • 第一种方法是使用计数器:在最简单的情况下,为每个页表条目关联一个使用时间域,并为CPU添加一个逻辑时钟或计数器。每次内存引用都会递增时钟。每当进行页面引用时,时钟寄存器的内容会复制到相应页面的页表条目的使用时间域。这样,我们总是有每个页面的最后引用的“时间”,我们置换具有最小时间的页面。这种方案需要搜索页表以查找LRU页面,而且每次内存访问都要写到内存(到页表的使用时间域)。当页表更改时(由于 CPU 调度),还必须保留时间。时钟溢出也要考虑。

  • 实现LRU置换的另一种方法是采用页码堆栈。每当页面被引用时,它就从堆栈中移除并放在顶部。这样,最近使用的页面总是在堆栈的顶部,最近最少使用的页面总是在底部。因为必须从堆栈的中间删除条目,所以最好通过使用具有首指针和尾指针的双向链表来实现这种方法。

四、 什么是死锁 ?
(一)死锁得概念
死锁是两个或两个以上的进程中的每一个都在等待其中的其它进程释放资源而被封锁,它们都无法向前推进,陷入永久等待状态,这种现象称为死锁。
(二)特点
1、占有一定的资源,等待对方释放资源。
2、获得对方资源前不释放自己占有的资源。
(三)死锁的起因
1、资源有限系统提供的资源数少于并发进程所需要的资源数。
2、资源竞争进程的并发性造成对资源的竞争使用。
(四)产生死锁的四个必要条件
1、互斥条件:一个资源每次只能被一个进程使用;
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;  3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;  
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;
五、文件操作(fwrite 和 write 区别)
fwrite是带缓冲的,write不带缓冲。
举例说明如下:
如果文件的大小是8k。
若用write,且只分配了2k的缓存,则要将此文件读入需要做4次系统调用。
若用fwrite,则系统自动分配缓存,则读入此文件只要一次系统调用。
也就是用write要读4次磁盘,而用fwrite则只要读1次磁盘。所以fwrite的效率比write要高4倍。
另外,如果程序对内存有限制,则用write比较好。
系统调用write的效率取决于用户buff的大小和要写入的总数量,如果buff太小,进入内核空间的次数会增加,效率就低下。而fwrite会自动完成缓存分配任务,减少了实际出现的系统调用,所以效率比较高。
六、库函数与系统调用函数比较
1、系统调用函数
系统调用是通向操作系统本身的接口,是面向底层硬件的。通过系统调用,可以使得用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互,是操作系统留给应用程序的一个接口。
实际上使用系统调用会影响系统的性能,在执行调用时的从用户态切换到内核态,再返回用户态会有系统开销。为了减少开销,因此需要减少系统调用的次数,并且让每次系统调用尽可能的完成多的任务。硬件也会限制对底层系统调用一次所能写的数据块的大小。为了给设备和文件提供更高层的接口,Linux系统提供了一系列的标准函数库。使用标准库函数,可以高效的写任意长度的数据块,库函数在数据满足数据块长度要求时安排执行底层系统调用。
2、库函数
库函数是把函数放到库里,供别人使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。一般放在.lib文件中。库函数调用则是面向应用开发的,库函数可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。(由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口)。
七、中断机制, 软中断和硬中断,中断处理程序为什么分为上半部分和下半部分
1、软中断和硬中断
①硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无面外部施加中断请求信号,因此中断的发生不是随机的而是由程序安排好的。
②硬中断的中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断的中断响应周期,CPU不需发中断回合信号。
③硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H);软中断的中断号由指令直接给出,无需使用中断控制器。
④硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。
2、为什么分为上下半部分
目的就是提高系统的响应能力和并发能力。通俗一点来讲:当一个中断产生,调用该中断对应的处理程序(上半部)然后告诉系统,对应的后半部可以执行了,然后中断处理。
如果该任务对时间比较敏感,将其放在上半部中执行。
如果该任务和硬件相关,一般放在上半部中执行。
如果该任务要保证不被其他中断打断,放在上半部中执行(因为这是系统关中断)。
其他不太紧急的任务, 一般考虑在下半部执行。下半部分并不需要指明一个确切时间,只要把这些任务推迟一点,让它们在系统不太忙并且中断恢复后执行就可以了。通常下半部分在中断处理程序一返回就会马上运行。
八、操作系统 P V 操作是什么意思?
1、PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
P(S):①将信号量S的值减1,即S=S-1;②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
2、PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。
九、是否了解过 schedule 函数,大概说一下调度的流程?
linux 调度的核心函数为schedule,schedule 函数封装了内核调度的框架。细节实现上调用具体的调度类中的函数实现。schedule 函数主要流程为:
1,将当前进程从相应的运行队列中删除;
2,计算和更新调度实体和进程的相关调度信息;
3,将当前进程重新插入到调度运行队列中,对于CFS调度,根据具体的运行时间进行插入而对于实时调度插入到对应优先级队列的队尾;
4,从运行队列中选择运行的下一个进程:5,进程调度信息和上下文切换;
十、实地址模式和保护地址模式的原理
1、实模式是指寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,寻址时将段寄存器的值左移4位加上偏移地址,得到1MB空间内的地址。它是CPU启动的时候的模式,这时候就相当于一个速度超快的8086。
2、保护模式,因为要做到与之前的机器兼容,段寄存器还是16位,地址总线增加,为了能寻址更多的空间,就不能把段寄存器的内容当成实模式下的那种用法,它的值会被当成一个索引,用来在描述符表中找相应的段描述符,进而找到段基址,从而能寻址更大的地址范围。
3、保护模式同实模式的根本区别是:进程内存受保护与否。
实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。

你可能感兴趣的:(linux,面试题)