RT /** * 递减当前进程的时间片计数器,并检查是否已经用完时间片. * 由于进程的调度类型不同,函数所执行的操作也有很大差别. */ /* 如果是实时进程,就进一步根据是FIFO还是RR类型的实时进程 */ if (rt_task(p)) { /** * 对SCHED_RR类型(时间片轮转)的实时进程,需要递减它的时间片. * 对SCHED_FIFO类型(先进先出)的实时进程,什么都不做, * 退出.在这种情况下, * current进程不可能被比其优先级低或其优先级相等的进程所抢占, *…
RT /** * 运行到此,说明进程是普通进程.现在开始更新普通进程的时间片. */ /* 首先递减普通进程的时间片计数器.如果用完,继续执行以下操作 */ if (!--p->time_slice) { /** * 既然用完了,就将当前进程从活动集合中摘除. */ dequeue_task(p, rq->active); /** * 当然,当前进程既然已经过期,就必须设置重新调度标志, * 以便在中断返回前调用schedule选择另外一个进程来运行. */ set_tsk_need_resc…
参考的是ULK第三版,Linux2.6.11.12内核版本. 调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下: /** * 维持当前最新的time_slice计数器 * 每次时钟节拍到来时,scheduler_tick函数将被调用,以执行与调度相关的操作. */ void scheduler_tick(void) { int cpu = smp_processor_id(); runqueue_t *rq = this_rq();//宏…
从1991年Linux的第1版到后来的2.4内核系列,Linux的调度程序都相当简陋,设计近乎原始,见0.11版内核进程调度.当然它很容易理解,但是它在众多可运行进程或者多处理器的环境下都难以胜任. 正因为如此,在Linux2.5开发系列的内核中,调度程序做了大手术.开始采用了一种叫做O(1)调度程序的新调度程序——它是因为其算法的行为而得名的.它解决了先前版本Linux调度程序的许多不足,引入了许多强大的新特性和性能特征.O(1)调度程序虽然对于大服务器的工作负载很理想,但是在有很多交互程序要…
1.排队机制 接收输入TCP报文时,有三个队列: ● 待处理队列 ● 预排队队列 ● 接收队列 接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序.接收队列包含了所有按顺序接收的数据段,在其他两个队列中的TCP数据段则需要进一步处理. TCP报文首先由tcp_v4_rcv()进行处理.该函数要决定是否需要处理报文或者在待处理队列和预排队队列中排队. /* 传输层报文处理入口 */ int tcp_v4_rcv(struct sk_buff *skb)…
在介绍tcp发送函数之前得先介绍很关键的一个结构sk_buff,在linux中,sk_buff结构代表了一个报文: 然后见发送函数源码,这里不关注硬件支持的分散-聚集: /* sendmsg系统调用在TCP层的实现 */ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t size) { struct iovec *iov; struct tcp_sock *tp = tcp_sk(sk)…
NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而其他一些操作系统比如Solaris则是MxN的,M对应创建的线程数,N对应操作系统可以运行的实体.(N<M),优点是线程切换快,但实现稍复杂 转 Linux2.6内核实现的是NPTL线程模型,依然是用进程来模拟线程,但新引入了线程组(进程组)的概念,使得实现效率更好. 在2.4内核中,不存在线程组的概念,当运行一个多线程得程序时,使用ps命令,可以看到有许多个进程,在ps命令看来,线程基本上是等同于进程,在信…
一.内核原型(linux2.6.28-7) long (*compat_ioctl)(struct tty_struct *tty, struct file * file,                      unsigned int cmd, unsigned long arg);      implement ioctl processing for 32 bit process on 64 bit system      Optional 二.What is compat_ioctl…
[摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的区别.接着分析Linux下有两种抢占:用户态抢占(User Preemption).内核态抢占(Kernel Preemption).然后分析了在内核态下:如何判断能否抢占内核(什么是可抢占的条件):何时触发重新调度(何时设置可抢占条件):抢占发生的时机(何时检查可抢占的条件):什么时候不能抢占内核.最后分析了2.6kernel中如何支持抢占内核. [关键字]内核态…
[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数,在system_call.s中: #### int32 -- (int 0x20) 时钟中断处理程序.中断频率被设置为100Hz(include/linux/sched.h,5), # 定时芯片8253/8254 是在(kernel/sched.c,406)处初始化的.因此这里jiffies 每10…