Pennant的日常
分享工作上的点点滴滴
posts - 75,comments - 21,views - 66454

随笔分类 -  读书笔记

1 2 3 下一页
《Linux内核设计与实现》读书笔记(12)--- 内存管理(2)
摘要:6.slab层 为了便于数据的频繁分配和回收,Linux内核提供了slab层(也就是所谓的slab分配器)。slab分配器扮演了通用数据结构缓存层的角色。 slab层把不同的对象划分为所谓高速缓存(cache)组,其中每个高速缓存都存放不同类型的对象。这些高速缓存又被划分为slab,slab由一个或多个物理上连续的页组成。一般情况下,slab也就仅仅由一页组成。每个调整缓存可以由多个slab组成。 每个slab都包含一些对象成员,这里的对象指的是被缓存的数据结构。每个slab处于三种状态之一:满、部分满或空。每个高速缓存都是用 kmem_cache_s 结构来表示。这个结构包含三个链表 ... 阅读全文
posted @ 2013-01-05 08:31 汝熹 阅读(391) 评论(0) 推荐(0) 编辑
《Linux内核设计与实现》读书笔记(11)--- 内存管理(1)
摘要:内存管理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 汝熹 阅读(371) 评论(0) 推荐(0) 编辑
《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) 编辑
《面向模式的软件体系结构4-分布式计算的模式语言》读书笔记(1)--- 从混沌到结构(1)
摘要:1.1 Domain Model 创建一个模型来定义系统的业务职责及其变化范畴,模型元素是对应用领域的有用抽象,其角色和交互反映了该领域的工作流。 我们可以通过适当的方法来创建Domain Model,比如领域驱动设计和领域分析,还有一些专门表现领域变化的方法,如普遍性/多样性分析和特性建模等。领域相关的模式能进一步支持Domain Model的创建,它们可以提供该领域中公共抽象和工作重复采用的经典解决方案,包括这些解决方案可能的相应变体。1.2 Layers 不管软件系统不同部分之间有什么样的交互和耦合,我们都希望能对其进行独立的开发和改进,这可能跟系统的大小有关或者是上市时间方面的要求.. 阅读全文
posted @ 2012-10-30 08:48 汝熹 阅读(277) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(10)--- Evictor模式
摘要:4.2 Evictor模式 Evictor(清除者)模式描述了何时以及如何释放资源以优化资源管理。这个模式让我们可以配置不同的策略来自动决定哪些资源应该释放,以及应该在什么时候释放这些资源。1.问题 高度健壮及可伸缩的系统必须高效地管理资源。随着时间的推移,应用程序会获得很多资源,其中有一些只用过一次。如果应用程序持续地获取资源而不释放它们,那么就会导致性能下降和系统的不稳定。为了避免出现这样的情况,应用程序可以在使用资源之后立刻释放资源。但是,应用程序可能需要重新使用相同的资源,这就要求重新获得那些资源。重新获得资源这个操作本身可能代价高昂,所以应该避免,这可以通过把频繁使用的资源保... 阅读全文
posted @ 2012-10-23 08:34 汝熹 阅读(667) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(9)--- Leasing模式
摘要:4.1 Leasing模式 Leasing(租约)模式通过在获取资源时把资源同基于时间的租约相关联而简化了资源释放。当租约过期并且没有被更新时,那么资源就会被自动释放。1.问题 高度健壮和可伸缩的系统必须高效地管理资源。资源可以有很多种类型,包含本地和分布式服务、数据库会话以及安全令牌。在典型的用例中,资源使用者获取资源提供者的接口,然后向提供者要求一个或者多个资源。假定提供者给予了资源,那么资源使用者就会开始使用资源。但是,过了一段时间之后,资源使用者可能不再需要其中的一些资源。除非资源使用者显式地终止和提供者的关系并释放资源,否则不用的资源依然会被不必要地占用。这会进而导致资源使用... 阅读全文
posted @ 2012-10-21 21:12 汝熹 阅读(336) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(8)--- Resource Lifecycle Manager模式
摘要:3.4 Resource Lifecycle Manager模式 Resource Lifecycle Manager(资源生命周期管理器)模式引入了一个单独的Resource Lifecycle Manager,从而把资源的生命周期管理同它们的使用解耦合了。1.问题 建立大规模的系统很有挑战性。使大规模系统健壮并且具有伸缩性更具挑战性。使大规模系统健壮并且具有可伸缩性的最重要因素是如何管理资源。系统中的资源可能具有很多种不同的类型,比如网络连接、线程、同步原语、服务等。网络连接代表了客户应用程序和分布式应用服务之间的通信渠道。高效地管理它们需要有能力判断何时建立连接,何时释放连接。线程对大规 阅读全文
posted @ 2012-10-19 09:10 汝熹 阅读(359) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(7)--- Coordinator模式
摘要:3.3 Coordinator模式 Coordinator(协调者)模式描述了如何通过协调涉及多个参与者(每个参与者都包含资源、资源使用者和资源提供者)的任务的完成来维护系统的一致性。这个模式提出了一个解决方案,使得在涉及多个参与者的任务中,或者所有参与者的任务都完成,或者一项任务都没有完成。这确保了系统总是处于一致的状态。1.问题 很多系统都会执行涉及不止一个参与者的任务。一个参与者是一个主动实体,既包含资源使用者,也包含资源提供者。此外,在某些情况下,资源(比如服务)可以是主动的,所以会直接参与任务。参与者可能位于同一个进程中,也有可能跨越了多个进程、多个节点,每个参与者都会顺序执... 阅读全文
posted @ 2012-10-17 09:05 汝熹 阅读(523) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(6)--- Pooling模式
摘要:3.2 Pooling模式 Pooling(池)模式描述了如何通过循环使用不再需要的资源来避免昂贵的获取和释放资源的操作。一旦资源被循环利用并置入池中,它们就失去了自己的标识和状态。1.问题 很多系统都要求对资源可以进行快速并且可预测的访问。这样的资源包括网络连接,对象实例,线程以及内存。除了提供快速以及可预测的资源访问外,系统还要求解决方案对于所用资源的数目具有可伸缩性。此外,每一次用户请求应当在访问时间内经历很少的变化。所以,对资源A的获取时间不应当同资源B的获取时间有显著不同(A和B是相同类型的资源)。为了解决上面提到的问题,需要解决以下几点: 1)可伸缩性(Scalabil... 阅读全文
posted @ 2012-10-16 08:45 汝熹 阅读(474) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(5)--- Caching模式
摘要:3.1 Caching模式 Caching(缓存)模式描述了如何通过用完资源后不立刻释放资源来避免对资源的昂贵的重新获取。资源会维持它们的标识,并保留在某种可以快速访问的存储器中。它们可以被重用,从而避免了重新获取。1.问题 对相同资源的重复的获取、初始化以及释放造成了不必要的开销。在系统的同一个组件或者多个组件访问相同资源的情形下,重复的获取和初始化带来了CPU周期和系统整体性能的开销。应该减少获取、访问和释放频繁使用的资源的开销,以提高性能。为了解决这个问题,需要关注以下几点: 1)性能(Performance)。重复获取、初始化和释放资源的开销必须最小化。 2)复杂性(C... 阅读全文
posted @ 2012-10-14 22:41 汝熹 阅读(353) 评论(0) 推荐(0) 编辑
《面向模式的软件体系结构3-资源管理模式》读书笔记(4)--- Partial Acquisition模式
摘要:2.4 Partial Acquisition模式 Partial Acquistion(部分获取)模式描述了如何把资源获取分成多个阶段来优化资源管理。每个阶段都获取资源的一部分,这取决于系统的约束,比如内存以及其他资源的可用性。1.问题 具有高健壮性和可伸缩性的系统必须高效地获取资源,包括本地和远程的资源。预先获取资源对于满足资源的可获得性和可访问性限制很重要。但如果这些系统都在一开始就获取全部资源,那么就会带来很大的额外开销,会浪费很多资源。而另一方面,延迟获取所有资源也是不现实的,因为有的资源可能在应用系统启动或恢复的时候就要用到,为了解决这些冲突的资源获取需求,我们需要关注以下... 阅读全文
posted @ 2012-10-13 08:38 汝熹 阅读(368) 评论(0) 推荐(0) 编辑

1 2 3 下一页
< 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

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