系统结构
  • 系统结构(用户态和内核态、中断、系统调用)
  • 进程管理(进程和线程、线程和协程、进程间通信、多线程并发和同步)
  • 内存管理(虚拟内存、分页分段、内存映射、写时复制)
  • I/O系统(五种I/O模型、I/O多路复用)
  • Linux命令(ps、top、grep、netstate)

存储结构

1、为什么计算机要给储存结构分级?

不同级别的储存结构具有不同的访问速度,CPU访问CPU Cache的延时只需要几纳秒,访问物理内存的延时则100纳秒,速度相差100倍,访问磁盘延时就更高了,已经到毫秒级,但是访问速度越快的存储器,造价成本就越高,容量也小很多。

通过分级存储结构,可以将数据按照不同的访问速度、容量和成本要求进行管理,CPU Cache用于存储近期频繁访问的数据,内存用于存储当前执行的程序和数据,而硬盘则用于存储大量数据和长期存储。

1分秒= 10厘秒;1厘秒= 10 毫秒;1 毫秒= 1000微秒;1微秒= 1000纳秒;1纳秒= 1000皮秒。

2、CPU CacheL1 L2 L3读取数据的时间量级差距有多大?

差距不大,都是纳秒级别,CPU访问L1 Cache大概延时是1-2纳秒,访问L2 Cache大概延时5-10纳秒,访问L3 Cache大概延时10-30纳秒。

3、CPU Cache对程序性能的影响体现在哪?

程序具有局部性原理,如果一个数据被访问,那么附近的数据很可能也会被访问到,CPU Cache就是基于这个局部性原理,在访问数据的时候,如果访问的数据不在CPU Cache中,不会只存内存读这一个数据,而是会从内存连续加载数据到CPU Cache,这样相邻的数据都会被缓存在CPU Cache,那么程序在访问相邻数据的时候,相邻数据就可以直接在缓存中命中,无需访问内存,可以提高访问的效率。

内核态

1、什么是内核?

计算机是由各种外部硬件设备组成的,比如内存、CPU、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所有由内核作为中间人,让内核作为应用连接硬件设备的桥梁,应用程序只需要关心与内核交互,不用关心硬件的细节。

内核是操作系统的核心组件,负责管理系统资源、提供硬件抽象层、调度任务和实现进程间通信等功能。内核是系统中第一个加载的程序,并拥有最高的特权级别,控制整个系统的运行和资源分配。它与用户空间程序交互,提供系统调用的接口,实现了操作系统的基本功能。

2、内核态和用户态有什么区别?为什么要区分内核态和用户态?

在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃,比如:清空内存、修改时钟等。如果所有的程序代码都能直接使用这些指令,那么我们的系统可能一天死n次。

所以,CPU将指令分为特权指令和非特权指令。

CPU的特权分级从内到位为Ring0、Ring1、Ring2、Ring3 。根据分级机制,把进程的运行空间分为内核空间和用户空间。

  • 内核空间(Ring0)具有最高权限,可以直接访问所有硬件资源,比如硬盘、网卡、内存等。
  • 用户空间(Ring3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入内核态中,才能访问这些特权资源。

为什么要区分用户态和内核态呢?这是为了实现操作系统的核心功能和保证系统的稳定性、安全性以及资源的合理分配。通过区分内核态和用户态,操作系统可以:

  • 提供一种安全机制,限制用户程序对系统资源的直接访问,防止恶意程序对系统造成破坏。
  • 实现操作系统的核心功能,如管理进程、文件系统、内存管理等,这些功能需要再内核态下进行。
  • 实现多任务并发执行,通过在内核态和用户态之间进行,操作系统可以在不同应用程序之间共享处理器资源,实现任务的并发执行。

3、什么时候会由用户态陷入内核态?

  • 应用程序执行系统调用的时候,会触发一个软件中断(比如 int指令),会进入内核态执行相应的内核代码,完成后再返回用户态。(用户态主动要求切换到内核态的一种方式)
  • 当应用程序发生异常情况,如访问非法内存、除零错误等,CPU会触发一个异常,将控制权转移到内核态的异常处理程序中。
  • 当系统接收到外部设备的中断信号,如硬件设备的输入输出请求、定时器中断等,处理器会中断当前的执行,进入内核态执行相应的中断处理程序。

4、系统调用的过程?

  • 执行系统调用的时候,先将系统调用名称转换为系统调用号,接着将系统调用号和请求的参数放到寄存器中,然后执行软件中断命令(int $0x80指令),CPU会从用户态切换到内核态。
  • CPU跳转到中断处理程序,先将当前用户态的寄存器(用户态的代码段、数据段、保存参数的寄存器)压入到内核栈中,接着根据系统调用号从系统调用表中找到对应的系统调用函数,并将寄存器中保存的参数取出,作为函数参数,然后在内核中执行系统调用函数。
  • 执行完系统调用后,执行中断返回指令(iret指令),内核栈会弹出之前保存的寄存器,将原来用户态保存的现场恢复回来,包含代码段、指令指针寄存器等。这时候CPU恢复到用户态,用户态进程恢复执行。

一次系统调用的过程中,会发生两次CPU上下文切换(CPU上下文,就是CPU寄存器和程序计数器):

  • 第一次CPU上下文切换是从用户态到内核态:CPU寄存器里原来用户态的指令位置,需要先保存起来。接着,为了执行内核态代码,CPU寄存器需要更新为内核态指令的新位置。最后才是跳转到内核态运行内核任务。
  • 第二次CPU上下文切换是从内核态切换到用户态:CPU寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。

5、用户态和内核态是如何切换的?

linux系统中每个进程都有两个栈,分别是用户栈和内核栈,当应用程序在用户态的时候,就会使用用户栈,当应用程序运行在内核态的时候,就会使用内核栈。

内核态与用户态的相互转换,最重要的就是用户栈和内核栈的切换。

1、用户栈到内核栈

  • 执行中断指令(int $0x80指令),中断发生时,CPU去一个特定的结构中(如TSS),获取该进程的内核栈的地址信息,也就是内核栈的段选择子和栈顶指针(描述内核栈在内存的那个地址空间),并分别送入ss寄存器和rsp寄存器,这时候CPU就指向了该进程的内核栈的栈顶位置,这就完成了用户态到内核态的一次栈的切换。(解析ss、rsp寄存器的作用
  • 然后,IP寄存器(指令指针寄存器)跳入终中断服务程序开始执行,中断服务程序会把用户态的所有寄存器压入到内核栈中,如下,CPU自动将用户态栈的段选择子ss3和栈顶指针rsp3都放到内核态栈里。这里3表示特权级,0,3 。

2、内核栈到用户栈

  • 当中断结束时,中断服务程序会从内核栈里将CPU寄存器的值全部恢复,最后执行’iret’指令。
  • 将ss3、rsp3弹出栈,并且将这个值分别送到ss和rsp寄存器中,这时候CPU就指向了该进程的用户态的栈顶位置,这样就完成了从内核栈到用户栈的一次切换。
  • 内核栈的ss0和rsp0也会被保存到前面所说的一个特定结构(如TSS)中,以供下次切换时使用。

6、为什么用户态和内核态的相互切换过程开销较大?

中断

1、什么是中断?为什么要有中断?

2、什么是硬件中断和软件中断?

3、什么是硬中断和软中断?

4、为什么要有软中断?

回答:

linux启动

1、说一下linux启动流程

上一篇
下一篇