[Java] Вопросы для интервью, которые не оставляют слез

Java алгоритм Операционная система Java EE

предисловие

Только лысина может стать сильнее

эта статьяСтремитесь объяснить каждый пункт знаний просто, я надеюсь, что каждый сможет что-то получить после прочтения

1. Как уменьшить переключение контекста потока

При использовании многопоточностиОтсутствие многопоточности может улучшить скорость выполнения программы, использование многопоточностиЛучшее использование ресурсов ЦП!

Когда программа выполняется, многопоточность задействует ЦП, предоставляя каждому потокуВыделите кванты процессорного времени для достиженияДа, квант времени — это время, которое ЦП выделяет каждому потоку для выполнения, потому что квант времени очень короткий, поэтомуПроцессор работает, постоянно переключая потоки.

нитьНе чем больше, тем лучшеДа, потому что переключение контекста потокапотеря производительностиДа, вам нужно подумать, как уменьшить переключение контекста при использовании многопоточности.

Как правило, есть следующие впечатления

  • параллельное программирование без блокировок. Когда многопоточность конкурирует, это вызовет переключение контекста, поэтому при обработке многопоточных данных можно использовать некоторые методы, чтобы избежать использования блокировок, например, сегментация идентификатора данных в соответствии с хэш-модулем, и разные потоки обрабатывают разные сегменты данных.
  • CAS-алгоритм. Пакет Java Atomic использует алгоритм CAS для обновления данных,без блокировки.
  • контролировать количество потоков. Избегайте создания ненужных потоков, например, задач мало, но для обработки создается много потоков, из-за чего большое количество потоков будет находиться в состоянии ожидания
  • сопрограмма. Реализуйте многозадачное планирование в одном потоке и поддерживайте переключение между несколькими задачами в одном потоке.
    • Корутины можно рассматривать как пользовательский режимСамоуправляемые «потоки».не будет участвоватьПланирование процессорного времени, нет сбалансированного распределения времени.неупреждающийиз

Также учтите, что наше приложениеинтенсивный ввод-вывод или интенсивный процессориз.

  • Если это интенсивный ввод-вывод, может быть больше потоков.
  • Если он интенсивно использует ЦП, потоков не должно быть слишком много.

Использованная литература:

2. Компьютерная сеть

2.1 MAC-адрес уже уникален, зачем вам IP-адрес?

Или вы можете спросить наоборот: зачем вам MAC-адрес, если у вас уже есть IP-адрес? ? Подобных вопросов на Zhihu довольно много:

