- 博客(29)
- 资源 (2)
- 收藏
- 关注
原创 调度算法
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 早期Linux版本中的调度算法非常简单易懂;在每次进程切换时,内核扫描可运行进程的链表,计算进程的优先级,然后选择”最佳”进程来运行。这个算法的主要缺
2011-07-16 10:41:26 812
原创 进程调度
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> Linux与任何分时系统一样,通过一个进程到另一个进程的快速切换,达到表面上看来多个进程同时执行的神奇效果。进程切换本身已在第三章中讨论过,本章讨论进
2011-07-16 10:05:27 1036
原创 软定时器和延迟函数
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 定时器是一种软件功能,即允许在将来的某个时刻,函数在给定的时间间隔用完被调用。超时表示与定时器相关的时间间隔已经用完的那个时刻。内核和进程广泛使用定时
2011-07-15 14:51:33 3291
原创 更新系统统计数
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 更新时间和日期用户程序从xtime变量中获得当前时间和日期。内核必须周期性地更新该变量,才能使它的值保持相当的精确。全局时钟中断处理程序调用updat
2011-07-15 14:50:45 1311
原创 单处理器系统上的计时体系结构
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 在单处理器系统上,所有与定时有关的活动都是由IRQ线0上的可编程间隔定时器产生的中断触发的。同样,在Linux中,某些活动都尽可能在中断产生后立即执行
2011-07-15 14:49:03 1016
原创 Linux 计时体系结构
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> Linux必定执行与定时相关的操作。例如,内核周期性地:更新自系统启动以来所经过的时间。更新时间和日期。确定当前进程在每CPU上已经运行了多长时间,如
2011-07-15 14:47:35 1289 1
原创 避免竞争条件的实例
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 人们总是期望内核开发者确定和解决由内核控制路径的交错执行所引起的同步问题。但是,避免竞争条件是一项艰巨的任务,因为这需要对内核的各个成分如何相互作用有
2011-07-14 16:50:10 1181
原创 对内核数据结构的同步访问
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 可以使用前面所述的同步原语保护共享数据结构避免竞争条件。当然,系统性能可能随所选择同步原语种类的不同而有很大变化。通常情况下,内核开发者采用下述由经验
2011-07-14 16:49:34 800
原创 补充原主和禁止中断
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 补充原语Linux2.6还使用了另一种类似于信号量的原语:补充。引入这种原语是为了解决多处理器系统上发生的一种微妙的竞争条件,当进程A分配了一个临时信
2011-07-14 16:48:43 851
原创 信号量
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 我们在第一章”同步和临界区”一节引入了信号量。从本质上说,它们实现了一个加锁原语,即让等待者睡眠,直到等待的资源变为空闲。实际上,Linux提供两种信
2011-07-14 13:50:20 860
原创 自旋锁
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 一种广泛应用的同步技术是加锁。当内核控制路径必须访问共享数据结构或进入临界区时,就需要为自己获取一把”锁”。由锁机制保护的资源非常类似于限制于房间内的
2011-07-14 10:33:25 1148
原创 原子操作和内存屏障
若干汇编语言指令具有”读—修改—写”类型----也就是说,它们访问存储器单元两次,第一次读原值,第二次写新值。假定运行在两个CPU上的两个内核控制路径试图通过执行非原子操作来同时” 读—修改—写”同一存储器单元。首先,两个CPU都试图读同一单元,但是存储器仲裁器插入,只允许其中的
2011-07-14 07:27:51 2439
原创 同步原语
现在我们考察一下在避免共享数据之间的竞争条件时,内核控制路径是如何交错执行的。表5-2列出了Linux内核使用的同步技术。”适用范围”一栏表示同步技术适用于系统中的所有CPU还是单个CPU。例如,本地中断的禁止只适用于一个CPU;相反原子操作影响系统中的所有CPU。现在,让我们简
2011-07-13 22:30:56 1595
原创 从中断和异常返回
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 我们通过考察中断和异常处理程序的终止阶段来结束本章。尽管终止阶段的主要目的很清楚,即恢复某个程序的执行;但是,在这样做之间,还需要考虑几个问题:内核控
2011-07-13 13:20:22 1901
原创 软中断及tasklet
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 我们前面在”中断处理”一节提到,在由内核执行的几个任务之间有些不是紧急的的;在必要情况下它们可以廷迟一段时间。回忆一下,一个中断处理程序的几个中断服务
2011-07-13 13:19:27 2776
原创 中断处理
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 正如前面解释的那样,内核只要给引起异常的进程发送一个Unix信号就能处理大多数异常。因此,要采取的行动被廷迟,直到进程接收到这个信号。所以,内核能很快
2011-07-12 17:15:57 1732
原创 异常处理
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> CPU产生的大部分异常都是由Linux解释为出错条件。当其中一个异常发生时,内核就向引起异常的进程发送一个信号向它通知一个反常条件。例如,如果进程执行
2011-07-12 10:48:20 1025
原创 初始化中断描述表
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 现在,我们知道了80x86微处理器在硬件级对中断和异常做了些什么,接下来,我们可以继续描述如何初始化中断描述表。内核启用中断以前,必须把IDT表的初始
2011-07-12 10:47:43 874
原创 中断和异常处理程序的嵌套执行
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 每个中断或异常都会引起一个内核控制路径,或者说代表当前进程在内核态执行单独的指令序列。例如:当I/O设备发出一个中断时,相应的内核控制路径的第一部分指
2011-07-12 10:46:03 3381
原创 中断描述符表
中断描述表是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序的入口地址。内核在允许中断发生前,必须适当地初始化IDT。在第二章中,我们介绍了GDT和LDT,IDT的格式与这两种表的格式非常相似,表中的每一项对应一个中断或异常微量,每个向量由8
2011-07-12 07:24:07 3643
原创 中断和异常
中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。中断通常分为同步中断和异步中断:(1) 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。(2)
2011-07-11 22:16:24 1733
原创 中断和异常
中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。中断通常分为同步中断和异步中断:(1) 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。(2)
2011-07-11 22:14:25 563
原创 中断和异常
中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。中断通常分为同步中断和异步中断:(1) 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。(2)
2011-07-11 21:59:21 724
原创 撤消进程
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 很多进程终止了它们本该执行的代码,从这种意义上说,这些进程“死”了。当这种情况发生是,必须通知内核以便内核释放进程所拥有的资源,包括内存,打开文件及其
2011-07-11 17:32:58 837
原创 创建进程
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> Unix操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell进程就创建一个新进程,新进程执行shell的另一个拷贝。传统的
2011-07-11 14:10:52 2054
原创 进程切换
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换,任务切换或上下文切换。下面几节描
2011-07-11 09:09:08 6408
原创 进程
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 第三章进程进程是任何多道程序设计的操作系统中的基本概念。通常把进程定义为程序执行的一个实例,因此,如果16个用户同时运行vi,那么就有16个独立的进程
2011-07-09 15:06:19 1037
原创 内存寻址
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 内存寻址内存地址使用用80x86微处理器时,必須区分以下三种不同的地址逻辑地址包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址有80x
2011-07-07 14:39:55 4382
原创 绪论
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> Unix内核概述Unix内核提供了应用程序可以运行的执行环境。因此,内核必须实现一组及相应的接口。应用程序使用这些接口,而且通常不
2011-07-06 14:56:58 765
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人