`
longxj
  • 浏览: 101822 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
文章列表
由于硬件体系的一些约束,比如说对于32位机器,cpu不能直接访问所有的内存,当内存过大的时候,linux将内存划分为3个zone:1.ZONE_DMA:below 16 mb,因为一些老的dma只能访问这些地址的内存2.ZONE_NORMAL:16mb-896mb3.ZONE_HIGHMEM:地址高于896MB的内存对于属于kernel的线性地址,也就是3-4g地址(我们可以看到实际上物理内存并没有1g大小)2009/02/02 一
这个函数对于conventional process来说将会将进程加到expired runqueue,而对于实时进程则仍然是将进程加入active runqueue。2009/02/02 一
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,唯一可以switch它的方法是当有更高优先级的进程到来时对于第二种,会减少进程的时间片,当时间片用完时,会被放到队列的最后,从而使得其它的进程可以运行对于第三种进程,会减少进程的时间片,并且当时间片用完时,会将其从 ...
为了使得进程能够平均地分配到多个cpu之间,linux使用scheduling domain的概念来管理多个cpu,内核保证一个scheduling domain内,负载是均衡的。具体来说,在每个时钟tick的处理函数中会调用rebalance_tick(),这个函数会根据当前处理器的使用情况,比如是否处于空闲或忙碌状态来决定是否要调用load_balance()(当当前cpu的runqueue是空时,该函数调用较为频繁)而load_balance()则首先找到domain里busiest cpu,然后将其runqueue里的进程迁移到当前cpu上来。如果失败了,则寻找到domain里一个最空闲 ...
每个进程运行一个quantum,这个quantum是由进程的static priority决定的,计算公式如下:base time quantum=(140-static priority)*20 if static priority<120(140-static priority)*5 if static priority>=120conventional process's static priority位于(100,139)real-time process's static priority位于(0,100)处于TASK_RUNNING的进程被sheduler分为两类:当进程 ...
有时kernel需要等待一段时间,这个是通过delay function来实现的。在系统初始化的时候,系统计算了一个tick内,执行"loop"的个数,delay function通过将要delay的时间,转换为要执行”loop"次数来实现delay。2009/01/31 六
定时器的链表是个per-cpu变量,这就是说每个cpu都有自己的定时器链表,所以timer在哪个cpu上执行,取决于它被挂在哪个cpu的定时器链表上,链表按时间被划成很多时间段,对应数组的不同index,开始的index对应的时间段间的间隔粒度较小,然后变大:tv1(0-255),tv2(<pow(2,14)-1),tv3(<pow(2,20)-1),tv4(<pow(2,26)-1),tv5(<pow(2,32)-1).2009/01/31 六
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 that timer functions will start right at their or after with a delay of up to a few hundreds of millise ...
spin_lock macro详解列在这里,是因为当进行轮询操作时,在实现上,也是有很多技巧值得学习的:1.调用preempt_disable()disable kernel preemption2.使用原子指令尝试获得spin lock,代码大致如下: movb $0,%al xchab %al, slp->slock3.如果前面的操作获得的是正值,则说明拿到了锁,终止;否则调用preempt_enable()开启kernel preemption4.set break_lock field告诉其它进程,有进程正在等待这个锁5.执行下面的循环: while(spin_is_locked( ...
同步可以通过多种方式来实现:1.per-cpu variable:一个这样的变量是一个数组,数组的每个元素都是同一个结构,分配给cpu每个cpu一个,每个cpu只能访问自己的2.atomic operation:将读取和写操作放到一条指令中去,比如inc和dec。在单cpu ...
softirq并不是由软件产生的中断,它也是由硬件(网卡)产生的,只是对这类中断的处理不需要很迅速的处理,可以被defer。softirq由do_softirq()函数进行处理,这个函数只处理一定数量的pendingsoftirq,一般是10个,然后就退出了,那么剩下的什么时候处理呢?linux有个ksoftirpd内核线程,当这个线程被执行时会处理处于pending状态的softirq。(对active也就是pending softirq的check是在内核代码的几个点上进行的)2009/01/23 五
tasklet是基于两种softirq HI_SOFTIRQ和TASKLET_SOFTIRQ,两种irq的区别在于HI_SOFTIRQ优先于TASKLET_SOFTIRQ被执行。tasklet跟softirq相比,不需要函数是可以重入的另外linux中还有一种work queue,可以将要执行的函数放入队列中。而执行这些函数的是由系统的kernel thread还进行执行,这类kernel thread又被叫着worker thread。softirq和tasklet是对中断的一种处理(can be deferred),而work queue从根本上来说不属于中断处理的范畴。2009/01/23 ...
这有些情况下,同步是不需要的:1.所有的中断处理函数在执行时,irq line是disable的,所以相同的中断不会再次被触发。2.Interrupt handlers,softirqs,and tasklets are both nonpreemptable and nonblocking,他们不会被挂起很长时间,最坏情况下,他们只会被slightly delayed,因为会有其它的中断会发生。3.a kernel control path performing interrupt handling cannot be interrupted by a kernel control path ...
linux在处理一个中断时,对检查IRQ_INPROGRESS是否被设置。当它被设置时,也就是说现有有另外一个cpu在处理这个中断。linux将不会在当前cpu上运行中断处理服务例程,而是将中断发给正在处理这个中断的cpu进行处理。这样做有两个好处:一是中断处理的服务例程不必要是可重入的,二是可以提高运行的效率,因为中断服务例程刚才在cpu上运行过,cpu可以充分利用前面处理用到的资源,像cache等。2009/01/21 三
由于IRQ线是有限的,如果用的是8259A PIC的话,只有15个line是可用的,但是硬件却远远不止15个,解决的办法有2个:1.irq sharing:多个硬件共享同一个irq,那么irq的处理将会运行一个循环,来调用每个需要处理这个irq的中断服务例程(interrupt service routine)。2.dynamic irq allocation:当一个硬件要被使用的时候,由硬件主动向内核发出分配某个irq line给它的请求,从而保证每个irq line在一个时刻只有一个硬件在使用。之所以有这种处理方式的存在是因为有些老的硬件不支持共享irq line的方式。2009/01/21 ...
Global site tag (gtag.js) - Google Analytics