Существует множество алгоритмов для диспетчера, мы выделим один из них в отдельный trait как интерфейс.
{% label %}os/src/algorithm/src/scheduler/mod.rs{% endlabel %}
/// Диспетчер потоков
///
/// Здесь `ThreadType` — это `Arc<Thread>`
pub trait Scheduler<ThreadType: Clone + Eq>: Default {
/// Тип приоритета
type Priority;
/// Добавить поток в пул потоков
fn add_thread(&mut self, thread: ThreadType);
/// Получить следующий поток для выполнения
fn get_next(&mut self) -> Option<ThreadType>;
/// Удалить поток
fn remove_thread(&mut self, thread: &ThreadType);
/// Установить приоритет потока
fn set_priority(&mut self, thread: ThreadType, priority: Self::Priority);
}
Конкретные алгоритмы здесь не рассматриваются, можно обратиться к некоторым примерам в каталоге os/src/algorithm/src/scheduler
.
Изменив main.rs
, мы можем запустить многопоточное приложение.
{% label %}os/src/main.rs{% endlabel %}
#[no_mangle]
pub extern "C" fn rust_main() -> ! {
memory::init();
interrupt::init();
{
let mut processor = PROCESSOR.lock();
// Создать процесс ядра
let kernel_process = Process::new_kernel().unwrap();
// Для этого процесса создать несколько потоков с одинаковой точкой входа sample_process и разными параметрами
for i in 1..9usize {
processor.add_thread(create_kernel_thread(
kernel_process.clone(),
sample_process as usize,
Some(&[i]),
));
}
}
extern "C" {
fn __restore(context: usize);
}
// Получить контекст первого потока
let context = PROCESSOR.lock().prepare_next_thread();
// Запустить первый поток
unsafe { __restore(context as usize) };
unreachable!()
}
fn sample_process(id: usize) {
println!("hello from kernel thread {}", id);
}
После запуска мы получим примерно такой вывод:
{% label %}Вывод после запуска{% endlabel %}
hello from kernel thread 7
thread 7 exit
hello from kernel thread 6
thread 6 exit
hello from kernel thread 5
thread 5 exit
hello from kernel thread 4
thread 4 exit
hello from kernel thread 3
thread 3 exit
hello from kernel thread 2
thread 2 exit
hello from kernel thread 1
thread 1 exit
hello from kernel thread 8
thread 8 exit
src/process/processor.rs:87: 'all threads terminated, shutting down'
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )