计算机体系结构-图+进程调度

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种方式)

    1.tick:系统时钟中断,系统时钟
            100Hz
            1000Hz:1ms产生一个时钟中断
   
    2.RHEL 6.4 (已经无系统时钟中断了)
          tick less:已经无系统时钟中断了
          interrupt-driven(才用中断驱动)
                  硬中断
                  软中断
            使CPU深度睡眠
 

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?
在非实时时程中重定义一个从[039]逻辑顺序,无负数,和实时优先级[0,99]一样的变化顺序

 

  
    nice调整静态优先级
    ps
 
    nice值: [-20-19]---->静态优先级[100-139]  一 一对应   
    静态优先级=120+nice 
    0:120
    
     [ 进程名格式]:内核线程
 
 
 
Linux process scheduling classes :
 
SCHED_FIFO  [1-99]:FF
First-In, First-Out real-time process
 
SCHED_RR:RR
Round Robin real-time process

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]

 
优先级调整:
SCHED_FIFO
chrt  -f  [1-99]  /path/to/program arguments
 
SCHED_RR
chrt -r [1-99]  /path/to/program arguments
 
SCHED_OTHER (SCHED_NORMAL)
nice   n command
renice -n pid
 
调度类别:
RT:
      SCHED_FIFO
      SCHED_RR
100-139:
       SCHED_Other
 
SCHED_BATCH
SCHED_IDLE

     

 LINUX调度器:

   o(1): 分成139个队列: 99->1 ,100-139 扫描队列首部

          每个队列有两个队列:活动队列,过期队列,[指针互换]

   cfs:完全公平队列:针对 SCHED_OTHER[100-139] 这个类别的算法

http://blog.csdn.net/zhoudaxia/article/details/7375668

 

 

 

 

 

 

 

 

  

posted @ 2016-06-10 22:29  zengkefu  阅读(634)  评论(0编辑  收藏  举报