- 博客(60)
- 资源 (11)
- 收藏
- 关注
原创 I/O scheduler
I/O scheduler负责处理对物理设备的操作调度,采用的是电梯调度算法。但是为了满足其它的需求。linux提供四种调度策略:1.the noop elevator:这种策略没有order队列,只有一个dispatch队列,每来一个操作请求就将其放在dispatch队列的最后。2.the cfq(complete fairness queueing) elevator:这种
2009-02-24 15:55:00 791
原创 linux对块设备的请求处理
linux对块设备请求的处理是一种层次体系结构,可以分为5层:1.vfs:这层对所有文件系统的一种封装2.mapping layer:这层用来定位数据的物理位置这个操作分为2步: a.首先确定包含文件的文件系统的block size,然后计算请求的数据包含多少file block。 b.调用跟文件系统有关的函数来访问文件的inode,确定请求的数据在磁盘上的逻辑块地址,事实上
2009-02-24 15:29:00 717
原创 看到《80后,还记得我们作文的必杀句吗? 》,心中多少回忆
看到《80后,还记得我们作文的必杀句吗? 》这篇文章里的句子,好像每一句都是自己写过的,那时候感觉还真的是天真单纯,整天无忧无虑的。在脑海里什么都是自然的,不带个人色彩。看着看着,小学时的种种事情都在脑海中浮现出来,老实说我觉得自己懂事懂得早,只有小学,我觉得自己是无忧无虑的。那时才真的是我的童年,那时爷爷奶奶都还很年轻,身体都很好,唉,现在真是不堪回首。想到小学,我又想起以前
2009-02-23 13:28:00 654
原创 linux block传输使用的一些术语
1.sector:是物理设备传输的最小单元,一般是512bytes2.block:是linux vfs 使用的基本单元,可以是512,1024,2048,4096byts3.segment:是设备驱动使用的传输单元,一个segment可以是一个内存页,也可以是一个内存页的一部分。需要注意的是,一个block device driver不需要知道block,block的大小,block
2009-02-23 13:14:00 697
原创 scatter-gather dma transfer
传统的dma传输要求内存的buffer必须是连续的,但是这种新型的scatter-gather dma transfer可以将连续的硬件sector(传统和新型的传输都要求硬盘sector是连续的)传输到不连续的内存buffer中
2009-02-23 12:48:00 1963
原创 linux对硬件设备的支持
linux对硬件设备的支持分为3种:1.no support at all:这样应用程序只能通过in 和 out指令直接对硬件设备进行操作,这种的典型代表是x window system,这样可以保证效率2.minimal support:内核不能识别设备,但是能识别设备对应的i/o接口,应用程序可以对i/o接口进行read或者write操作,这种的典型的代表是并口和串口设
2009-02-23 11:34:00 1121
原创 cache coherency when using dma
linux提供两种方式,来保证使用dma时,内存和硬件cache的一致性:1.Coherent DMA mappingWhen using this mapping, the kernel ensures that there will be no cache coherency problems between the memory and the hardware device;
2009-02-22 12:25:00 853
原创 今天的虚空龙日常任务
今天早上8点起来做虚空龙的日常任务,居然捡到7个虚空龙蛋。挑战壮志凌空任务的老5,居然被我过了然后挑战老6,在失败了2次后,第3次终于过了。发现老6比老5简单多了,飞行距离比老5短的多,老5的飞行距离太远了。总结规律是,要预先判断boss的飞行路线,这样才能最快做出调整,躲开boss的攻击,以及不被boss甩掉(特别是老6飞行速度真的很快,一不小心就会被甩掉)。看来今天早上
2009-02-22 09:35:00 2383
转载 e17 enlightenment 介绍及配置
为什么要有一个窗口管理器?为什么一定要有一个桌面背景,甚至是标题栏? 或是如果把一个应用程序如firefox当成桌面背景行不行?桌面能不能再快一点?我不想把资源浪费在那些用不到的地方。Linux那么多虚拟桌面,为什么我不能在一个桌面全屏运行一个程序,然后用alt+tab切换到其它程序或是alt+Fn换到其它桌面?如果你对窗口管理器也有上面的感觉的话,那么建议你可以试一试E1
2009-02-21 20:26:00 5253 1
原创 我常用的工具软件
1.音乐播放器:songbird2.文件管理器:thunar3.窗口管理器:e174.web浏览器:firefox5.终端:gnome-terminal
2009-02-21 20:17:00 864
转载 linux常用文件管理器
默认的文件管理器以下这些文件管理器被 Linux 桌面环境采用为默认的文件管理器:Nautilus,又称鹦鹉螺,是 GNOME 桌面环境中的默认文件管理器。虽然 Nautilus 稍显笨重,但是功能非常全面。Nautilus 具有树状视图,支持通过脚本来扩展其功能,并集成了光盘烧录特性。Nautilus 使用技巧,在 Nautilus 中执行批量重命名操作,Nautilus 脚本集,扩
2009-02-21 20:16:00 4507
原创 linux file lock
linux的文件锁分为两种:一种是advasory lock,只能保证进程内对同一个文件锁的互斥有效,但是多个进程可以同时对一个文件加互斥的锁,所以这种锁是加在file 结构上;一种是mandatory lock,这种锁可以保证多个进程无法对同一个文件都加上互斥锁,所以这种锁是加在inode 结构上的。当加mandatroy lock时,如果已有进程在文件上加了互斥锁a,那么进程创建的fi
2009-02-20 20:05:00 3766
原创 linux的vfs
linux VFS结构:1.superblock:每个文件系统有且只有一个superblock,系统初始化完毕之后将维护一个superblock链表,里面包含所有注册的文件系统的superblock。2.inode:保存一个文件的信息,比如文件的名字,文件在磁盘上的数据位置等3.file:这个结构用来描述进程跟一个文件交互的信息4.dentry:因为在linux
2009-02-20 19:40:00 720
转载 java button详细 解说mvc设计模式
用Button的例子详细说明 为了更好的理解MVC设计模式和Swing用户界面组件之间的关系,让我们更加深入的进行分析。我将采用最常见的组件button来说明。 我们从model来开始。 Model 一个按钮的model所应该具备的行为由一个接口ButtonModel来完成。一个按钮model实例封装了其内部的状态,并且定义了按钮的行为。它的所有方法可以分为四类: 1、查询内部状
2009-02-18 12:32:00 4849
原创 generate and deliver signal
在linux里,generate signal是指在接受信号的进程结构中插入信号的相关结构(在进程的结构中有两个跟信号相关的队列,一个是pending field里的信号队列,一个是signal field里的信号队列其中pending指向的是进程的私有信号,而signal里的是进程所在进程组的共有信号)。这个结构名为struct sigqueue.需要补充说明的是,如果信号是被进程忽略的,忽略一
2009-02-17 20:15:00 782
原创 linux的执行文件格式
linux可以直接运行的文件格式都保存在一个list里,其中list的基本结构是linux_binfmt,这个结构包含3个methods:1.load_binary:执行文件创建execution environment的方法2.load_shlib:binds a shared library3.core_dump:dump the execution context of the curren
2009-02-16 20:02:00 495
原创 exec系列函数的实现
exec系列函数从linux的linux_binfmt链表中,通过依次调用每个结构的load_binary函数来选择合适的运行格式,一旦找到就执行load_binary函数,否则尝试下一个linux_binfmt的load_binary,直到尝试完所有的linux_binfmt。load_binary函数:1.检查128位的magic number,看文件是不是属于这个格式2.读取文件的heade
2009-02-16 20:02:00 860
原创 linux 进程的内存布局
linux的进程有2种memory region layout:1.classic layout2.flexible layout见-819页type of memory region classic layout flexible layouttext segment(elf)
2009-02-16 19:54:00 851
原创 有关对系统调用参数的检查
在linux2.2以前,进行系统调用时,kernel将会对传入的参数进行比较细致的检查,特别是对指针参数,但是linux2.2后,系统在函数开始时只会检查指针是否是属于用户地址空间,而是不是有效的则在进行相关操作时才进行。2009/02/12 四
2009-02-16 19:53:00 505
原创 一个奇怪的问题
However, once the kernel initialization phase ends, the master kernel Page Tables are not directly used by any process or kernel thread. 内核使用的master page table并不是直接被进程或者内核线程使用,而内核在申请内存空间时,使用的lazy手法不会更
2009-02-16 19:51:00 478
原创 memory region and red-black tree
当一个进程要增加线性空间时,kernel首先检查看是不是现有的memory region是不是可以被增大,如果不可以的话,就创建一个新的memory region。一个进程可以包含多个memory region,他们用list结构进行存储,考虑到如果一个进程包含太多的memory region时,查找一个特定的线性地址在哪个memory region时,开销太大。所以每个进程的mm_struct(
2009-02-16 19:49:00 509
原创 zero page
当一个进程第一次对一个页进行读操作时,而且该页不在内存中时,kernel应该给进程分配一个新的页帧,更安全的做法是分配一个filled with zero的页帧给进程,这样才能保证别的进程的信息不会被新的进程给读取,所以linux中保留的一个这样filled with zero的页帧,叫zero page,当这种情况发生时,系统就将zero page填入页表中,并标记为不可写。当进程要对zero
2009-02-16 19:49:00 1250
原创 linux kernel linear address
共有1g线性空间,分成4部分:1.先映射内存的前896m空间,到high_memory结束2.剩下的用于noncontiguous memory area映射,从VMALLOC_OFFSET到VMALLOC_END,其中VMALLOC_OFFSET距high_memory8mb,每个被映射的noncontiguous memory area中间还要间隔4kb3.用于映射persistent ker
2009-02-16 19:48:00 403
原创 vmalloc() vs vmap()
Linux 2.6 also features a vmap( ) function, which maps page frames already allocated in a noncontiguous memory area: essentially, this function receives as its parameter an array of pointers to page d
2009-02-16 19:48:00 1562
原创 slab allocator
首先要说的是memory area,因为有时需要的内存没有一个page frame那么大,比方说只有10bytes,如果分配一个page frame给它,则会产生很多internal fraction。这是一方面,更重要的是很多kernel的数据结构都不正好是一个或几个page frame那么大,那么在分配的时候就会造成很多internal fraction。为了解决这个问题,linux现在是采用
2009-02-16 19:47:00 1590
原创 slab color
slab color是为了提高硬件cache的使用率,因为相同大小的object in different slabs有很大的可能被映射到同一个cache line,而同时又会有其它的cacheline处于空闲。解决方法如下:假设aln是对齐参数,free是每个slab为了对齐而未被使用的空间,通常free>aln将color*aln未使用的空间放到slab的最前面,后面留free-color*a
2009-02-16 19:47:00 1550
原创 memory pool
memory pool是给kernel component使用的内存cache,它保存了一些object,书上称为了memory element。是为了保证在低内存的情况下,也就是向memory allocator再也申请不到所要的内存时,component仍然可以从memory pool中申请到所需要的空间。一个memory pool中所有的cache都是一类的。2009/02/05 四
2009-02-16 19:47:00 406
原创 buddy system
这是一个很著名的算法,它的思想如下:首先将一系列连续的page frame看作一个block,然后每次需要allocation时,都会将一个block分成一半,一半用来满足需求,另一半则是free的,kernel中用一个list,来记录所有可用block。在linux中,这个list的名字是free_area array,数组的大小是11,即1, 2, 4, 8, 16, 32, 64, 128,
2009-02-16 19:46:00 535
原创 reserved page frame
linux保留了一定的reserved page frame数量由以下方式决定:The amount of the reserved memory (in kilobytes) is stored in the min_free_kbytes variable. Its initial value is set during kernel initialization and depends on
2009-02-16 19:45:00 522
原创 kernel mappings of high-memory page frames
linux使用3种方法来实现这个目标:1.permanent kernel mappings: 这种实现方法有两个核心的数据结构,一个是dedicated page table,地址由变量pkmap_page_table来指明,这个table有512或者1024中entries,取决于pae是否被激活,负责将线性地址转为物理地址。 另一个核心数据结构是一个名为page_address_htab
2009-02-16 19:45:00 759
原创 memory zone
由于硬件体系的一些约束,比如说对于32位机器,cpu不能直接访问所有的内存,当内存过大的时候,linux将内存划分为3个zone:1.ZONE_DMA:below 16 mb,因为一些老的dma只能访问这些地址的内存2.ZONE_NORMAL:16mb-896mb3.ZONE_HIGHMEM:地址高于896MB的内存对于属于kernel的线性地址,也就是3-4g地址(我们可以看到实际上物理内存并没
2009-02-16 19:44:00 980
原创 sched_yield函数
这个函数对于conventional process来说将会将进程加到expired runqueue,而对于实时进程则仍然是将进程加入active runqueue。2009/02/02 一
2009-02-16 19:43:00 2128
原创 scheduling class
linux有3种调度类:1.SCHED_FIFO:first in first out real-time process2.SCHED_RR:round robin real-time process3.SCHED_NORMAL:conventional time-shared process对于SCHED_FIFO,不会减少进程的时间片,所以进程不会因为时间片用完而被switch,唯一可以sw
2009-02-16 19:42:00 597
原创 runqueue balance in multiprocessor system
为了使得进程能够平均地分配到多个cpu之间,linux使用scheduling domain的概念来管理多个cpu,内核保证一个scheduling domain内,负载是均衡的。具体来说,在每个时钟tick的处理函数中会调用rebalance_tick(),这个函数会根据当前处理器的使用情况,比如是否处于空闲或忙碌状态来决定是否要调用load_balance()(当当前cpu的runqueue是
2009-02-16 19:42:00 512
原创 linux进程调度策略
每个进程运行一个quantum,这个quantum是由进程的static priority决定的,计算公式如下:base time quantum=(140-static priority)*20 if static priority(140-static priority)*5 if static priority>=120conventional processs static prior
2009-02-16 19:41:00 1350
原创 delay function
有时kernel需要等待一段时间,这个是通过delay function来实现的。在系统初始化的时候,系统计算了一个tick内,执行"loop"的个数,delay function通过将要delay的时间,转换为要执行”loop"次数来实现delay。2009/01/31 六
2009-02-16 19:40:00 705
原创 dynamic timers 的list
定时器的链表是个per-cpu变量,这就是说每个cpu都有自己的定时器链表,所以timer在哪个cpu上执行,取决于它被挂在哪个cpu的定时器链表上,链表按时间被划成很多时间段,对应数组的不同index,开始的index对应的时间段间的间隔粒度较小,然后变大:tv1(0-255),tv2(2009/01/31 六
2009-02-16 19:39:00 311
原创 有关timers的延时问题
one word of caution about linux timers:since checking for timer functions is always done by deferrable functions that be executed a long timerafter they have been activaed ,the kernel cannot ensure th
2009-02-16 19:31:00 410
原创 spin_lock详解
spin_lock macro详解列在这里,是因为当进行轮询操作时,在实现上,也是有很多技巧值得学习的:1.调用preempt_disable()disable kernel preemption2.使用原子指令尝试获得spin lock,代码大致如下: movb $0,%al xchab %al, slp->slock3.如果前面的操作获得的是正值,则说明拿到了锁,终止;否则调用preemp
2009-02-16 19:30:00 805
原创 synchronization primitives
同步可以通过多种方式来实现:1.per-cpu variable:一个这样的变量是一个数组,数组的每个元素都是同一个结构,分配给cpu每个cpu一个,每个cpu只能访问自己的2.atomic operation:将读取和写操作放到一条指令中去,比如inc和dec。在单cpu中,这样的确可以做到atomic,但是在多核中是不够的,因为读写操作需要两次方位内存单元,所以要做到atomic,必须在读写的
2009-02-16 19:26:00 1710
Python源码剖析
2009-06-19
understanding the linux kernel 3rd
2009-06-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人