По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В предыдущих лекциях обсуждалось правило кратчайшего пути и два алгоритма (или, возможно, системы) для поиска путей без петель через сеть. Существует широкий спектр таких систем—их слишком много, чтобы охватить их в отведенное время для изучения, - но для сетевых администраторв важно быть знакомыми хотя бы с некоторыми из этих систем. В этих лекциях сначала рассматривается алгоритм поиска кратчайшего пути Дейкстры, вектор пути и два различных алгоритма непересекающихся путей: Suurballe и Maximally Redundant Trees (MRTs). Наконец, в этих лекциях будет рассмотрена еще одна проблема, которую должны решить управляющие плоскости: обеспечение двусторонней связи через сеть. Алгоритм Дейкстры Shortest Path First. Алгоритм Дейкстры Shortest Path First (SPF), возможно, является наиболее широко известной и понятной системой для обнаружения Loop-Free путей в сети. Он используется двумя широко распространенными протоколами маршрутизации и во многих других повседневных системах, таких как программное обеспечение, предназначенное для поиска кратчайшего пути через дорожную сеть или для обнаружения соединений и паттернов соединений в социальных сетях. Алгоритм Дейкстры в псевдокоде использует две структуры данных. Первый - это предварительный список или TENT; этот список содержит набор узлов, рассматриваемых для включения в дерево кратчайшего пути (Shortest Path Tree). Второй - PATH; этот список содержит набор узлов (а следовательно, и каналы), которые находятся в дереве кратчайшего пути. 01 move "me" to the TENT 02 while TENT is not empty { 03 sort TENT 04 selected == first node on TENT 05 if selected is in PATH { 06 *do nothing* 07 } 08 else { 09 add selected to PATH 10 for each node connected to selected in TOPO 11 v = find node in TENT 12 if (!v) 13 move node to TENT 14 else if node.cost < v.cost 15 replace v with node on TENT 16 else 17 remove node from TOPO 18 } 19 } Как всегда, алгоритм менее сложен, чем кажется на первый взгляд; ключом является сортировка двух списков и порядок, в котором узлы обрабатываются вне списка TENT. Вот несколько примечаний к псевдокоду перед рассмотрением примера: Процесс начинается с копии базы данных топологии, называемой здесь TOPO; это будет яснее в примере, но это просто структура, содержащая исходные узлы, целевые узлы и стоимость связи между ними. TENT - это список узлов, которые можно условно считать кратчайшим путем к любому конкретному узлу. PATH - это дерево кратчайшего пути (SPT), структура, содержащая loop-free путь к каждому узлу и следующий переход от «меня» к этому узлу. Первым важным моментом в этом алгоритме является сохранение только узлов, уже каким-то образом связанных с узлом в списке PATH в TENT; это означает, что кратчайший путь в TENT - это следующий кратчайший путь в сети. Второй важный момент в этом алгоритме - это сравнение между любыми существующими узлами TENT, которые подключаются к одному и тому же узлу; это, в сочетании с сортировкой TENT и отделением TENT от PATH, выполняет правило кратчайшего пути. Имея в виду эти моменты, рисунки с 1 по 9 используются для иллюстрации работы алгоритма SPF Дейкстры. На каждой из следующих иллюстраций вместе с сопроводительным описанием показан один шаг алгоритма SPF в этой сети, начиная с рисунка 2. В точке, показанной на рисунке 2, A был перемещен из TOPO в TENT, а затем в PATH. Стоимость исходного узла всегда равна 0; эта линия включена для начала расчета SPF. Это представляет строки с 01 по 09 в псевдокоде, показанном ранее. На рисунке 3 показан второй этап расчета SPF. На рисунке 3 каждый узел, подключенный к A, был перемещен из TOPO в TENT; это строки с 10 по 17 в псевдокоде, показанном ранее. Когда этот шаг начался, в TENT была только A, поэтому в TENT нет существующих узлов, которые могли бы вызвать какие-либо сравнения метрик. Теперь TENT отсортирован, и выполнение продолжается со строки 03 в псевдокоде. Рисунок 4 демонстрирует это. На рисунке 4 один из двух путей с кратчайшей стоимостью - к B и F, каждый со стоимостью 1 - был выбран и перемещен в PATH (строки 05–09 в псевдокоде, показанном ранее). Когда B перемещается из TENT в PATH, любые узлы с началом B в TOPO перемещаются в TENT (строки 10-17 в псевдокоде). Обратите внимание, что C еще не был в TENT, прежде чем он был задействован посредством перехода B к PATH, поэтому сравнение показателей не выполняется. Стоимость для C - это сумма стоимости его предшественника в PATH (который равен B со стоимостью 1) и связи между двумя узлами; следовательно, C добавляется к TENT со стоимостью 2. TENT сортируется (строка 3 псевдокода), поэтому процесс готов к повторному запуску. На рисунке 5 показан следующий шаг в этом процессе. На рисунке 5 был выбран кратчайший путь к TENT, и F переместился от TENT к PATH. Между F и E существует связь (показанная на предыдущих иллюстрациях как [E, F]), но путь через F к E имеет ту же стоимость, что и путь [A, E], поэтому эта линия не добавляется в TENT. Скорее он остается неактивным, поскольку не рассматривается для включения в SPT, и удаляется из TOPO. На рисунке 6 показан следующий шаг в процессе, который переместит один из путей метрики 2 в PATH. Примечание. Большинство реальных реализаций поддерживают перенос нескольких путей с одинаковой стоимостью из TENT в PATH, поэтому они могут пересылать трафик по всем каналам с одинаковой метрикой. Это называется многолучевым распространением с равной стоимостью или ECMP. Для этого есть несколько различных способов, но они в этих лекциях не рассматриваются. На рисунке 6 путь к C через B со стоимостью 2 был перемещен в PATH, а путь к D через [A, B, C, D] перемещен в TENT. Однако при перемещении этого пути к TENT строка 11 в псевдокоде находит существующий путь к D в TENT, путь [A, D], со стоимостью 5. Метрика нового пути, 3, ниже чем метрика существующего пути, 5, поэтому путь [A, D] удаляется из TENT, когда добавляется путь [A, B, C, D] (строка 15 в псевдокоде). На рисунке 7 показан следующий шаг, на котором линия оставшейся стоимости 2 перемещается из TENT в PATH. На рисунке 7 путь к E стоимостью 2 был перемещен из TENT в PATH. G был перемещен в TENT стоимостью 4 (сумма [A, E] и [E, G]). Другой сосед E, F, исследуется, но он уже находится в PATH, поэтому не рассматривается для включения в TENT. На рисунке 8 показан следующий шаг, который перемещает D в PATH. На рисунке 8 D общей стоимостью 3 перемещен из TENT в PATH. Это учитывает соседа D, G, последнюю запись в TOPO, для TENT. Однако уже существует путь к G с общей стоимостью 4 через [A, E, G], поэтому строка 14 в псевдокоде завершается ошибкой, и путь [D, G] удаляется из TOPO. Это последний SPT. Основная трудность в понимании алгоритма Дейкстры заключается в том, что правило кратчайшего пути не выполняется в одном месте (или на одном маршрутизаторе), как это происходит с Bellman-Ford или Diffusing Update Algorithm (DUAL). Кратчайший путь (по-видимому) проверяется только при перемещении узлов из TOPO в TENT - но на самом деле сортировка самого TENT выполняет другую часть правила кратчайшего пути, и проверка по PATH для существующих узлов составляет еще один шаг в процесс, делающий процесс трехступенчатым: Если путь к узлу длиннее, чем любой из TENT, то путь к TENT является более коротким путем по всей сети. Путь, который поднялся к вершине TENT через сортировку, является самым коротким к этому узлу в сети. Если путь перемещается к PATH от вершины TENT, это кратчайший путь к этому узлу в сети, и любые другие записи в TOPO к этому узлу следует отбросить. При наличии базового алгоритма полезно рассмотреть некоторые оптимизации и расчет Loop-Free Alternates (LFAs) и remote Loop-Free Alternates (rLFAs). Частичный и инкрементный SPF Нет особой причины, по которой весь SPT должен перестраиваться каждый раз, когда происходит изменение топологии сети или информации о доступности. Рассмотрим рисунок 9 для объяснения. Предположим, G теряет связь с 2001: db8: 3e8: 100 :: / 64. Устройству A не требуется пересчитывать свой путь к любому из узлов сети. Доступный пункт назначения - это просто лист дерева, даже если это набор хостов, подключенных к одному проводу (например, Ethernet). Нет причин пересчитывать весь SPT, когда один лист (или любой набор листьев) отключается от сети. В этом случае только лист (IP-адрес Интернет-протокола или доступный пункт назначения) должен быть удален из сети (или, скорее, пункт назначения может быть удален из базы данных без каких-либо изменений в сети). Это частичный пересчет SPT. Предположим, что канал [C, E] не работает. Что делает А в этом случае? Опять же, топология C, B и D не изменилась, поэтому у A нет причин пересчитывать все дерево. В этом случае A может удалить все дерево за пределами E. Чтобы вычислить только измененную часть графа, выполните следующие действия: Удалите отказавший узел и все узлы, которые нужно достичь через точку E. Пересчитайте дерево только от предшественника C (в данном случае A), чтобы определить, есть ли альтернативные пути для достижения узлов, ранее доступных через E до того, как канал [C, E] не доступен. Это называется инкрементным SPF. Расчет LFA и rLFA. Bellman-Ford не вычисляет ни соседей ниже по потоку, ни LFA, и, похоже, не располагает необходимой для этого информацией. DUAL по умолчанию вычисляет нисходящих соседей и использует их во время конвергенции. А как насчет протоколов на основе Дейкстры (и, соответственно, аналогичных алгоритмов SPF)? На рисунке 10 показан простой механизм, который эти протоколы могут использовать для поиска LFA и соседних узлов ниже по потоку. Определение нисходящего соседа - это такое, при котором стоимость достижения соседом пункта назначения меньше, чем локальная стоимость достижения пункта назначения. С точки зрения А: A знает местную стоимость проезда к месту назначения на основе SPT, созданного с помощью SPF Дейкстры. A знает стоимость B и C, чтобы добраться до места назначения, вычитая стоимость каналов [A, B] и [A, C] из рассчитанной на местном уровне стоимости. Следовательно, A может сравнивать локальную стоимость со стоимостью от каждого соседа, чтобы определить, находится ли какой-либо сосед в нисходящем направлении по отношению к любому конкретному месту назначения. Определение LFA: Если затраты соседа для «меня» плюс затраты соседа на достижение пункта назначения ниже, чем местные затраты, соседом является LFA. Вернее, учитывая: NC - это стоимость соседа до пункта назначения. BC - это стоимость соседа для меня. LC - местная стоимость до места назначения. Если NC + BC меньше LC, то соседом является LFA. В этом случае A знает стоимость каналов [B, A] и [C, A] с точки зрения соседа (она будет содержаться в таблице топологии, хотя не используется при вычислении SPT с использованием алгоритма Дейкстры). Таким образом, LFA и нисходящие соседи требуют очень небольшой дополнительной работы для расчета, но как насчет удаленных LFA? Модель P/Q Space обеспечивает простейший способ для алгоритмов на основе Дейкстры вычисления соседних узлов и LFA. Рисунок 11 используется для иллюстрации изнутри P/Q Space. Определение пространства P - это набор узлов, доступных с одного конца защищенного соединения, а определение пространства Q - это набор узлов, достижимых без пересечения защищенного канала. Это должно предложить довольно простой способ вычисления этих двух пространств с помощью Дейкстры: Рассчитайте SPT с точки зрения устройства, подключенного к одному концу линии связи; удалить линию связи без пересчета SPT. Остальные узлы доступны с этого конца линии. На рисунке 11 E может: Вычислите пространство Q, удалив линию [E, D] из копии локального SPT и всех узлов, для достижения которых E использует D. Вычислите пространство P, вычислив SPT с точки зрения D (используя D в качестве корня дерева), удалив линию [D, E], а затем все узлы, для достижения которых D использует E. Найдите ближайший узел, достижимый как из E, так и из D, с удаленной линией [E, D]. SPF Дейкстры - это универсальный, широко используемый алгоритм для вычисления Shortest Path Trees через сеть.
img
Бывало ли у вас такое, что ваш компьютер работал как сонная муха, а не как суперсовременное устройство? Он работает очень медленно, тормозит, как будто бежит марафон с рюкзаком, полным кирпичей. Или, возможно, он ведет себя как капризный ребенок, которому абсолютно неважно, что вам срочно нужно что-то сделать. Если вам это знакомо, то, вероятно, вы стали жертвой, так называемой,  утечки памяти . Этот противный цифровой глюк может стать той еще головной болью как для обычных пользователей, так и для разработчиков.  Утечки памяти, хоть и незаметны, могут потихоньку снижать производительность вашего компьютера, превращая когда-то быструю систему в старую измученную машину. Знаете, что хуже всего? В отличие от утечки воды, которую можно заметить, утечки памяти скрыты от ваших глаз, что серьезно усложняет процесс их выявления и тем более устранения. Впрочем, как и в любой сложной проблемной ситуации, понимание проблемы – первый шаг в борьбе с ней.  Разбираемся: что такое утечка памяти? Для того, чтобы лучше понять, что же такое утечка памяти, проведем несколько аналогий. Представьте, что ваш компьютер – это оживленный город. Дороги города олицетворяют память компьютера, а программы, которые работают на нем, - транспортные средства, каждое из которых выполняет различные задачи. А теперь представьте, что произойдет, если некоторые машины, завершив свои дела, решат припарковаться на дорогах на неопределенное время вместо того, чтобы уехать. Через какое-то время эти припаркованные машины заполонят городские дороги и замедлят, таким образом, движение. В худшем случае движение в городе просто остановится. В целом, все это описывает то, что утечка памяти делает с вашим компьютером.  А вот еще одна аналогия. Скрытая протечка воды в вашем доме может оставаться незамеченной до какого-то определенного времени, но она все равно увеличивает ваш счет за коммунальные услуги. Точно так же с утечкой памяти – она может оставаться незамеченной, едва ощутимо замедляя работу вашей системы, что приводит к резкому росту загрузки ЦП вашего компьютера.  Утечки памяти заполняют память, что приводит к проблемам с производительностью и истощению ресурсов Несмотря на то, что эти аналогии определяют утечку памяти как серьезную проблему, это не значит, что их нельзя решить. В этой статье мы разберемся, что является причиной утечек памяти, как их обнаружить и, самое главное, как не допустить, чтобы они портили нашу жизнь. Как и в случае с любой другой проблемой, ключ к борьбе с утечками памяти – понимание проблемы. Давайте приоткроем завесу тайны этих цифровых глюков и узнаем, как можно обеспечить безотказную работу наших компьютеров. Капелька терпения, доза знаний и небольшое количество хороших практик программирования, и мы сможем предотвратить появление утечек памяти, которые могут подпортить нашу жизнь в мире цифровых технологий. Давайте развеем миф об утечке памяти и исследуем их причины, последствия и стратегии, которые позволят их сдержать. Настало время вернуть контроль над производительностью вашего компьютера и распрощаться с внезапными спадами, вызванными этими цифровыми нарушителями порядка.  Что вызывает утечку памяти? Представьте, что вы – тусовщик, который устраивает у себя дома много вечеринок. Но есть одна особенность: после каждой вечеринки вместо того, чтобы убраться, вы оставляете все остатки пиццы, пустые банки из-под газировки и скомканные салфетки там, где они и были. А теперь представьте, что будет происходить, если вы так и продолжите устраивать вечеринки, не убирая беспорядок после предыдущих. В вашем доме будет самый настоящий бардак, не так ли? Примерно тоже самое происходит на вашем компьютере, когда программы поглощают все больше памяти, не очищая себя. Это все равно что перемещаться по захламленному дому – сущий кошмар. Компьютер, который пытается справиться с утечками памяти, работает медленно, что может раздражать, и абсолютно несговорчив. Данные, которые должны были быть давным-давно очищены, никуда не деваются, засоряя память вашего компьютера. В особо тяжелых случаях весь этот ералаш может привести к сбою системы.  Если мы говорим о программировании, когда программе необходимо сохранить какие-то данные, она запрашивает место в памяти. Она использует это пространство, и, по сути, когда она выполнит свою работу, она должна прибраться за собой. Такую уборку мы называем  освобождением памяти . В С и С++ за очистку памяти ответственны сами программисты. Если забывать об этом, то неиспользуемая память будет оставаться занятой, что в последствие приведет к утечке памяти.  А как насчет таких языков, как Java и Python? У них есть свои собственные автоматические очистители памяти, известные как  сборщики мусора , которые способствуют предотвращению утечек памяти. Но вот в чем загвоздка – даже этот автоматический очиститель может что-то упустить. Если были сделаны неправильные ссылки на объекты в памяти, то сборщик мусора может не распознать их как мусор, а, значит, утечки памяти все равно могут возникать.  Кроме того, утечки памяти могут возникать из-за проблем в самой программе. Например, некоторые строки кода могут выполняться в бесконечном цикле, потребляя все больше и больше памяти. Или, если программа столкнется с какой-то неожиданной ситуацией, с которой она не знает, как справиться, она может не выполнить свою задачу и, как результат, не освободить ту память, которую она использовала. Если коротко, то выходит, что утечка памяти преимущественно возникает из-за ошибок в коде, неэффективного управления памятью и некоторыми ошибками в программах.  Утечки памяти могут незаметно проникать в вашу систему (как подлый воришка), потихоньку замедляя работу компьютера. Понимание того, что является их причиной, - это первый шаг к эффективной борьбе с ними и поддержанию чистоты в памяти вашего компьютера, как в доме после отличной вечеринки.    Причины избегать утечек памяти Есть несколько причин, по которым утечка памяти классифицируется как серьезная проблема: Снижение производительности : программное обеспечение может начать работать медленнее, поскольку оно начнет потреблять больше памяти. Это крайне нежелательно для пользователей. Не исключено, что утечки памяти могут привести к нехватке памяти в системе, что повлечет за собой сбой или завершение работы. Растрачивание ресурсов : по сути, неосвобожденная память тратиться впустую, так как ни одна другая программа не может ей воспользоваться.  Систематическое замедление работы : если ваша программа со временем становится все медленнее, то, вполне вероятно, что в этом виновата утечка памяти. Использование памяти : внезапные скачки в использовании памяти (даже если программа не выполняет никаких новых задач) могут быть признаком утечки памяти.  Сбои : если сбои стали частым явлением, и при этом они сопровождаются сообщениями об ошибках «недостаточно памяти», их причиной может быть утечка памяти. Теперь, когда мы уже знаем, что такое утечка памяти и почему они так критичны, давайте рассмотрим несколько методов, которые помогут их остановить.  Примеры кода Давайте взглянем на примеры на С++ и Java, чтобы посмотреть, как происходит утечка памяти. Мы продемонстрируем несколько сценариев, при которых может возникнуть утечка памяти, а также способы, как их можно избежать. Пример на С++ Давайте посмотрим, как выделяется и освобождается память в С++ и что может вызвать утечку памяти. #include int main() {    int* array = new int[1000000];  // Allocate memory for an integer array { // Выделяем память для целочисленного массива }    // Use the array for some computations { // Производим некоторые вычисления с массивом  }    // ...    delete[] array;  // Deallocate the memory allocated for the array { // Освобождаем память, которая была выделена под массив }    // At this point, the memory allocated for the array is freed { // На этом этапе память, которая была выделена под массив, освобождается }    // Other code in the program { // Остальной код программы }    return 0; } Утечка памяти в С++: невозможность освободить память после ее динамического выделения может привести к утечке памяти Давай проанализируем код: Строка 4 : здесь происходит выделение памяти для массива целых чисел с помощью ключевого слова  new . Таким образом, в куче динамически выделяется память для хранения массива, состоящего из 1 000 000 целых чисел. Оператор  new возвращает указатель на выделенную память, которая хранится в переменной  array . На данном этапе память для массива была успешно выделена. Строка 8 : здесь происходит освобождение памяти, которая была выделена под массив, с помощью оператора  delete[] . Оператор  delete[] используется для освобождения памяти, которая была выделена с помощью оператора  new . При освобождении памяти программа гарантирует тот факт, что память будет освобождена и сможет быть повторно использована. Эта строка указывает на то, что в данный момент память, которая была выделена под массив, освобождается. В данном примере утечка памяти произойдет в том случае, если будет пропущен шаг с освобождением памяти (в  строке 8 ). Если вы пропустите конструкцию  delete[] array; , то память не освободиться. Это, в свою очередь, может привести к неэффективному использованию памяти и потенциальному исчерпанию ресурсов.  Для того, чтобы избежать утечки памяти, крайне важно, чтобы память, которая была выделена с помощью  new , была освобождена с помощью  delete . Добавив строку  delete[] array; , вы, как полагается, освобождаете выделенную память, предотвращая возникновение утечки памяти и позволяя вернуть память для дальнейшего использования. Примечание : если мы говорим о С++, то для того, чтобы эффективно управлять памятью, вам нужно правильно сочетать операторы ( new – с  delete , а  new[] – с  delete[] ). Если вместо оператора  delete[] вы будете использовать оператор  delete , то это может привести к утечке памяти, так как в таком случае вы освобождаете память только для первого индекса массива. Для того, чтобы предотвратить возникновение утечек памяти, не забывайте о правильном сочетании операторов.  Интеллектуальные указатели Существует еще один способ, как можно избежать возникновения утечек памяти в С++, - использовать интеллектуальные указатели. Давайте взглянем на следующий код: #include #include int main() {    std::unique_ptr array(new int[1000000]);  // Allocate memory for an integer array using a smart pointer { // Выделяем память для целочисленного массива с помощью интеллектуального указателя }    // Use the array for some computations { // Производим некоторые вычисления с массивом }    // ...    // No explicit deallocation needed. Smart pointers handle memory deallocation automatically. { // Явное освобождение памяти не требуется. Интеллектуальные указатели производят освобождение памяти автоматически. }    // Other code in the program { // Остальной код программы }    return 0; } Эффективное управление памятью с помощью интеллектуальный указателей в С++ С помощью этого скорректированного примера мы продемонстрируем то, как можно использовать интеллектуальные указатели для управления памятью, которая была выделена динамически с помощью оператора  new . Интеллектуальные указатели осуществляют автоматическое управление памятью, снижая, таким образом, риск возникновения утечек памяти и делая код более надежным.  Давайте проанализируем код: Строка 2 : здесь указывается заголовок  , который нужен для того, чтобы интеллектуальный указатель мог работать. Строка 5 :  std::unique_ptr array объявляет уникальный указатель с именем  array . Используя  std::unique_ptr , вы гарантируете, что у выделенной памяти есть только один владелец. Конструкция  new int[1000000] выделяет память для массива, состоящего из 1 000 000 целых чисел (по аналогии с прошлым примером). Но здесь за выделение память отвечает интеллектуальный указатель. Если вы используете в С++ динамическое выделение памяти, крайне важно обеспечить ее правильное освобождение. Если вы не освободите память, то это может привести к возникновению утечки памяти и постепенному снижению производительности программы.  Пример на Java В случае Java управление памятью осуществляется сборщиком мусора автоматически. Именно он отвечает за выделение и освобождение памяти, которая больше не используется. Вот пример, который четко демонстрирует то, как происходит управление памятью в Java: public class MemoryManagementExample {    public static void main(String[] args) {        int[] array = new int[1000000];  // Allocate memory for an integer array { // Выделяем память для целочисленного массива }        // Use the array for some computations { // Производим некоторые вычисления с массивом }        // ...        array = null;  // Set the array reference to null to make it eligible for garbage collection { // Устанавливаем ссылку на массив на значение null, чтобы он соответствовал всем критериям сборки мусора }        // At this point, the memory allocated for the array can be reclaimed by the garbage collector { // На данном этапе память, которая была выделена для массива, освобождается сборщиком мусора }        // Other code in the program { // Остальной код программы }    } } Правильное управление памятью в Java: для того, чтобы массив соответствовал всем критериям сборки мусора, после использования массива ссылка на него должна принять значение null В данном примере за выделение и освобождение памяти ответственна функция  main .  Давайте проанализируем код: Строка 3 : здесь выделяется память для массива, состоящего из 1 000 000 целых чисел, с помощью  new int[1000000] . Строка 8 : после того, как с массивом были произведены все необходимые вычисления, значение ссылки на массив  array устанавливается как  null . Таким образом, массив становится недоступным для любой другой активной ссылки. На данном этапе память, которая была выделена для массива, может быть освобождена сборщиком мусора.  Сборщик мусора Сборщик мусора отвечает за автоматическое управление памятью, процесс которого состоит из следующих этапов: Маркировка : сборщик мусора начинает с обхода графа объектов. Он начинает с корневых объектов (например, статических переменных, локальных переменных в стеке и параметров методов) и переходит по ссылкам на другие объекты. Он маркирует объекты, которые еще доступны, как «живые» объекты. Немаркированные объекты считаются недоступными.  Очистка : после того, как сборщик мусора завершит маркировку, он переходит к этапу очистки. На этом этапе сборщик мусора определяет объекты, которые не были промаркированы как «живые» на предыдущем этапе, и освобождает память, которую они занимают. Он эффективно справляется с освобождением памяти от этих недоступных объектов, делая ее доступной для последующих выделений.  Перемещение : некоторые сборщики мусора выполняют еще один этап, который называется перемещением. В процессе перемещения «живые» объекты передвигаются ближе друг к другу, что уменьшает фрагментацию и улучшает локальность в памяти. В результате вы можете получить более эффективное использование памяти и лучшую производительность. Этот этап – необязателен.  У Java есть несколько разных алгоритмов и стратегий сборки мусора, например, Алгоритм маркировки и очистки Сборка мусора разных поколений Фоновая сборка мусора То, какой алгоритм вы будете использовать, зависит от реализации и конфигурации JVM. Как правило, разработчикам не требуется явно взаимодействовать со сборщиком мусора или вручную освобождать память. И тем не менее, очень важно писать эффективный код и придерживаться рекомендаций для того, чтобы минимизировать количество бесполезных объектов и предотвратить возникновение утечек памяти, которые могут возникать, если вы непреднамеренно оставляете объекты активными или не освобождаете ссылки должным образом. Управляя памятью автоматически, сборщик мусора упрощает для разработчиков процесс управления памятью и помогает предотвратить возникновение таких распространенных проблем с памятью, как утечки памяти или висячие указатели.  Методы предотвращения утечек памяти Интеллектуальные указатели . Вы можете использовать интеллектуальные указатели (например, в таких языках программирования, как С++) для того, чтобы обеспечить автоматическое управление памятью. Используйте языки программирования, у которых есть сборщики мусора . Такие языки программирования, как Python и Java, имеют встроенную систему сбора мусора, которые отвечают за выделение и освобождение памяти в автоматическом режиме. Применяйте стратегию управление памятью . Эффективное управление памятью может помочь предотвратить возникновение утечки памяти. Оно включает в себя постоянное отслеживание того, сколько памяти использует наше программное обеспечение, и представление о том, когда нужно выделять память, а когда – освобождать.  Заключение Утечки памяти могут постепенно и незаметно снижать производительность вашего компьютера. Они могут вызывать замедление работы и сбои. Зная причины возникновения утечек памяти и применяя передовые методы программирования, вы можете эффективно противостоять им. Будьте начеку, разумно управляйте памятью и смело программируйте, и вы сможете избежать таких проблем, как утечки памяти. 
img
В нашей профессиональной жизни нам всем необходим свой собственный набор инструментов, чтобы мы всегда были готовы решить любые проблемы, которые встречаются на нашем пути. Многие QA-специалисты считают, что для того, чтобы быть профессионалом своего дела, им нужно получить огромное количество технических знаний, а некоторые считают, что для этого нужно обладать хорошими коммуникативными навыками и легким характером.  Еще недавно компании в своем большинстве при найме и продвижении сотрудников по службе делали больший акцент исключительно на навыках, которые больше известны как профессиональные навыки. Однако рынок труда развивался, количество требований, которым должен соответствовать профессионал, чтобы считаться квалифицированным, росло, и навыки межличностного общения (или надпрофессиональные навыки) стали вполне актуальными.  В этой статье я представлю вам список профессиональных (Hard Skills) и надпрофессиональных навыков (Soft Skills), которыми должен обладать каждый QA-специалист. Но перед этим я введу такие понятия, как Hard Skills и Soft Skills, а также расскажу для чего они нужны. А для тех, кто не имеет отношения к сфере обеспечения качества, мы кратенько рассмотрим список навыков, которыми должен обладать каждый IT-специалист, чтобы их проекты были как можно качественнее. Кроме того, я предложу вам несколько способов, как можно приобрести как можно больше профессиональный и надпрофессиональных навыков, чтобы стать профессионалом своего дела. Давайте начнем! Hard Skills для QA-специалистов На протяжении довольного долгого времени основным показателем для профессионала были именно Hard Skills. Нетрудно догадаться, почему это так. Hard Skills – это профессиональные навыки, которые можно неким образом оценить или сравнить. Кроме того, легко доказать их наличие, просто предъявив сертификат или выполнив некоторое техническое задание.  Hard Skills – это навыки, которые можно легко изучить (и выучить) на различных курсах, тренингах, мастер-классах, самообучении и т.д. Если коротко, то Hard Skills – это технические навыки профессионала. Вот несколько примеров: Технические курсы Факультативные курсы Дипломы об окончании учебы Степень магистра, доктора Высокий уровень владения иностранным языком Технические сертификаты Как правило в резюме указывают именно Hard Skills, так как их легко доказать. Какие именно Hard Skills являются актуальными зависит от должности специалиста и сферы деятельности компании. Само собой, технические навыки проще всего проанализировать. Однако с профессиональным ростом специалистов и развитием профессионального рынка они потеряли свое очарование. Soft Skills для QA-специалистов В отличие от Hard Skills, Soft Skills не так просто определить, количественно оценить или сравнить. Soft Skills – это социально-поведенческие навыки, которые связаны непосредственно с тем, как профессионал думает, и с его умением уверенно справляться с различными эмоциональными факторами.  Soft Skills – это то, что трудно уловить, так как это гораздо больше, чем просто оконченный курс или сертификат. Сюда входит весь психосоциальный опыт человека, что подразумевает, что таким навыкам довольно сложно обучиться, и их непросто освоить. За последние годы многие компании изменили свой подход к оценке сотрудников, что повлекло за собой рост значимости Soft Skills. Нет никакого смысла рассчитывать на сотрудников (пусть и технически квалифицированных), которым трудно работать в некомфортных для них условиях или совместно с другими специалистами. Вот несколько примеров Soft Skills: Умение работать с другими людьми Инициативность Умение разрешать конфликты Умение работать в стрессовых ситуациях Умение руководить Ответственность Аналитические способности Такие навыки, как правило, не так часто упоминают в резюме, поскольку доказать их довольно сложно. Для того, чтобы их можно было оценить, может потребоваться группа специалистов по подбору кадров и сотрудников. Есть довольно широко используемый инструмент для наблюдения за надпрофессиональными навыками и их оценки, и это групповая динамика. Для чего нужны профессиональные и надпрофессиональные навыки? Если мы говорим о профессиональной карьере, то Hard Skills и Soft Skills важны в двух моментах: 1. В самом начале, когда вы только приняли решение найти работу. Когда вы находитесь в поисках своей первой работы в сфере качества ПО, вы в полной мере будете использовать свои профессиональные и надпрофессиональные навыки, чтобы продемонстрировать специалистам по подбору кадров, что вы обладаете всеми необходимыми навыками для этой работы и что вы соответствуете представлению компании о профессионале.  2. На протяжении всей вашей карьеры, когда вы продолжаете развиваться. После того, как вы получили работу и уже какое-то время работаете в области обеспечения качества, вам понадобятся ваши профессиональные и надпрофессиональные навыки для того, чтобы дальше развиваться и стать востребованным специалистом в этой области. Развивая свои Hard Skills, вы сможете еще больше узнать об области контроля качества и сможете работать над любым проектом. А развивая Soft Skills, вы сможете стать профессиональным APT-специалистом, сможете получать новые должности, а с ними новые обязанности и назначения на более сложные и интересные проекты.   Набор профессиональных навыков В этом разделе мы перечислим набор обязательных Hard Skills, которыми должен обладать каждый профессионал в области обеспечения качества ПО. Цель состоит не в том, чтобы уйти от этой темы. Наоборот, я хочу предоставить средства, которые, как мне кажется, являются наиболее важными для QA на данный момент.  Базовые концепции QA : принципы тестирования, процесс тестирования, методы тестирования, этапы тестирования, виды тестирования. Базовые знания в области программирования : логика программирования и базовые знания некоторых языков программирования.  Базовые знания баз данных : SQL-команды. Автоматизация тестирования : Selenium, Appium, TestProject. Методы тестирования : тестирование методом черного ящика, тестирование методом белого ящика, исследовательское тестирование, тестирование при помощи эвристик. Инструменты тестирования : инструменты управления тестовыми примерами, системы отслеживания ошибок.   Набор надпрофессиональных навыков В этом разделе представлен список Soft Skills, которыми, как я считаю, должен обладать каждый специалист по обеспечению качества ПО, который хочет стать отличным QA-специалистом. И еще раз, цель состоит не в том, чтобы уйти от этой темы, а в том, чтобы предоставить средства, которые, на мой взгляд, являются наиболее актуальными для QA на сегодняшний день.  Взаимодействие с людьми : мы всегда должны сообщать ту или иную информацию всем членам команды. Пытливость и смекалистость : важно уметь исследовать, постигать и создавать новые вещи. Терпение : всегда есть шанс столкнуться с различными проблемами, связанными с приложением, инфраструктурой и требованиями. Самоорганизация : важно уметь правильно расставлять приоритеты, организовывать работу в команде, организовывать собственную работу и соблюдать дедлайны. Навыки для IT-профессионалов Мы всегда несем ответственность за качество своих продуктов. В этом разделе вы найдете список Hard и Soft Skills, которыми, как я думаю, должен обладать каждый IT-специалист, который хочет, чтобы команда разрабатывала качественный продукт. Вот те Hard Skills, которые следует развивать каждому IT-специалисту, работающему в области обеспечения качества ПО: Базовые концепции QA : принципы тестирования, процесс тестирования, методы тестирования, этапы тестирования, виды тестирования. Методы тестирования : тестирование методом черного ящика, тестирование методом белого ящика, исследовательское тестирование, тестирование при помощи эвристик. А вот Soft Skills, которые также следует развивать каждому IT-специалисту, работающему в области обеспечения качества ПО: Взаимодействие с людьми : мы всегда должны сообщать ту или иную информацию всем членам команды. Сотрудничество : можно предлагать тестовые сценарии, помощь в решении проблем среды и поиске ошибок. Работа в команде : качество и автоматизация тестирования – это обязанность не только QA-специалистов, отчеты об ошибках – это также работа не только QA-специалистов.  Способы саморазвития Если вы только прочитали эту статью и не знаете, как можно развить свои Hard и Soft Skills (неважно, пытаетесь вы получить свою первую работу или развиваться как профессионал в своей области), то вот вам список лучших способов, как можно получить знания, которые сделают их вас прекрасного QA-специалиста. По большей части я использую его в своей повседневной профессиональной жизни: Чтение публикаций в блоге : найдите и выберите блоги, которые вам нравятся, и читайте публикации на тему тестирований. Чтение книг : есть огромное количество хороших книг, в которых рассказывается о QA. Прохождение курсов : есть огромное количество курсов, которые вы можете пройти онлайн и развить свои навыки. Практика : все, что вы изучаете, необходимо использовать на практике; таким образом, вы закрепите свои знания. Посещение встреч и конференций : посещение мероприятий такого рода позволит вам познакомиться с профессионалами своего дела и поучиться у них. Разговоры с другими QA-специалистами : делясь своими мыслями, проблемами и ситуациями, с которыми вы имеете дело в своей повседневной работе, вы можете услышать иное мнение и почерпнуть какие-то новые знания от ваших коллег. Найдите свои источники информации и следите за ними : читайте тексты, которые там публикуют, смотрите презентации, проходите курсы, которые там предлагают, читайте их публикации в социальных сетях и учитесь у них. Делитесь своими знаниями с другими : вы многому можете научиться, делясь своими знаниями с другими. Наймите преподавателя : вы можете получить поддержку профессионала, который направит вас к вашим целям самым быстрым и эффективным способом.  Заключение Hard Skills и Soft Skills – это важные компоненты развития каждого специалиста по обеспечению качества ПО. Вам необходимо постоянно совершенствовать свои навыки, чтобы не потерять свою профессиональную привлекательность для рынка в целом и для компании, в которой вы работаете. Это даст вам больше возможностей для роста, возможность работать на серьезных должностях и выполнять интересные задачи. В этой статье мы поговорили о важности профессиональных и надпрофессиональных навыков и о том, что это такое. Кроме того, мы привели списки Hard и Soft Skills, которые, на мой взгляд, являются необходимыми для того, чтобы иметь возможность стать отличным QA-специалистом и специалистом в области обеспечения качества ПО. И напоследок, я перечислил несколько способов, как можно приобрести и развить свои профессиональные навыки. А теперь, вперед и с песней!
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59