Позвольте мне кратко резюмировать, зачем нужен IP(MAC) при наличии MAC(IP):

  • MAC — это канальный уровень, IP — сетевой уровень,Каждый слой делает каждый слой вещей, причина, по которой сеть разделена на канальный уровень, сетевой уровень (..., заключается в упрощении проблемы.
  • Исторические проблемы совместимости.

У меня уже есть IP-адрес, зачем мне MAC-адрес? ?

  • Причины на данном этапе:DHCP назначает IP на основе MAC-адреса.

MAC-адреса уже уникальны, зачем вам IP-адреса?

  • MAC не имеет концепции сетевого сегмента, не кластеризуется и сложен в управлении..

Если у вас есть идея получше, оставьте сообщение в разделе комментариев~

Использованная литература:

  • Является ли MAC-адрес уникальным и не может удовлетворить потребности связи? Зачем нужен ИП?woohoo.wukong.com/answer/6549…
  • Зачем использовать MAC-адрес, если у вас есть IP-адрес?Ууху. Call.com/question/21…

2.2 Состояние TCP

Расскажите о каждом состоянии TCP, расскажите о состоянии TIME-WAIT

TCP имеет в общей сложности 11 состояний, и переходы между состояниями следующие:

блок-схема:

Ниже я кратко суммирую каждое состояние:

  • CLOSED: исходное состояние, указывающее, что TCP-соединение «закрыто» или «не открыто».
  • LISTEN: Указывает, что SOCKET на стороне сервера находится в состоянии прослушивания и может принимать соединения от клиентов.
  • SYN-SENT: указывает клиентаSYN-сообщение отправлено. Когда клиент SOCKET выполняет connect() для подключения, он сначала отправляет сообщение SYN, а затем сразу переходит в состояние SYN_SENT.
  • SYN_RCVD: указывает, что сервер подключенПолучено SYN-сообщение от клиента, запрашивающего соединение. Когда TCP-соединение находится в этом состоянии,Получите сообщение ACK от клиента еще раз, он войдет вУСТАНОВЛЕН статус.
  • ESTABLISHED: указывает TCPСоединение успешно установлено.
  • FIN-WAIT-1:Первый активный запрос на закрытие соединения, дождитесь ответа ACK другой стороны.
  • CLOSE_WAIT: другая сторона отправляет сообщение FIN себе и отвечает сообщением ACK другой стороне. В этот момент он входит в состояние CLOSE_WAIT.
    • Далее необходимо проверитьУ вас все еще есть данные для отправки другой стороне?, если нет, то можно иclose()Этот SOCKET отправляет сообщение FIN другой стороне, то есть закрывает соединение между собой и другой стороной в этом направлении.
  • FIN-WAIT-2: Активный конец концаПосле получения ACK, и ввел FIN-WAIT-2. В этом состоянии приложение по-прежнему может получать данные, но не может отправлять данные.
  • LAST_ACK: Когда пассивно закрытая сторона находится вПосле отправки сообщения FIN дождитесь сообщения ACK другой стороны.находится в состоянии LAST_ACK
  • CLOSED: после получения сообщения ACK от другой стороны он может перейти в состояние ЗАКРЫТО.
  • TIME_WAIT: Указывает, что получено сообщение FIN от другой стороны и отправлено сообщение ACK. TCP-соединения в состоянии TIME_WAIT будут ожидать2*MSL
  • CLOSING: Редкое состояние. означает, что обаЗакрытие SOCKET-соединения

Состояние TIME_WAIT обычно используется для решения следующих двух проблем:

  • При закрытии TCP-соединения убедитесь, что последний ACK передается нормально (или может рассматриваться как:дождитесь повторной передачи ACK)
  • В сети могут быть остаточные пакеты, чтобы иметь возможность нормально обрабатывать эти остаточные пакеты. Использование состояния TIME-WAIT можетудостоверитьсясуществуетПри создании нового подключения, в предыдущей сетиВсе остальные данные потеряны.

Как решить слишком много TIME_WAIT?

если вВысокий параллелизм и несколько коротких ссылок, TIME_WAIT будет слишком много.

Это можно решить, настроив параметры ядра:vi /etc/sysctl.confДобавьте следующие настройки содержимого:

  • повторное использование указывает, разрешать ли повторное применение сокетов в состоянии TIME-WAIT для новых соединений TCP;
  • recyse — ускорить перезапуск сокетов TIME-WAIT

Мы можем знать, что состояние TIME_WAITОтображается сторона, которая активно закрыла соединениеДа, давайте не будем легкомысленно использовать два вышеуказанных параметра. Посмотрим, возможно ли этоПовторное использование TCP-соединенийЧтобы попытаться избежать этой проблемы (например, нашего HTTP KeepAlive) ~

Использованная литература:

2.3 Скользящее окно TCP

TCP — надежный транспортный протокол, требующийГарантия того, что все пакеты могут быть достигнуты, для поддержки которого требуется механизм повторной передачи.

Существуют следующие механизмы ретрансляции:

  • тайм-аут повторной передачи
  • быстрая ретрансляция
  • SACK-метод

Можно сказать, что скользящее окно является очень важным элементом знаний о TCP. Скользящее окно TCP выполняет две основные функции:

  • Предоставляет TCPнадежность
  • Предоставляет TCPХарактеристики контроля жидкости

Принципиальная схема простого раздвижного окна:

Подробная схема раздвижного окна:

  • #1 получил данные, подтвержденные ack.
  • #2 еще не получил подтверждение.
  • № 3 не был отправлен в окне (еще есть место для получателя).
  • #4 Данные за окном (в приемнике нет места)

Иллюстрация получателя, управляющего отправителем:

2.4 Контроль перегрузки

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

Существует четыре основных алгоритма управления перегрузкой:

  • 1) медленный старт,
  • 2) предотвращение заторов,
  • 3) возникают заторы,
  • 4) Быстрое восстановление

Роль контроля заторов:

Решение о перегрузке:

  • Таймер повторной передачи истек
  • Получено три идентичных (дубликата) ACK

Настоятельно рекомендуется к прочтению:

Использованная литература:

3. Операционная система

3.1 Что такое процесс-зомби и процесс-сирота (разница)

В среде unix/linux

Процесс зомби:

  • Родительский процесс создает дочерний процесс, дочерний процесс завершается, а родительский процесс не вызываетwaitилиwaitIdПолучить информацию (статус) дочернего процесса,Дескриптор дочернего процесса все еще находится в системе.

Сиротский процесс:

  • Родительский процесс завершается, а дочерний процесс продолжает работать. Эти дочерние процессы называются процессами-сиротами, и процесс-сирота будетпроцесс инициализации(номер процесса 1)принятие, а процесс init завершает для них работу по сбору состояний

