🖥️Операционные системы

Отличие процессов и потоков в ОС, адресное пространство, виртуальная память

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

Процессы

Процесс в ОС - это экземпляр выполняемой программы, который имеет свой адресный спектр и ресурсы, которые используются при выполнении программы[2]. Каждый процесс имеет свой адресный спектр, который может быть отображен на физическую память, и он может иметь несколько потоков[3]. Процесс может быть сравним с выполнением программы на отдельном компьютере, где каждый процесс имеет свой адресный спектр и ресурсы, которые не могут быть доступны для других процессов[5].

Потоки

Поток, с другой стороны, - это последовательный переход процессора от одной команды программы к другой[3]. Потоки одного процесса делят общее адресное пространство и ресурсы, что отличает их от процессов, которые могут иметь свои адресные пространства и ресурсы[4]. Потоки могут быть созданы не только в режиме ядра, но и в пользовательском режиме, что может быть полезно для выполнения задач, которые не требуют доступа к ядру[1].

Адресное пространство

Адресное пространство процесса - это диапазон адресов виртуальной памяти, который может использоваться процессом[2]. Каждый процесс имеет свой адресный спектр, который может быть отображен на физическую память. Виртуальное адресное пространство процесса - это его собственный адресный спектр, который отличается от адресного пространства физической оперативной памяти[5].

Виртуальная память

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

Citations: [1] https://habr.com/ru/articles/40227/ [2] http://techn.sstu.ru/kafedri/%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/1/MetMat/murashev/com/lec/cl14.htm [3] https://surazhspk.narod.ru/kop/El_spravo/page-32.html [4] https://vyache.art/posts/process-thread-fiber/ [5] https://surazhspk.narod.ru/kop/El_spravo/page-25.html

Как убить процесс в линуксе?

Убить процесс в Linux можно с помощью команд kill и killall. Команда kill используется для отправки сигнала процессу, указанному его идентификатором (PID), а команда killall для остановки всех процессов, соответствующих указанному имени[1][5].

Для использования этих команд, сначала необходимо найти PID процесса, который нужно остановить. Это можно сделать с помощью команды ps, которая выводит список активных процессов в системе, и grep, который помогает найти процесс с конкретным именем или свойствами[2].

Например, чтобы найти PID процесса Mozilla Firefox, можно использовать следующую команду:

ps -ef | grep firefox

Затем, после определения PID, можно использовать команду kill для отправки сигнала SIGKILL, который немедленно остановит процесс:

kill <PID>

Команда killall может быть использована для остановки всех процессов, которые соответствуют указанному имени:

killall firefox

Обратите внимание, что перед использованием этих команд, рекомендуется проверить, что процесс не является важным для системы или пользовательского приложения, и что его остановка не может привести к негативным последствиям[5].

Citations: [1] https://surazhspk.narod.ru/kop/El_spravo/page-32.html [2] https://www.gotoadm.ru/kill-process-in-linux/ [3] https://surazhspk.narod.ru/kop/El_spravo/page-25.html [4] http://techn.sstu.ru/kafedri/%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/1/MetMat/murashev/com/lec/cl14.htm [5] https://selectel.ru/blog/tutorials/kill-and-killall-commands-in-linux/

Что происходит, когда в коде на Go мы просим выделить один кб памяти?

Когда в коде на Go мы просим выделить 1 Кб памяти, происходит следующее:

  1. Система выделения памяти в Go использует различные структуры и кэши для эффективного управления памятью[1][2]. Она учитывает размер объектов, для которых выделяется память.

  2. Для объектов размером до 32 Кб, память выделяется из специальных структур, называемых "арены"[2]. Арены представляют собой блоки виртуальной памяти размером 64 МБ, которые управляются средой выполнения Go.

  3. Когда нужно выделить память под объект размером до 32 Кб, среда выполнения Go использует специальные структуры данных, такие как span и bitmap, для эффективного управления памятью[2]. Эти структуры хранят метаданные об арене и используются, в основном, при сборке мусора.

  4. Для объектов размером больше 32 Кб, память выделяется из кучи, которая также управляется средой выполнения Go[1][2]. Куча использует различные механизмы, такие как сегментация и кэширование, для эффективного распределения памяти.

  5. Таким образом, при выделении 1 Кб памяти в Go, среда выполнения использует свои внутренние структуры и механизмы для управления памятью, стараясь обеспечить эффективное использование ресурсов[1][2].

Citations: [1] https://www.pvsm.ru/razrabotka/310902 [2] https://habr.com/ru/companies/ruvds/articles/442648/ [3] https://habr.com/ru/companies/piter/articles/543226/ [4] https://www.youtube.com/watch?v=_BbhmaZupqs [5] https://tproger.ru/translations/memory-leaks-investigation-in-go-using-pprof

Что будет, если система не может дать память?

Согласно представленным источникам, если система не может выделить запрошенный объем памяти, то может произойти следующее:

  1. Если объект, для которого запрашивается память, небольшого размера (до 32 Кб), среда выполнения Go попытается выделить его из специальных структур, называемых "арены"[1][2]. Если в аренах недостаточно свободного места, среда выполнения Go может попытаться расширить арены, выделив дополнительную виртуальную память[2].

  2. Для объектов большего размера (более 32 Кб), память выделяется из кучи, управляемой средой выполнения Go[1][2]. Если в куче недостаточно свободного места, среда выполнения Go может попытаться расширить кучу, выделив дополнительную виртуальную память[2].

  3. Если среда выполнения Go не может выделить дополнительную виртуальную память, либо если система в целом не может предоставить запрошенный объем физической памяти, то это может привести к ошибке нехватки памяти (OutOfMemoryError) или к сбою в работе программы[3][4][5].

  4. В таких случаях программе может потребоваться использовать более эффективные алгоритмы управления памятью, оптимизировать использование памяти, или ограничить потребление памяти с помощью различных механизмов, таких как установка лимитов на потребление памяти[3][5].

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

Citations: [1] https://www.pvsm.ru/razrabotka/310902 [2] https://habr.com/ru/companies/ruvds/articles/442648/ [3] https://www.youtube.com/watch?v=_BbhmaZupqs [4] https://www.cyberforum.ru/go/thread2684117.html [5] https://habr.com/ru/companies/piter/articles/543226/

Last updated