【面试】操作系统

0 内核

1 用户态和内核态

操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序。根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:

1)用户态(user mode) : 运行用户程序。

2)内核态(kernel mode) : 运行操作系统程序,几乎可以访问计算机的任何(硬件)资源。

2 切换到内核态的方式

1)系统调用:是操作系统为应用程序提供能够访问到内核态资源的接口,通常由用户态主动调用。

2)异常:当 cpu 在执行用户态的应用程序时,发生了某些不可知的异常。 于是当前用户态的应用进程切换到处理此异常的内核程序中去。

3)硬件设备中断: 当硬件设备完成用户请求后,会向 cpu 发出相应的中断信号,这时 cpu 会暂停执行下一条即将要执行的指令,转而去执行与中断信号对应的应用程序。

1 进程

进程是指在系统中正在运行的一个应用程序

1 进程和线程的区别

1)进程是资源分配的最小单位,线程是CPU调度的最小单位。

2)进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据,使用相同的地址空间,因此 CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

3)线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

4)但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

2 作业、进程、线程、管程

1)作业:用户在一次解题或者一个事务处理过程中要求操作系统所做的工作的集合。它包括用户程序,所需要数据及控制指令等。作业是由一系列有序的步骤组成的。

2)进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同的数据集合上运行,或者一个程序在同一个数据集合上运行多次,都不是同一个进程。

3)线程:线程是进程的一个实体,是被系统独立调度和执行的基本单位。

4)管程:管程实际上是定义了一个数据结构以及能够在该数据结构上的一组操作,这组操作能并发进程,同步进程及改变管程中的数据。

3 进程、线程、协程区别

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

1)一个线程可以多个协程,一个进程也可以单独拥有多个协程。

2)线程进程都是同步机制,而协程则是异步。

3)协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

三者优缺点

1)无法利用多核资源:协程的本质就是单线程,它不能同时将单个CPU的多核用上,协程需要配合进程才能运行在多核CPU上。

2)进程堵塞操作会堵塞掉整个程序。

4 进程的调度算法

1)先来先服务(FCFS)

2)时间片轮转(RR)

3)短作业优先(SJF)

4)优先级调度

5)多级反馈队列调度算法

6)最短剩余时间优先

7)高响应比优先调度算法

5 进程的通信方式

1)管道(匿名管道、命名管道)

2)信号(Signal):是一种比较复杂的通信方式,用于通知接收进程某个已经发生事件

3)信号量(Semaphores):用于多进程对共享数据同步访问的计数器

4)消息队列

5)共享内存

6)本地套接字(Sockets):非网络套接字,仅用于本地进程间的通讯

6 线程的通信方式

1)互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。

1)信号量(Semphares):它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。

1)事件(Event):Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。

7 fork函数

在 Linux 中 fork 函数是非常重要的函数,它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。

当控制转移到内核代码后:

1)分配新的内存块和内核数据结构给子进程。

2)将父进程部分数据结构内容拷贝至子进程。

3)将子进程添加到系统进程列表。

4)fork返回开始调度器,调度。

8 linux中的进程和线程

1)进程通过 fork() 创建

2)线程通过 pthread_create() 函数创建

9 僵尸进程产生的原因

10 孤儿进程产生的原因

11 常用IO模型

1)关注消息通信机制:同步和异步

2)等待调用结果时的状态:阻塞和非阻塞

通常用户进程中的一个完整IO分为两个阶段:

用户空间<------------->内核空间<------------->设备空间

1)阻塞IO模型:应用进程被阻塞,直到数据从内核缓冲区复制到应用进程缓冲区中才返回。

2)非阻塞IO模型:进程发起 IO 系统调用后,内核返回一个错误码而不会被阻塞;应用进程可以继续执行,但是需要不断的执行系统调用来获知 I/O 是否完成。

3)IO复用模型:使用 select 或者 poll 等待数据,可以等待多个套接字中的任何一个变为可读。这一过程会被阻塞,当某一个套接字可读时返回,之后把数据从内核复制到进程中。

4)信号驱动IO模型:当进程发起一个 IO 操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用 IO 读取数据。

5)异步IO模型:当进程发起一个 IO 操作,进程返回不阻塞,但也不能返回结果;内核把整个 IO 处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据。

12 select、poll和epoll区别

select、poll 和 epoll 允许应用程序监视一组文件描述符,等待一个或者多个描述符成为就绪状态,从而完成 I/O 操作。

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024

epoll既然是对select和poll的改进,就应该能避免上述的三个缺点。
epoll的核心是3个API,核心数据结构是:1个红黑树和1个链表。

水平触发和边缘触发的区别

1)LT(level triggered,水平触发)是默认的工作方式,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果不作任何操作,内核还是会继续通知。可以保证了数据的完整输出,但资源开销大、效率低。

2)ET(edge-triggered,边缘触发)是高速工作方式,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知。

内核只会通知一次,大大减少了内核资源的浪费,提高效率。不能保证数据的完整,需要编写程序时充分考量。

2 内存

1 逻辑地址和物理地址

1)逻辑地址(LogicalAddress) :是指由程序产生的与段相关的偏移地址部分。页式存储器的逻辑地址由两部分组成:页号+页内地址。

2)在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址。物理地址就是绝对地址。

2 虚拟内存和物理内存

虚拟内存使得应用程序认为它拥有一个连续的地址空间,而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。

虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。虚拟内存让每个进程拥有一片连续完整的内存空间。

3 局部性原理

1)时间局部性 :如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。

2)空间局部性 :一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问。

操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块, 每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,会将缺失的部分从磁盘装入物理内存。

4 页面置换算法

1)OPT 页面置换算法(最佳页面置换算法):所选择的被换出的页面将是最长时间内不再被访问, 通常可以保证获得最低的缺页率。

2)FIFO(First In First Out) 页面置换算法(先进先出页面置换算法) : 总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。

3)LRU (Least Currently Used)页面置换算法(最近最久未使用页面置换算法):将最近最久未使用的页面换出。需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到 链表表头。这样就能保证链表表尾的页面是最近最久未访问的。力扣-实现LRU

4)LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法):该置换算法选择在之前时期使用最少的页面作为淘汰页。力扣-实现LFU

5)CLOCK 时钟置换算法(又称为最近未用 Not Recently Used, NRU 算法) :LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。

5 实现LRU算法

1)链表

2)链表+Hash

3)LinkedHashMap(inheritance or delegation 委派)

6 内存管理机制

1)块式管理 : 将内存分为几个固定大小的块,每个块中只包含一个进程。

2)页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。

3)段式管理 : 页式管理虽然提高了内存利用率,但是页式管理其中的页并无任何实际意义。 段式管理把主存分为一段段的,最重要的是段是有实际意义的,每个段定义了一组逻辑信息。 段式管理通过段表对应逻辑地址和物理地址。

4)段页式管理:段页式管理机制结合了段式管理和页式管理的优点。段页式管理机制就是把主存先分成若干段,每个段又分成若干页。

7 分段和分页

1)共同点
分页机制和分段机制都是为了提高内存利用率,较少内存碎片。
页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。

2)区别
页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。

Linux

1. 什么时一切皆文件

Linux中所有内容都是以文件的形式保存和管理,即:一切皆文件。

包括普通文件、目录(在win下称为文件夹)是文件。

硬件设备(键盘、硬盘、打印机)和套接字(socket)、网络通信等资源也都是文件。

所有的文件(资源)都存储在以根目录(/)为树根的树形目录结构中。

一切皆文件的利弊

1)这样做最明显的好处是,开发者仅需要一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。

2)不利之处在于,使用任何硬件设备都必须与根目录下某一目录执行挂载操作,否则无法使用。

目录挂载的含义
我们知道,本身Linux具有一个以根目录为根的树形文件目录结构,每个设备也同样如此,它们是相互独立的。如果我们想通过Linux上的根目录找到设备文件的目录结构,就必须将这两个文件系统目录合二为一,这就是挂载的真正含义。

2 查用Linux命令

1)pwd:显示当前所在位置

2)su:申请切换root用户,需要输入root用户密码(sudo su是当前用户暂时申请root权限,需要输入当前用户密码)

3)grep:要搜索的字符串 要搜索的文件 --color : 搜索命令,–color 代表高亮显示

4)ps -ef/ps aux:两者的区别是展示格式不同(System V风格和BSD风格)

5)kill -9 [pid] : 销毁进程(-9表示强制停止),先用ps查找进程,然后用kill掉

6)find :寻找

7)tar -zcvf :打包并压缩文件

8)tar -xvf 压缩文件 - C 解压的位置 : 解压压缩包

9)free : 显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存

10)wget : 是从远程下载的工具

11)vmstat : 虚拟内存性能监控、CPU 监控

12)top : 常用来监控Linux的系统状况,比如CPU、内存的使用,显示系统上正在运行的进程和load average(系统负载,就是进程队列的长度)

3 Ping中TTL含义

TTL是指生存时间(Time To Live)。用来计算数据包在路由器的消耗时间,因为现在绝大多数路由器的消耗时间都小于1s,而时间小于1s就当1s计算,所以数据包没经过一个路由器节点TTL都减一。

如ping百度服务器返回的数据包的TTL值为56(一般都是找2^n且离返回值最近的那个值),那么途中则经过了64-56=9个路由器。(64可以通过ping本地地址得到)

Guess you like

Origin blog.csdn.net/adminpd/article/details/112163718