posts - 71,comments - 19,trackbacks - 0

摘要: 学习的三要素 方法 = 模型 + 策略 + 算法模 型 所要学习的条件概率分布或决策函数,模型的假设空间包含所有可能的条件概率分布或决策函数。 \(F = \{ ~f~ | ~Y = f(X)~ \}\), \(F = \{ ~f~ | ~Y = f_{\theta}(X), \theta \in R^{n}~ \}\) 条件概率 \(F = \{ ~P~ | ~P(Y~|~X)~ \} \), \(F = \{ ~P~ | ~P_{\theta}(Y~|~X), \theta \in R^{n}~ \}\)策 略 为了从假设空间中选取最优模型,需要引用一些手段来评估模型。1)损失函...阅读全文
posted @ 2013-09-09 09:29 汝熹 阅读(1323) 评论(1) 编辑
摘要: 6.slab层 为了便于数据的频繁分配和回收,Linux内核提供了slab层(也就是所谓的slab分配器)。slab分配器扮演了通用数据结构缓存层的角色。 slab层把不同的对象划分为所谓高速缓存(cache)组,其中每个高速缓存都存放不同类型的对象。这些高速缓存又被划分为slab,slab由一个或多个物理上连续的页组成。一般情况下,slab也就仅仅由一页组成。每个调整缓存可以由多个slab组成。 每个slab都包含一些对象成员,这里的对象指的是被缓存的数据结构。每个slab处于三种状态之一:满、部分满或空。每个高速缓存都是用 kmem_cache_s 结构来表示。这个结构包含三个链表 ...阅读全文
posted @ 2013-01-05 08:31 汝熹 阅读(182) 评论(0) 编辑
摘要: 内存管理1.页 内核把物理页作为内存管理的基本单位。大多数 32 位体系结构支持 4KB 的页,而 64 位体系结构一般会支持 8KB 的页。内核用 struct page 结构表示系统中的每个物理页。该结构位于<linux/mm.h>中。struct page { page_flags_t flags; /* 表示页的状态,每一位表示一种状态,定义在<linux/page_flags.h> */ atomic_t _count; /* 存放页的引用计数,0代表没有被引用 */ atomic_t _mapcount; unsigned long pr...阅读全文
posted @ 2013-01-03 11:30 汝熹 阅读(156) 评论(0) 编辑
摘要: 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 汝熹 阅读(323) 评论(0) 编辑
摘要: 定时器和时间管理 系统定时器是一种可编程硬件芯片,它能以固定频率产生中断。该中断就是所谓的定时器中断,它所对应的中断处理程序负责更新系统时间,还负责执行需要周期性运行的任务。系统定时器和时钟中断处理程序是Linux系统内核管理机制中的中枢。 另外一个关注的焦点是动态定时器——一种用来推迟执行程序的工具。比如说,如果软驱马达在一定时间内都未活动,那么软盘驱动程序会使用动态定时器关闭软驱马达。内核可以动态创建或销毁动态定时器。1.内核中的时间概念 系统定时器以某种频率自行触发时钟中断,该频率可以通过编程预定,称为节拍率(tick rate)。连续两次时钟中断的间隔时间称为节拍(tick),它...阅读全文
posted @ 2012-12-30 08:45 汝熹 阅读(270) 评论(0) 编辑
摘要: 4.信号量 Linux中的信号量是一种睡眠锁。如果一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时处理器能重获自由,从而去执行其他代码。当持有信号量的进程将信号量释放后,处于等待队列中的那个任务将被唤醒,并获得该信号量。 信号量和自旋锁在使用上的差异: 1)由于争用信号量的过程在等待锁重新变为可用时会睡眠,所以信号量适用于锁会被长时间持有的情况;相反,锁被短时间持有时,使用信号量就不太适宜了。因为睡眠、维护等待队列以及唤醒所花费的开销可能比锁被占用的全部时间还要长。 2)由于执行线程在锁被争用时会睡眠,所以只能在进程上下文中才能获取信号量锁,因...阅读全文
posted @ 2012-12-28 09:07 汝熹 阅读(426) 评论(0) 编辑
摘要: 内核同步方法1.原子操作 原子操作可以保证指令以原子的方式执行——执行过程不被打断。内核提供了两组原子操作接口,一组针对整数进行操作,另一组针对单独的位进行操作。 针对整数的原子操作只能对 atomic_t 类型的数据进行处理。 除了原子整数操作外,内核还提供了一组针对位这一级数据进行操作的函数。位操作函数是对普通的内存地址进行操作的,它的参数是一个指针和一个位号,第0位是给定地址的最低有效位。 内核还提供了一组与上述操作对应的非原子位函数。非原子位函数与原子位函数的操作完全相同,但是前者不保证原子性,且其名字前缀多两个下划线。例如,与 set_bit 对应的非原子形式是 __se...阅读全文
posted @ 2012-12-26 09:03 汝熹 阅读(170) 评论(0) 编辑
摘要: 下半部和推后执行的工作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 汝熹 阅读(238) 评论(0) 编辑
摘要: 下半部和推后执行的工作1.下半部 下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作,对于在上半部和下半部之间划分工作,尽管不存在某种严格的规则,但还是有一些提示可供借鉴: 1)如果一个任务对时间非常敏感,将其放在中断处理程序中执行。 2)如果一个任务和硬件相关,将其放在中断处理程序中执行。 3)如果一个任务要保证不被其他中断(特别是相同的中断)打断,将其放在中断处理程序中执行。 4)其他所有任务,考虑放置在下半部执行。 我们希望尽量减少中断处理程序中需要完成的工作量,因为在它运行的时候当前的中断线(或全局中断)都会被屏蔽,而缩短中断被屏蔽的时间对系统的响应能力和...阅读全文
posted @ 2012-12-21 08:44 汝熹 阅读(184) 评论(0) 编辑
摘要: 中断和中断处理程序1.中断 中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向操作系统反映此信号的到来,然后由OS负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步,内核随时可能因为新到来的中断而被打断。不同的设备对应的中断不同,都通过一个唯一的数字标识,称之为中断请求(IRQ)线。 在操作系统中,讨论中断就不得不提及异常。异常与中断不同,它在产生时必须考虑与处理器时钟同步。实际上,异常也常常称为同步中断。在处理器执行到由于编程失误而导致的错误指令的时候,或者是在执行期间出现特殊情况,必须靠内核来处理的时候,处理器就会产生一个异常。因为..阅读全文
posted @ 2012-12-19 08:55 汝熹 阅读(257) 评论(0) 编辑