自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

dodobear的小窝窝

兜兜里都是宝贝

  • 博客(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

unix环境高级编程

unix环境编程的圣经,本资源非扫描版,相当清晰

2012-08-11

Imperfect c++ 中文版 pdf

Imperfect c++ 中文版 pdf版,看看

2011-11-02

Introduction+to+3D+Game+Programming+with+DirectX+10

jing dian zhi zuo directx

2010-08-09

Network Programming for Microsoft Windows-2

经典网络编程,大家看看。。。。。。。。。

2010-07-22

hibernate in action

hibernate 的经典之作,分享给大家看看

2009-06-27

spring in action

spring 的经典之作,分享给大家看看

2009-06-27

Python源码剖析

在最高的层次上,Python的整体架构可以分为四个主要的部分,整个架构如图1所示。在左边,是Python提供的大量的模块,库以及用户自定义的模块。比如在执行import os时,这个os就是Python内建的模块,当然用户还可以通过自定义模块来扩展Python系统。在本系列文章中,我们不会对这一部分进行过多的考察。

2009-06-19

understanding the linux kernel 3rd

经典linux书籍 In order to thoroughly understand what makes Linux tick and why it works so well on a wide variety of systems, you need to delve deep into the heart of the kernel. The kernel handles all interactions between the CPU and the external world, and determines which programs will share processor time, in what order. It manages limited memory so well that hundreds of processes can share the system efficiently, and expertly organizes data transfers so that the CPU isn't kept waiting any longer than necessary for the relatively slow disks.

2009-06-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除