linux内核的三种调度方法:
1,SCHED_OTHER 分时调度策略,
2,SCHED_FIFO实时调度策略,先到先服务
3,SCHED_RR实时调度策略,时间片轮转
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。
SHCED_RR和SCHED_FIFO的不同:
当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

相同点:
RR和FIFO都只用于实时任务。
创建时优先级大于0(1-99)。
按照可抢占优先级调度算法进行。
就绪态的实时任务立即抢占非实时任务。

Linux 2.2内核中,进程是通过系统调用fork创建的,新的进程是原来进程的子进程,在Linux 2.2.x中,不存在真正意义上的线程,
Linux中常用的线程Pthread实际上是通过进程来模拟的。

Linux 2.4内核允许在系统运行中动态调整进程数上限,进程数只受制于物理内存的多少。

Linux 2.6内核,对进程调度经过重新编写,去掉了以前版本中效率不高的算法。进程标识号(PID)的数目也从 3.2万升到10亿。内核内部
的大改变之一就是Linux的线程框架被重写,以使NPTL可以运行其上。

目前线程有用户态线程和核心态线程两种方法实现。核心态线程的实现方法允许不同进程中的线程按照同一相对优先调度方法进行调度,目前,
线程主要的实现方法是用户态线程,也就是同一进程的线程之间竞争CPU。但也可以将某个线程固定的 “绑 “在一个轻进程之上。被绑定的线程
具有较高的响应速度,这是因为CPU时间片的调度是面向轻进程的,绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定
的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。
设置线程绑定状态的函数为pthread_attr_setscope,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值:
PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。下面的代码即创建了一个绑定的线程。

#include
#include
#include
#include

void fun1(void *info);

int main(int arg, char *argv[])
{
pthread_t thrd;
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_getschedparam(&attr, &param);
param.sched_priority = 99;
pthread_attr_setschedparam(&attr, &param);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
int id = 0;
int ret = pthread_create(&thrd, &attr, (void *)&fun1, (void *)&id);
//记住:设置分离属性后创建线程一定要休眠一会儿,知道创建成功,并进入线程函数;
#define DIFF 1
#if DIFF
sleep(1);
#else
pthread_attr_destroy(&attr);
id = 1;
fun1((void *)&id); //两个线程都在执行永不退出;
#endif
return 0;
}
void fun1(void *info)
{
int id = *(int *)info;
while (1) {
printf(“HelloWorld %d\n”, id);
usleep(1);
}
}

/*
说明:
DIFF=1时,创建的线程打印”HelloWorld 0″执行了1s之后,整个进程退出;
DIFF=0时,创建的线程提前退出,主线程一直运行,打印”HelloWorld 1″;
记住:
设置分离属性后创建线程一定要休眠一会儿,知道创建成功,并进入线程函数;




Related posts

coded by nessus
分享:  DeliciousGReader鲜果豆瓣CSDN网摘
Trackback

no comment untill now

Add your comment now

无觅相关文章插件