linux kernel的问与答

本文详细解析了Linux内核中的内存管理技术,包括kmalloc、valloc、kzalloc、devm_kmalloc的功能区别,以及自旋锁spinlock和信号量semaphore在同步机制中的作用。深入探讨了不同内存分配函数的应用场景和自旋锁的内部实现,为理解Linux内核的内存管理和多线程同步提供关键洞见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内存

1、kmalloc、valloc、kzalloc、devm_kmalloc的区别
  • kmalloc和valloc的区别:

kmalloc是在线性映射区分配内存,它的物理地址是连续的; vmalloc是在高端内存区(非线性区/valloc区)分配内存,它的虚拟地址是连续的、物理地址非连续;
kmalloc在分配内存的时候,通过传入GFP_ATOMIC可以进行原子操作;

  • kmalloc kzalloc的区别

kzalloc申请内存后,并将这段内存清0

  • kmalloc devm_kmalloc的区别

kmalloc申请的内存,在不使用时需要主动free释放
devm_kmalloc申请的内存,在不使用时无需主动free释放.

二、同步机制

1、spinlock

(1)、请问自旋锁spinlock中都干了哪些事?
在spin_lock中,先关闭抢占preempt_disable、再加入排队序列(有ower和next两个变量,排队就是next++)、再进入低功耗模式等到wfe
在spin_unlock中,先让cpu退出低功耗模式(armv7使用sev指令,armv8使用staddlh指令),更新排队序列(onwer++),在打开抢占preempt_enable

(2)、spin_lock中,为何要关闭抢占preempt_disable ?
如果不关闭抢占,单核的情况下, 进程A获取spinlock后,在临界区干活,发生了抢占,进程B尝试获取spinlock,进程B拿不到,就会自旋等待那里.
等到B的时间片耗完,再次调度到进程A,且A释放了该锁,然后再调用B,B才能拿到该锁.
在B自旋的时候,造成cpu资源很大的浪费; 因为那个时候:A拿着锁,A并没有在执行,CPU在B上自旋等待

(3)、cpu0调用的A进程,刚获取lock->next值后,正准备给该变量+1计数、此时cpu1调用的B进程,也获取了lock->next值; 这样A和B进程都能拿到该锁? 请问linux是怎样解决这个问题的?

在ARMV8上使用了exclusive机制,是一种独占访问的状态,在A进程操作lock->next值时,在读取时,使用了ldaxr指令,将global monitor状态从open切换成exclusive状态, 然后写入数据到变量时使用stxr指令,将global monitor状态从exclusive切换成open状态。
在global monitor状态未exclusive时,B是再去使用ldaxr指令读取数据时,会返回错误,然后B会再继续读取该数据。

而在ARMv7上,虽然没有exclusive机制,但是提供了类似的指令,ldrex和strex;

2、信号量semaphore

(1)、在信号量semaphore的down()中,都干了哪些事情?
检查count值,大于0则获得该锁,进入临界区;
否则的话,未获得该锁,先将task加入到wait_list,再调用schedule_timeout进入睡眠

(2)、信号量的实现为何要依赖spinlock ?
在信号量的实现中,要对count值进行加加或减减操作,使用spinlock防止该变量产生竞争;

以下是一些常见的Linux运维面试题及答案,供参考: 1. 请介绍一下Linux系统的文件系统。 答:Linux系统的文件系统可以分为根文件系统、用户文件系统和虚拟文件系统。根文件系统包含了Linux系统的核心文件,如/bin、/sbin、/lib等。用户文件系统包含了用户的数据和应用程序,如/home、/usr、/var等。虚拟文件系统是由内核提供的一种文件系统,它不对应任何实际的硬盘分区,而是将各种资源以文件系统的形式呈现出来,如/proc、/sys等。 2. 请介绍一下Linux系统的启动流程。 答:Linux系统的启动流程可以分为BIOS、bootloader、kernel和init四个阶段。BIOS是计算机系统的基本输入输出系统,负责对计算机进行初始化和自检。bootloader是Linux系统的引导程序,负责加载内核和初始化系统环境。kernelLinux系统的核心,负责管理系统的硬件和软件资源。init是Linux系统的初始化程序,负责完成系统的初始化和启动服务。 3. 请解释一下什么是Linux进程和线程。 答:Linux进程是指正在运行的一个程序的实例,它包含了程序的代码、数据和堆栈等。进程是Linux系统中最基本的资源之一,每个进程都有独立的内存空间和系统资源。Linux线程是进程中的一个执行单元,它与其他线程共享进程的资源,包括内存、文件描述符、信号处理等。 4. 请列举一些Linux系统的常用命令。 答:常用的Linux命令包括cd、ls、mkdir、rm、cp、mv、cat、grep、sed、awk、ps、top、netstat、ifconfig、ping、ssh、scp等。这些命令可以帮助我们进行文件操作、进程管理、网络调试等。 5. 请解释一下Linux系统的权限和文件属性。 答:Linux系统的权限和文件属性是由文件的所有者、用户组和其他用户来决定的。每个文件都有读、写和执行三种权限,分别对应r、w、x三个字符。文件的所有者可以通过chown命令来修改文件的所有者,通过chmod命令来修改文件的权限。文件的属性包括文件类型、所有者、用户组、大小、修改时间等。 以上是一些常见的Linux运维面试题及答案,希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值