菜鸟学Linux 第110篇笔记 CPU 



内容总览

cpu

进程

查看和调整linux 进程优先级




计算机原理


PAE (physical address extention)


cpu 

32bit 支持内存寻址空间 2^32=4G

64bit 支持内存寻址空间 4G*4G 

寄存器

一级缓存 cpu每个核独有

二级缓存 cpu每个核独有

三级缓存 核心共有


write through 通写

write back 回写 只有当缓存的数据要被替换时,才会将缓存的数据回写到RAM


interrupt controller 中断控制器 用来将外部的设备紧急信息通知给cpu使其停止正在做的事情

来处理外部设备所发来的信息,分为两步,一步是cpu指挥将数据读到内存,另一步

是查看其所发来的信息是否需要紧急处理,如紧急则需要立即处理


AGP 显卡 与cpu交互比较频繁


PCI-E 高速总线接口


IO port 65535个 硬件在开机时所分配的端口,cpu用来区分其不同的硬件 数据交互


单进程最大寻址为3G 剩下1G给内核


临界区 容易发生资源争用的地方


DMA direct memory access 直接内存访问


process 一个独立运行单位

系统资源: cpu时间 存储空间


OS VM 虚拟机

虚拟cpu 时间,切片 将cpu的运行时间切片

缓存:当前程序数据

内存: 线性地址 --> 物理地址 空间映射


进程切换:保存现场、恢复现场




linux 操作系统


进程


进程描述符 (元数据)


双向链表


context switch 上下文切换(进程切换)


linux 支持进程抢占CPU运行

系统时钟:时钟tick  

时间解析度 100Hz 1000Hz 时钟中断即每一次tick便可抢占cpu


linux进程类别

交互式进程(I/O) 时间片长,优先级低

批处理进程(CPU) 时间片短,优先级高

实时进程(Real-time)


linux 优先级 priority

实时优先级:1-99 数字越小,优先级越低

静态优先级:100-139 数字越小,优先级越高 

nice值调整静态优先级-20~19 用户空间进程一般为120 所以当nice为-20 其优先级为100

实时优先级比静态优先级高


动态优先级 是内核用来临时性的调整一些用户空间进程的优先级,当某些用户空间进程长时

  间未得到cpu运行时间片时,来将其调高,使其在cpu上运行一次,或某些进程

  得到的cpu运行时间片太多,来调低其优先级,使其降低得到的cpu运行时间片

  或运行时长

  dynamic priority = max (100, min ( static priority - bonus + 5), 139)

  bonus: 0-10


查看linux 进程优先级

# ps -e -o class,rtprio,pri,nice,cmd

cmd显示为加中括号表示是内核线程


手动调整优先级

100-139: nice|renice 调整用户空间进程

nice (run a program with modified scheduling priority)

# nice N COMMAND (针对未启用的)


renice (alter priority of running processes)

# renice -n # PID (针对已经运行的进程)


chrt -p [prio] COMMAND


1-99: chrt (manipulate real-time attributes of a process) 调整实时优先级

chrt [options] prio command [arg]... (未启动的)

        chrt [options] -p [prio] pid (启动的进程)

          -f, --fifo

              set scheduling policy to SCHED_FIFO

      -r, --rr

             set scheduling policy to SCHED_RR (the default)  

      -p, --pid

             operate on an existing PID and do not launch a new task


        # chrt -f -p [prio] PID

        # chrt -r -p [prio] PID

        # chrt -f <prio> COMMAND




linux 内核调度类别

实时进程

SCHED_FIFO   FIFO(first in first out) 先到先运行

SCHED_RR RR(round robin) 轮调,轮到该进程,则运行该运行

SCHED_Other  用户调度用户空间进程100-139

SCHED_BATCH

SCHED_IDLE


linux 调度进程在cpu上运行的算法O(1)和CFS(Complete Fair Scheduler)

O(1)算法 用来实现静态和实时优先级的进程在cpu运行时间片上分配公平,不能让优先级高

的进程一直在占用cpu,而导致优先级低的进程因为无法得到cpu运行时间片而饿死呵呵。

原理:它是将多个优先级的每个优先级分为两个队列,一个为即将调度的另一个为当

即将高度的进程在cpu运行完后将其放到此队列里(过时队列),内核在决定下一个要来

cpu运行的进程时,扫描顺序99~1,100~139如当优先级高的即将运行队列里有则会将其

队列里的每一个都运行,运行时间片完成后如果后续还需要再运行的则将其放到过时队

列里,然后再扫描优先级比其低的队列,如果有和上述运行规则相同,当一轮运行结束

后,即运行到最后一个优先级队列里,并且将所有的即将运行的进程运行完成后,内核

会将过时队列切换为即将即行队列,而刚刚为即将运行的队列切换为过时队列,这样内

核便会再次扫描运行队列里的进程,执行的顺序和上相同,不再重述。


CFS调度算法 也是一个进程合理公平化的使每个进程都能得到cpu运行时间片的一个调度机制



CPU 

rhel 6.4 tick less 无滴答

interrupt-driven

硬中断

软中断


深度睡眠


一级缓存 I1 (Instruct 1)1级指令缓存 D1(data 1)1级数据缓存


smp 对称多处理器  一块主板有多个cpu 插槽(socket)


cpu访问内存至少需要三个时间周期

1.向内存控制器寻求内存地址(寻址)

2.找到内存地址并施加一些请求机制(锁机制)

3.对内存进行访问(读写操作)


numa   每个cpu都有自己的内存访问区域,非一致性内存访问



CPU affinity cpu姻亲关系

将某程序直接绑定到某颗cpu或某个核心上,让其只在此核心上运行,从而不会交叉内存访问


命令numa实现绑定进程至某cpu上

numactl (临时调整cpu绑定进程)

numad   (永久调整cpu)

numastat  


taskset 绑定进程至某cpu上

# taskset -p mask pid

# taskset -p 0x00000003 101

# taskset -c 1,2 101


将中断请求绑定在非隔离的cpu上,从而避免那些隔离的cpu处理中断程序

echo CPU_MASK > /proc/irq/<irq number/smp_affinity

sysstat  工具包

dstat  工具包

查看cpu 负载状态Load average

sar -q

top

w

uptime

vmstat 1 5


查看cpu使用率 utilization

mpstat 1 2

sar -P ALL 1 2

iostat -c 1 2

/proc/stat

dstat 

--top-cpu

--top-mem

--top-io