计算机体系结构-图+进程调度
http://blog.csdn.net/wudongxu/article/category/791519
PAE:物理地址扩展:
32bit+4=64G
32位操作系统:1G内核+3G用户
缓存:比原始存储设快,但小,因为贵,程序运行局部性
缓存置换算法:LRU MRU
程序运行局部性:空间局部性,时间局部性
1.寄存器
2.一级指令缓存,一级数据缓存
3.二级缓存
4.三级缓存(共享)
1.直接映射(性能太低,RAM >>缓存)
2.N路关联
5.cpu直接跟1级缓存打交道,其二级缓存,三级缓存要置换到1级缓存
6. Write through:通写,CPU更新缓存,所有缓存也同时都要更新
Write Back:回写,当CPU丢弃缓存中数据,才更新其他缓存
7.设备识别:IO端口
设备在PC开机BIOS检测,注册IO端口
8.中断控制器:接受外部设备请求,并向CPU请求中断处理
9.线性低地址空间16M 给DMA使用
10.BIOS :加载线性地址最低端
11.CPU频率大于内存频率,需要在一定比例后在上升延读取内存数据
12.process:一个独立的运行单位
系统资源:CPU时间,存储空间
13.os:vm
把CPU时间分片
14.指令寄存器:指向下条指令地址
15.进程切换:保存现场,恢复现场
16.把内存划分成固定单元[4K..]
每个页面称为页框
进程虚拟地址空间页 通过MMU映射到 页框
MMU:具有保护资源,映射资源
映射关系:保存在 一级目录,二级目录,三级目录
进程优先级:优先级越高,越优先调度,分的时间越多
17.进程描述符 task_struct
双向链表:内核维护所有进程的task_struct
进程切换,是切换task_struct ,保存该进程现场到task_struct中,而task_struct 由内核维护,即由用户态切换到内核态,花费时间资源
进程切换太快,会产生由用户态到内核态切换,花时间
进程切换太慢,一个进程可能很久不会得到CPU,响应慢
18.抢占(2种方式)
19.进程分类:
交互式进程(I/O)
批处理进程(CPU)
实时进程(Real-time)
策略:
CPU:时间片长,优先级低
IO:时间片短,优先级高
LINUX优先级:
实时优先级:1-99,数字越小,优先级越低
静态优先级:100-139,数据越小,优先级越高
[root@monitor ~]# ps -e -o class,rtprio,pri,nice,cmd CLS RTPRIO PRI NI CMD TS - 19 0 /sbin/init TS - 19 0 [kthreadd] FF 99 139 - [migration/0] TS - 19 0 [ksoftirqd/0] FF 99 139 - [migration/0] FF 99 139 - [watchdog/0] TS - 19 0 [events/0] TS - 19 0 [cgroup] TS - 19 0 [khelper]
[root@localhost ~]# chrt -p 2
pid 2's current scheduling policy: SCHED_FIFO
pid 2's current scheduling priority: 99
针对非实时进程:TS
[root@localhost ~]# ps -e -o class,rtprio,pri,nice,cmd CLS RTPRIO PRI NI CMD TS - 24 0 init [5] FF 99 139 - [migration/0] TS - 5 19 [ksoftirqd/0] FF 99 139 - [watchdog/0] FF 99 139 - [migration/1] TS - 5 19 [ksoftirqd/1] FF 99 139 - [watchdog/1] TS - 29 -5 [events/0] TS - 29 -5 [events/1] renice num -p pid num[-20,19] pri nice prority 39--->-20--->100 38--->-19--->101 37--->-18--->102
pri=39
实际优先级=139-39=100
pri=38
实际优先级=139-38=101
pri与nice关系 pri=19-nice
而nice值又对应[100-139]
静态优先级与nice关系
prority=120+nice=120+(19-pri)=139-pri
PR与NI关系
PR=20+nice
[root@monitor ~]# top top - 15:02:56 up 4 days, 21 min, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1018600k total, 706716k used, 311884k free, 80660k buffers Swap: 0k total, 0k used, 0k free, 479184k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 4 -16 19232 1504 1212 S 0.0 0.1 0:00.69 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:01.15 ksoftirqd/0
为什么要搞个PRI ,PR? 在非实时时程中重定义一个从[0,39]逻辑顺序,无负数,和实时优先级[0,99]一样的变化顺序
SCHED_OTHER:TS(SCHED_NORMAL) :用来调度[100-139]的进程 ( 优先级调度 )
10个110
30个115
50个120
2个130
那么130可能不会运行
- SCHED_OTHER 分时调度策略,(默认的)
- SCHED_FIFO实时调度策略,先到先服务
- SCHED_RR实时调度策略,时间片轮转
- RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程
- SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
- SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
- 当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。
1:进程只能在SCHED_FIFO和SCHED_RR选择一个 2:使用统一的数据结构管理SCHED_FIFO和SCHED_RR进程。 3:同一优先级选择就绪队列头的的那个进程运行 |
http://blog.csdn.net/ctthuangcheng/article/details/8914149
动态优先级解决这种情况:
dynamic priority=max(100,min(static priority-bonus+5,139))
bonus:[0,10]
LINUX调度器:
o(1): 分成139个队列: 99->1 ,100-139 扫描队列首部
每个队列有两个队列:活动队列,过期队列,[指针互换]
cfs:完全公平队列:针对 SCHED_OTHER[100-139] 这个类别的算法
http://blog.csdn.net/zhoudaxia/article/details/7375668