linux线程调度(linux 线程 调度)-冯金伟博客园

交换机的线程是什么意思?

线程(英语:thread)是操作系统能够进行运算调度的最小单位。也是独立调度和分派的基本单位。

线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务。

linux运行后有哪些线程?

就绪:线程分配了CPU以外的全部资源,等待获得CPU调度 执行:线程获得CPU,正在执行 阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列 挂起:由于终端请求,操作系统的要求等原因,导致挂起。

绘制线程什么意思?

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

一个进程可以有很多线程,每条线程并行执行不同的任务。

怎么让一个线程一直运行?

不会出现问题的,具体过程如下。

假设线程开始运行在core1上,对内存x将旧值b更改成新值a,在完成mov , a指令时,a这个值至少已经写到core1上的store buffer里面了。

线程要被迁移到core2,那必须是它被抢占,或主动让出cpu,或者主动睡眠才可以发生迁移到core2. 但不管什么情况,它必须在core1执行完schedule函数之后,才会发生迁移。

而schedule函数有以下一段代码:

注意上述最后两条语句,它会产生一个mb,意味着执行到mb之后,刚才将x修改为a的操作,会从store buffer写到L1 Cache,并且会将invalid message发送到其它核的invalid queue上。

之后线程才被调度出来了。

而线程被core2迁移过来时,它要执行,也必须是另一个线程执行schedule之后才能轮到该线程执行。同样,scheuld函数在core2执行时,因为有mb语句,它必须将本core2的invalid queue上的请求应用到本核的L1 Cache上,才能往前执行,此时Core2上L1 Cache上x的值状态变为invalid。

所以线程在core2执行完schedule后,还没有返回到用户态执行,那此时Cache情况如下:

Core1: x值,有效,为a,Exclusive状态

Core2: x值,无效, 因为收到core1的invalide message并应用到本Cache

然后线程执行到用户态时,访问x变量,本地cache是invalid,会发送读cache请求到core1,core1返回x的值为a给core2,此时core1/core2对x地址的状态均为Share。

所以Linux已 处理好进程调度与Cache的关系了。

linux进程调度的三种策略是什么?

进程调度策略就是调度系统种哪一个进程来CPU运行。

这种调度分2层考虑。

第一层,进程状态这个是最优先考虑的,也就是说优先级最高的。

在linux中只有就绪态的进程才有可能会被调度选中然后占有CPU,其它状态的进程不可能占有的到CPU。

下面是linux中进程的状态 TASK_RUNNING:就绪状态,得到CPU就可以运行。

TASK_INTERRUPTIBLE:浅度睡眠,资源到位或者受到信号就会变成就绪态。

TASK_UNINTERRUPTIBLE:深度睡眠,资源到位就会进入就绪态,不响应信号。

TASK_ZOMBIE:僵死态,进程exit后。

TASK_STOPPED:暂停态,收到SIG_CONT信号进入就绪态。

第二层,其实真正在操作系统中的实现,就是所有就绪态进程链接成一个队列,进程调度时候只会考虑这个队列中的进程,对其它的进程不考虑,这就实现了第一层中的要求。

接下来就是就绪队列内部各个进程的竞争了。

Linux采用3种不同的调度政策,SCHED_FIFO(下面简写成FIFO,先来先服务),SCHED_RR(简写成RR,时间片轮流),SCHED_OTHER(下面简写成OTHER)。

这里大家就能看出一个问题,采用同等调度政策的进程之间自然有可比性,Linux3种调度政策并存,那么不同调度政策间的进程如何比较呢?可以说他们之间根本就没有可比性。

其实在调度时候,调度只看一个指标,那就是各个进程所具有的权值,权值最大的且在可执行队列中排在最前面的就会被调度执行。

而权值的计算才会设计到各方面因素,其中调度政策可以说在计算权值中,份量是最重的。

为什么Linux要这么干呢?这是由于事务的多样性决定的,进程有实时性进程和非实时性的进程2种,FIFO和RR是用来支持实时性进程的调度,我们看一下这3种政策下权值的计算公式就明白了: FIFO和RR计算公式,权值=1000+进程真正的运行时间 OTHER计算公式,当时间片为0时,权值=0.当时间片不为0时候,权值=剩余时间片+20-nice,同时如果是内核线程有+1的小加分,这是因为内核线程无需用户空间的切换,所以给它加了一分,奖励他在进程切换时候开销小的功劳。

时间片好理解,那么nice这个值,用过linux系统的人都知道,这是一个从unix下继承过来的概念,表示谦让度,是一个从20~-19的数,可以通过nice和renice指令来设置。

从代码中也能看到值越小就越不会谦让他人。

从这里我们看出FIFO和RR至少有1000的基数,所以在有FIFO和RR调度政策进程存在时,OTHER进程是没有机会被调度的到的。

从权值计算公式同时也能看出,FIFO先来先服务的调度政策满足了,但RR这个时间片轮流的调度如果按照这种权值计算是不能满足时间片轮流这一概念的。

这里只是权值的计算,在调度时候对RR政策的进程特殊处理。

以上都是权值计算,下面看看真正的调度过程,首先是对RR政策进程的特殊处理,如果当前进程采用的RR政策,那么看他的时间片是否用完,用完了就踢到就绪队列尾部,同时恢复他的时间片。

然后是便利整个就绪队列,找到第一个权值最大的进程来运行。

整体调度效果就是:如果有FIFO和RR政策的进程,就优先调度他们2个,他们之间看已执行时间长短决定胜负,而2种政策内部则遵守各自调度政策。

而OTHER只有在前面2种不存在于就绪队列时候才有可能执行,他们实际也是轮流执行,但他们之间是靠剩余时间和NICE值来决定胜负。

同时就绪队列中排在最前面的最优先考虑在同样权值情况下。