Принцип: Является ли системный вызов для чтения символов блокирующим или неблокирующим после использования условной переменной с точки зрения потока и операционной системы?
Для потока это блокирующий вызов, так как поток приостанавливается до получения действительного ввода. Однако для операционной системы ожидание ввода полностью распределяется между другими потоками, поэтому для операционной системы это неблокирующий вызов.
Проектирование: Какие действия необходимо предпринять, чтобы пользовательский поток мог использовать Vec
и другие структуры данных? Какие шаги нужно предпринять, чтобы позволить пользовательскому потоку использовать динамически выделяемую память, превышающую размер его стека?
Эксперимент: Реализовать системный вызов get_tid
, который позволяет пользовательскому потоку получить свой собственный идентификатор потока.
Эксперимент: На основе опыта, полученного в эксперименте 4 (верхняя часть), реализовать системный вызов sys_fork
. Этот системный вызов должен копировать процесс и возвращать 1 для родительского процесса (в настоящее время без введения идентификатора процесса, который можно добавить самостоятельно) и 0 для дочернего процесса.
В отличие от эксперимента 4, вам может потребоваться уделить дополнительное внимание копированию файловых дескрипторов.
Эксперимент: Упаковать файл в образ пользователя и позволить пользовательскому процессу прочитать его и распечатать содержимое. Необходимо реализовать sys_open
, добавить файловый дескриптор в descriptors
процесса и вернуть его, а затем использовать sys_read
для чтения.
Сложный эксперимент: Реализовать 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 )