Linux面试专题

Linux面试专题

  • 1 Linux中主要有哪几种内核锁?
  • 2 Linux 中的用户模式和内核模式是什么含意?
  • 3 怎样申请大块内核内存?
  • 4用户进程间通信主要哪几种方式?
  • 5通过伙伴系统申请内核内存的函数有哪些?
    • 6) Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)
    • 7) 对文件或设备的操作函数保存在那个数据结构中?
    • 8) Linux 中的文件包括哪些?
    • 9) 创建进程的系统调用有那些?
    • 10) 调用schedule()进行进程切换的方式有几种?
    • 11) Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的?
    • 12) 进程调度的核心数据结构是哪个?
    • 13) 如何加载、卸载一个模块?
    • 14) 模块和应用程序分别运行在什么空间?
    • 15) Linux 中的浮点运算由应用程序实现还是内核实现?
    • 16) 模块程序能否使用可链接的库函数?
    • 17) TLB 中缓存的是什么内容?
    • 18) Linux 中有哪几种设备?
    • 19) 字符设备驱动程序的关键数据结构是哪个?
    • 20) 设备驱动程序包括哪些功能函数?
    • 21) 如何唯一标识一个设备?
    • 22) Linux 通过什么方式实现系统调用?
    • 23) Linux 软中断和工作队列的作用是什么?

1 Linux中主要有哪几种内核锁?

Linux 的同步机制不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡;

伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也越来越复杂。 Linux 的内核锁主要是自旋锁和信号量。

自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。

Linux 中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。 Linux 内核中的同步机制:原子操作、信号量、读写信号量和自旋锁的API,另外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序锁。

2 Linux 中的用户模式和内核模式是什么含意?

MS-DOS等操作系统在单一的CPU模式下运行,但是一些类Unix的操作系统则使用了双模式,可以有效地实现时间共享。在Linux机器上,CPU要么处于受信任的内核模式,要么处于受限制的用户模式。除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中。

内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。

在2.4和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占。除非
发生以下两种情况,否则内核模式代码可以一直独占CPU:
(1) 它自愿放弃CPU;
(2) 发生中断或异常。

2.6 内核引入了内核抢占,大多数内核模式的代码也可以被抢占。

3 怎样申请大块内核内存?

在Linux 内核环境下,申请大块内存的成功率随着系统运行时间的增加而减少,虽然可以通过vmalloc 系列调用申请物理不连续但虚拟地址连续的内存,但毕竟其使用效率不高且在32位系统上vmalloc的内存地址空间有限。所以,一般的建议是在系统启动阶段申请大块内存,但是其成功的概率也只是比较高而已,而不是100%。如果程序真的比较在意这个申请的成功与否,只能退用“启动内存”(Boot Memory)。下面就是申请并导出启动内存的一段示例代码:

void* x_bootmem = NULL; 
EXPORT_SYMBOL(x_bootmem); 
unsigned long x_bootmem_size = 0; 
EXPORT_SYMBOL(x_bootmem_size); 
static int __init x_bootmem_setup(char *str) 
{ 
x_bootmem_size = memparse(str, &str); 
x_bootmem = alloc_bootmem(x_bootmem_size); 
printk(“Reserved %lu bytes from %p for x\n”, x_bootmem_size, x_bootmem); 
return 1; 
} 
__setup(“x-bootmem=, x_bootmem_setup); 

可见其应用还是比较简单的,不过利弊总是共生的,它不可避免也有其自身的限制:

内存申请代码只能连接进内核,不能在模块中使用。
被申请的内存不会被页分配器和slab分配器所使用和统计,也就是说它处于系统的可见内存之外,即使在将来的某个地方你释放了它。

一般用户只会申请一大块内存,如果需要在其上实现复杂的内存管理则需要自己实现。
在不允许内存分配失败的场合,通过启动内存预留内存空间将是我们唯一的选择。

4用户进程间通信主要哪几种方式?

(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

(3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

(4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

(5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

(6)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

(7)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V 的变种都支持套接字。

5通过伙伴系统申请内核内存的函数有哪些?

在物理页面管理上实现了基于区的伙伴系统(zone based buddy system)。对不同区的内存使用单独的伙伴系统(buddy system)管理,而且独立地监控空闲页。相应接口
alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。

6) Linux 虚拟文件系统的关键数据结构有哪些?(至少写出四个)

struct super_block,struct inode,struct file,struct dentry;

7) 对文件或设备的操作函数保存在那个数据结构中?

struct file_operations

8) Linux 中的文件包括哪些?

执行文件,普通文件,目录文件,链接文件和设备文件,管道文件。

9) 创建进程的系统调用有那些?

clone(),fork(),vfork();系统调用服务例程:sys_clone,sys_fork,sys_vfork;

10) 调用schedule()进行进程切换的方式有几种?

1.系统调用 do_fork();
2.定时中断 do_timer();
3.唤醒进程 wake_up_process
4.改变进程的调度策略 setscheduler();
5.系统调用礼让 sys_sched_yield();

11) Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的?

Liunx 调度程序是根据根据进程的动态优先级来调度进程的,但是动态优先级又是根据静态
优先级根据算法计算出来的,两者是两个相关联的值。因为高优先级的进程总是比低优先级
的进程先被调度,为防止多个高优先级的进程占用CPU资源,导致其他进程不能占有CPU,
所以引用动态优先级概念

12) 进程调度的核心数据结构是哪个?

struct runqueue

13) 如何加载、卸载一个模块?

insmod 加载,rmmod卸载

14) 模块和应用程序分别运行在什么空间?

模块运行在内核空间,应用程序运行在用户空间

15) Linux 中的浮点运算由应用程序实现还是内核实现?

应用程序实现,Linux中的浮点运算是利用数学库函数实现的,库函数能够被应用程序链接后
调用,不能被内核链接调用。这些运算是在应用程序中运行的,然后再把结果反馈给系统。
Linux 内核如果一定要进行浮点运算,需要在建立内核时选上math-emu,使用软件模拟计算
浮点运算,据说这样做的代价有两个:用户在安装驱动时需要重建内核,可能会影响到其他的
应用程序,使得这些应用程序在做浮点运算的时候也使用math-emu,大大的降低了效率。

16) 模块程序能否使用可链接的库函数?

模块程序运行在内核空间,不能链接库函数。

17) TLB 中缓存的是什么内容?

TLB,页表缓存,当线性地址被第一次转换成物理地址的时候,将线性地址和物理地址的对应放到TLB中,用于下次访问这个线性地址时,加快转换速度。

18) Linux 中有哪几种设备?

字符设备和块设备。网卡是例外,他不直接与设备文件对应,mknod系统调用用来创建设备文件。

19) 字符设备驱动程序的关键数据结构是哪个?

字符设备描述符struct cdev,cdev_alloc()用于动态的分配cdev描述符,cdev_add()用于注册一个cdev描述符,cdev包含一个struct kobject 类型的数据结构它是核心的数据结构

20) 设备驱动程序包括哪些功能函数?

open(),read(),write(),llseek(),realse();

21) 如何唯一标识一个设备?

Linux 使用一个设备编号来唯一的标示一个设备,设备编号分为:主设备号和次设备号,一般主设备号标示设备对应的驱动程序,次设备号对应设备文件指向的设备,在内核中使用dev_t来表示设备编号,一般它是32位长度,其中12位用于表示主设备号,20位用于表示次设备号,利用MKDEV(int major,int minor);用于生成一个dev_t 类型的对象。

22) Linux 通过什么方式实现系统调用?

靠软件中断实现的,首先,用户程序为系统调用设置参数,其中一个编号是系统调用编号,参数设置完成后,程序执行系统调用指令,x86上的软中断是有int产生的,这个指令会导致一个异常,产生一个事件,这个事件会导致处理器跳转到内核态并跳转到一个新的地址。并开始处理那里的异常处理程序,此时的异常处理就是系统调用程序。

23) Linux 软中断和工作队列的作用是什么?

Linux 中的软中断和工作队列是中断处理。

1.软中断一般是“可延迟函数”的总称,它不能睡眠,不能阻塞,它处于中断上下文,不能进城切换,软中断不能被自己打断,只能被硬件中断打断(上半部),可以并发的运行在多个CPU上。所以软中断必须设计成可重入的函数,因此也需要自旋锁来保护其数据结构。

2.工作队列中的函数处在进程上下文中,它可以睡眠,也能被阻塞,能够在不同的进程间切换。已完成不同的工作。
可延迟函数和工作队列都不能访问用户的进程空间,可延时函数在执行时不可能有任何正在运行的进程,工作队列的函数有内核进程执行,他不能访问用户空间地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个推数据驱动运营增长城市巡回沙龙首发北京站

如今很多互联网企业正在加速数智化升级,希望通过运用数据以实现降本提效和运营增长。为帮助更多伙伴在工作中“用好”数据,提升运营效率与效果;同时和更多对用户运营感兴趣的伙伴,共创、共享数智运营实践成果,个推重磅…

设计模式行为型——访问者模式

目录 访问者模式的定义 访问者模式的实现 访问者模式角色 访问者模式类图 访问者模式举例 访问者模式代码实现 访问者模式的特点 优点 缺点 使用场景 注意事项 实际应用 访问者模式的定义 访问者模式(Visitor Pattern)属于行为型设计模式&am…

【JAVA开发工具系列】Git

Git常用功能整理 1.自动打包1.1 第一步安装git 服务1.1.1 查看版本1.1.2 安装1.1.3 配置秘钥 1.2 第二步 配置maven1.2.1 下载1.2.2解压1.2.3 配置环境变量1.2.4刷新环境变量文件1.2.5测试环境1.2.6 修改数据源 1.3 部署项目1.3.1拉取项目 1.4 jar 重启tomcat 2.SmartGit合并主…

常用的mysql子查询

