Чем отличается процесс от потока?
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое.
Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.
Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов.
📍 Зачем математика нужна в Data Science в 2022?
Библиотека программиста продолжает серию вебинаров по темам, интересным для наших подписчиков. На предстоящем вебинаре аналитик данных Артур Сапрыкин поведает слушателям об актуальных требованиях к дата-сайентистам, математике, необходимой для обучения предсказательных моделей и том, как соответствующие навыки используются на практике для обработки крупных массивов информации.
🧑💻 Для кого: начинающие дата-сайентисты и абитуриенты ШАД
📅 Когда: 8 августа в 19:00
🖇 Где: https://proglib.io/w/fb2c6ce4
#proglib_academy #профессии #datascientist
Библиотека программиста продолжает серию вебинаров по темам, интересным для наших подписчиков. На предстоящем вебинаре аналитик данных Артур Сапрыкин поведает слушателям об актуальных требованиях к дата-сайентистам, математике, необходимой для обучения предсказательных моделей и том, как соответствующие навыки используются на практике для обработки крупных массивов информации.
🧑💻 Для кого: начинающие дата-сайентисты и абитуриенты ШАД
📅 Когда: 8 августа в 19:00
🖇 Где: https://proglib.io/w/fb2c6ce4
#proglib_academy #профессии #datascientist
#вопросы_с_собеседований
Что такое «зелёные потоки» и есть ли они в Java?
Зелёные (легковесные) потоки(green threads) - потоки эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.
Виртуальная машина Java берёт на себя заботу о переключении между разными green threads, а сама машина работает как один поток ОС. Это даёт несколько преимуществ. Потоки ОС относительно дороги в большинстве POSIX-систем. Кроме того, переключение между native threads гораздо медленнее, чем между green threads.
Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем native threads. Система может поддерживать гораздо большее количество green threads, чем потоков OС. Например, гораздо практичнее запускать новый green thread для нового HTTP-соединения к веб-серверу, вместо создания нового native thread.
Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один native thread, только он и вызывается планировщиком ОС. Даже если у вас несколько процессоров и несколько green threads, только один процессор может вызывать green thread. И всё потому, что с точки зрения планировщика заданий ОС всё это выглядит одним потоком.
Начиная с версии 1.2 Java поддерживает native threads, и с тех пор они используются по умолчанию.
Что такое «зелёные потоки» и есть ли они в Java?
Зелёные (легковесные) потоки(green threads) - потоки эмулируемые виртуальной машиной или средой исполнения. Создание зелёного потока не подразумевает под собой создание реального потока ОС.
Виртуальная машина Java берёт на себя заботу о переключении между разными green threads, а сама машина работает как один поток ОС. Это даёт несколько преимуществ. Потоки ОС относительно дороги в большинстве POSIX-систем. Кроме того, переключение между native threads гораздо медленнее, чем между green threads.
Это всё означает, что в некоторых ситуациях green threads гораздо выгоднее, чем native threads. Система может поддерживать гораздо большее количество green threads, чем потоков OС. Например, гораздо практичнее запускать новый green thread для нового HTTP-соединения к веб-серверу, вместо создания нового native thread.
Однако есть и недостатки. Самый большой заключается в том, что вы не можете исполнять два потока одновременно. Поскольку существует только один native thread, только он и вызывается планировщиком ОС. Даже если у вас несколько процессоров и несколько green threads, только один процессор может вызывать green thread. И всё потому, что с точки зрения планировщика заданий ОС всё это выглядит одним потоком.
Начиная с версии 1.2 Java поддерживает native threads, и с тех пор они используются по умолчанию.
Каким образом можно создать поток?
• Создать потомка класса Thread и переопределить его метод run();
• Создать объект класса Thread, передав ему в конструкторе экземпляр класса, реализующего интерфейс Runnable. Эти интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
• Вызвать метод submit() у экземпляра класса реализующего интерфейс ExecutorService, передав ему в качестве параметра экземпляр класса реализующего интерфейс Runnable или Callable (содержит метод call(), в котором описывается логика выполнения).
• Создать потомка класса Thread и переопределить его метод run();
• Создать объект класса Thread, передав ему в конструкторе экземпляр класса, реализующего интерфейс Runnable. Эти интерфейс содержит метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
• Вызвать метод submit() у экземпляра класса реализующего интерфейс ExecutorService, передав ему в качестве параметра экземпляр класса реализующего интерфейс Runnable или Callable (содержит метод call(), в котором описывается логика выполнения).
#вопросы_с_собеседований
В чём заключается разница между методами start() и run()?
Несмотря на то, что
В чём заключается разница между методами start() и run()?
Несмотря на то, что
start()
вызывает метод run()
внутри себя, это не то же самое, что просто вызов run()
. Если run()
вызывается как обычный метод, то он вызывается в том же потоке и никакой новый поток не запускается, как это происходит, в случае, когда вы вызываете метод start()
.🔥 Бесплатная Live coding сессия, где будем решать задачу с собеседования в международную FinTech компанию
В прямом эфире Роман Оборин, Senior Java Developer в BNP Paribas и преподаватель курса Middle Java Dev, проведет Live coding сессию по написанию объектно-ориентированного кода на Java, покрытого разными типами тестов: Unit, Integration, Stress.
На Live сoding ты сможешь понаблюдать, как пишет код Senior-разработчик, прокомментировать процесс и решить реальную задачу, которую дают на собеседованиях. Ну и конечно, прокачаешь свои hard skills:
— Структурируешь знания по принципам SOLID
— Прокачаешь знания по разным видам тестирования, в том числе многопоточных программ
— Подготовишься к техническому интервью с этапом Live coding
🚀 Стартуем 18 августа в 19.00 по МСК
Регистрируйся бесплатно: https://cutt.ly/BZ0wv09
В прямом эфире Роман Оборин, Senior Java Developer в BNP Paribas и преподаватель курса Middle Java Dev, проведет Live coding сессию по написанию объектно-ориентированного кода на Java, покрытого разными типами тестов: Unit, Integration, Stress.
На Live сoding ты сможешь понаблюдать, как пишет код Senior-разработчик, прокомментировать процесс и решить реальную задачу, которую дают на собеседованиях. Ну и конечно, прокачаешь свои hard skills:
— Структурируешь знания по принципам SOLID
— Прокачаешь знания по разным видам тестирования, в том числе многопоточных программ
— Подготовишься к техническому интервью с этапом Live coding
🚀 Стартуем 18 августа в 19.00 по МСК
Регистрируйся бесплатно: https://cutt.ly/BZ0wv09
#вопросы_с_собеседований
Дайте определение понятию «синхронизация».
Синхронизация - это процесс, который позволяет выполнять потоки параллельно.
В Java все объекты имеют одну блокировку, благодаря которой только один поток одновременно может получить доступ к критическому коду в объекте. Такая синхронизация помогает предотвратить повреждение состояния объекта. Если поток получил блокировку, ни один другой поток не может войти в синхронизированный код, пока блокировка не будет снята. Когда поток, владеющий блокировкой, выходит из синхронизированного кода, блокировка снимается. Теперь другой поток может получить блокировку объекта и выполнить синхронизированный код. Если поток пытается получить блокировку объекта, когда другой поток владеет блокировкой, поток переходит в состояние Блокировки до тех пор, пока блокировка не снимется.
Дайте определение понятию «синхронизация».
Синхронизация - это процесс, который позволяет выполнять потоки параллельно.
В Java все объекты имеют одну блокировку, благодаря которой только один поток одновременно может получить доступ к критическому коду в объекте. Такая синхронизация помогает предотвратить повреждение состояния объекта. Если поток получил блокировку, ни один другой поток не может войти в синхронизированный код, пока блокировка не будет снята. Когда поток, владеющий блокировкой, выходит из синхронизированного кода, блокировка снимается. Теперь другой поток может получить блокировку объекта и выполнить синхронизированный код. Если поток пытается получить блокировку объекта, когда другой поток владеет блокировкой, поток переходит в состояние Блокировки до тех пор, пока блокировка не снимется.
#вопросы_с_собеседований
Какие существуют способы синхронизации в Java?
•
•
•
Какие существуют способы синхронизации в Java?
•
Системная синхронизация с использованием wait()/notify()
. Поток, который ждет выполнения каких-либо условий, вызывает у этого объекта метод wait()
, предварительно захватив его монитор. На этом его работа приостанавливается. Другой поток может вызвать на этом же самом объекте метод notify()
(опять же, предварительно захватив монитор объекта), в результате чего, ждущий на объекте поток «просыпается» и продолжает свое выполнение. В обоих случаях монитор надо захватывать в явном виде, через synchronized-блок
, потому как методы wait()/notify()
не синхронизированы!•
Системная синхронизация с использованием join(). Метод join()
, вызванный у экземпляра класса Thread
, позволяет текущему потоку остановиться до того момента, как поток, связанный с этим экземпляром, закончит работу.•
Использование классов из пакета java.util.concurrent
, который предоставляет набор классов для организации межпоточного взаимодействия. Примеры таких классов - Lock
, Semaphore
и пр.. Концепция данного подхода заключается в использовании атомарных операций и переменных.👍 Как правильно писать сообщения коммитов в GIT, чтобы всем было хорошо
Правильно написанные сообщения к коммитам в Git помогают сделать проект с открытым или закрытым исходным кодом удобным для дальнейшей доработки и поддержки. В этой статье вы познакомитесь с различными стратегиями написания хороших сообщений и их использования для оптимизации процесса разработки.
🔗 Основной сайт
🔗 Зеркало
Правильно написанные сообщения к коммитам в Git помогают сделать проект с открытым или закрытым исходным кодом удобным для дальнейшей доработки и поддержки. В этой статье вы познакомитесь с различными стратегиями написания хороших сообщений и их использования для оптимизации процесса разработки.
🔗 Основной сайт
🔗 Зеркало
В каких состояниях может находиться поток?
Потоки могут находиться в одном из следующих состояний:
•
•
•
•
○
○
○
○
Потоки могут находиться в одном из следующих состояний:
•
Новый (New)
. После создания экземпляра потока, он находится в состоянии Новый до тех пор, пока не вызван метод start()
. В этом состоянии поток не считается живым.•
Работоспособный (Runnable)
. Поток переходит в состояние Работоспособный, когда вызывается метод start()
. Поток может перейти в это состояние также из состояния Работающий или из состояния Блокирован. Когда поток находится в этом состоянии, он считается живым.•
Работающий (Running)
. Поток переходит из состояния Работоспособный в состояние Работающий, когда Планировщик потоков выбирает его как работающий в данный момент.•
Живой, но не работоспособный (Alive, but not runnable)
. Поток может быть живым, но не работоспособным по нескольким причинам:○
Ожидание (Waiting)
. Поток переходит в состояние Ожидания, вызывая метод wait()
. Вызов notify()
или notifyAll()
может перевести поток из состояния Ожидания в состояние Работоспособный.○
Сон (Sleeping)
. Метод sleep()
переводит поток в состояние Сна на заданный промежуток времени в миллисекундах.○
Блокировка (Blocked)
. Поток может перейти в это состояние, в ожидании ресурса, такого как ввод/вывод или из-за блокировки другого объекта. В этом случае поток переходит в состояние Работоспособный, когда ресурс становится доступен.○
Мёртвый (Dead)
. Поток считается мёртвым, когда его метод run()
полностью выполнен. Мёртвый поток не может перейти ни в какое другое состояние, даже если для него вызван метод start()
.#вопросы_с_собеседований
Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
Да, можно создавать новые экземпляры класса, так как статические поля не принадлежат к экземплярам класса.
Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
Да, можно создавать новые экземпляры класса, так как статические поля не принадлежат к экземплярам класса.
🔥Меня уволили: 8 способов справиться с потерей работы и найти новую
Увольнение – это всегда стресс. А в нынешнее тяжелое время и вовсе «конец света». Расскажем, как не опускать руки и начать новый эпизод в карьере.
https://proglib.io/sh/9qAhBenSNT
Увольнение – это всегда стресс. А в нынешнее тяжелое время и вовсе «конец света». Расскажем, как не опускать руки и начать новый эпизод в карьере.
https://proglib.io/sh/9qAhBenSNT
Изучить основы Java за 14 дней? По цене пиццы?!
Это реально!
Подключайтесь к нашему подготовительному курсу по Java-разработке.
Начинаем уже 16 августа 📚
Это реально!
Подключайтесь к нашему подготовительному курсу по Java-разработке.
Начинаем уже 16 августа 📚
#вопросы_с_собеседований
В чем разница между notify() и notifyAll()?
Дело в том, что «висеть» на методе
В чем разница между notify() и notifyAll()?
Дело в том, что «висеть» на методе
wait()
одного монитора могут сразу несколько потоков. При вызове notify()
только один из них выходит из wait()
и пытается захватить монитор, а затем продолжает работу со следующего после wait()
оператора. Какой из них выйдет - заранее неизвестно. А при вызове notifyAll()
, все висящие на wait()
потоки выходят из wait()
, и все они пытаются захватить монитор. Понятно, что в любой момент времени монитор может быть захвачен только одним потоком, а остальные ждут своей очереди. Порядок очереди определяется планировщиком потоков Java
.#вопросы_с_собеседований
Почему методы wait() и notify() вызываются только в синхронизированном блоке?
Монитор надо захватывать в явном виде (через
Почему методы wait() и notify() вызываются только в синхронизированном блоке?
Монитор надо захватывать в явном виде (через
synchronized-блок
), потому что методы wait()
и notify()
не синхронизированы.#вопросы_с_собеседований
Что такое livelock?
Реальный пример livelock, – когда два человека встречаются в узком коридоре и каждый, пытаясь быть вежливым, отходит в сторону, и так они бесконечно двигаются из стороны в сторону, абсолютно не продвигаясь в нужном им направлении.
Что такое livelock?
livelock
– тип взаимной блокировки, при котором несколько потоков выполняют бесполезную работу, попадая в зацикленность при попытке получения каких-либо ресурсов. При этом их состояния постоянно изменяются в зависимости друг от друга. Фактической ошибки не возникает, но КПД системы падает до 0. Часто возникает в результате попыток предотвращения deadlock.Реальный пример livelock, – когда два человека встречаются в узком коридоре и каждый, пытаясь быть вежливым, отходит в сторону, и так они бесконечно двигаются из стороны в сторону, абсолютно не продвигаясь в нужном им направлении.
#вопросы_с_собеседований
Как проверить, удерживает ли поток монитор определённого ресурса?
Метод
Как проверить, удерживает ли поток монитор определённого ресурса?
Метод
Thread.holdsLock(lock)
возвращает true
, когда текущий поток удерживает монитор у определённого объекта.Большой гайд. Пишем микросервисы на Java и Spring Boot, заворачиваем в Docker, запускаем на EKS, мониторим на Grafana.
https://habr.com/ru/post/682720/
https://habr.com/ru/post/682720/
Хабр
Большой гайд. Пишем микросервисы на Java и Spring Boot, заворачиваем в Docker, запускаем на EKS, мониторим на Grafana
Туториалы делятся на две больших категории: либо "как нарисовать сову", либо подробно расписанные тысячи шагов в формате "напиши туториал для дурака - и только дурак захочет его читать". К какой из...
⌛ Миф о 21 дне: как на самом деле формируются привычки
Проблема привить полезную привычку (или избавиться от вредной) касается каждого из нас. Рассказываем о самых популярных заблуждениях – смотрим фактам в лицо.
🔗 Основной сайт
🔗 Зеркало
Проблема привить полезную привычку (или избавиться от вредной) касается каждого из нас. Рассказываем о самых популярных заблуждениях – смотрим фактам в лицо.
🔗 Основной сайт
🔗 Зеркало