缓存cache: 数据执行过程: 磁盘--->内存-->缓存--->真正执行
pdflush :内核线程 实现数据同步 含有kupdate和bdflush sync :数据同步
内存管理:
分为: 逻辑地址空间: linux很少用到 物理地址空间 线性地址空间:虚拟 为了更好的分配地址空间内存将其分成页page: 页page:为了让线性地址空间映射成物理的,一页一般4K 叶框 page frames:存放页的 4k 页表page table: 数据结构,描述每一个页所对应的叶框的位置,不至 于造成数据修改时的混乱 每个进程都有自己的页表,每一行记录为page table entry:PTE 解释: MMU:内存管理单元:实选线性地址空间根据页表转换成物理地址空间 ,每一次的 转换都需要花费一定的时间,可以让TLB解决,TLB实现缓存MMU装换的结果,节省时间,提高 效率 虚拟内存管理: buddy allocator: 避免外碎片 ,在内存中产生 slab allocator:内碎片 在内存的叶框中产生,重用解决 slabtop 查看系统的slab kswapd 将物理内存的一些数据放到交换分区中(交换分区swap) bdflush :将内存中未同步的数据同步到磁盘中。当数据不在内存中,而 在磁盘中,修改页时会保存到内存中, 脏页dirty page:在内存中没有同步到磁盘上的页
用户访问文件--通过inode号---inode表---找到对应的磁盘位置 提高文件的响应能力: dentry cache-->缓冲池 数据分为:metadata 元数据:在inode表的inode项里 data ext2上:没有记录日志, 文件的存储:现存元数据再存文件,可能会造成数据的不完整, 元数据和数据不一致 ,数据的自检会花费很长时间 ext3:启用日志功能journal,数据在存到磁盘前先写到日志中,同步后 ,然后会在日志中删除数据 dumpe2fs /dev/sda1 查看分区的详细信息,是否有碎片等 ext3模式: journal 数据和元数据都写进日志中,同步磁盘中再删除 ordered 默认模式 只写元数据 ,但会确保数据的同步 writeback 性能最好,一致性最差 元数据写到日志里就认为数据完成,不管数据是否和磁盘的同步 mount -o data={ordered|writeback|journal}
进程管理 :
驱动工作在内核,没有做进内核,程序, kernel功能: 进程管理 内存管理 文件系统 I/O 中断kernel的进程管理: 进程是一个在cpu上运行的实例,独立占用资源,实现资源分配(cpu时间 、内存,打开文件 ), 单个cpu同时只能分配一个实例,为了解决问题,需要进程进行 分配 进程描述符pid,描述系统运行的进程数据结构,内核中占1.7k 任务列表保存所有的pid 双向循环列表 进程状态: 就绪态(R) 运行态(R) 停止态(T) 睡眠态 (S) 僵死态(Z) 睡眠态又分为: 可以中断的睡眠 :发信号可以唤醒进程 不可中断的睡眠: 停止态(T):SIGSTOP信号, 瞬间的,可以回到就绪态 僵死态:进程中断时有其父进帮助收回资源,这中间的过程就是僵死态 ;父进程发送wait4()或waitpid()帮助收回 父进程不帮助收回也是僵死态 父进程先于子进程中断,一般要把子进程重新 僵死态分为: 发起信号就可以唤醒 和进程本身醒来否则不会被唤醒 父进程发起fork()产生子进程,设置新的pid,与父进程共享同一个地址 空间 ,当子进程需要修改数据, 父进程会马上为其创建地址空间,该过程称为copy on write,当子进程 完成后exit,由父进程帮其收回 线程:比进程更小的执行单位,轻量级的进程LWP,单进程可发起多线程 进线程的不同 : 线程的创建和销毁比进程快 线程不独占资源 linux支持的线程类型: linux threads:linux自带的 Native POSIX thread library:NPTL ,posix规范标准 库 编程接口 NGPT 环境变量 LD_ASSUME_KERNEL 查看当前系统的线程类型 windows和linux是真正支持线程的系统上下文切换context switch:动作 kernel能将正在cpu执行的进程能够挂起,必要的时候将挂起的进程再重 新启动 挂起的进程会保存在内核模式站KMS cpu的寄存器 上下文的切换来保证系统的多任务
进程内存段: 地址的分为: 物理地址 虚拟地址 32为的系统上,进程使用的内存大小最多不超过4G(虚拟内存) 32位有PAE机制可支持64G的内存,最大使用为16G ,进程最多使用4G,实 际为3G 每个进程都有自己的虚拟空间,都为3G 进程地址空间:低地址空间3G 高地址空间1G: 内核 进程地址空间的四段: 代码段 text:只读的 数据段 data :初始化为0 堆段heap:调用malloc()函数,实现动态分配地址, 栈段:本地变量 函数, 实现高向低地址转换
多任务:实现进程调度: 调度方式: 协作式的调度 :自愿交出 抢占式任务调度:调度器scheduler:管理进程的抢占方式 调度器使用的算法:查找时间 O标准 n为队列长度 分为: O(1) O(Log n) 比O(1)的时间稍长 O(n) O(n的2次方) O(2的n次方) 调度器类别: 先进先出的实时调度器:SCHED_FIFO 只调度0-99的 轮调实时调度器:SCHED_RR 只调度0-99的,优先级没有FIFO高 SCHED_NORMAL :调度静态的100-139 ,时间共享的 普通的进程 ,也称为SCHED_OTHER 调度器提供策略: 尽可能快的相应进程 大的后台进程吞吐率 避免进程饥饿 低的需要 满足高优先级的进程 进程调度: 基于时间共享:多路复用 基于优先级 进程优先级分为: 静态的:标识 100-139 越小越高, 动态的 :0-99 实时的,越小越高,可调整 调整优先级nice,静态的 调整进程优先级:让出自己的优先级,值越小优先级越高 nice值(-20到19)与动态进程相符100--139: 普通用户Nice值只能调高不能调低,root都可以 nice值的调整有两种: 1 在系统启动时就调整# nice -n 3 bash(进程名)默 认都为0对应120 2 调整已经启动的进程 # renice 数字 进程号 renice 0 8669