- 1、本文档共33页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程调度与切换
第五章 进程调度与切换 0.0预备知识:进程与内核关系 5.0 预备知识:CPU的连续流程与多任务 5.1 Linux时间系统 5.2 时钟中断 5.3 Linux调度程序Schedule() 5.4 进程切换 0.0预备知识:进程与内核关系 所有系统调用的功能都在内核中实现 所有进程共享内存中唯一一份内核代码 Linux采用此大内核结构 系统调用、中断、异常时执行内核 5.0 预备知识:CPU的连续流程与多任务 main() { int i,j; char buf[101]; for(i=0;i10000;i++); read(0,buf,100); } fork()创建进程-execl()装入并执行此程序-main()-...-时钟中断处理程序-调度原语-执行其它进程...-调度原语-main()中的指令...可能还有几次切换...-main()中指令-调用read()-进入内核-阻塞原语-调度原语-...-键盘中断处理程序-执行被中断进程-..若干次键盘中断...- 键盘中断处理程序,发现键入值为’\n’-唤醒原语-中断返回执行被中断进程-...-调度原语-内核中继续执行完read(),准备返回用户空间-调度原语-...-调度原语-read()返回-调用exit() 5.1 Linux时间系统 5.1.1 时钟硬件 5.1.2 时钟运作机制 5.1.3 Linux时间基准 5.1.4 Linux时间系统 5.1.1 时钟硬件 RTC(Real Time Clock) 也叫CMOS时钟 用主板电池供电 用于维持日期和时间 系统管理员可用/sbin/clock程序配置RTC OS时钟 典型芯片8253/8254 OS设定计数器初值 收到一次脉冲计数器减一 减至零时引发时钟中断并恢复计数器初值 OS时钟是以时钟中断为基础的软件时钟 5.1.2 时钟运作机制 OS时钟通过BIOS调用从RTC获得初值 Linux内核初始化完成后不经过BIOS直接对RTC操作 OS时钟通过时钟中断进行计时 每隔一定时间操作系统根据OS时钟的值刷新或校正RTC(不经过BIOS) 应用程序从OS时钟获得日期和时间 5.1.3 Linux时间基准 每次时钟中断称为一个时钟嘀嗒 计算机中的时间表示为从时间基准开始的时钟嘀嗒数 DOS时间基准是1980年一月一日 UNIX的时间基准是1970年1月1日上午12点 Linux的时间基准是1970年1月1日凌晨0点 5.1.4 Linux时间系统 Linux中用全局变量jiffies表示时钟嘀哒数 定义:unsigned long volatile jiffies; 5.2.1时钟中断的产生 set_intr_gate(0x20,interrupt[0]); /*在IDT0x20表项中插入一个中断门,其中段选择符置成内核代码段选择符,偏移域置成0号中断处理程序入口地址*/ outb_p(0x34,0x43);/*置8253计数器0的工作方式*/ outb_p(LATCH0xff,0x40);/*置计数初值的低位字节*/ outb_p(LATCH8,0x40); /*置计数初值的高位字节*/ #define CLOCK_TICK_RATE 1193180 #define LATCH ((CLOCK_TICK_RATE+HZ/2)/HZ) #define HZ 100 5.2.2 时钟中断相关的函数 timer_interrupt() - do_timer_interrupt() - do_timer() timer_interrupt() 每10ms一次的时钟中断发生时被调用 关中断情况下执行 单处理机时主要语句是调用 do_timer_interrupt() do_timer_interrupt() static inline void do_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) //in /arch/i386/kernel/time.c { do_timer(regs); if(xtime.tv_sec last_rtc_update + 660 ) update_RTC();//每隔11分钟更新一次RTC } //以上程序经过简化 do_timer() void do_timer(struct pt_regs *regs) // in /kernel/timer.c { (*(unsigned long *)jiffies)++; //更新系统时间,保证jiffies操作的原子性 update_process_times(user_mode(regs)); // 更新进程时间片计数器
文档评论(0)