Опасность зомби-процесса:

  • Таблица системных процессов является ограниченным ресурсом.Если таблица системных процессов исчерпана процессами-зомби, система можетНевозможно создать новый процесс.
  • Родительский процесс создает множество дочерних процессов, то есть, если его не перезапустить, это вызоветтрата ресурсов памяти.

Средства для решения процесса зомби:

  • Убейте родительский процесс, оставшийся процесс-зомби станет осиротевшим процессом и, наконец, будет управляться процессом инициализации.
  • Когда дочерний процесс завершается, родительскому процессу посылается сигнал SIGCHILD, а родительский процесс обрабатывает сигнал SIGCHILD. существуетОжидание вызова в обработчике сигнала для обработки зомби-процесса
  • Разветвление дважды: принцип состоит в том, чтобы сделать дочерний процесс осиротевшим процессом, чтобы его родительский процесс стал процессом инициализации, а процесс-зомби мог обрабатываться через процесс инициализации.

Использованная литература:

3.2 Какие существуют режимы межпроцессного взаимодействия в операционной системе?

Первое, что нужно знать: процессы и потокиточка фокусировкиразные:

  • Межпроцессные ресурсы независимы, основное внимание уделяетсякоммуникацияпроблема.
  • Ресурсы распределяются между потоками, основное внимание уделяетсяБезопасностьпроблема.

Каковы способы взаимодействия между процессами операционной системы?

  • Трубка: Трубка – этополудуплексданные могут передаваться только в одном направлении и могут использоваться только между связанными процессами. Сходство процессов обычно относится кродительско-дочерний процесссвязь.
  • Именованный канал: Именованный канал также является полудуплексным методом связи, ноРазрешено несвязанноеСвязь между процессами.
  • Очередь сообщений: Очередь сообщений — это связанный список сообщений, хранящийся в ядре и идентифицируемый индикатором очереди сообщений. очередь сообщенийПреодоление передачи сигнала меньшего количества информации, каналы могут передавать только неформатированные потоки байтов, а размер буфера ограничен.
  • Общая память (общая память): Общая память предназначена для отображения раздела памяти, к которому обращаются другие процессы.Общая память создается одним процессом, но к ней могут обращаться несколько процессов. Общая память — это самый быстрый IPC, этоОн специально разработан для неэффективной работы других методов связи процесса.. Он часто взаимодействует с другими механизмами. Например, семафоры, используемые вместе для достижения синхронизации и связи между процессами.
  • Сокет (сокет): Сокет также является механизмом связи между процессами.В отличие от других механизмов связи, его можно использовать длямежду разными машинамипроцесс коммуникации.
  • Сигнал (сигнал): Сигнал — это относительно сложный метод связи, используемый дляУведомлениеКогда-то происходил процесс принятия.
  • Семафор: семафор – этоприлавок, который можно использовать для управления доступом к общим ресурсам несколькими процессами.
    • он часто используется в качествезамок механизм, чтобы предотвратить доступ других процессов к общему ресурсу, когда процесс обращается к ресурсу. Поэтому он в основном используется между разными процессами или одним и тем же процессом.Средства синхронизации между разными потоками.

3.3 Каковы способы взаимодействия между потоками операционной системы?

Каковы способы связи между потоками операционной системы? (Напрямую можно понимать как: между нитямиспособ синхронизацииЧто)

  • Механизм блокировки: включая мьютекс, условную переменную, блокировку чтения-записи.
  • Семафор: включая семафор безымянного потока и семафор именованного потока
  • Сигнальный механизм (Signal): аналогичен обработке сигналов между процессами.

Цель связи между потокамиВ основном используется для синхронизации потоков.

Использованная литература:

Дальнейшее чтение:

3.4 Каковы алгоритмы планирования процессов операционной системы?

Каковы алгоритмы планирования процессов операционной системы?

  • Алгоритм «первым пришел — первым обслужен» (FCFS)
    • Кто придет первым, тот и казнит первым
  • Алгоритм Short Process/Job First (SJF)
    • Кто потратит меньше времени, тот и выполнит первым
  • Первый алгоритм с наивысшим коэффициентом отклика (HRN)
    • Комплексный баланс FCFS и SJF
  • алгоритм номера с наивысшим приоритетом
    • Система назначает процессор в очередь готовностинаивысший приоритетпроцесс
  • Алгоритм циклического планирования на основе интервала времени
    • Время обработки ЦП, используемое каждым процессом, постоянно
  • Первый алгоритм с наименьшим оставшимся временем
    • Усовершенствованная версия первого алгоритма короткого задания, за исключением того, чтопревентивныйиз
  • Многоуровневый алгоритм организации очереди с обратной связью
    • Настройте несколько готовых очередей и назначьте им разные приоритеты, например постепенное уменьшение, очередь 1 имеет наивысший приоритет

