Linux内核源码分析 (A)常见内核面试题

这篇具有很好参考价值的文章主要介绍了Linux内核源码分析 (A)常见内核面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux内核源码分析 常见内核问题

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

  • 系统调用 do_fork()copy_process()
  • 定时中断 do_timer()
  • 唤醒进程 wake_up_process():进程由睡眠状态转为RUNNING状态
  • 系统调用 sys_sched_yield()
  • 改变进程的调度策略 sched_setscheduler()
    什么情况下会发生调度时机:阻塞操作、中断返回之前(系统调用返回用户空间时)、被唤醒的进程会存放到CFS就绪队列中。

CFS调度器vruntime的计算方式

  • Linux内核中CFS调度器有一个计算虚拟时间的API函数(calc_delta_fair()),公式如下:

    v r u n t i m e = d e l t a _ e x e c ∗ n i c e _ 0 _ w e i g h t w e i g h t vruntime = \frac {delta\_exec * nice\_0\_weight}{weight} vruntime=weightdelta_execnice_0_weight
    v r u n t i m e vruntime vruntime表示进程虚拟运行时间; d e l t a _ e x e c delta\_exec delta_exec表示实际运行时间; n i c e _ 0 _ w e i g h t nice\_0\_weight nice_0_weight表示nice值为0的进程的权重值, w e i g h t weight weight表示此进程权重值。
    Linux内核源码分析 (A)常见内核面试题,Linux内核源码分析,算法,linux
    当进程的nice值不等于0时,虚拟时间和真实时间不一样。nice值小的进程优先级高,虚拟时间比真实时间跑慢一些;nice值大的进程优先级低,虚拟时间比真实时间跑快一些。为方便记忆,Linux内核约定nice值为0的进程的权重值为1024。内核预先计算好表如下:
    kernel/sched.c

    static const int prio_to_weight[40] = { 
    	/* -20 */ 88761, 71755, 56483, 46273, 36291, 
    	/* -15 */ 29154, 23254, 18705, 14949, 11916, 
    	/* -10 */ 9548, 7620, 6100, 4904, 3906, 
    	/* -5 */ 3121, 2501, 1991, 1586, 1277, 
    	/* 0 */ 1024, 820, 655, 526, 423, 
    	/* 5 */ 335, 272, 215, 172, 137, 
    	/* 10 */ 110, 87, 70, 56, 45, 
    	/* 15 */ 36, 29, 23, 18, 15, 
    };
    
  • 比如技术面试:假设某个进程nice值为1,其权重值为820delta_exec=12ms,代入公式计算:vruntime=(12*1024)/820= 15

  • vruntme的值越小,证明占用cpu时间越少(或者说权重越大),此时则优先运行,所使用红黑树是根据全部进程vruntime来组织的,树最左下角的节点就是vruntime最小的节点,是需要最先执行的节点;随着进程的执行,vruntime是不停的变化,就需要动态调整红黑树。由于红黑树本身的算法特点,动态调整比链表快,这是为什么选择CFS根本原因。CFS算法没有时间片,而是根据实际运行时间和虚拟运行时间来对任务进行排序,从而选择调度。

网站收集面试题集合1

主要有哪几种内核锁?Linux 内核的同步机制是什么?

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

怎么申请大块内存?vmalloc 和 kmalloc 有什么区别?

进程间通信主要有哪几种方式?

伙伴系统申请内存的函数有哪些?

通过 slab 分配器申请内存的函数有哪些?

Linux 的内核空间和用户空间如何划分的?进程地址空间布局图?

vmalloc() 申请内存有什么特点?

用户程序使用 malloc() 申请的内存空间在什么范围?

在支持并使能 MMU 的系统中,Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式?

ARM 处理器是通过几级页表进行存储空间映射的?

Linux 是通过什么组件来实现支持多种文件系统的?

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

对文件系统的操作函数保存在哪个数据结构中?

Linux 中的文件包括哪些?

创建进程的系统调用有哪些?

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

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

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

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

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

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

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

TLB 中缓存的是什么内容

Linux 中有哪几种设备?

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

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

如何唯一标识一个设备?

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

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


下面是面试题的答案:


  1. 主要有哪几种内核锁?Linux 内核的同步机制是什么?

自旋锁:spin_lock 忙等,中断中使用

信号量:semxxx down/up write/read

mutex:初始化为1的信号量

