进程状态间的切换图。PROCESS_STATE_NONE在该状态下进程在进程链表中,但是不能获取CPU使用权。PROCESS_STATE_RUNNING为进程可以运行,但还未获得CPU使用权,PROCESS_STATE_CALLED为进程正在运行。
进程状态切换
PROCESS_STATE_NONE- > PROCESS_STATE_RUNNING状态切换:该状态切换调用process_start(),该函数有两个作用:将进程挂载到进程链表中,并切换状态,其二将发送同步事件,让进程第一次运行。
-
void process_start(struct process *p, process_data_t data)
-
{
-
struct process *q;
-
-
/**判断新加入进程是否在进程链表中
-
*
-
*/
-
for(q = process_list; q != p && q != NULL; q = q->next);
-
if(q == p) {
-
return;
-
}
-
-
/* 插入进程链表,并切换状态*/
-
p->next = process_list;
-
process_list = p;
-
p->state = PROCESS_STATE_RUNNING;
-
PT_INIT(&p->pt);
-
-
PRINTF("process: starting '%s
-
process_post_synch(p, PROCESS_EVENT_INIT, data); /**<调用同步事件,使进程运行一次 */
-
}
PROCESS_STATE_RUNNING ->PROCESS_STATE_CALLED状态切换:该状态调用call_process()。上述发送同步事件让进程执行一次。
PROCESS_STATE_CALLED -> PROCESS_STATE_RUNNING 状态切换:在调用call_process()中若进程没有自己终端自己或者没有其他任务终结自己,切换到running状态,等待下一次运行。
-
void process_post_synch(struct process *p, process_event_t ev, process_data_t data)
-
{
-
/**process_current可以被用来判断删除的是否是当前的任务
-
*/
-
struct process *caller = process_current; /**<指向当前运行进程 */
-
-
call_process(p, ev, data);
-
process_current = caller;
-
}
-
-
static void call_process(struct process *p, process_event_t ev, process_data_t data)
-
{
-
int ret;
-
-
if((p->state & PROCESS_STATE_RUNNING) && /**< 函数是即将运行态,运行进程*/
-
p->thread != NULL) {
-
process_current = p;
-
p->state = PROCESS_STATE_CALLED; /**< 更改进程为正在运行态 */
-
ret = p->thread(&p->pt, ev, data); /**< 运行线程 */
-
if(ret == PT_EXITED ||
-
ret == PT_ENDED ||
-
ev == PROCESS_EVENT_EXIT) {
-
/**根据进程运行结果(是否结束自己)和事件类型判断是否需要退出。一个进程可以主动结束
-
* 或者A进程调用事件通知B进程结束结束
-
*/
-
exit_process(p, p);
-
} else {
-
p->state = PROCESS_STATE_RUNNING; /**< 直接切换到running状态,等待下一次运行 */
-
}
-
}
-
}
PROCESS_STATE_CALLED -> PROCESS_STATE_NONE:此次切换表示进程自己终结自己;
PROCESS_STATE_RUNNING -> PROCESS_STATE_NONE:其他任务终结自己;
无论是自己结束自己,还是其他进程结束自己,均需要调用exit_process()
-
static void exit_process(struct process *p, struct process *fromprocess)
-
{
-
register struct process *q;
-
struct process *old_current = process_current;
-
-
for(q = process_list; q != p && q != NULL; q = q->next); /**<确保被删除的进程在进程链表中 */
-
if(q == NULL) {
-
return;
-
}
-
/**进程在运行状态,包含两种PROCESS_STATE_RUNNING(被其他线程终结) PROCESS_STATE_CALLED(被自己终结)
-
* 如果是在运行状态终结任务,那么有可能被终结的任务绑定一些事件,那么此处应该把被终结任务绑定的事件移除。
-
* 例如,print_hello_process进程被删除,则需要通知etimer进程把与该任务相关的定时器移除。因为该事件绑定
-
* 了进程的地址
-
*/
-
if(process_is_running(p)) {
-
-
p->state = PROCESS_STATE_NONE; /**<切换状态 */
-
-
for(q = process_list; q != NULL; q = q->next) {
-
if(p != q) {
-
call_process(q, PROCESS_EVENT_EXITED, (process_data_t)p);/**< 通知其他线程,某个线程已经退出,把与我有关的事件删除*/
-
}
-
}
-
/**如果是被其他进程删除的,通知被删除的进程,其被删除
-
*/
-
if(p->thread != NULL && p != fromprocess) {
-
process_current = p;
-
p->thread(&p->pt, PROCESS_EVENT_EXIT, NULL);
-
}
-
}
-
/**此处是PROCESS_STATE_NONE状态说明与被删除任务相关的事件已经被删除,可以从线程链表中移除删除的任务了
-
*
-
*/
-
if(p == process_list) {
-
process_list = process_list->next;
-
} else {
-
for(q = process_list; q != NULL; q = q->next) {
-
if(q->next == p) {
-
q->next = p->next;
-
break;
-
}
-
}
-
}
-
-
process_current = old_current;
-
}
阅读(433) | 评论(0) | 转发(0) |