Почему создание и запись в очень большой вектор вызывает дамп ядра? - PullRequest
0 голосов
/ 20 мая 2018

Я создаю Сито Эратосфена, чтобы я мог видеть все простые числа вплоть до начального числа.Просто следующий код вызывает дамп ядра на Rust 1.26.Нет никаких предупреждений или ошибок компилятора, и дамп ядра не очень полезен без сообщения об ошибке.

fn main() {
    let starting_number: i64 = 600851475143;
    let mut primes = vec![true; 600851475143];

    primes[0] = false;
    primes[1] = false;

    for i in 2..((starting_number as f64).ln() as usize) {
        if primes[i] {
            let mut j = i + i;
            while j < primes.len() {
                primes[j] = false;
                j += i;
            }
        }
    }
}

Я думал, что Rust - это все о безопасности и об отказе от дампов ядра?Это допустимая ошибка с моим кодом, которая не перехватывается компилятором или что-то другое?

1 Ответ

0 голосов
/ 20 мая 2018

Проблема в том, что вам не хватает памяти.

Многие операционные системы "ленивы" выделяют память.Это означает, что ОС на самом деле не будет выделять реальный объем памяти, который вы запрашиваете, пока вы его не используете.Вы запрашиваете не менее 75 106 434 393 октетов (он же 70 Gio), но Rust не оптимизирует размер Vec<bool>, поэтому вы запрашиваете 600 851 475 143 байт (aka 600 ГиБ) - ваша операционная система не нашла достаточно памяти.

Ошибка вашей операционной системы не может быть исправлена, поскольку она уже сказала «ОК», когда вы запросили память.Это критическая ошибка, поэтому он завершает ваш процесс дампом ядра.

Я думал, что Rust - это безопасность и предотвращение дампов ядра?

Дамп ядра не даетНе обязательно означает, что ваша программа не является безопасной.Как видите, ваша программа не имеет доступа к памяти за пределами допустимого уровня, просто ей не хватает памяти.Это лучший способ справиться с этой ошибкой с точки зрения вашей ОС, и нет ничего опасного в соответствии с определением safe в Rust.


Кстати, на моей машине (archlinux) ваша программа простоубито:

[1]    4901 killed     cargo run
...