进程被创建到了链表中,如何再进行进一步的调用和调用?
进程调度
void schedule(void); 进程调度
switch_to(next); 进程切换函数
void schedule(void)
{
int i,next,c;
struct task_struct ** p;
/* check alarm, wake up any interruptible tasks that have got a signal */
for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
if (*p) {
if ((*p)->alarm && (*p)->alarm < jiffies) {
(*p)->signal |= (1<<(SIGALRM-1));
(*p)->alarm = 0;
}
//信号不为空,并且去除不能引发进程就绪状态的阻塞信号,且现在进程为可中断状态
if ((*p)->signal && (*p)->state==TASK_INTERRUPTIBLE)
(*p)->state=TASK_RUNNING;
}
/* this is the scheduler proper: */
while (1) {
c = -1;
next = 0;
i = NR_TASKS;
p = &task[NR_TASKS];
while (--i) {
if (!*--p)
continue;
//找到当前counter最大值
if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
c = (*p)->counter, next = i;
}
if (c) break;
//如果task链表中所有进程的时间片为0,则进行时间片重分配
for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
if (*p)
(*p)->counter = ((*p)->counter >> 1) +
(*p)->priority; //counter = counter/2+pri
}
switch_to(next);
}
进程状态:
运行状态 #define TASK_RUNNING 0 可以被运行,就绪状态,只有这种状态才能被运行
可中断睡眠状态 #define TASK_INTERRUPTIBLE 1 可以被信号中断,使其变成RUNING
不可中断睡眠状态 #define TASK_UNINTERRUPTIBLE 2 只能被wakeup唤醒变成RUNNING
暂停状态 #define TASK_STOPPED 4 被相关STOP信号暂停
僵死状态 #define TASK_ZOMBIE 3 进程停止运行,但是没有被父进程进行回收
进程切换:
将进程切换为当前执行进程
1.将需要切换的进程赋值给当前执行进程
2.切换进程上下文(TSS等信息),堆栈信息
#define switch_to(n) {\
struct {long a,b;} __tmp; \
__asm__("cmpl %%ecx,_current\n\t" \ //比较一下是否为当前进程
"je 1f\n\t" \
"xchgl %%ecx,_current\n\t" \
"movw %%dx,%1\n\t" \
"ljmp %0\n\t" \
"cmpl %%ecx,%2\n\t" \
"jne 1f\n\t" \
"clts\n" \
"1:" \
::"m" (*&__tmp.a),"m" (*&__tmp.b), \
"m" (last_task_used_math),"d" _TSS(n),"c" ((long) task[n])); \
}
进程睡眠函数:
void sleep_on(struct task_struct **p)
{
struct task_struct *tmp;
if (!p)
return;
if (current == &(init_task.task))
panic("task[0] trying to sleep");
tmp = *p;
*p = current;
current->state = TASK_UNINTERRUPTIBLE;
schedule();
if (tmp)
tmp->state=0;
}