《深入理解Linux内核》 读书笔记

深入理解Linux内核 读书笔记

一、概论

操作系统基本概念

  • 多用户系统
    • 允许多个用户登录系统,不同用户之间的有私有的空间
  • 用户和组
    • 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样。对应的是Linux的文件权限系统
  • 进程
    • 和程序的区别。几个进程能并发执行同一个程序,一个进程能顺序执行几个程序
    • 程序更像是代码片段,进程是执行代码的容器
    • linux是抢占式操作系统,也就是一个进程只能占用CPU一段时间。非抢占式系统中,进程如果不释放CPU,可以一直占用
  • 内核体系结构
    • Linux是单块内核,同时提供模块(module)功能
    • 模块是指:例如一个程序,引用了一个系统模块,这个系统模块不会是这个进程单独拥有,当其他程序也需要这个模块时,内核会把这个模块链接到其他程序。这样可以节省内存,也就是这个模块只会在内存中存在一份。模块就是一组函数,或者一段代码。

文件系统

  • 文件
    • 文件是以字节序列组成的信息载体(container)
    • 文件目录是树结构
    • 每个进程都有一个工作目录,通过pwdx 进程ID 命令可以查看
  • 硬链接和软连接
    • 链接类似window的快捷方式,创建一个文件,指向另一个文件
    • ln p1 p2 就是创建一个文件p2,指向p1
    • 硬链接只能指向文件,不能指向目录,因为会导致循环指向
    • 硬链接只能指向同一个文件系统的文件(文件系统是物理划分,例如不同硬盘)
    • 软链接没有硬链接这些限制,创建方法是加-s参数
  • 文件类型
    • 普通文件
    • 目录
    • 符号链接
    • 面向块的设备文件
    • 面向字符的设备文件
    • 管道和命名管道(pipe named pipe)
    • 套接字(socket)
  • 文件描述符与索引节点
    • 每个文件都有一个索引节点(inode)的数据结构,用来存储文件的描述信息,和文件的内容是区分开的。
      • inode有(通过ll命令看到的):
        • 文件类型
        • 硬链接个数
        • 文件长度
        • 文件拥有者的uid
        • 用户组的id
        • 修改时间等
        • 访问权限
  • 访问权限和文件模式
    • 拥有者,组,其他人,各有读写执行3种权限
  • 文件操作
    • 打开文件
    • 移动光标
    • 关闭

Unix内核概述

  • 进程/内核模式
    • 进程有用户态和内核态
    • 用户态不能访问内核的数据结构和内核程序
    • 两种态会经常切换,例如在时刻A,进程在用户态,在时刻B,进程在内核态
    • 从用户态切换到内核态的情况:
      • 调用系统调用
      • 执行进程的CPU发送异常
      • 外围设备向CPU发出中断
      • 内核线程被执行
  • 进程
    • 每个进程有一个进程ID,pid
    • 内核切换执行的进程时,会保存旧进程的信息,包括:
      • 程序计数器和栈指针寄存器
      • 通用寄存器
      • 浮点寄存器
      • CPU状态
      • 内存管理寄存器
  • 可重入内核
    • unix内核都是可重入的
    • 可重入是指,可以被重复进入,也就是可以同时有多个进程处于内核态
  • 进程地址空间
    • 每个进程有自己私有的地址空间
  • 同步和临界区
    • 类似锁
    • linux是抢占式内核,所以需要同步
    • 信号量
      • 每个资源都有一个信号量,类似int类型,初始值是1
      • 每个进程访问资源,调用down方法,信号量减1,如果减1后,信号量小于0,进程被加入到访问队列中。如果大于等于0,进程可以访问资源
      • 每个进程访问完资源,调用up方法,信号量加1,如果信号量大于等于0,激活访问队列的第一个进程
      • 进程锁,线程锁的机制,应该都是这样的
      • 这里要保证down和up的操作都是原子性的,不能并发
      • 要防止死锁
      • 锁里面的区域就是临界区,也就是acquire和release之间的代码
  • 信号和进程间通信
    • 信号和信号量是不一样的
    • linux有20多种不同的信号,例如kill -9 中的 9就是一种信号
    • 进程收到信号后,可以
      • 忽略
      • 异步执行指定程序(新开一个线程?),这种需要事先定义信号处理函数。
    • 内核收到信号后,可以
      • 终止进程(例如kill - 9)
      • 忽略信号
      • 挂起进程
      • 恢复进程
    • 进程间通信(IPC)
      • 信号
      • 消息(msgget(),msgsnd())两个系统调用,发信息和收信息,Python里面的进程间Queue应该就是用这个实现的
      • 共享内存(shmget shmdt)两个系统调用
  • 进程管理
    • fork来启动一个子进程,一般在启动的时候复制父进程的数据和代码,但是这样效率较低,所以会使用写时复制,也就是一开始父子进程共享内存,当其中一个进程需要修改数据时,才执行复制操作
    • exec用于启动子进程
    • exit用于结束子进程
    • wait4用于父进程等待子进程结束
  • 内存管理
    • 虚拟内存,在物理内存(MMU)和程序之间的抽象,相当于访问内存的代理。
    • 内核内存分配器,KMA,用于管理内存
    • 高速缓存 由于内存比硬盘快很多,所以从硬盘读取得数据会缓存在内存,使下次可以快速访问

猜你喜欢

转载自www.cnblogs.com/Xjng/p/11516471.html