Pennant的日常
分享工作上的点点滴滴
posts - 75,comments - 21,views - 66454
12 2012 档案
《Linux内核设计与实现》读书笔记(10)--- 定时器和时间管理(2)
摘要:6.实际时间 当前实际时间(墙上时间)定义在文件 kernel/timer.c 中:struct timespec xtime; timespec 数据结构定义在文件<linux/time.h>中,形式如下:struct timespec { time_t tv_sec; /* 秒 */ long tv_nsec; /* 纳秒 */}; xtime.tv_sec 以秒为单位,存放着自 1970年7月1日(UTC)以来经过的时间。xtime.tv_nsec 记录自上一秒开始经过的纳秒数。 读写 xtime 变量需要使用 xtime_loc... 阅读全文
posted @ 2012-12-31 21:41 汝熹 阅读(528) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(9)--- 定时器和时间管理(1)
摘要:定时器和时间管理 系统定时器是一种可编程硬件芯片,它能以固定频率产生中断。该中断就是所谓的定时器中断,它所对应的中断处理程序负责更新系统时间,还负责执行需要周期性运行的任务。系统定时器和时钟中断处理程序是Linux系统内核管理机制中的中枢。 另外一个关注的焦点是动态定时器——一种用来推迟执行程序的工具。比如说,如果软驱马达在一定时间内都未活动,那么软盘驱动程序会使用动态定时器关闭软驱马达。内核可以动态创建或销毁动态定时器。1.内核中的时间概念 系统定时器以某种频率自行触发时钟中断,该频率可以通过编程预定,称为节拍率(tick rate)。连续两次时钟中断的间隔时间称为节拍(tick),它... 阅读全文
posted @ 2012-12-30 08:45 汝熹 阅读(521) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(8)--- 内核同步方法(2)
摘要:4.信号量 Linux中的信号量是一种睡眠锁。如果一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时处理器能重获自由,从而去执行其他代码。当持有信号量的进程将信号量释放后,处于等待队列中的那个任务将被唤醒,并获得该信号量。 信号量和自旋锁在使用上的差异: 1)由于争用信号量的过程在等待锁重新变为可用时会睡眠,所以信号量适用于锁会被长时间持有的情况;相反,锁被短时间持有时,使用信号量就不太适宜了。因为睡眠、维护等待队列以及唤醒所花费的开销可能比锁被占用的全部时间还要长。 2)由于执行线程在锁被争用时会睡眠,所以只能在进程上下文中才能获取信号量锁,因... 阅读全文
posted @ 2012-12-28 09:07 汝熹 阅读(747) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(7)--- 内核同步方法(1)
摘要:内核同步方法1.原子操作 原子操作可以保证指令以原子的方式执行——执行过程不被打断。内核提供了两组原子操作接口,一组针对整数进行操作,另一组针对单独的位进行操作。 针对整数的原子操作只能对 atomic_t 类型的数据进行处理。 除了原子整数操作外,内核还提供了一组针对位这一级数据进行操作的函数。位操作函数是对普通的内存地址进行操作的,它的参数是一个指针和一个位号,第0位是给定地址的最低有效位。 内核还提供了一组与上述操作对应的非原子位函数。非原子位函数与原子位函数的操作完全相同,但是前者不保证原子性,且其名字前缀多两个下划线。例如,与 set_bit 对应的非原子形式是 __se... 阅读全文
posted @ 2012-12-26 09:03 汝熹 阅读(339) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(6)--- 下半部和推后执行的工作(2)
摘要:下半部和推后执行的工作4.tasklet tasklet是通过软中断实现的,它由两类软中断代表:HI_SOFTIRQ和TASKLET_SOFTIRQ。两者唯一区别在于前者优先于后者执行。 tasklet由tasklet_struct结构体表示,每个结构体代表一个tasklet,在<linux/interrupt.h>中定义:struct tasklet_struct { struct tasklet_struct *next; /* 链表中的下一个tasklet */ unsigned long state; /* tasklet的状态 ... 阅读全文
posted @ 2012-12-24 08:50 汝熹 阅读(415) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(5)--- 下半部和推后执行的工作(1)
摘要:下半部和推后执行的工作1.下半部 下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作,对于在上半部和下半部之间划分工作,尽管不存在某种严格的规则,但还是有一些提示可供借鉴: 1)如果一个任务对时间非常敏感,将其放在中断处理程序中执行。 2)如果一个任务和硬件相关,将其放在中断处理程序中执行。 3)如果一个任务要保证不被其他中断(特别是相同的中断)打断,将其放在中断处理程序中执行。 4)其他所有任务,考虑放置在下半部执行。 我们希望尽量减少中断处理程序中需要完成的工作量,因为在它运行的时候当前的中断线(或全局中断)都会被屏蔽,而缩短中断被屏蔽的时间对系统的响应能力和... 阅读全文
posted @ 2012-12-21 08:44 汝熹 阅读(355) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(4)--- 中断和中断处理程序
摘要:中断和中断处理程序1.中断 中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向操作系统反映此信号的到来,然后由OS负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步,内核随时可能因为新到来的中断而被打断。不同的设备对应的中断不同,都通过一个唯一的数字标识,称之为中断请求(IRQ)线。 在操作系统中,讨论中断就不得不提及异常。异常与中断不同,它在产生时必须考虑与处理器时钟同步。实际上,异常也常常称为同步中断。在处理器执行到由于编程失误而导致的错误指令的时候,或者是在执行期间出现特殊情况,必须靠内核来处理的时候,处理器就会产生一个异常。因为.. 阅读全文
posted @ 2012-12-19 08:55 汝熹 阅读(491) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(3)--- 进程调度
摘要:进程调度1.策略 进程可以被划分为I/O消耗型和处理器消耗型。前者指进程的大部分时间用来提交I/O请求或是等待I/O请求,常处于可运行状态。后者把时间大多用在执行代码上,除非被抢占,否则一直不停地运行,调度器不应该经常让它们运行。 调度算法中最基本的一类就是基于优先级的调度。这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度。 Linux根据以上思想实现了一种基于动态优先级的调度方法。一开始,该方法先设置基本的优先级,然而它允许调度程度根据需要来加、减优先级。例如,如果一个进程在I/O等待上耗费的时间多于其运行时 阅读全文
posted @ 2012-12-17 08:51 汝熹 阅读(486) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(2)--- 进程管理
摘要:进程管理1.进程描述符及任务结构 进程存放在叫做任务队列(task list)的双向循环链表中。链表中的每一项包含一个具体进程的所有信息,类型为task_struct,称为进程描述符(process descriptor),该结构定义在<linux/sched.h>文件中。 Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色(cache coloring)的目的。另一方面,为了避免使用额外的寄存器存储专门记录,让像x86这样寄存器较少的硬件体系结构只要通过栈指针就能计算出task_struct的位置,该结构为thread_info,在文件< 阅读全文
posted @ 2012-12-15 08:58 汝熹 阅读(299) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(1)--- Linux内核开发的特点
摘要:Linux内核开发的特点 相对于用户空间内的应用程序开发,内核开发存在很多的不同,最重要的差异包括以下几种: 1)内核编程时不能访问C库。 2)内核编程时必须使用GNU C。 3)内核编程时缺乏像用户空间那样的内存保护机制。 4)内核编程时浮点数很难使用。 5)内核只有一个很小的定长堆栈。 6)由于内核支持异步中断,抢占和SMP,因此必须时刻注意同步和并发。 7)要考虑可移植性的重要性。1.没有libc库 与用户空间的应用程序不同,内核不能链接使用标准C函数库(其他的那些库也不行)。最主要的原因在于速度和大小。虽然不能使用,但大部分常用的C库函数在内核中都已经得到实现。比如说操作字符串的函数组 阅读全文
posted @ 2012-12-13 09:16 汝熹 阅读(639) 评论(1) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示