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

OSCHINA-MIRROR/rcore-os-rCore-Tutorial

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

Эксперимент 6: Системные вызовы

Перед экспериментом

  • Прочитайте инструкции к экспериментам 5 и 6.

Тема эксперимента

  1. Принцип: Является ли системный вызов для чтения символов блокирующим или неблокирующим после использования условной переменной с точки зрения потока и операционной системы?

    Для потока это блокирующий вызов, так как поток приостанавливается до получения действительного ввода. Однако для операционной системы ожидание ввода полностью распределяется между другими потоками, поэтому для операционной системы это неблокирующий вызов.


  2. Проектирование: Какие действия необходимо предпринять, чтобы пользовательский поток мог использовать Vec и другие структуры данных? Какие шаги нужно предпринять, чтобы позволить пользовательскому потоку использовать динамически выделяемую память, превышающую размер его стека?

  3. Эксперимент: Реализовать системный вызов get_tid, который позволяет пользовательскому потоку получить свой собственный идентификатор потока.

  4. Эксперимент: На основе опыта, полученного в эксперименте 4 (верхняя часть), реализовать системный вызов sys_fork. Этот системный вызов должен копировать процесс и возвращать 1 для родительского процесса (в настоящее время без введения идентификатора процесса, который можно добавить самостоятельно) и 0 для дочернего процесса.

    В отличие от эксперимента 4, вам может потребоваться уделить дополнительное внимание копированию файловых дескрипторов.

  5. Эксперимент: Упаковать файл в образ пользователя и позволить пользовательскому процессу прочитать его и распечатать содержимое. Необходимо реализовать sys_open, добавить файловый дескриптор в descriptors процесса и вернуть его, а затем использовать sys_read для чтения.

  6. Сложный эксперимент: Реализовать sys_pipe, чтобы добавить и вернуть два файловых дескриптора для процесса — один для чтения из канала, другой для записи в канал. После вызова sys_pipe пользовательским процессом, вызвать sys_fork, где родительский процесс записывает в канал, а дочерний процесс может читать из него. При чтении следует избегать блокировки ожидания.

/// Пример пользовательского процесса
pub fn main() -> usize {
    let (mut write_fd, mut read_fd) = sys_pipe();
    if sys_fork() {
        // Родительский процесс
        sys_close(read_fd); // Необязательно реализовывать
        sys_write(write_fd, "hello_world".as_bytes());
    } else {
        // Дочерний процесс
        sys_close(write_fd); // Необязательно реализовывать
        let mut buffer = [0u8; 64];
        let len = sys_read(read_fd, &mut buffer);
        println!("{}", core::str::from_utf8(&buffer));
    }
}

Опубликовать ( 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