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

news2024/12/27 13:15:59

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

文章目录

  • Linux内核源码分析 (A)常见内核面试题
    • 调用 schedule() 进行进程切换的方式有几种
    • CFS调度器vruntime的计算方式
  • 网站收集面试题集合1

调用 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表示此进程权重值。
    在这里插入图片描述
    当进程的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 软中断和工作队列的作用是什么?

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

工作队列:处理进程上下文中,可以睡眠阻塞。

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

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

相关文章

供热管网安全运行监测,提升供热管网安全性能

城市管网是城市的“生命线”之一,是城市赖以生存和发展的基础,在城市基础设施高质量发展中发挥着重要作用。供热管网作为城市生命线中连接供热管线与热用户的桥梁,担负着向企业和居民用户直接供热的重要职责。随着城市热力需求的急剧增加&…

【SpringBoot】Swagger和knife4j的使用

文章目录 前言1.什么是Swagger和Knife4j2.Swagger和Knife4j怎么用2.1 引入依赖2.2 设置配置类2.3 启动验证 3.完结撒花 前言 springboot笔记集合: springboot笔记合计 没用的废话理论不多说,会用就完了 1.什么是Swagger和Knife4j Swagger是一种开源的API描述语言…

ranger无法同步用户问题解决

1.首先就是定位日志,日志目录 cd /var/log/ranger/usersync 定位到问题报错如下: LdapDeltaUserGroupBuilder.getUsers() failed with exception:java.naming.AuthticationExceptiom :[LDAP:error code 49 - Invalid Credentials]:remaing name ‘ouPeople,dc*.dccom’ 解决办法…

frida动态调试入门01——定位关键代码

说明 frida是一款Python工具可以方便对内存进行hook修改代码逻辑在移动端安全和逆向过程中常用到。 实战 嘟嘟牛登录页面hook 使用到的工具 1,jadx-gui 2,frida 定位关键代码 使用jadx-gui 进行模糊搜索,例如搜索encyrpt之类的加密关键…

Python Qt(八)Treeview

源代码: # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_treeview.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not…

vnc与windows之间的复制粘贴

【原创】VNC怎么和宿主机共享粘贴板 假设目标主机是linux,终端主机是windows(就是在windows上使用VNC登陆linux) 在linux中执行 vncconfig -nowin& 在linux选中文字后,无需其他按键,直接在windows中可以黏贴。 …

2023-8-31 Dijkstra求最短路(二)

题目链接&#xff1a;Dijkstra求最短路 II #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue>using namespace std;typedef pair<int, int> PII;const int N 150010;int n, m; int h[N…

利用GeoServer进行跨图层空间查询

Cross-layer filtering 跨层过滤提供了从层A中查找与层B中的特征具有特定关系的特征的能力。例如&#xff0c;这可以用于查找距离指定商店给定距离内的所有公交车站&#xff0c;或者查找指定城区内的所有咖啡店。 querylayer模块添加了实现跨层过滤的过滤功能。这些功能通过查…

十一、装饰器模式

一、什么是装饰器模式 装饰器&#xff08;Decorator&#xff09;模式的定义&#xff1a;指在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式&#xff0c;它属于对象结构型模式。 装饰器模式主要包含以下角色…

你的家乡清晰可见,全国卫星影像100%覆盖!

向上数三代&#xff0c;祖辈皆农民&#xff01; 无论是坐在高楼大厦里的白领&#xff0c;各种机构的公职人员&#xff0c;还是奔跑在大街小巷的外卖小哥&#xff0c;他们的根几乎皆在农村&#xff0c;当然应该也包括你和我&#xff01; 如何通过高清卫星影像看家乡的变化&…

企业如何充分借助大数据下精准营销?

技术的发展和智能终端的普及移动互联网用户的大规模增长使移动互联网快速发展&#xff0c;使中国移动互联网软件进入移动互联网时代越来越多地涉及到改变生活大家习惯。移动互联网时代的到来也意味着大数据时代的到来。精准营销数据方法&#xff0c;移动互联网和大数据的兴起不…

java八股文面试[多线程]——AQS 详细介绍

线程同步除了Synchronized Volatile ReentranLock 之外&#xff0c;还有其他一些用来进行同步的机制。 AQS 简单介绍 AQS 的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类在 java.util.concurrent.locks 包下面。 AQS 是一个用来构建锁和同步器…

git submodule 子模块的基本使用

背景 浏览开源库的时候经常会看到如下子模块的引用情况。 子模块通常是项目比较复杂&#xff0c;需要对项目进行拆分&#xff0c;而项目又有引用关系时会使用。通常拆分项目后&#xff0c;我只需要关注自己的项目更改&#xff0c;不需要关注引用的项目都做了哪些更改。 通常…

为什么删除Windows 11上的Bloatware可以帮助加快你的电脑速度

如果你感觉你的电脑迟钝&#xff0c;彻底清除软件会有所帮助&#xff0c;而且这个过程对Windows用户来说越来越容易。 微软正在使删除以前难以删除的其他预装Windows应用程序成为可能。专家表示&#xff0c;这项新功能可能会改变用户的游戏规则。 科技公司Infatica的主管Vlad…

23款奔驰GLS400升级柏林之声音响系统,体验不一样的感觉

Burmester 环绕立体声音响系统–为每位乘员打造令人印象深刻的音质13个高性能扬声器、总功率为590瓦的9声道数字信号处理器(DSP)放大器以及放大器/扬声器系统专为车辆配置&#xff0c;打造出一流的Burmester之音。必要时还可进一步提升令人印象深刻的听觉体验。声音环绕功能能够…

如何在Windows本地快速搭建SFTP文件服务器,并通过端口映射实现公网远程访问

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#xff0…

对于uts namespace共享的测试

前言 单单以下列命令运行虽然是root&#xff0c;还不行&#xff0c;我们需要加--privileged&#xff0c;不然会报 hostname: you must be root to change the host name docker run -it --utshost ubuntu:latest /bin/bash 如果加上--privileged后 docker run -it --priv…

0727开发问题小结分享

Hi&#xff0c;我是阿昌&#xff0c;今天记录分析下关于0727开发问题小结分享的内容。 总结汇总了一些在开发问题&#xff0c;或者需要开发注意点&#xff1b; 一、内容概览 ● 问题驱动思维 ● 数据库 ● javaee & 框架 ● 服务治理 ● 三方服务 & 迁移操作 二、问…

北大C++课后记录:自增、自减运算符重载的小Demo

前言 自增、自减运算符有前置&#xff08;x&#xff09;和后置&#xff08;x&#xff09;之分&#xff0c;为了对其进行区分&#xff0c;C规定&#xff1a; 前置运算符作为一元运算符进行重载&#xff1a;&#xff08;注意T1对象和T2对象是有差异的&#xff09; 后置运算符作…

DT 变形学习

弯曲变形 扩张变形 正弦变形 挤压变形 扭曲变形 波浪变形 内外的影响 雕刻 抖动变形 混合变形 晶格变形 包裹变形 线条变形 重置 在测试一个