目录
5.1.3系统调用read()/write(),内核具体做了哪些事情⭐⭐
5.1.7 Bootloader多数有两个阶段的启动过程:⭐⭐⭐
5.1.8 linux的内核是由bootloader装载到内存中的?⭐⭐⭐
目录
5.1.3系统调用read()/write(),内核具体做了哪些事情⭐⭐
5.1.7 Bootloader多数有两个阶段的启动过程:⭐⭐⭐
5.1.8 linux的内核是由bootloader装载到内存中的?⭐⭐⭐
5.1.11为什么自旋锁不能睡眠 而在拥有信号量时就可以?⭐⭐⭐⭐
5.2.2 一个程序从开始运行到结束的完整过程(四个过程)⭐⭐⭐⭐⭐
5.2.5死锁的原因、条件 创建一个死锁,以及如何预防⭐⭐⭐⭐⭐
5.2.11 Linux 操作系统挂起、休眠、关机相关命令⭐⭐
5.1.11为什么自旋锁不能睡眠 而在拥有信号量时就可以?⭐⭐⭐⭐
5.1 Linux内核相关
-
5.1.1 Linux内核的组成⭐⭐
内存管理:主要完成如何合理有效的管理整个系统的物理内存,同时快速响应内核各个子系统堆内存分配的请求。
进程管理:主要控制系统进程对CPU的访问。当需要某个进程运行时,由进程调度器根据基于优先级的调度算法启动新的进程。:Linux支持多任务运行,那么如何在一个单CPU上支持多任务呢?这个工作就是由进程调度管理来实现的。在系统运行时,每个进程都会分得一定的时间片,然后进程调度器根据时间片的不同,选择每个进程依次运行。
进程间通信:主要用于控制不同进程之间在用户空间的同步、数据共享和交换。一般情况下,当一个进程等待硬件操作完成时,会被挂起,当硬件操作完成,进程恢复执行。
虚拟文件系统:虚拟文件系统用一个通用的文件模型表示了各种不同的文件系统,这个文件模型屏蔽了很多具体文件系统的差异,使Linux内核支持很多不同的文件系统,这个文件系统可以分为逻辑文件系统和设备驱动程序:逻辑文件系统指Linux所支持的文件系统,例如ext2、ext3和fat等;设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
网络接口:网络接口提供了对各种网络标准的实现和各种网络硬件的支持。网络接口一般分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序则主要负责与硬件设备进行通信,每一种可能的网络硬件设备都有相应的设备驱动程序。
-
5.1.2用户空间与内核通信方式有哪些?⭐⭐⭐⭐⭐
系统调用:提供特定的用户空间与内核空间的信息传递
信号:内核空间出现一些异常时候会发送信号给进程,如SIGSEGV、SIGILL、SIGPIPE等。
/proc:proc可以读取内核空间的配置信息和运行状态并且设置部分属性的值。
文件:可以通过指定文件的读写操作来实现通信,需要循环检测来实现
netlink:类似socket通信方式,可以读写大量的数据
ioctl:可以实现数据量比较少时的通信。
-
5.1.3系统调用read()/write(),内核具体做了哪些事情⭐⭐
内核空间,scull_read() 通过file_operations结构与scull_fops->read联系
用户空间read()–>内核空间sys_read()–>scull_fops.read–>scull_read();
read 系统调用发出到结束处理的过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。
Read 系统调用在用户空间中的处理过程
Read 系统调用,当调用发生时,库函数在保存 read 系统调用号以及参数后,陷入 0x80 中断。这时库函数工作结束。Read 系统调用在用户空间中的处理也就完成了。
Read 系统调用在核心空间中的处理过程
0x80 中断处理程序接管执行后,先检察其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理 read 系统调用的内核函数 sys_read ,最后传递参数并运行 sys_read 函数。至此,内核真正开始处理 read 系统调用(sys_read 是 read 系统调用的内核入口)。
Read 系统调用在核心空间中处理的层次模型
对于磁盘的一次读请求,首先经过虚拟文件系统层(vfs layer),其次是具体的文件系统层(例如 ext2),接下来是 cache 层(page cache 层)、通用块层(generic block layer)、IO 调度层(I/O scheduler layer)、块设备驱动层(block device driver layer),最后是物理块设备层(block device layer)
-
5.1.4系统调用的作用⭐⭐⭐⭐⭐
系统调用可以为用户空间提供访问硬件资源的统一接口;
系统调用可以对系统进行保护,保证系统的稳定和安全
-
5.1.5内核态,用户态的区别⭐⭐⭐⭐⭐
内核态和用户态是操作系统中的两个不同运行级别,它们之间存在以下区别:
权限不同:内核态拥有更高的权限,可以访问系统的所有资源,而用户态只能访问受限的资源,例如内存、硬件设备等。
访问资源:在内核态下,操作系统可以直接访问系统资源,而不需要通过用户程序的请求,而在用户态下,用户程序需要通过系统调用才能访问系统资源。
运行空间:内核态运行在内核空间,拥有系统的全部内存空间,而用户态运行在用户空间,只拥有有限的内存空间。
任务执行顺序:内核态是抢占式执行,优先级更高,可以中断用户态任务的执行,而用户态是协作式执行,优先级较低。
驱动程序:内核态下运行的是驱动程序,用于管理硬件设备的接入和访问,而用户态下运行的则是应用程序和库函数。
内核态和用户态之间的区别是为了保证系统的安全性和稳定性。通过限制内核态的访问权限和资源,可以防止恶意程序对系统造成损害,同时也提供了更好的灵活性和可扩展性。
-
5.1.6 bootloader内核 根文件的关系⭐⭐⭐⭐
BootLoader、内核和根文件系统是操作系统启动的三个重要组成部分,它们之间的关系如下:
BootLoader:BootLoader是操作系统启动时首先执行的程序,它的作用是加载内核并将控制权交给内核。BootLoader通过读取内核映像文件,将其加载到内存中,然后跳转到内核的入口地址,使内核开始执行。
内核:内核是操作系统的核心部分,它负责管理系统的进程、内存、设备驱动等核心功能。在内核启动后,它会检查文件系统并挂载根文件系统到系统中。
根文件系统:根文件系统是操作系统的文件系统,它包含了操作系统的基本文件和目录。在内核启动后,它会检查文件系统并挂载根文件系统到系统中,使应用程序能够访问和操作这些文件和目录。
在操作系统的启动过程中,BootLoader会加载内核并将控制权交给内核,内核会初始化系统的各个组件,然后检查和挂载根文件系统到系统中。这样,应用程序就可以通过根文件系统访问和操作文件和目录。因此,BootLoader、内核和根文件系统之间的关系是相互依存、缺一不可的。
-
5.1.7 Bootloader多数有两个阶段的启动过程:⭐⭐⭐
对于Bootloader的启动过程分为两个阶段stage1和stage2。
stage1全部由汇编编写,它的主要工作是
(1)初始化硬件设备
(2)为加载Bootlodader的stage2准备RAM空间
(3)拷贝Bootloader的stage2到RAM空间
(4)设置好堆栈段为stager2的C语言环境做准备。
stage2全部由C语言编写,其的主要工作是
(1)初始化本阶段要使用到的硬件设备
(2)将内核映像和根文件系统映像从 flash 上读到RAM
(3)调用内核
-
5.1.8 linux的内核是由bootloader装载到内存中的?⭐⭐⭐
-
5.1.9为什么需要BootLoader⭐⭐⭐⭐
BootLoader就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。对于Bootloader的启动过程又分为两个阶段stage1和stage2。
stage1全部由汇编编写,它的主要工作是(1)初始化硬件设备、(2)为加载Bootlodader的stage2准备RAM空间(3)拷贝Bootloader的stage2到RAM空间(4)设置好堆栈段为stager2的C语言环境做准备。
stage2全部由C语言编写,其的主要工作是(1)初始化本阶段要使用到的硬件设备(2)将内核映像和根文件系统映像从 flash 上读到RAM (3)调用内核
每种不同的CPU体系结构都有不同的Bootloader。除了依赖于CPU的体系结构外,Bootloader还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片类型等。对于两块不同的开发板而言,即使他们是基于同一种CPU而构建的,但是如果他们的硬件资源或配置不一致的话,想要在一块开发板上运行Bootloader程序也能在另一块板子上运行,还是需要做修改。
-
5.1.10 Linux内核同步方式总结⭐⭐⭐⭐
1、中断屏蔽
在单CPU范围内避免竞态的一种简单方法是在进入临界区之前屏蔽系统的中断。由于linux内核的进程调度等操作都依赖中断来实现,内核抢占进程之间的并发也就得以避免了。
2、原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。
3、自旋锁
4、读写自旋锁
5、顺序锁
6、信号量
7、读写信号量
8、BKL(大内核锁)
9、Seq锁
-
5.1.11为什么自旋锁不能睡眠 而在拥有信号量时就可以?⭐⭐⭐⭐
自旋锁禁止处理器抢占;而信号量不禁止处理器抢占
-
5.1.12 linux下检查内存状态的命令⭐⭐⭐
在Linux下,可以使用以下命令来检查内存状态:
free命令:可以显示系统内存状态,包括物理内存、已使用的内存、空闲内存、缓存等。
vmstat命令:可以显示虚拟内存状态,包括内存使用情况、缓存、进程状态等。
top命令:可以实时查看系统内存使用情况,包括内存使用率、进程状态、CPU使用率等。
htop命令:可以以更为详细的格式显示系统内存使用情况,包括每个进程的内存使用情况、CPU使用率等。
sar命令:可以生成系统性能报告,包括内存使用情况、CPU使用率、磁盘使用情况等。
dstat命令:可以显示系统运行状态,包括内存使用情况、CPU使用率、磁盘使用情况等。
cat /proc/meminfo:
这些命令可以帮助用户实时查看系统内存状态,并对系统性能进行监控和分析。
-
5.2 其他操作系统
-
5.2.1大小端的区别以及各自的优点,哪种时候用⭐⭐⭐⭐⭐
所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
大端小端没有谁优谁劣,各自优势便是对方劣势:
小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
大端模式 :符号位的判定固定为第一个字节,容易判断正负。
一般操作系统都是小端,而通讯协议是大端的。I2C和SPI都是从高字节开始发送数据。
-
5.2.2 一个程序从开始运行到结束的完整过程(四个过程)⭐⭐⭐⭐⭐
1)预处理阶段:从源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。条件编译,头文件包含,宏替换的处理,生成.i文件。
2)编译阶段:将经过预处理后的预编译文件转换成汇编代码,生成.s汇编文件
3)汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标.o文件
4)链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件。
-
5.2.3什么是堆,栈,内存泄漏和内存溢出?⭐⭐⭐⭐
堆(heap):是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
栈(stack):是自动分配变量,以及函数调用的时候所用到的一些空间,地址是由高向低减少的。
内存溢出(out of memory):内存不够
内存泄漏(memory leak):是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统资源的浪费,导致程序运行速度缓慢甚至系统崩溃等严重后果。
-
5.2.4堆和栈的区别⭐⭐⭐⭐⭐
1)栈是一种线性数据结构,而堆则是一种树状的数据结构;
2)栈的内存分配方式是自动的,而堆的内存分配与释放需要手动管;3)栈的内存分配速度相对较快,而堆的内存分配速度较慢;
4)栈的大小是固定的,而堆的大小可以根据需要进行动态调整;
5)栈适用于管理局部变量、函数调用和递归等,而堆适用于需要长时间存储的数据、动态数据结构和大型数据等。
-
5.2.5死锁的原因、条件 创建一个死锁,以及如何预防⭐⭐⭐⭐⭐
死锁:死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行。
产生死锁的四个必要条件:
1)互斥条件:线程对资源的占有是排他性的,一个资源只能被一个线程占有,直到释放。
2)请求和保持条件:一个线程对请求被占有资源发生阻塞时,对已经获得的资源不释放。
3)循环等待条件:发生死锁时,线程进入死循环,永久阻塞
4)不可剥夺条件:一个线程在释放资源之前,其他的线程无法剥夺占用。
产生死锁的原因:
1)竞争不可抢占性资源(哲学家问题)
p1已经打开F1,想去打开F2,p2已经打开F2,想去打开F1,但是F1和F2都是不可抢占的,这是发生死锁。
2)竞争可消耗资源引起死锁
进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1给p2,p1接收p3的消息m3,p2接收p1的m1,发m2给p3,p3,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先接收信息就会产生死锁。
3)进程推进顺序不当(银行家算法)
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
预防死锁:
1)资源一次性分配:(破坏请求和保持条件)
2)资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
避免死锁:
系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
解除死锁:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
-
5.2.6硬链接与软链接的区别;⭐⭐⭐⭐⭐
软链接 | 硬链接 | |
inode | 软链接源文件&链接文件拥有不同的inode号,表明他们是两个不同的文件 | 硬链接源文件和链接文件共用一个inode号,就像一个文件有多个文件名,说明他们是同一个文件 |
文件属性 | 软链接明确写出了是链接文件 | 硬链接没有写出来,因为在本质上硬链接文件和源文件是完全平等关系 |
跨越文件系统建立 | 支持 | 不支持 |
链接数目 | 软链接的链接数目不会增加,文件大小是不一样的(可理解为快捷方式和对应源文件之间的关系) | 硬链接文件显示的大小是跟源文件一样的 |
1)硬链接是同一个文件,多个名称;软连接是不同文件
2)硬链接不支持跨分区,软链接支持跨分区
3)硬链接不支持对目录创建,软链接支持对目录的创建
4)删除某一个硬链接,另一个硬链接不影响使用;原始文件和软链接有依赖关系,原始文件删了,软链接就失效了
5)硬链接inode编号相同;软链接不同
6)删除一个硬链接,硬链接的链接数会有变化;删除一个软链接,链接数不会变化,删除的相当于是一个文件或快捷方式
7)硬链接的相对路径是相对的当前工作目录的相对路径;软链接的原始文件路径是相对的软链接的相对路径,而不是相对当前工作目录
8)硬链接文件类型是原来是什么就是什么;软链接的文件类型是L
9)硬链接用ln实现;软链接用ln -s实现
-
5.2.7虚拟内存,虚拟地址与物理地址的转换⭐⭐⭐⭐
快表中的内容的选择
单级页表的问题:
二级页表:
内存分段管理
段表:
分段分页对比
段页式存储管理
-
5.2.8计算机中,32bit与64bit有什么区别⭐⭐⭐
-
5.2.9中断和异常的区别⭐⭐⭐⭐⭐
中断是指 CPU 对系统发生某事件时的这样一种响应:
CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行。
下图 表示中断时 CPU 的活动轨迹。还可进一步把中断分为外中断和内中断。
外中断——就是我们指的中断——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
内中断——就是异常——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。
异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
中断则是由于系统中某事件引起的,该事件与现行指令无关。
分类 | 中断 | 异常 |
产生地点 | 处理器外部,由与运行程序无关的中断信号触发,中断时间系统无法得知 | 处理器内部,CPU控制单元产生 |
能否被屏蔽 | 高优先级的中断可以屏蔽低优先级的中断 | 不可被屏蔽 |
处理程序能否被阻塞 | 不能被阻塞,处理器需要及时响应其他中断信号 | 可以被阻塞 |
CPU | 中断与CPU异步,无论处理器处于什么状态都需处理外部中断请求 | 异常与CPU同步,基本上发生在用户态,内核态唯一发生的异常是“缺页异常” |
能否嵌套 | 允许嵌套,一般不超过3重,重数多了影像系统性能 | 大多为一重 |
彼此之间的影响 | 中断过程中不会产生异常 | 异常处理过程中可能会产生中断 |
-
5.2.10中断怎么发生,中断处理大概流程⭐⭐⭐⭐
当CPU收到中断或者异常的信号时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理程序中,在完成对这个信号的处理后再跳回到刚才被打断的程序或任务中
-
5.2.11 Linux 操作系统挂起、休眠、关机相关命令⭐⭐
挂起是一种省电模式,系统将机器的硬盘、显示器等外部设备停止工作,而CPU、内存仍然工作,等待用户随时唤醒,再次唤醒需要按键盘上的键数次。
体眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,使CPU也停止工作,当再次使用时需按开关机键,机器将会恢复到您的执行休眠时的状态,而不用再次执行启动操作系统复杂的过程。
待机是将当前处于运行状态的数据保存在内存中,机器只对内存供电,而硬盘、屏幕和CPU等部件则停止供电。由于数据存储在速度快的内存中,因此进入等待状态和唤醒的速度比较快。不过这些数据是保存在内存中,如果断电则会使数据丢失。
操作 | Code | Other code |
立即关机 | halt | init 0 |
定时/延时关机 | shutdown -h 10:00 | |
重启 | reboot | init 6 |
睡眠 | sudo pm-hibernate | echo "disk" > /sys/power/state |
待机/挂起 | sudo pm-suspend | echo “mem” > /sys/power/state |
-
5.2.12数据库为什么要建立索引,以及索引的缺点⭐⭐
索引的优点:
① 建立索引的列可以保证行的唯一性,生成唯一的rowId
② 建立索引可以有效缩短数据的检索时间
③ 建立索引可以加快表与表之间的连接
④ 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
索引的缺点:
① 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长