《linux内核设计与实现》 读书笔记

进程&&线程

  1. 进程:处于执行期的程序。
  2. 线程:在进程中活动的对象。
  3. 进程提供两种虚拟机制:虚拟处理器和虚拟内存。
  4. 内核把进程的列表存放在task list的双向循环链表中。
  5. linux通过slab分配器分配task_struct结构。用slab分配器动态生成task_struct。
  6. unix创建进程的方式:
    ①fork通过拷贝当前进程创建一个子进程。
    ②exec负责读取可执行文件并将其载入地址空间开始执行。
    写时拷贝: 写时拷贝是可以推迟甚至免除拷贝数据的技术,fork正时采用这个机制,fork的时候,内核没有复制整个进程地址空间,而是让父子进程共享同一个拷贝。只有需要写入的时候,数据才会被复制。在此之前,只是以只读方式共享。

进程调度

  1. IO调度算法。
  2. 进程可以分为IO消耗型(读写频繁)和cpu消耗型(运算频繁)。io指进程大部分时间用来提交IO请求或是等待IO请求。
  3. 进程优先级,有两种,
    ①nice值,范围-20到19,默认值0.nice数值越大,越低优先级。nice实际是代表了时间片的比例,可以通过 ps -el 查看。
    ②实时优先级,范围0到99.与nice相反,数值越大,越高实时优先级。

在这里插入图片描述
4. 时间片:进程所获取的处理器时间和系统负载密切相关。这个比例还会受进程nice影响,nice值作为权重将调整进程所使用的处理器时间使用比。
5. 调度算法。完全公平调度(CFS),实现在kernel/sched_fair.c,他是针对普通进程的调度类。现代调度器有两个通用的概念:进程优先级和时间片。
6. CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小vruntime值的进程。
在这里插入图片描述

内存管理

  1. 内核把物理页作为内存管理的基本单位,从虚拟内存的角度,页就是最小单位。
  2. 内核把页划分成不同的区(zone)。
  3. linux主要使用四种区:
    ·ZONE_DMA 这个区包含的也能用来执行DMA操作。
    ·ZONE_DMA32 和ZONE_DMA类似,该区包含的页面可用来执行DMA操作;而和ZONE_DMA不同之处,这些页面只能被32位设备访问。
    ZONE_NORMAL 这个区包含正常影射的页。
    ZONE_HIGHEM 包含高端内存。
    在这里插入图片描述
  4. 获取页
    在这里插入图片描述
  5. kmalloc的GFP标志:
    在这里插入图片描述
    在这里插入图片描述
  6. vmalloc 和kmalloc :kmalloc函数确保页在物理地址上是连续的(虚拟地址自然也是连续的),vmalloc函数只确保在虚拟地址空间内是连续的,他通过分配非连续的物理内存块,再修正页表,再内存映射到逻辑地址空间连续区域中,其中,只有硬件设备需要得到物理地址连续的内存,所有硬件设备用到的任何内存区都必须是物理上连续的块,不仅仅是虚拟地址上的块。vmalloc会比kmalloc更消耗性能,所以vmalloc仅在不得已的情况下才被使用,典型就是为了获取大块内存。
  7. vmalloc原型:void * vmalloc(unsigned long size);
    void * vfree(const void *addr);
    没有GFP标志,这两个函数默认就是可以睡眠的,所以不能用于中断上下文中。
  8. slab层(即slab分配器)扮演了通用数据结构缓存层的角色。
    在这里插入图片描述
  9. 管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配器的作用就是从页框分配器中拿出一些页框,专门把这些页框拆分成一小块一小块的小内存,当申请者申请的是小内存时,系统就会从SLAB中获取一小块分配给申请者。它们的整个关系如下图:
    在这里插入图片描述

设备与模块

  1. 所以unix系统,设备分为以下类型:块设备,字符设备,网络设备。
  2. 块设备,可以寻址,寻址以块为单位,支持重定位操作,也就是对数据的随机访问,块设备通常挂载成文件系统。
  3. 字符设备,是不可寻址的,仅提供数据的流式范文,就是一个个字符或者一个个字节访问。和块设备不一样,应用程序可以通过直接访问设备节点与字符设备交互。
  4. 网络设备,提供了对网络的访问,通过一个物理适配器和特定的网络协议进行的。他不是通过设备节点来访问,而是通过套接字API来访问的。
  5. 杂项设备,miscdev其实是一个简化的字符设备。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是关于《Linux内核设计实现》的笔记: 1. 进程管理 - 进程控制块(Process Control Block, PCB):一个进程在内核中的表示,包含了进程的状态、各种计数器和指针,以及进程所需要的资源。 - 进程调度:内核必须在可能的情况下公平地分配CPU时间片给每个进程。Linux内核使用完全公平调度(Completely Fair Scheduler, CFS)来实现这一点。 - 进程同步:进程在访问共享资源时需要同步,以避免冲突。Linux内核提供了多种同步机制,如信号量、自旋锁和读写锁等。 2. 内存管理 - 虚拟内存:每个进程都拥有自己的虚拟内存空间,这使得每个进程都可以认为自己独占整个系统内存。 - 页面置换:当物理内存不足时,Linux内核会使用页面置换算法将一部分未使用的页面从物理内存中移出,以便为正在运行的进程腾出空间。 - 内存映射文件:Linux允许将磁盘上的文件映射到进程的虚拟地址空间中,这样就可以像访问内存一样访问文件。 3. 文件系统 - 虚拟文件系统(Virtual File System, VFS):Linux内核中的抽象层,它允许系统支持多种文件系统格式,如ext4、FAT32等。 - I/O管理:内核必须管理所有的I/O操作,包括磁盘读写和网络通信等。 - 文件描述符:Linux内核使用文件描述符来标识打开的文件,每个进程都有一个文件描述符表。 4. 网络协议栈 - TCP/IP协议栈:Linux内核支持多种网络协议,其中最常用的是TCP/IP协议栈。 - Socket:在Linux中,进程之间通信的主要方式是使用Socket。Socket是一种抽象的概念,它代表了一个网络连接。 5. 设备驱动程序 - 驱动程序开发:Linux内核的设备驱动程序通常是以模块的形式开发的,它们可以动态地加载和卸载。 - 设备文件:Linux内核将设备表示为文件,它们可以通过文件系统接口来访问。 以上是《Linux内核设计实现》的一些重点内容和笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值