内核系统里常用的算法,这里做了些归纳:
1、trie算法,linux网络子系统中取代了之前哈希算法的新路由算法,适合有大、超大规模路由项的应用场景。
2、CFS(completely fair scheduler),说是一种算法,其实更是类似一种思想,基于时间片分割技术。进程调度使用。
3、哈希算法,到处在用,网络、内存、文件系统等子系统都在使用
4、堆排序,内存初始化时使用到
5、红黑树,进程调度树、虚拟内存管、以及管理应用程序虚拟内存区的代码都使用到了红黑树,树的算法在linux内核中使用的频率也较高。
6、链表,数不胜数;双链表是linux内核使用的一个特色,此外还有哈希表和单链表,哈希表使用的也很多,单链表相对较少,但是也有。
7、优先查找树,struct address_space结构体的prio tree使用,用于建立文件中的一个区域与该区域映射到的所有虚拟地址空间的关联。
8、位图算法,内存自举分配器、linux进程的ID号都使用位图管理。
9、内存管理,伙伴算法,是一种思想,比较经典的内存管理算法,linux内核沿用至今。
10、内存管理,slab、slub、slob,基于cache的一种内存管理思想,对提高读写效率很重要,适用于频繁操作且小块的内存。
11、写时复制技术(copy on write),使用fork创建子进程时,为避免无用的赋值而采取的一种技术,只有在父、子进程对区域进行写才会执行真正的复制工作。
12、磁盘块I/O操作,linux使用了电梯算法,基于RAID的数据库运维会遇到,目前数据库发展趋势倾向使用SSD作为存储介质。
linux中更多的不是具体的数学算法,比如位图之类,更多的是思想,比如预读、对nand操做的损耗平衡、网卡多队列等,这些思想贯串linux内核,博大精深。
除了上面比较时髦的一些算法,linux还有一些比较基础的东西。
1、并发和竞态引入的同步算法,信号量、锁等。
2、工作队列、tasklet等。
3、链表操作。
4一些小技巧,比如container_of。
剩下的就是各个子系统需要深究的了。
比如网络系统,网络协议以及网络协议栈代码(一些算法、一些思想)等
比如驱动,module、字符设备、代码中的(misc、cdev等)