1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/rcore-os-rCore-Tutorial

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
part-6.md 2.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 21:14 7f8a4fd

Диспетчер

Существует множество алгоритмов для диспетчера, мы выделим один из них в отдельный 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/rcore-os-rCore-Tutorial.git
git@api.gitlife.ru:oschina-mirror/rcore-os-rCore-Tutorial.git
oschina-mirror
rcore-os-rCore-Tutorial
rcore-os-rCore-Tutorial
master