读写锁,RCU(read-copy update)
2. Linux 中的用户模式和内核模式是什么含义?

cpu mode,用户模式只能通过系统调用操作硬件资源,内核模式可以直接操作硬件资源
3. 怎么申请大块内存?vmalloc 和 kmalloc 有什么区别?

vmalloc 用于申请大块内存,虚拟地址连续,物理地址不一定连续,不能直接用于DMA,在进程地址空间有专门的一块。

kmalloc 用于申请小内存,由 slab 管理实现,一般至少小于4KB(page)。不能申请大于128K的数据。物理地址和虚拟地址都连续,可用于DMA操作。
4. 进程间通信主要有哪几种方式?

管道:两个进程需要有共同的祖先,pipe/popen

命名管道:两个进程可以无关

信号

消息队列

共享内存

信号量

套接字

Android:binder/ashmem
5. 伙伴系统申请内存的函数有哪些?

alloc_page(gfp_mask, order)

__get_free_pages(gfp_mask, order)
6. 通过 slab 分配器申请内存的函数有哪些?

自己构造对象:kmem_cache_create/kmem_cache_alloc

普通匿名内存申请:kmalloc
7. Linux 的内核空间和用户空间如何划分的?进程地址空间布局图?

32位可配置3G/1G, 2G/2G,一般是两级页表

64位可配置几级页表,一般可选3级/4级页表,256G/256G,或512T/512T
8. vmalloc() 申请内存有什么特点?

申请大块内存,虚拟地址连续,物理地址不一定连续,不能直接用于DMA。对于释放函数 vfree()。
9. 用户程序使用 malloc() 申请的内存空间在什么范围?

stack 和 heap 中间。小于128M的通过brk申请,大于的通过 mmap 申请。
10. 在支持并使能 MMU 的系统中,Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式?

都运行在虚拟地址模式,页表转换对应由硬件单元MMU完成。
11. ARM 处理器是通过几级页表进行存储空间映射的?

两级页表,PGD和PTE
12. Linux 是通过什么组件来实现支持多种文件系统的?

VFS(virtual file system)
13. Linux虚拟文件系统的关键数据结构有哪些?(至少写出4个)

super_block超级块

inode索引节点

dentry目录项

file文件
14. 对文件系统的操作函数保存在哪个数据结构中?

struct file_operations
15. Linux 中的文件包括哪些?

可执行文件,普通文件,目录文件,链接文件,设备文件,管道文件
16. 创建进程的系统调用有哪些?

clone, fork, vfork
17. 调用 schedule() 进行进程切换的方式有几种?

do_fork/do_timer/wake_up_process/setscheduler/sys_sched_yield
18. Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的?

cfs 会计算虚拟时间,还有一个计算出来的优先级。

实时进程根据xx
19. 进程调度的核心数据结构是哪个?

struct runqueue
20. 如何加载、卸载一个模块?

ismod, rmmod
21. 模块和应用程序分别运行在什么空间?

模块运行在内核空间,应用程序运行在用户空间
22. Linux 中的浮点运算由应用程序实现还是内核实现?

由应用程序实现,对应的数学库函数。
23. 模块程序能否使用可链接的库函数?

module 运行在内核空间,不能链接库函数。
24. TLB 中缓存的是什么内容

translation lookaside buffer, 也叫快表,用作页表缓冲。记录虚拟地址和物理地址的对应关系,用于加快地址转换。
25. Linux 中有哪几种设备?

字符设备和块设备
26. 字符设备驱动程序的关键数据结构是哪个?

struct cdev: kobject

cdev_alloc()

cdev_add()
27. 设备驱动程序包括哪些功能函数?

open/read/write/ioctl/release/llseek
28. 如何唯一标识一个设备?

主设备号和次设备号。dev_t,12位表示主设备号,20位表示次设备号。

MKDEV(int major, int minor)用于生产一个 dev_t 类型的对象。
29. Linux 通过什么方式实现系统调用?

软件中断。系统调用编号,异常处理程序
30. Linux 软中断和工作队列的作用是什么?

软中断:不可睡眠阻塞,处于中断上下文,不能进程切换,不能被自己打断。

工作队列:处理进程上下文中,可以睡眠阻塞。文章来源地址https://www.toymoban.com/news/detail-683755.html

到了这里,关于Linux内核源码分析 (A)常见内核面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux 内核源码分析】物理内存组织结构

    多处理器系统两种体系结构: 非一致内存访问(Non-Uniform Memory Access,NUMA):这种体系结构下,内存被划分成多个内存节点,每个节点由不同的处理器访问。访问一个内存节点所需的时间取决于处理器和内存节点之间的距离,因此处理器与内存节点之间的距离会影响内存访问

    2024年02月22日
    浏览(57)
  • 《Linux内核源码分析》(2)进程原理及系统调用

    操作系统的作用 :作为硬件的使用层,提供使用硬件资源的能力, 进程的作用 :作为操作系统使用层,提供使用操作系统抽象出的资源层的能力 进程、线程和程序的区别 :进程指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。 程序本身只是指令

    2024年02月07日
    浏览(49)
  • 【Linux 内核源码分析】进程调度 -CFS 调度器

    Linux内核调度器是负责决定哪个进程在何时执行的组件。它管理着CPU资源的分配和任务的调度,以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种,包括经典的O(1)调度器、CFS(Completely Fair Scheduler)调度器等。这些调度器根据不同的策略和算法来进

    2024年01月17日
    浏览(55)
  • 【Linux 内核源码分析】内存管理——Slab 分配器

    在Linux内核中,伙伴分配器是一种内存管理方式,以页为单位进行内存的管理和分配。但是在内核中,经常会面临结构体内存分配问题,而这些结构体的大小通常是小于一页的。如果使用伙伴分配器来分配这些小内存,将造成很大的内存浪费。因此,为了解决这个问题,Sun公

    2024年02月22日
    浏览(61)
  • Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

    Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现 在上篇文章 《深入理解 Linux 物理内存分配全链路实现》 中,笔者为大家详细介绍了 Linux 内存分配在内核中的整个链路实现: image.png 但是当内核执行到 get_page_from_freelist 函数,准备进入伙伴系统执行具体内存分配

    2024年02月07日
    浏览(46)
  • Linux内核源码分析 (B.2)虚拟地址空间布局架构

    Linux内核只是操作系统当中的一部分,对下管理系统所有硬件设备,对上通过系统调用向 Library Routine 或其他应用程序提供API接口。 内存管理可以通过以下三个维度进行介绍: 用户空间 相当于应用程序使用 malloc() 申请内存,通过 free() 释放内存。 malloc() / free() 是 glibc 库的内

    2024年02月09日
    浏览(70)
  • Linux内核源码分析 (6)RCU机制及内存优化屏障

    问题: RCU 英文全称为 Read-Copy-Update ,顾名思义就是 读-拷贝-更新 ,是 Linux 内核中重要的同步机制。 Linux 内核已有原子操作、读写信号量等锁机制,为什么要单独设计一个比较复杂的新机制? RCU的原理 RCU记录所有指向共享数据的指针的使用者,当要修改该共享数据时,首先

    2024年02月10日
    浏览(58)
  • 文件IO_文件读写(附Linux-5.15.10内核源码分析)

    目录 1.什么是文件偏移量? 1.1 文件偏移量介绍 1.2 文件偏移量重点 1.3 文件偏移量工作原理 2.文件偏移量设置 2.1 lseek函数 2.2 lseek内核源码分析 3.写文件 3.1 write函数 3.2 write内核源码分析 4.读文件 4.1 read函数 4.2 read内核源码分析 5.文件读写,文件偏移量设置示例代码 在介绍文

    2024年02月16日
    浏览(54)
  • linux-2.6.22.6内核i2c驱动框架源码分析

    i2c是常见的通信协议,协议比较简单,只有数据和时钟两条线(SDA和SCL),i2c的通信分为主机和从机,主机一般占主导地位,从机可以有多个。 i2c通信的数据格式为(SDA上的数据):开始的7位里面指定了设备地址(因为有多个从机),第8位是读或写信号,表示此次传输是读还

    2024年02月11日
    浏览(52)
  • 【Linux内核解析-linux-5.14.10-内核源码注释】关于Linux同步机制知识点整理

    在Linux系统中,同步机制是操作系统中非常重要的一部分,以下是一些基本要点: 什么是同步机制?同步机制是一种操作系统提供的机制,用于协调多个进程或线程之间的访问共享资源,防止出现竞态条件和死锁等问题。 Linux中常用的同步机制有哪些?Linux中常用的同步机制

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包