Практика языка C (МФТИ, 2023-2024). Углубление пройденного: логическая память и виртуальная память.

Поділитися
Вставка
  • Опубліковано 13 чер 2024
  • Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики.
    Мы временно берем передышку. На этом семинаре не будет новых задач. Только углубление понимания концепции памяти, которая очень нам понадобиться дальше. Начнём мы со своего рода мультфильма, который называется Genesis и к которому мы вернемся на втором курсе, см. • Базовый курс C++ (MIPT...
    Семинарист: Константин Владимиров.
    Дата: 13 октября 2023 года.
    Съёмка: Марк Гончаров.
    Звук: Юлий Тарасов.
    Предыдущий семинар: • Практика языка C (МФТИ...
    Следующий семинар: • Практика языка C (МФТИ...
    Слайды к занятиям: cs.mipt.ru/wp/?page_id=7775
    Примеры кода: github.com/tilir/c-graduate
    Задачник: olymp1.vdi.mipt.ru/
    Timeline
    00:00 Intro
    02:26 Genesis
    09:35 Пространственные соотношения
    22:30 Указатели на указатели
    28:42 Массивы
    33:30 Виртуальная память
    37:28 Структура адресного пространства
    45:10 Время решать задачи
    48:47 Время жизни и область видимости
    51:20 Куча и утечки памяти
    58:40 Исчерпание кучи и исчерпание стека
    01:06:47 Статические переменные
    01:11:30 Бенчмаркинг
    01:21:10 Литература и завершение
    Errata:
    * пока пусто

КОМЕНТАРІ • 49

  • @user-td8wl7dd4m
    @user-td8wl7dd4m 7 місяців тому +22

    Как же повезло этим ребятам

    • @dmitrii-329d
      @dmitrii-329d 7 місяців тому +1

      За этим везением стоит много труда

    • @tilir
      @tilir  7 місяців тому +5

      Кстати в этом году действительно речь идёт о чистом везении (ну или невезении как посмотреть). На меня видимо за что-то обиделся ответственный за распределение (я не разбирался) и мне выдали не ребят и девушек которые лучше прочих написали распределительный контест, а просто кого-то из середины списка результатов. Мне в общем всё равно с кем работать, они все физтехи. Но факт в том, что в этом году, как и в старые добрые времена, чтобы попасть ко мне, нужно было написать входное распределительное тестирование по информатике ПЛОХО, а не хорошо. Но никто не знал заранее насколько именно плохо, в чём и была интрига )))

    • @user-td8wl7dd4m
      @user-td8wl7dd4m 7 місяців тому +5

      Продолжайте и дальше выкладывать материал, Вас смотрят со всех мест нашей необъятной!

    • @alex_s_ciframi
      @alex_s_ciframi 6 місяців тому +2

      @@tilir неважно, откуда выборка. Жемчужина может проснуться/обнаружиться где угодно :) Может, какой-нибудь ученик и не знает, что в нём спит талант, а тут раз - опачки )

  • @user-wh3to1fn3c
    @user-wh3to1fn3c 7 місяців тому +5

    Владимир, низкий Вам поклон за лекции. Это действительно качественный материал, с удовольствием смотрю все лекции. На работе давно пишу на Си, но там не менее нахожу для себя всегда что-то новое в Ваших записях

    • @tilir
      @tilir  7 місяців тому +8

      Спасибо на добром слове. Только я Константин ))

  • @evgeniykochetkov2702
    @evgeniykochetkov2702 7 місяців тому +1

    я пришел немного подушнить и сказать, что 90210 это почтовый индекс в беверли хилсс) Отличня лекция! Смотрю с удовольствием и интересом!

  • @DART2WADER
    @DART2WADER 7 місяців тому +2

    11:07 в ядрах ARM есть механизм bit banding для линейной адресации по битам. В основном это сделано для быстрого управления регистрами переферии.

  • @user-rz6oy9fc4l
    @user-rz6oy9fc4l 7 місяців тому +7

    Если бы я учился в этом ВУЗе я б не вылазил бы с лекций Константина

    • @tilir
      @tilir  7 місяців тому +8

      Я иногда шучу что мои лекции очень любят все, кроме тех, кто должен на них ходить ))

    • @my_learning_spaceship
      @my_learning_spaceship Місяць тому

      ​@@tilir если бы у моих преподавателей были бы записи с хотя бы в четверть с таким звуком, я бы с радостью смотрела бы их так же на двойной скорости и кайфовала бы с лекций, а не засыпала бы, когда чуть переставала догонять

  • @ivankorotkov2563
    @ivankorotkov2563 7 місяців тому +2

    26:10 можно смотреть на указатели и числа как на точки и вектора в одномерном пространстве. Мы можем сложить два вектора (два числа)? - да, получим вектор (число). Можем сложить две точки (адреса) - нет. Можем вычесть две точки (адреса) друг из друга - да, получим вектор (число).
    Чтобы лучше это представить, можно представлять точки и вектора одномерного пространства как элекменты двухмерного пространства (x, y), где x - координата точки или вектора, а y может принимать только значения 0 или 1. Где 0 означает что элемент является вектором, а 1 - точкой. Вылетело из головы как такое представление называется.

    • @tilir
      @tilir  7 місяців тому

      Интересное рассуждение. Но чисто интуитивно вектор (радиус-вектор) это скорее указатель =)

    • @ivankorotkov2563
      @ivankorotkov2563 7 місяців тому +1

      @@tilir Я смотрю на эту аналогию так: есть векторное пространство адресов в памяти. Точка на нем - конкретный адрес. Вектор - это офсет на который этот адрес можно сдвинуть.

  • @alexandrsmirnov8615
    @alexandrsmirnov8615 7 місяців тому +3

    49:34 Почему получили SIGSEGV, а не печать мусорного значения? Адрес "res" располагался на стеке, который заранее выделен для этого процесса и размер этого стека фиксирован. Т.е. вроде бы обращаемся к памяти, которая выделена под наше приложение и существует пока программа запущена.

    • @tilir
      @tilir  7 місяців тому +2

      Мы научимся отвечать на такие вопросы во второй части курса, когда научимся смотреть дизассемблер ))

    • @jonnyradars
      @jonnyradars 4 місяці тому

      @@tilir а вы вторую часть выложите в этот же плейлист? если нет, то где её можно будет найти?

  • @ПЛИСоводство
    @ПЛИСоводство 2 місяці тому

    Грамотный преподаватель и отличные лекции. В своё время мне тоже с преподавателем повезло.
    Возник вопрос, как бороться с фрагментацией кучи, если это вообще возможно? И есть ли какой-то способ принудительно освободить всю кучу сразу?

  • @sergeykirdyankin7027
    @sergeykirdyankin7027 7 місяців тому

    Неинициализированный глобальный массив попадёт в .bss и как следствие на размер бинарника не повлияет, а занулен будет (весь bss) чем то вроде memset. В секцию .data попадут только глобальные переменные с начальными значениями и они уже будут помещены в бинарник (иначе откуда эти начальные значения брать)

  • @niceday1713
    @niceday1713 3 місяці тому

    Добрый день, замечательная лекция! У меня вопрос, хотел именно для себя прояснить: а на 16 слайде у вас нет "неточности" на картинке? Просто там показано, что процесс 1 ссылается на адрес на диске, но если я все правильно понимаю, он должен ссылаться на оперативную память, а та, в свою очередь, на жесткий диск (сначала ищем значение в кэше, потом в оперативке, потом уже на диске)? Поправьте, пожалуйста, если я неправильно понимаю.

    • @tilir
      @tilir  3 місяці тому

      Там стрелка идёт через операционку и мы предполагаем что всё о чём вы говорите она берёт на себя.

  • @artemosipuk5731
    @artemosipuk5731 7 місяців тому

    К семинару остались вопросы. Нет сложностей для того, чтобы адресное пространство кучи и стека одной программы двигались друг на встречу другу. Но как это реализовано для нескольких программ?

    • @tilir
      @tilir  7 місяців тому +1

      Для каждого процесса своя виртуальная память.

  • @v.b.1544
    @v.b.1544 7 місяців тому

    Здравствуйте, Константин Игоревич. Ссылка на слайды перестала работать (ошибка 404) для не студентов или она и не должна была?)

    • @tilir
      @tilir  7 місяців тому

      Нет, должно быть всем доступно. Должно быть временные проблемы. Проверьте ещё раз.

    • @v.b.1544
      @v.b.1544 7 місяців тому

      Ссылки работают, если вручную https поменять на http.
      О, вижу и в описании поправили. Или мне всё это показалось??)

  • @user-qr4xq9fd6t
    @user-qr4xq9fd6t 7 місяців тому

    И переменная и ее адрес и адрес ее адреса (при условии, что все сохранили) - это все какие-то биты в памяти. Правильно ли, что "указатель" это, своего рода, договоренность (контракт), в языке между компилятором и программистом? Когда программист заводит переменную типа указатель, то компилятор при работе с этой переменной, использует правила этого контракта.

    • @tilir
      @tilir  7 місяців тому +1

      Адрес это не обязательно биты в памяти. Может быть переменная у которой адрес не материализован в память. Он тем не менее у неё есть.
      Что до контракта так любой тип это контракт. Собственно это часть определения object type: это коробочка value type + набор операций.

  • @user-tx1rp8pm7x
    @user-tx1rp8pm7x Місяць тому

    Здравствуйте, Константин
    1:07:54 (static int i = 0;)
    про глобальную переменную с ограниченной областью видимости понятно. а что с инициализацией? почему = 0 каждый раз не отрабатывает при вызове функции? или инициализация компилятором куда-то выносится? а что если там вызов функции? static int i = getValue();

    • @tilir
      @tilir  Місяць тому +2

      Инициализируется единожды при первом заходе в функцию.

    • @nullptr_or_null8301
      @nullptr_or_null8301 23 дні тому

      "почему = 0 каждый раз не отрабатывает при вызове функции" - static говорит компилятору что как правильно сказано инициализируется единожды при первом заходе в функцию, но храниться это переменная и ее значение и ее адрес все время работы программы, но видимость этой переменной только будет в функции, а не во внешнем или внутренним связыванием в файле, поэтому значение будет храниться все время работы программы.

  • @tohoto2183
    @tohoto2183 3 місяці тому

    Уважаемый Константин ,а почему в место глобальных переменных не использовать enum{} ?

    • @tilir
      @tilir  3 місяці тому

      При таких комментариях оставляйте пожалуйста таймкод какое место вы имели в виду. Или номер слайда.

    • @tohoto2183
      @tohoto2183 3 місяці тому

      @@tilir Это не вопрос по видео, это вопрос вообще . Через enum очень удобно вводить глобальные переменные и их не изменить.

    • @tilir
      @tilir  3 місяці тому

      @@tohoto2183это называется глобальные константы. Да удобно но на ранних этапах не критично. Мы его разбираем на семинаре 5.2

  • @user-wv8lb7ow6k
    @user-wv8lb7ow6k 7 місяців тому

    Вы сказали что static можно считать как глобальную, а на деле она передается каждый раз через стек как то автоматически?

    • @tilir
      @tilir  7 місяців тому +1

      Нет, на деле она и есть глобальная.

    • @user-wv8lb7ow6k
      @user-wv8lb7ow6k 7 місяців тому

      @@tilir Спасибо за видео, на многие вопросы ваши отвечал(по типу что Null имеет тип void*), хотя я не программист и только сайт метанит прочитал, очень интересно слушать и понимать

  • @DART2WADER
    @DART2WADER 7 місяців тому

    28:31 а вас я попрошу остаться)) Можете вкратце пояснить за с++.

    • @tilir
      @tilir  7 місяців тому +2

      Форма 2[x] не будет работать при перегрузке op[].

  • @stanislavstanislavius7618
    @stanislavstanislavius7618 7 місяців тому

    Если адрес - это расстояние от начала памяти, до переменной, то получается, что длина памяти в 64 битной системе не может превышать 8 байт?

    • @tilir
      @tilir  7 місяців тому

      2 в 64 степени байт.

    • @stanislavstanislavius7618
      @stanislavstanislavius7618 7 місяців тому

      @@tilir еще более непонятно стало(

    • @v.b.1544
      @v.b.1544 7 місяців тому +1

      В 64 битной системе адрес байта кодируется числом из 64 бит. А это 2^64 адресов: от 0 до 2^64 - 1.

    • @andrey7530
      @andrey7530 7 місяців тому

      вроде верно, что если указатель 8 байт, выделяемые 64битной системой под него , то у него 8[байт] * 8[бит/байт]=64 бит

  • @evgenyrozhnowsky6572
    @evgenyrozhnowsky6572 7 місяців тому

    40:58 по-моему так не работает)

    • @tilir
      @tilir  7 місяців тому

      Очень легко проверяется. Сделайте глобальный массивчик на 100к элементов, заполните его чем-нибудь в инициализаторе, чтобы компилятор не снёс в bss (любые три первых элемента хватит), используйте его во внешней функции, скомпилируйте, посмотрите размер файла.

    • @evgenyrozhnowsky6572
      @evgenyrozhnowsky6572 7 місяців тому

      @@tilir вы правы) спасибо за разъяснение, видимо мой Cl выдрал его на стадии оптимизации)