linux系统调优的I/O管理 内存管理 进程管理

时间:2020-12-24 22:30:49
I/O设备:

              I/O总线:连接cpuI/O设备的

              组成:    I/O端口:65536个,不代表可以连接65536个设备,一个设备用

多个端口

                     接口

                     设备控制器

             

用户进程执行的动作:

              虚拟文件系统层:bio:数据结构

              block layerI/O调度器 I/O的请求队列

              设备驱动

              磁盘

I/O调度器算法:

      

              期限deadline:维护读、写、 排序队列

              anticipatory期望:只有一个sata硬盘 ,可能较长时间的读延长每一个

请求读后会等待一段时                     间,但吞吐率大

              完全公平队列:CFQ 每一个进程都有一个特定的队列里,默认一次取四个

请求

              NOOP无操作:没有任何的其他动作,请求进来直接就提供服务

       设定 系统启动传递参数

 

缓存cache

       数据执行过程: 磁盘--->内存-->缓存--->真正执行

 

       pdflush :内核线程 实现数据同步  含有kupdatebdflush

       sync :数据同步    

内存管理:

              分为:  逻辑地址空间: linux很少用到

                     物理地址空间

                     线性地址空间:虚拟

为了更好的分配地址空间内存将其分成页page

              page:为了让线性地址空间映射成物理的,一页一般4K

              叶框 page frames:存放页的 4k

              页表page table 数据结构,描述每一个页所对应的叶框的位置,不至          

于造成数据修改时的混乱

              每个进程都有自己的页表,每一行记录为page table entryPTE

       解释:

       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 threadslinux自带的

                            Native POSIX thread libraryNPTL ,posix规范标准      

              编程接口

                            NGPT

                     环境变量 LD_ASSUME_KERNEL 查看当前系统的线程类型

                     windowslinux是真正支持线程的系统

 

上下文切换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(n2次方)      

                            O(2n次方)

              调度器类别:

                     先进先出的实时调度器:SCHED_FIFO 只调度0-99

                     轮调实时调度器:SCHED_RR 只调度0-99的,优先级没有FIFO

                     SCHED_NORMAL :调度静态的100-139 ,时间共享的 普通的进程      

              ,也称为SCHED_OTHER

                           

              调度器提供策略:

                            尽可能快的相应进程

                            大的后台进程吞吐率

                            避免进程饥饿

                            低的需要

                            满足高优先级的进程

              进程调度:

                     基于时间共享:多路复用

                     基于优先级

              进程优先级分为:

                            静态的:标识 100-139 越小越高,

                            动态的 0-99 实时的,越小越高,可调整

                     调整优先级nice,静态的

                     调整进程优先级:让出自己的优先级,值越小优先级越高

                                   nice(-2019)与动态进程相符100--139

                     普通用户Nice值只能调高不能调低,root都可以

                     nice值的调整有两种:

                            1 在系统启动时就调整# nice -n  3  bash(进程名)

认都为0对应120

                                  2 调整已经启动的进程 # renice  数字 进程号

                                                 renice   0   8669