Справочные примечания:

4. Расширенное чтение

Эта часть предназначена для того, чтобы увидеть, что сообщения в блогах других людей были написаны хорошо, поделиться с вами~

4.1 Нужно ли расширение в ConcurrentHashMap для блокировки всей таблицы?

Требует ли расширение ConcurrentHashMap блокировки всей таблицы?

Резюме (выдержка) пунктов:

  • ДаваяКаждый поток выделяет интервалы ведра(По умолчанию поток выделяет 16 сегментов), чтобы избежать конфликтов между потоками.
  • будучиЗаблокируйте каждый узел корзины, чтобы избежать несогласованности данных, вызванной методом putVal.
  • В то же время при расширении он такжеРазделить связанный список на два, который похож на метод изменения размера HashMap.

Использованная литература:

4.2 Что такое последовательный алгоритм хеширования (принцип)?

Что такое последовательный алгоритм хеширования (принцип)?

Резюме (выдержка) пунктов:

  • Алгоритм согласованного хеширования организует все пространство хэш-значений ввиртуальное кольцо, преимущество заключается в улучшенииОтказоустойчивость и масштабируемость.
    • Для увеличения и уменьшения узловПросто переместите небольшую часть данных в кольцевом пространстве.

Использованная литература:

4.3 Различия между типами даты, даты и времени в MySQL

Разница между типами даты, даты и времени в MySQL

Резюме (выдержка) пунктов:

  • дата с точностью до дней, дата и время с точностью до секунд
  • Разница между датой и временем:
    • временная метка будетследовать установленному часовому поясуизменяется, а datetime сохраняет абсолютное значение, которое не изменится
    • хранилище временных меток занимает 4 байта, хранилище даты и времени занимает 8 байтов
    • Диапазон времени, который может быть представлен, отличается. Отметка времени может быть представлена ​​только до 2038, а дата и время может быть представлена ​​до 9999.

Использованная литература:

4.4 Определить, есть ли в связном списке цикл/пересечение

Определите, имеет ли связанный список цикл (на самом деле просто посмотрите наСледует ли переходить к дублирующимся узлам), раствор (3 вида):

  1. для итераций дважды
  2. Используйте hashSet в качестве кеша для записи пройденных узлов.
  3. Использование двух указателей, перемещающихся один за другим, всегда будет появляться前指针==后指针Случай

Использованная литература:

  • Комический алгоритм: как определить, есть ли цикл в связном списке?blog.jobbole.com/106227/

судитьПересекаются ли два ациклических связанных списка?, раствор (2 вида):

  • Наведите следующий указатель в конце первого связанного списка на второй связанный список, и два связанных списка образуют связанный список.
    • Определить, есть ли в этом связном списке цикл, если цикл есть, то он пересекается, а если цикла нет, то не пересекается
  • Непосредственно судить, равны ли хвостовые узлы двух связанных списков, если они равны, они пересекаются, иначе они не пересекаются

судитьдва связанных спискаСледует ли пересекаться (Примечание: если в связанном списке есть цикл, а в связанном списке нет цикла, два связанных списка не должны пересекаться):

  • Найдите точку кольца первого связанного списка, затем отключите кольцо (не забудьте, конечно, сохранить его следующий узел), а затем пройдитесь по второму связанному списку, если вы обнаружите, что второй связанный список изменился с кольца на кольцо, То они вкраплены, иначе они не вкраплены.

Использованная литература:

4.5 Значение KeepAlive

  • Цель Keep-Alive протокола HTTP состоит в том, чтобымультиплексирование соединения, последовательно передавая данные запроса-ответа по одному и тому же соединению
  • Механизм TCP KeepAlive предназначен дляПоддерживать активность, сердцебиение, обнаруживать ошибки подключения

Использованная литература:

Наконец

Если у вас есть лучший способ понять или в статье есть ошибки, пожалуйста, не стесняйтесь оставлять сообщение в области комментариев, чтобы мы могли учиться друг у друга~~~

Если вы хотите увидеть большеоригинальныйТехнические статьи, приглашаю всех обратить на меня вниманиеПубличный аккаунт WeChat: Java3y. Также есть публичные аккаунтыОгромные видеоресурсыО, следуйте, чтобы получить его бесплатно.

Ссылки, которые могут быть интересны: