Pintos源码学习进度(2)

2019-05-12  本文已影响0人  speakspeak

1.Thread结构

    在pintos中,仅有init thread存放在0x0000e000 ~ 0x0000efff空间之内。

其他的thread结构存放在1M空间之后.

thread 存放结构

2.Thread函数

thread_init       (在init.c中调用)

①初始化tid_lock, read_list, all_list 

(read_list用于存放状态为ready的thread,all_list存放所有的thread)

②创建init这一个线程,其结构存放在0x0000e000 ~ 0x0000efff之间。

(创建过程中调用init_thread()函数)

init_thread

①将thread的状态设置为block状态

②填入name,stack,priority,magic字段

③将allelem字段链入all_list链表中

thread_start       (在init.c中调用)

①创建一个名为idle_started的信号量       (idle thread指的是,当没有线程正在运行时运行的线程)

②创建一个指向idle函数的idle thread。

③开启中断

④对idle_started信号量使用down. 

(作用:虽然idle被创建,但idle线程有可能会晚于内核运行,而使用down信号可以保证

idle线程先运行)

thread_create

①为需要创建的thread分配一块page用于存放thread结构

②调用init_thread函数对thread的各个字段进行初始化

③为thread分配一个tid

④为thread创建kernel_thread_frame,switch_entry_frame,switch_threads_frame

(kernel_thread_frame是用于存放thread所对应的func函数与其参数的)

(switch_entry_frame是用于存放kernel_thread函数,用于调用func函数)

(switch_threads_frame是用于存放switch_entry函数,用于schedule)

这些thread_frame是用于第一次运行此进程而添加的.

thread_tick

(与时钟有关,等看了时钟再来看)

thread_block

①将current_thread的状态转化为block

②调用schedule函数

thread_unblock

①将thread.elem字段放入ready_list

②将thread的状态转化为ready

thread_yield

①将current_thread的状态从running转化为ready

②嗲用schedule函数

上一篇 下一篇

猜你喜欢

热点阅读