你好!下面是一些常用的 MySQL 子查询: 标量子查询(Scalar Subquery):返回单个值作为查询结果。SELECT column_name FROM table_name WHERE column_name (SELECT column_name FROM table_name WHERE condition); 列表…

echarts实现中国地图下钻进入下一级行政区(地图钻取)

获取geo数据: 可以使用node爬虫获取数据 最好多爬几遍,因为有时候会获取错误 实现逻辑 拥有geo数据后 请求geo数据注册地图 registerMap配置echarts增加事件监听(点击事件) 如果点击了,回到第一步。功能就是循环以…

滇医通微信小程序分析笔记

注意 本文章仅供学习交流使用,如果你是铁粉你就会知道博主之前发布过一篇相关的文章,但是由于代码涉及到法律相关所以就隐藏了,两年的时间过去了,因为女朋友已经早早安排上了,所以就搁置了,本次不做代码分…

Android c++内存异常检查

1、GWP-ASan 不消耗性能,支持app中非root手机调试; target sdk版本大于等于30; 不是一定能检测出,固定case反复测试可以提高检测出的概率; GWP-ASan | Android NDK | Android Developers (google.cn)

【C++】STL——set/multiset 和 map/multimap的使用

文章目录 1. 关联式容器2. 树形结构的关联式容器3. set3.1 认识set3.1 set的使用 4. multiset5. map5.1 认识map5.2 pair5.3 map的使用对map中[]的理解 6. multimap 1. 关联式容器 在初阶阶段,我们已经接触过STL中的部分容器 比如:vector、list、deque、…

一键暂停win11自动更新

暂停更新至2042年(1000周):1、暂停更新Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings]"FlightSettingsMaxPauseDays"dword:00001b58"PauseFeatureUpdatesStartTime…

使用chatGPT生成提示词,在文心一言生成装修概念图

介绍 家是情感的港湾,而家居装修则是将情感融入空间的艺术。如何在有限的空间里展现个性与美感,成为了现代人关注的焦点。而今,随着人工智能的发展,我们发现了一个新的创意助手——ChatGPT,它不仅为我们带来了更多可能…

linux下绑定进程到指定CPU的操作方法

taskset简介 # taskset Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] Show or change the CPU affinity of a process. Options: -a, --all-tasks operate on all the tasks (threads) for a given pid -p, --pid operate on ex…

ES6链判断运算符(?.)的正确打开方式

在实际应用中,如果读取对象内部 的某个属性,往往需要判断一下,属性的上层对象是否存在。比如,读取message.body.user.firstName这个属性,安全的写法是写成下下面这样: // 错误的写法 const firstName mes…

探索 TypeScript 元组的用例

元组扩展了数组数据类型的功能。使用元组,我们可以轻松构造特殊类型的数组,其中元素相对于索引或位置是固定类型的。由于 TypeScript 的性质,这些元素类型在初始化时是已知的。使用元组,我们可以定义可以存储在数组中每个位置的数…

Android, 笔记+课表的app实现

NoteSchedule: 笔记课表,不同于超表和课程格子等笔记类软件,笔记课表的核心是将课表和笔记进行深度绑定,点击每个课表,就进入到笔记view中,点击其中的item就可以进入到笔记详情; 该应用已上线,…

回归预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN…

Creo散热处理结构设计--阵列操作

问题描述: 在某一平面掏孔以散热,如何快速的绘制多孔并掏空处理 解决方式: 采用阵列操作。 1)绘制圆、拉伸处理 2)选择需要阵列的单元,选择阵列操作,在弹出的界面选择方向,按照…

【Winform学习笔记(七)】Winform无边框窗体拖动功能

Winform无边框窗体拖动功能 前言正文1、设置无边框模式2、无边框窗体拖动方法1、通过Panel控件实现窗体移动2、通过窗体事件实现窗体移动3、调用系统API实现窗体移动4、重写WndProc()实现窗体移动 前言 在本文中主要介绍 如何将窗体设置成无边框模式、以及实现无边框窗体拖动功…

C++项目:在线五子棋对战网页版--匹配对战模块开发

玩家匹配是根据自己的天梯分数进行匹配的,而服务器中将玩家天梯分数分为三个档次: 1. 普通:天梯分数小于2000分 2. 高手:天梯分数介于2000~3000分之间 3. 大神:天梯分数大于3000分 当玩家进行对战匹配时,服…

[分享]STM32G070 串口 乱码 解决方法

硬件 NUCLEO-G070RB 工具 cubemx 解决方法 7bit 改为 8bit printf 配置方法 添加头文件 #include <stdio.h> 添加重定向代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endi…

并发多线程篇

线程的基础知识 面试题1&#xff1a;线程与进程的区别&#xff1f; 面试题2&#xff1a;并行和并发有什么区别&#xff1f; 面试题3&#xff1a;创建线程的方式有哪些&#xff1f; 面试题 4&#xff1a;runnable 和 callable 有什么区别&#xff1f; 面试题5&#xff1a;线程…