2020-Байт-Фронтенд-Интервью

1. Сначала расскажите о некоторых языках, которые вы знаете, в основном о серверной части.

2. Вы понимаете междоменный доступ?

Домен: состав URL-адреса веб-сайта включает имя протокола, имя поддомена, имя основного домена и номер порта. Например, https://www.github.com/80 . Где https - это имя протокола, www.github.com - это имя поддомена, github.com - это имя основного домена, а номер порта - 80. При запросе данных с URL-адреса на странице, если имя протокола URL-адреса, имя поддомена, основной Если одно из доменного имени и номера порта отличается, возникнут междоменные проблемы. Даже если вы  запросите http://127.0.0.1:80/ на  странице http: // localhost: 80 / возникнут междоменные проблемы (потому что имена доменов разные). Все домены здесь относятся к набору протокола \ имени домена \ номера порта, и один и тот же домен означает, что имя домена протокола и номер порта совпадают.

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

Стратегия же, Происхождение: В процессе разработки фронтального, общие HTML - теги, такие как <a/>,<form/>,<img/>,<script/>,<iframe/>и ajaxоперации могут указывать на адрес ресурса или инициировать запрос ресурса, то запросы , упомянутые здесь , включают в себя запросы в тот же домен и кросс-доменных запросов. Стратегия одного и того же происхождения - это основная базовая стратегия безопасности браузера, которая используется для защиты от незаконных атак.Однако мы не можем заблокировать все междоменные проблемы только потому, что хотим защитить себя от незаконных атак.

Междоменный запрос: когда домен запроса несовместим с доменом, на который указывает запрошенный ресурс.

  • В интерфейсной разработке часто используются сторонние сервисные интерфейсы (например, фиктивный сервер, поддельный API). С появлением специализированного разделения труда появилось множество профессиональных поставщиков информационных услуг, которые предоставляют различные интерфейсы для интерфейсных разработчиков. В этом случае требуются междоменные запросы (большинство из них решаются кроссом)
  • Интерфейс и серверная часть принадлежат разным сервисам. Когда используется архитектура разделения внешнего и внутреннего интерфейса, возникают междоменные проблемы (большинство из них решаются методами обратного прокси)

Решение:

  • Самый простой и распространенный: используйте jsonp, то есть json с заполнением, которое, как следует из названия, должно заполнить JSON в поле.
  • Раз и навсегда: напрямую настройте доступ к ресурсам между разными источниками CORS (Cross-Origin Resource Sharing) на стороне сервера, установите Access-Control-Allow-Origin в заголовке запроса, чтобы указать имя домена, которое может получать данные
  • Просто и эффективно: запросите изображение напрямую
  • Найдите «Папу»: перекрестите поддомены, изменив document.domain
  • Хорошие братья: получайте данные между доменами через window.name
  • Эпоха неолита: междоменное использование метода HTML5 window.postMessage

3. Расскажите о механизме кеширования http?

Веб-кеш: его можно условно разделить на: кеш базы данных, кеш на стороне сервера (кеш прокси-сервера, кеш CDN), кеш браузера. Кеш браузера содержит много контента: HTTP-кеш, indexDB, файлы cookie, localstorage и т. Д.

Сообщение HTTP: блок данных, который отправляется и отвечает, когда браузер и сервер обмениваются данными. 
Браузер запрашивает данные с сервера и отправляет сообщение запроса (запроса); сервер возвращает данные браузеру и возвращает сообщение ответа (ответа). 
Информация в сообщении в основном разделена на две части. 

  1. Заголовок, который содержит атрибуты ————————– Дополнительная информация (файлы cookie, информация кеша и т. Д.) И информация о правилах, связанных с кешем, включаются в заголовок. 
  2. Содержит тело данных ——————— Часть HTTP-запроса, которая действительно хочет быть передана

Свойства в заголовках ответа:

  • Etag (более высокий приоритет, чем Last-Modified / If-Modified-Since): когда сервер отвечает на запрос, он сообщает браузеру уникальный идентификатор текущего ресурса на сервере (правило генерации определяется сервером).
  • Last-Modified: когда сервер отвечает на запрос, он сообщает браузеру время последней модификации ресурса.
  • If-Modified-Since: при повторном запросе сервера используйте это поле, чтобы уведомить сервер о времени последней модификации ресурса, возвращенного сервером во время последнего запроса. После того, как сервер получает запрос, он находит заголовок If-Modified-Since и сравнивает его с временем последней модификации запрошенного ресурса. Если время последней модификации ресурса больше, чем If-Modified-Since, что указывает на то, что ресурс был изменен, он ответит на все содержимое ресурса и вернет код состояния 200; если время последнего изменения ресурса меньше или равно If-Modified-Since, ресурс не имеет Новая модификация будет отвечать на HTTP 304, сообщая браузеру продолжать использовать сохраненный кеш.
  • If-None-Match: при повторном запросе сервера используйте это поле для уведомления сервера об уникальном идентификаторе данных, кэшированных клиентским сегментом. После того, как сервер получит запрос, если он найдет заголовок If-None-Match, он будет сравнен с уникальным идентификатором запрошенного ресурса. Если он отличается, что указывает на то, что ресурс был изменен, он ответит на все содержимое ресурса и вернет код состояния 200; то же самое, с указанием ресурса Если новых изменений нет, он отвечает HTTP 304, чтобы проинформировать браузер о продолжении использования сохраненного кеша.
  • Истекает: это HTTP 1.0. Теперь браузеры по умолчанию используют HTTP 1.1 по умолчанию, поэтому его функция в основном игнорируется. 
  • Cache-Control: то же самое, что и Expires. Он определяет срок действия текущего ресурса и определяет, будет ли браузер напрямую извлекать данные из кеша браузера или повторно отправлять запрос на сервер для извлечения данных. Просто у Cache-Control больше вариантов выбора и более детальных настроек, если выставить одновременно, то его приоритет выше, чем Expires. Всего существует шесть значений:
Кэш-контроль Это самое главное правило. Общие значения: private, public, no-cache, max-age, no-store, а по умолчанию - private.
частный Клиент может кэшировать
общественный И клиент, и прокси-сервер могут быть кэшированы (студенты-интерфейсы могут думать, что публичный и частный - это одно и то же)
макс-возраст = xxx Срок хранения кэшированного содержимого истекает через xxx секунд.
без кеша Необходимо использовать контрастный кеш для проверки кэшированных данных (описано ниже)
нет магазина:           Весь контент не будет кэшироваться, принудительное кеширование и кеширование контраста не будут запускаться (для интерфейсной разработки чем больше кеша, тем лучше, поэтому ... в основном скажите ему 886)   

Обязательное кеширование: сервер информирует браузер о времени кэширования. Во время кэширования следующий запрос будет использовать кеш напрямую, и стратегия кэширования сравнения будет выполнена, если время кэширования истекло.  Сравните кеш: отправьте информацию о Etag и Last-Modified в кеше на сервер через запрос, и сервер проверит это.Когда возвращается код состояния 304, браузер напрямую использует кеш.

4. Представить некоторые модели ввода-вывода?

Блокирующий ввод-вывод, неблокирующий ввод-вывод, мультиплексированный ввод-вывод, ввод-вывод, управляемый сигналом, и асинхронный ввод-вывод.

  1. Блокирующий ввод-вывод: наиболее традиционная модель ввода-вывода, то есть блокирование происходит в процессе чтения и записи данных. После того, как пользовательский поток выдает запрос ввода-вывода, ядро ​​операционной системы проверяет, готовы ли данные, если они не готовы, оно будет ждать, пока данные будут готовы, и пользовательский поток будет в заблокированном состоянии, а пользовательский поток передаст ЦП. Когда данные готовы, ядро ​​копирует данные в пользовательский поток и возвращает результат в пользовательский поток, а пользовательский поток освобождает состояние блока.
  2. Неблокирующий ввод-вывод: когда пользовательский поток инициирует операцию чтения, ему не нужно ждать, но он получает результат немедленно. Если результатом является ошибка, он знает, что данные не готовы, поэтому он может снова отправить операцию чтения. Когда данные в ядре готовы и оно снова получает запрос от пользовательского потока, оно немедленно копирует данные в пользовательский поток и возвращается. Фактически, в модели неблокирующего ввода-вывода пользовательский поток должен постоянно спрашивать, готовы ли данные ядра, то есть неблокирующий ввод-вывод не передает ЦП, но всегда будет занимать ЦП. Но для неблокирующего ввода-вывода существует очень серьезная проблема. В цикле while необходимо постоянно проверять , готовы ли данные ядра, что приведет к очень высокой загрузке ЦП. Поэтому цикл while обычно используется редко. Прочтите данные.
    //伪代码
    while(true){
    new MyThread(socket)
    }
    class MyThread{
    data = socket.read();
    if(data!= error){
    //处理数据
    break;
    }
    
  3. Мультиплексированный ввод-вывод: модель мультиплексированного ввода-вывода в настоящее время является наиболее используемой моделью. В модели мультиплексированного ввода-вывода будет поток, который непрерывно опрашивает состояние нескольких сокетов, и только когда сокет действительно имеет события чтения и записи, фактически вызываются фактические операции чтения и записи ввода-вывода. Поскольку в модели мультиплексированного ввода-вывода только один поток может использоваться для управления несколькими сокетами.Системе не нужно создавать новые процессы или потоки, а также не нужно поддерживать эти потоки и процессы, и только при наличии событий чтения и записи сокета. Ресурсы ввода-вывода будут использоваться только тогда, когда придет время, поэтому это значительно сокращает использование ресурсов. В Java NIO selector.select () используется для запроса, есть ли на каждом канале событие прибытия. Если события нет, оно всегда будет там заблокировано. Следовательно, этот метод вызовет блокировку пользовательского потока. Может быть, некоторые друзья скажут, что я могу использовать многопоточность + блокирующий ввод-вывод для достижения аналогичных эффектов, но поскольку в многопоточности + блокирующем вводе-выводе каждый сокет соответствует потоку, что вызовет большое использование ресурсов, и особенно надолго. Что касается подключений, ресурсы потоков никогда не будут освобождены. Если в дальнейшем будет установлено много подключений, это приведет к снижению производительности. В режиме мультиплексированного ввода-вывода несколькими сокетами можно управлять через один поток, и только когда сокет действительно имеет событие чтения и записи, ему потребуются ресурсы для выполнения фактических операций чтения и записи. Поэтому мультиплексированный ввод-вывод больше подходит для ситуаций с большим количеством подключений. Кроме того, почему мультиплексированный ввод-вывод более эффективен, чем модель неблокирующего ввода-вывода, заключается в том, что при неблокирующем вводе-выводе статус сокета постоянно запрашивается через поток пользователя, тогда как при мультиплексном вводе-выводе опрашивается каждый сокет. Состояние выполняется ядром, и эта эффективность намного выше, чем у пользовательских потоков. Однако следует отметить, что модель мультиплексированного ввода-вывода использует опрос для определения того, прибывает ли событие, и отвечает на прибывающие события одно за другим. Следовательно, для модели мультиплексированного ввода-вывода, когда тело ответа на событие велико, последующие события не будут обрабатываться с опозданием и повлияют на опрос нового события.
  4. Управляемый сигналом ввод-вывод: когда пользовательский поток инициирует операцию запроса ввода-вывода, он зарегистрирует функцию сигнала для соответствующего сокета, а затем пользовательский поток продолжит выполнение.Когда данные ядра будут готовы, сигнал будет отправлен в пользовательский поток. После того, как пользовательский поток получит сигнал, Вызовите операции чтения и записи ввода-вывода в функции сигнала, чтобы выполнить фактическую операцию запроса ввода-вывода.
  5. Асинхронный ввод-вывод: это наиболее идеальная модель ввода-вывода. В асинхронной модели ввода-вывода, когда пользовательский поток инициирует операцию чтения, он может немедленно начать делать другие вещи. С другой стороны, с точки зрения ядра, когда оно получает асинхронное чтение, оно немедленно возвращается, указывая на то, что запрос чтения был успешно инициирован, поэтому для пользовательского потока не будет сгенерировано никаких блоков. Затем ядро ​​будет ждать завершения подготовки данных, а затем скопировать данные в пользовательский поток.Когда все это будет сделано, ядро ​​отправит сигнал пользовательскому потоку, чтобы сообщить ему, что операция чтения завершена. Другими словами, пользовательскому потоку не нужно, как выполняется фактическая вся операция ввода-вывода. Ему нужно только сначала инициировать запрос. Когда получен сигнал успеха, возвращенный ядром, операция ввода-вывода завершена, и данные можно использовать напрямую. Другими словами, в модели асинхронного ввода-вывода две фазы операции ввода-вывода не будут блокировать пользовательский поток.Обе фазы автоматически завершаются ядром, а затем отправляется сигнал, информирующий пользовательский поток о том, что операция завершена. Нет необходимости снова вызывать функцию ввода-вывода для определенного чтения и записи в пользовательском потоке. Этот момент отличается от модели, управляемой сигналом. В модели, управляемой сигналом, когда пользовательский поток получает сигнал, это указывает, что данные готовы, а затем пользовательскому потоку необходимо вызвать функцию ввода-вывода для фактических операций чтения и записи; в то время как в модели асинхронного ввода-вывода, Сигнал указывает, что операция ввода-вывода завершена, и нет необходимости вызывать функцию ввода-вывода в пользовательском потоке для фактических операций чтения и записи. Обратите внимание, что асинхронный ввод-вывод требует базовой поддержки операционной системы, потому что, будь то мультиплексированный ввод-вывод или управляемая сигналом модель, второй этап операции ввода-вывода приведет к блокировке пользовательского потока, то есть процесс копирования данных ядром позволит пользовательскому потоку блок.

5. Знаете модель узла?

Node.js использует управляемый событиями и асинхронный ввод-вывод для реализации однопоточной среды выполнения JavaScript с высоким уровнем параллелизма.

6. Знаете mysql? Знаете sql index? В базе данных большой объем данных, как быстро искать.

Причины низкой эффективности запросов:

1: нет индекса или сбоя индекса

Условие where использует следующий оператор, чтобы сделать индекс недействительным: null ,! =, <> или соединение, в (необходимо использовать, может быть заменено ключевым словом exists), а не в, '% abc%';

Используйте параметры: num = @ num, операция выражения: где num / 2 = 100, операция функции: где substring (name, 1, 3) = 'abc'-name;

2: объем запрошенных данных слишком велик, возвращаются ненужные строки и столбцы

Запрашивать только полезные поля, не использовать * для запроса всех полей. Замените «*» конкретным списком полей и не возвращайте никакие поля, которые не используются.

Используйте несколько потоков для нескольких запросов. Если условие запроса - это условие диапазона, например определенный период времени, вы можете разделить временное условие и объединить несколько результатов запроса.

3. Блокировка или тупик

4: пропускная способность ввода-вывода мала, что создает эффект узкого места.

5: Недостаточно памяти.

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

Своевременно очищайте память jvm.

6: скорость сети низкая. 

Метод оптимизации SQL

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

2: Индексов не так много. Индекс таблицы лучше не превышать 6. Хотя индекс может повысить эффективность выбора, он также снижает эффективность вставки и обновления, поскольку вставка и обновление будут перестраивать индекс, поэтому необходимо тщательно продумать, как построить индекс.

3: Некоторые оптимизации построения таблиц:

Старайтесь как можно больше использовать числовые поля. Если данные содержат только числовую информацию, постарайтесь не создавать их как символьные. Это снизит производительность запросов и подключений и увеличит накладные расходы на хранилище. Поскольку механизм сравнивает каждый символ в строке один за другим при обработке запросов и соединений, а для числовых типов достаточно только одного сравнения.
Попробуйте использовать varchar / nvarchar вместо char / nchar, потому что пространство для хранения полей переменной длины невелико, что может сэкономить место. Во-вторых, для запросов эффективность поиска в относительно небольшом поле очевидно выше.
4: Старайтесь избегать использования курсора, потому что его эффективность низкая.Если данные, обрабатываемые курсором, превышают 10 000 строк, вам следует подумать о перезаписи. (Курсор - очень старая функция, почти устаревшая.)

5. Не все индексы эффективны для запросов. SQL оптимизирован для запросов на основе данных в таблице. Когда в столбце индекса повторяется большой объем данных, запрос SQL может не использовать индекс. Например, есть поля "пол", "мужской" и Женщины составляют почти половину, поэтому даже если индекс построен на основе пола, он не будет играть роли в эффективности запроса.

6. Старайтесь избегать крупных транзакционных операций и улучшайте параллелизм системы.

Меры предосторожности:

1: при использовании лайков не забудьте пустить

... где имя типа '%'. имя переменной. '%'; (значение переменной передается извне)

Если: переменная пуста, она становится следующим sql

... где имя вроде '%%'; - Следствием этого условия является «выбрать все данные или обновить все данные или удалить все данные», что эквивалентно отсутствию условия записи, что является серьезной проблемой после его возникновения.

2: Как с подстановочными знаками: использование% и _

Классификация
подстановочных знаков: %% подстановочный знак: указывает, что любой символ встречается любое количество раз ** (может быть 0) **.
Подстановочный знак _Underscore: он может соответствовать только одному символу, не более или не менее, только одному символу.

Оператор Like:
функция LIKE состоит в том, чтобы указать, что шаблон поиска, лежащий в основе mysql, должен использовать подстановочные знаки вместо прямого равного сопоставления для сравнения.
Примечание: если вы используете оператор like, эффект последнего без использования общего оператора сопоставления согласуется с =, SELECT * FROM products WHERE products.prod_name как '1000'; Единственный результат совпадения - 1000, но он не может совпадать с результатом, таким как JetPack 1000.

1) Использование подстановочного знака%:
сопоставить записи, начинающиеся с «yves»: (включая запись «yves»)
SELECT * FROM products WHERE products.prod_name like'yves% ';

Соответствующие записи, содержащие «yves» (включая запись «yves»)
SELECT * FROM products WHERE products.prod_name, например, '% yves%';

Сопоставьте записи, оканчивающиеся на «yves» (включая запись «yves», исключая запись «yves», то есть записи с пробелами после yves, которые здесь требуют внимания)
SELECT * FROM products WHERE products.prod_name, например, «% yves»;

2) Использование подстановочных знаков:
SELECT * FROM products WHERE products.prod_name like'_yves '; Результат
сопоставления: запись типа «yyves».

SELECT * FROM products WHERE products.prod_name like'yves__ '; Результат
сопоставления: записи типа «yvesHe». (Подчеркивание может соответствовать только одному символу, не больше и не меньше)

Прочие операции:

 вставить в tb (...) значения (...), (...) ...; лучше, чем вставить в tb (...) значения (...); вставить в tb (...) значения (...); ... Метод пакетной вставки очень эффективен [причина]: Основная причина высокой эффективности второго выполнения SQL здесь - это уменьшение объема журнала после слияния (транзакции MySQL binlog и innodb делают журнал), уменьшая журнал Объем и частота очистки данных, что повышает эффективность. Объединяя операторы SQL, можно также сократить количество операций синтаксического анализа операторов SQL и уменьшить количество операций ввода-вывода при передаче по сети.

7. Вы разбираетесь в процессах и потоках? Какая основная единица обработки ЦП?

Процесс - это основная единица распределения ресурсов операционной системы, а поток - это основная единица планирования и выполнения задач. Процесс - это контейнер потоков

8. Расскажите об алгоритме обработки CPU?

9. Что такое тупик процесса?

Определение тупика: тупик - это явление, когда несколько процессов в наборе процессов ждут друг друга из-за конкуренции за ресурсы. Например: A и B едят пельмени, A - соевый соус, B - уксус, A - уксус, а B - соевый соус. В результате они оба ждут, чтобы съесть пельмени.

Причины тупика: недостаточные системные ресурсы; необоснованная последовательность продвижения нескольких процессов; неправильное распределение ресурсов

Необходимые условия для тупика:

(1) Взаимное исключение: ресурсы не могут быть общими и могут использоваться только одним процессом.

(2) Условия запроса и удержания (удержание и ожидание): процессы, которые уже получили ресурсы, могут снова подать заявку на новые ресурсы.

(3) Отсутствие преимущественного права: выделенные ресурсы не могут быть принудительно лишены соответствующего процесса.

(4) Условие циклического ожидания (циклическое ожидание): несколько процессов в системе образуют цикл, и каждый процесс в цикле ожидает, пока ресурсы будут заняты смежными процессами.

Есть четыре способа справиться с тупиком: 1) Предотвратить тупик 2) Избежать тупика 3) Обнаружить и удалить тупик.

Предотвратить тупик: уничтожить одно из четырех необходимых условий

① Разрушение условий взаимного исключения: разрешить совместное использование ресурсов.Например, технология SPOOLing позволяет нескольким процессам одновременно генерировать данные для печати.

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

② Запрос на уничтожение и условия удержания: ресурсы выделяются сразу.

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

③Небольшое неотъемлемое условие: существует два метода: один - отказаться от ресурсов, изначально занятых, когда запрошенные ресурсы не удовлетворены; другой метод применим только к процессу подачи заявки на ресурсы с более высоким приоритетом. Когда приоритет процесса ресурса высокий, если ресурс, запрошенный процессом, занят другими процессами, а приоритет процесса приложения выше, то это может заставить процесс, занимающий ресурс, отказаться. Этот метод обычно применим к процессорам и ресурсам хранения.

④Условия ожидания цикла уничтожения: система присваивает номер каждому типу ресурса, и каждый процесс запрашивает ресурс в порядке возрастания числа, а освобождение происходит наоборот (например, проблема с едой философа)

Есть два способа избежать тупика: 1) ресурсы распределяются по порядку и 2) алгоритм Банкира.

Есть два способа удалить взаимоблокировку: 1) метод лишения ресурсов 2) метод отмены процесса 3) метод отката процесса

10. Дайте вам URL-адрес веб-сайта, запишите все URL-адреса в этом URL-адресе и все URL-адреса, перенаправленные через эти URL-адреса, которые не дублируются?

11. В чем разница между типом содержимого загрузки файла и нажатием кнопки? В чем разница между протоколом передачи http?

Тип содержимого:

Обычно относится к Content-Type, существующему на веб-странице, который используется для определения типа сетевого файла и кодировки веб-страницы, а также для определения формы и кодировки, которые браузер будет читать этот файл. Это результат частых нажатий на некоторые веб-страницы PHP. Это причина загрузки файла или изображения. Заголовок сообщает клиенту тип фактически возвращенного содержимого. Это поле заголовка объекта Http. Оно используется для описания метода кодирования запроса или тела возвращенного сообщения. Оно присутствует как в заголовке запроса, так и в заголовке ответа.

Общие типы:

text / (plain, css, html, xml) (text ,, css, html, xml) тип
application / (x-javascript, json, xml, octet-stream) (js, json, xml, данные двоичного потока) тип
image / png jpg gif изображение / *    

Загрузите файл Excel: .xls     application/vnd.ms-excel

12. Проблема алгоритма: выведите массив int {1, 2, 5, -7, 8, -10} такой, что непрерывный подмассив с наибольшей суммой

 

подводить итоги:

На этот раз подготовка - это в основном знания js. Я не ожидал, что байтовое интервью будет очень низкоуровневым, и не просматривал его. . . Я не освежал в памяти вопросы алгоритма, я занимался этим полчаса, но не мог. . . Это кажется гораздо более трудным, чем интервью Ant Financial некоторое время назад. . .

рекомендация

отblog.csdn.net/weixin_45440502/article/details/109586398