linux内核基础层的学习(1)

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45072905 一:内核基...
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45072905

一:内核基础层数据结构
1:双向链表list
a):链表的定义

struct list_head{
 struct list_head *next,*pre;
 }

b):container对象和list_entry

#define container_of(ptr,type,member){  \
    const typeof(((type *)0->member) *_mptr = (ptr); \
    (type*)((char*)_mptr-offset(type,member));})
#define list_entry(ptr,type,member) \
    container_of(ptr,type,member)

对双向链表的详细介绍请参考我的博客:

linux内核list.h的学习

2:hash链表
a):定义

struct hlist_head{
    struct hlist_head *first;
}

b):hash链表库
与list相同

请参考下面文章的后面部分就是hash链表的内容:

linux内核list.h的学习

3:红黑树

a):实质上是自平衡二叉树
b):定义在rbtree.c文件中(静待博客更新,对rbtree的介绍)
c):应用场景
主要用在内存管理,IO调度算法等实现了红黑树

4:radix输–基树

a):定义在/lib/radix_tree.c中
b):radix树是一种空间换时间的数据结构,通过空间的冗余减少了时间上的消耗
(静待博客更新,对radix_tree的介绍)
c):page cache的管理使用了radix tree

二:内核基础层的同步机制
1:自旋锁
a):作用
(1):如果数据未锁,那么就获取锁并运行,如果数据已锁,那么就一定旋转(其实是反复执行一条指令)
(2):单处理器环境(非抢占式内核)下,自旋锁其实不起作用
(3):单处理器,抢占式内核环境下,自旋锁起的作用就是禁止抢占
b):自旋锁的调用
(1):spin_lock
(2):spin_unlock

2:内核信号量

a):定义在文件semaphore.h文件里
b):semaphore和mutex
(1):sema_init:计数可以为多
(2):init_mutex:计数为1的信号量
c):信号量的操作
(1):up:释放信号量
(2):down:获取信号量,如果不能获取,则进入睡眠状态
(3):down_trylock:获取信号量,如果不能获取则立即返回,进程不进入睡眠状态

注意:
自旋锁和信号量的区别
1:自旋锁可以用在中断处理函数和tasklet等不可睡眠的场景,而信号量不行
2:可睡眠的场景既可以使用信号量,也可以使用自旋锁,自旋锁通常用在轻量级场景

3:同步机制–原子变量
a):原子变量提供了一种原子的数据结构,对这种数据结构的读写不可被细分和打断
b):原子变量提供的调用
(1):atomic_add:加一个整数到原子变量
(2):automic_sub:从原子变量减去一个整数
(3):automic_set:设置原子变量的数值
(4):automic_read:读取原子变量的数值
4:同步机制–completion
a):completion提供了一种等待完成的机制
b):提供的调用
(1):wait_for_completion:等待操作完成
(2):complete:完成的信号
5:其他内核同步机制
a):CPU变量 DEFINE_PER_CPU
b):RCU锁
c):顺序锁

目录
相关文章
|
13天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
1月前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
29 1
|
22小时前
|
消息中间件 Unix Linux
Linux的学习之路:17、进程间通信(1)
Linux的学习之路:17、进程间通信(1)
9 1
|
1天前
|
Unix Linux Windows
Linux的学习之路:3、基础指令(2)
Linux的学习之路:3、基础指令(2)
7 0
|
6天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
11天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
19 3
|
15天前
|
Linux 应用服务中间件 网络安全
小白学习Linux的学习建议和阶段
【4月更文挑战第5天】小白学习Linux的学习建议和阶段
44 0
|
18天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
18天前
|
Ubuntu Linux
Linux查看内核版本
在Linux系统中查看内核版本有多种方法:1) 使用`uname -r`命令直接显示版本号;2) 通过`cat /proc/version`查看内核详细信息;3) 利用`dmesg | grep Linux`显示内核版本行;4) 如果支持,使用`lsb_release -a`查看发行版及内核版本。
36 6
|
21天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
16 1