2020-Byte-Frontend-Interview

1. Stellen Sie zunächst einige Sprachen vor, die Sie kennen, hauptsächlich das Backend

2. Verstehen Sie domänenübergreifend?

Domäne: Die URL-Zusammensetzung einer Website umfasst den Protokollnamen, den Namen der Unterdomäne, den Hauptdomänennamen und die Portnummer. Zum Beispiel https://www.github.com/80 . Dabei ist https der Protokollname, www.github.com der Name der Unterdomäne, github.com der Name der Hauptdomäne und die Portnummer 80. Wenn Sie Daten von einer URL auf der Seite anfordern, geben Sie den Protokollnamen, den Namen der Unterdomäne und den Hauptnamen an Wenn einer der Domänennamen und die Portnummer unterschiedlich ist, treten domänenübergreifende Probleme auf. Selbst wenn Sie http://127.0.0.1:80/ auf der Seite  http: // localhost: 80 /  anfordern, treten   domänenübergreifende Probleme auf (da die Domainnamen unterschiedlich sind). Alle Domänen beziehen sich hier auf die Sammlung von Protokoll \ Domänenname \ Portnummer. Dieselbe Domäne bedeutet, dass der Protokolldomänenname und die Portnummer identisch sind

Das domänenübergreifende Problem besteht darin, dass Browser durch die Richtlinie mit demselben Ursprung eingeschränkt sind. Die js des aktuellen Domänennamens können nur Fenstereigenschaften unter derselben Domäne lesen. 

Strategie mit gleichem Ursprung: Im Front-End-Entwicklungsprozess können allgemeine HTML-Tags wie <a/>,<form/>,<img/>,<script/>,<iframe/>und ajaxOperationen auf eine Ressourcenadresse verweisen oder eine Anforderung für eine Ressource initiieren. Die hier genannten Anforderungen umfassen Anforderungen für dieselbe Domäne und domänenübergreifende Anforderungen. Die Strategie des gleichen Ursprungs ist die grundlegende Sicherheitsstrategie des Browsers, die zur Abwehr illegaler Angriffe verwendet wird. Wir können jedoch nicht alle domänenübergreifenden Probleme blockieren, nur weil wir uns gegen illegale Angriffe verteidigen möchten.

Domänenübergreifende Anforderung: Wenn die Anforderungsdomäne nicht mit der Domäne übereinstimmt, auf die die angeforderte Ressource verweist

  • In der Front-End-Entwicklung werden häufig Dienstschnittstellen von Drittanbietern (wie Mock-Server, gefälschte API) verwendet. Mit dem Aufkommen einer spezialisierten Arbeitsteilung gibt es viele professionelle Informationsdienstanbieter, die verschiedene Schnittstellen für Front-End-Entwickler bereitstellen. In diesem Fall sind domänenübergreifende Anforderungen erforderlich (die meisten werden von Cros gelöst).
  • Das Front-End und das Back-End gehören zu verschiedenen Diensten. Wenn die Front-End- und Back-End-Trennungsarchitektur übernommen wird, treten domänenübergreifende Probleme auf (die meisten werden durch Reverse-Proxy-Methoden gelöst).

Lösung:

  • Das einfachste und gebräuchlichste: Verwenden Sie jsonp, dh json mit Auffüllung, was, wie der Name schon sagt, darin besteht, JSON in ein Feld zu füllen
  • Ein für alle Mal: ​​Richten Sie den Cross-Origin-Ressourcenzugriff CORS (Cross-Origin Resource Sharing) direkt auf der Serverseite ein und setzen Sie Access-Control-Allow-Origin im Header Request Header, um den Domänennamen anzugeben, der Daten abrufen kann
  • Einfach und effektiv: Fordern Sie direkt ein Bild an
  • Suchen Sie nach "Dad": Überqueren Sie Subdomains, indem Sie document.domain ändern
  • Gute Brüder: Erhalten Sie domänenübergreifende Daten über window.name
  • Jungsteinzeit: Domänenübergreifend mit der window.postMessage-Methode von HTML5

3. Erzählen Sie mir von dem http-Caching-Mechanismus?

Web-Cache: Er kann grob unterteilt werden in: Datenbank-Cache, serverseitigen Cache (Proxyserver-Cache, CDN-Cache), Browser-Cache. Der Browser-Cache enthält viele Inhalte: HTTP-Cache, IndexDB, Cookies, Localstorage usw.

HTTP-Nachricht: Der Datenblock, der gesendet und beantwortet wurde, wenn der Browser und der Server kommunizieren. 
Der Browser fordert Daten vom Server an und sendet eine Anforderungsnachricht (Anforderungsnachricht), der Server gibt Daten an den Browser zurück und gibt eine Antwortnachricht (Antwortnachricht) zurück. 
Nachrichteninformationen sind hauptsächlich in zwei Teile unterteilt 

  1. Der Header, der die Attribute ————————– enthält. Zusätzliche Informationen (Cookies, Cache-Informationen usw.) und Cache-bezogene Regelinformationen sind alle im Header enthalten 
  2. Enthält den Datenkörper ——————— Der Teil der HTTP-Anforderung, der wirklich übertragen werden möchte

Eigenschaften in Antwortheadern:

  • Etag (höhere Priorität als Last-Modified / If-Modified-Since): Wenn der Server auf die Anforderung antwortet, teilt er dem Browser die eindeutige Kennung der aktuellen Ressource auf dem Server mit (die Generierungsregel wird vom Server festgelegt).
  • Zuletzt geändert: Wenn der Server auf die Anforderung antwortet, teilt er dem Browser die letzte Änderungszeit der Ressource mit.
  • If-Modified-Since: Wenn Sie den Server erneut anfordern, verwenden Sie dieses Feld, um den Server über die letzte Änderungszeit der vom Server während der letzten Anforderung zurückgegebenen Ressource zu informieren. Nach dem Empfang der Anforderung findet der Server den Header If-Modified-Since und vergleicht ihn mit der letzten Änderungszeit der angeforderten Ressource. Wenn die letzte Änderungszeit der Ressource größer als If-Modified-Since ist, was darauf hinweist, dass die Ressource geändert wurde, reagiert sie auf den gesamten Ressourceninhalt und gibt den Statuscode 200 zurück. Wenn die letzte Änderungszeit der Ressource kleiner oder gleich If-Modified-Since ist, hat die Ressource keine Neue Änderungen reagieren auf HTTP 304 und weisen den Browser an, den gespeicherten Cache weiterhin zu verwenden.
  • If-None-Match: Wenn Sie den Server erneut anfordern, verwenden Sie dieses Feld, um den Server über die eindeutige Kennung der vom Client-Segment zwischengespeicherten Daten zu informieren. Nachdem der Server die Anforderung erhalten hat und den Header If-None-Match gefunden hat, wird er mit der eindeutigen Kennung der angeforderten Ressource verglichen. Wenn er anders ist und angibt, dass die Ressource geändert wurde, antwortet er auf den gesamten Ressourceninhalt und gibt einen Statuscode von 200 zurück, der die Ressource angibt Wenn es keine neue Änderung gibt, antwortet es mit HTTP 304, um den Browser zu informieren, den gespeicherten Cache weiterhin zu verwenden.
  • Läuft ab: Es handelt sich um HTTP 1.0. Jetzt verwenden die Standardbrowser standardmäßig HTTP 1.1, sodass die Funktion grundsätzlich ignoriert wird. 
  • Cache-Steuerung: In Übereinstimmung mit Expires geben beide die Gültigkeitsdauer der aktuellen Ressource an und steuern, ob der Browser Daten direkt aus dem Browser-Cache abruft oder eine Anforderung zum Abrufen von Daten erneut an den Server sendet. Es ist nur so, dass Cache-Control mehr Auswahlmöglichkeiten und detailliertere Einstellungen hat. Wenn es gleichzeitig festgelegt wird, ist seine Priorität höher als Expires. Es gibt sechs Werte:
Cache-Kontrolle Ist die wichtigste Regel. Allgemeine Werte sind privat, öffentlich, kein Cache, maximales Alter, kein Speicher, und der Standardwert ist privat.
Privat Client kann zwischenspeichern
Öffentlichkeit Sowohl der Client als auch der Proxyserver können zwischengespeichert werden (die Front-End-Schüler können denken, dass öffentlich und privat gleich sind).
maximales Alter = xxx Der zwischengespeicherte Inhalt läuft in xxx Sekunden ab
kein Cache Sie müssen den Kontrast-Cache verwenden, um die zwischengespeicherten Daten zu überprüfen (später beschrieben).
No-Store:           Der gesamte Inhalt wird nicht zwischengespeichert, der erzwungene Cache und der Kontrast-Cache werden nicht ausgelöst (für die Front-End-Entwicklung gilt: Je mehr Cache, desto besser, also ... sagen Sie im Grunde 886 dazu).   

Obligatorisches Caching: Der Server informiert den Browser über eine Caching-Zeit. Während der Caching-Zeit verwendet die nächste Anforderung den Cache direkt und die Vergleichs-Caching-Strategie wird ausgeführt, wenn die Zeit abgelaufen ist.  Cache vergleichen: Senden Sie die Informationen zu Etag und Last-Modified in den Cache über eine Anforderung an den Server, und der Server überprüft sie. Wenn ein 304-Statuscode zurückgegeben wird, verwendet der Browser den Cache direkt.

4. Einige IO-Modelle vorstellen?

Blockierende E / A, nicht blockierende E / A, gemultiplexte E / A, signalgesteuerte E / A und asynchrone E / A.

  1. Blockieren von E / A: Das traditionellste E / A-Modell, dh das Blockieren, tritt beim Lesen und Schreiben von Daten auf. Nachdem der Benutzer-Thread eine E / A-Anforderung ausgegeben hat, prüft der Betriebssystem-Kernel, ob die Daten bereit sind. Wenn sie nicht bereit sind, wartet er darauf, dass die Daten bereit sind, und der Benutzer-Thread befindet sich in einem blockierten Zustand, und der Benutzer-Thread übergibt die CPU. Wenn die Daten bereit sind, kopiert der Kernel die Daten in den Benutzerthread und gibt das Ergebnis an den Benutzerthread zurück, und der Benutzerthread gibt den Blockstatus frei.
  2. Nicht blockierende E / A: Wenn ein Benutzer-Thread einen Lesevorgang initiiert, muss er nicht warten, sondern erhält sofort ein Ergebnis. Wenn das Ergebnis ein Fehler ist, weiß es, dass die Daten nicht bereit sind, sodass der Lesevorgang erneut gesendet werden kann. Sobald die Daten im Kernel bereit sind und erneut eine Anforderung vom Benutzer-Thread empfangen wird, werden die Daten sofort in den Benutzer-Thread kopiert und anschließend zurückgegeben. Tatsächlich muss der Benutzer-Thread im nicht blockierenden E / A-Modell ständig fragen, ob die Kerneldaten bereit sind, dh, nicht blockierende E / A übergeben die CPU nicht, sondern belegen immer die CPU. Bei nicht blockierenden E / A gibt es jedoch ein sehr ernstes Problem: In der while-Schleife muss kontinuierlich abgefragt werden, ob die Kerneldaten bereit sind, was zu einer sehr hohen CPU-Auslastung führt. Daher wird die while-Schleife im Allgemeinen selten verwendet. Lesen Sie die Daten.
    //伪代码
    while(true){
    new MyThread(socket)
    }
    class MyThread{
    data = socket.read();
    if(data!= error){
    //处理数据
    break;
    }
    
  3. Multiplexed IO: Das Multiplexed IO-Modell ist derzeit das am häufigsten verwendete Modell. Im gemultiplexten E / A-Modell gibt es einen Thread, der ständig den Status mehrerer Sockets abfragt. Nur wenn der Socket tatsächlich Lese- und Schreibereignisse aufweist, werden die tatsächlichen E / A-Lese- und Schreibvorgänge tatsächlich aufgerufen. Da im Multiplex-E / A-Modell nur ein Thread zum Verwalten mehrerer Sockets verwendet werden kann, muss das System weder neue Prozesse oder Threads erstellen noch diese Threads und Prozesse verwalten, sondern nur, wenn Socket-Lese- und Schreibereignisse vorliegen. E / A-Ressourcen werden nur dann verwendet, wenn es Zeit ist, wodurch die Ressourcenbelegung erheblich reduziert wird. In Java NIO wird mit selector.select () abgefragt, ob jeder Kanal ein Ankunftsereignis hat. Wenn kein Ereignis vorhanden ist, wird es dort immer blockiert. Daher bewirkt diese Methode das Blockieren des Benutzer-Threads. Vielleicht werden einige Freunde sagen, dass ich Multithreading + Blocking IO verwenden kann, um ähnliche Effekte zu erzielen, aber da beim Multithreading + Blocking IO jeder Socket einem Thread entspricht, der vor allem lange Zeit viel Ressourcen beansprucht In Bezug auf Verbindungen werden Thread-Ressourcen niemals freigegeben. Wenn später viele Verbindungen bestehen, führt dies zu einem Leistungsengpass. Im gemultiplexten E / A-Modus können mehrere Sockets über einen Thread verwaltet werden. Nur wenn der Socket tatsächlich ein Lese- und Schreibereignis aufweist, werden Ressourcen für die Ausführung der eigentlichen Lese- und Schreibvorgänge benötigt. Multiplexed IO eignet sich daher besser für Situationen mit einer großen Anzahl von Verbindungen. Darüber hinaus liegt der Grund dafür, dass Multiplex-E / A effizienter ist als das nicht blockierende E / A-Modell, darin, dass bei nicht blockierenden E / A der Socket-Status ständig über den Benutzer-Thread abgefragt wird, während bei Multiplex-E / A jeder Socket abgefragt wird Der Status wird vom Kernel ausgeführt, und diese Effizienz ist viel höher als die von Benutzer-Threads. Es sollte jedoch beachtet werden, dass das gemultiplexte E / A-Modell erkennt, ob ein Ereignis durch Abfragen eintrifft, und nacheinander auf die ankommenden Ereignisse reagiert. Daher werden für das gemultiplexte E / A-Modell nachfolgende Ereignisse, sobald der Ereignisantwortkörper groß ist, nicht zu spät verarbeitet und wirken sich auf die Abfrage neuer Ereignisse aus.
  4. Signalgesteuerte E / A: Wenn ein Benutzer-Thread eine E / A-Anforderungsoperation initiiert, registriert er eine Signalfunktion für den entsprechenden Socket, und der Benutzer-Thread wird weiterhin ausgeführt. Wenn die Kerneldaten bereit sind, wird ein Signal an den Benutzer-Thread gesendet. Nachdem der Benutzer-Thread das Signal empfangen hat, Rufen Sie E / A-Lese- und Schreiboperationen in der Signalfunktion auf, um die eigentliche E / A-Anforderungsoperation auszuführen.
  5. Asynchrone E / A: Dies ist das idealste E / A-Modell. Wenn ein Benutzer-Thread im asynchronen E / A-Modell eine Leseoperation initiiert, kann er sofort mit anderen Aktionen beginnen. Wenn der Kernel aus Sicht des Kernels einen asynchronen Lesevorgang empfängt, kehrt er sofort zurück, was darauf hinweist, dass die Leseanforderung erfolgreich initiiert wurde, sodass kein Block für den Benutzer-Thread generiert wird. Anschließend wartet der Kernel auf den Abschluss der Datenvorbereitung und kopiert die Daten in den Benutzer-Thread. Wenn dies alles erledigt ist, sendet der Kernel ein Signal an den Benutzer-Thread, um ihm mitzuteilen, dass der Lesevorgang abgeschlossen ist. Mit anderen Worten, der Benutzer-Thread benötigt nicht, wie die eigentliche gesamte E / A-Operation ausgeführt wird. Er muss nur zuerst eine Anforderung initiieren. Wenn das vom Kernel zurückgegebene Erfolgssignal empfangen wird, ist die E / A-Operation abgeschlossen und die Daten können direkt verwendet werden. Mit anderen Worten, im asynchronen E / A-Modell blockieren die beiden Phasen der E / A-Operation den Benutzer-Thread nicht. Beide Phasen werden automatisch vom Kernel abgeschlossen, und dann wird ein Signal gesendet, um den Benutzer-Thread darüber zu informieren, dass die Operation abgeschlossen wurde. Es ist nicht erforderlich, die E / A-Funktion zum spezifischen Lesen und Schreiben im Benutzerthread erneut aufzurufen. Dieser Punkt unterscheidet sich vom signalgesteuerten Modell. Wenn der Benutzer-Thread im signalgesteuerten Modell das Signal empfängt, zeigt dies an, dass die Daten bereit sind, und dann muss der Benutzer-Thread die E / A-Funktion für tatsächliche Lese- und Schreibvorgänge aufrufen, während er sich im asynchronen E / A-Modell befindet. Das Signal zeigt an, dass die E / A-Operation abgeschlossen wurde und die E / A-Funktion im Benutzer-Thread nicht für tatsächliche Lese- und Schreiboperationen aufgerufen werden muss. Beachten Sie, dass für asynchrone E / A die zugrunde liegende Unterstützung des Betriebssystems erforderlich ist, da in der zweiten Stufe des E / A-Vorgangs der Benutzer-Thread blockiert wird, dh der Prozess des Datenkopierens durch den Kernel lässt den Benutzer-Thread Block.

5. Kennen Sie das Knotenmodell?

Node.js verwendet ereignisgesteuerte und asynchrone E / A , um eine JavaScript-Laufzeitumgebung mit einem Thread und hoher Parallelität zu implementieren .

6. Kennen Sie MySQL? Kennen Sie SQL-Index? Es gibt eine große Datenmenge in der Datenbank, wie man schnell sucht.

Gründe für die langsame Abfrageeffizienz:

1: Kein Index oder Indexfehler

Die where-Bedingung verwendet die folgende Anweisung, um den Index ungültig zu machen: null,! =, <> oder Verbindung in (muss verwendet werden, kann durch das Schlüsselwort exist ersetzt werden) und nicht in '% abc%';

Verwenden Sie die Parameter: num = @ num, Ausdrucksoperation: wobei num / 2 = 100, Funktionsoperation: wobei Teilzeichenfolge (Name, 1, 3) = 'abc'-Name;

2: Die Menge der abgefragten Daten ist zu groß und unnötige Zeilen und Spalten werden zurückgegeben

Fragen Sie nur nützliche Felder ab. Verwenden Sie * nicht, um alle Felder abzufragen. Ersetzen Sie "*" durch eine bestimmte Feldliste und geben Sie keine Felder zurück, die nicht verwendet werden.

Verwenden Sie mehrere Threads für mehrere Abfragen. Wenn die Abfragebedingung eine Bereichsbedingung ist, z. B. ein bestimmter Zeitraum, können Sie die Zeitbedingung aufteilen und mehrere Abfrageergebnisse kombinieren.

3: Sperre oder Deadlock

4: Der E / A-Durchsatz ist gering und führt zu einem Engpass.

5: Unzureichender Speicher.

Erstellen Sie weniger Objekte. Objekte werden nur erstellt, wenn sie verwendet werden müssen, und durchlaufen nicht den gesamten Kontext.

Bereinigen Sie den JVM-Speicher rechtzeitig.

6: Die Netzwerkgeschwindigkeit ist langsam. 

SQL-Optimierungsmethode

1: Wenn der Index ein zusammengesetzter Index ist, muss das erste Feld des Index als Bedingung verwendet werden, um sicherzustellen, dass das System den Index verwendet. Andernfalls wird nicht auf den Index verwiesen, und die Feldreihenfolge sollte so weit wie möglich mit der Indexreihenfolge übereinstimmen.

2: Indizes sind nicht so viele wie möglich. Ein Tabellenindex sollte 6 am besten nicht überschreiten. Obwohl der Index die Effizienz der Auswahl verbessern kann, verringert er auch die Effizienz des Einfügens und Aktualisierens, da durch Einfügen und Aktualisieren der Index neu erstellt wird. Daher muss sorgfältig überlegt werden, wie der Index erstellt wird.

3: Einige Optimierungen der Tabellenerstellung:

Versuchen Sie, numerische Felder zu verwenden. Wenn die Daten nur numerische Informationen enthalten, versuchen Sie, sie nicht als Zeichentyp zu entwerfen. Dies verringert die Leistung von Abfragen und Verbindungen und erhöht den Speicheraufwand. Da die Engine bei der Verarbeitung von Abfragen und Verbindungen jedes Zeichen in der Zeichenfolge einzeln vergleicht und für numerische Typen nur einmal verglichen werden muss.
Versuchen Sie, varchar / nvarchar anstelle von char / nchar zu verwenden, da erstens Felder mit variabler Länge einen kleinen Speicherplatz haben und Speicherplatz sparen können. Zweitens ist bei Suchvorgängen die Sucheffizienz in einem relativ kleinen Feld offensichtlich höher.
4: Vermeiden Sie die Verwendung des Cursors, da die Effizienz des Cursors schlecht ist. Wenn die vom Cursor betriebenen Daten mehr als 10.000 Zeilen umfassen, sollten Sie ein Umschreiben in Betracht ziehen. (Cursor ist eine sehr alte Funktion, fast veraltet.)

5: Nicht alle Indizes sind für Abfragen wirksam. SQL ist für Abfragen optimiert, die auf den Daten in der Tabelle basieren. Wenn eine große Datenmenge in der Indexspalte wiederholt wird, verwendet die SQL-Abfrage möglicherweise nicht den Index. Beispielsweise gibt es die Felder Geschlecht, Mann und Frauen sind fast die Hälfte. Selbst wenn ein Index auf Geschlecht basiert, spielt er keine Rolle für die Effizienz von Abfragen.

6: Vermeiden Sie große Transaktionsvorgänge und verbessern Sie die Parallelität des Systems.

Vorsichtsmaßnahmen:

1: Denken Sie bei der Verwendung von "Gefällt mir" daran, das Feld zu leeren

... wobei Name wie '%'. Variablenname. '%'; (Variablenwert wird von außen übergeben)

Wenn: die Variable leer ist, wird sie zur folgenden SQL

... wobei Name wie '%%'; - Die Folge dieser Bedingung ist, dass alle Daten ausgewählt oder alle Daten aktualisiert oder alle Daten gelöscht werden. Dies entspricht keiner Schreibbedingung, die nach ihrem Auftreten ein ernstes Problem darstellt.

2: wie bei Platzhaltern: die Verwendung von% und _

Die Klassifizierung von
Platzhaltern: %% Platzhalter: Gibt an, dass ein beliebiges Zeichen beliebig oft angezeigt wird ** (kann 0 sein) **.
_Unterstrichene Platzhalter: Es kann nur einem einzelnen Zeichen entsprechen, nicht mehr oder nicht weniger, nur einem Zeichen.

Like-Operator: Die
Funktion von LIKE besteht darin, anzuzeigen, dass das Suchmuster hinter mysql darin besteht, Platzhalter anstelle einer direkten gleichen Übereinstimmung zum Vergleich zu verwenden.
Hinweis: Wenn Sie den Like-Operator verwenden, stimmt der Effekt des letzteren ohne Verwendung des allgemeinen Matching-Operators mit =, SELECT * überein FROM products WHERE products.prod_name wie '1000'; Das einzige übereinstimmende Ergebnis ist 1000, aber es kann nicht mit dem Ergebnis wie JetPack 1000 übereinstimmen.

1)% Platzhalterverwendung:
Übereinstimmungsdatensätze beginnend mit "yves": (einschließlich Datensatz "yves")
SELECT * FROM products WHERE products.prod_name like'yves% ';

Übereinstimmende Datensätze, die "yves" enthalten (einschließlich des Datensatzes "yves")
SELECT * FROM products WHERE products.prod_name wie '% yves%';

Ordnen Sie die Datensätze zu, die mit "yves" enden (einschließlich des Datensatzes "yves", mit Ausnahme des Datensatzes "yves", dh der Datensätze mit Leerzeichen nach yves, die hier beachtet werden müssen).
SELECT * FROM products WHERE products.prod_name wie '% yves';

2) Verwendung von Platzhalterzeichen:
SELECT * FROM products WHERE products.prod_name like'_yves '; Das
übereinstimmende Ergebnis lautet: record like "yyves".

SELECT * FROM products WHERE products.prod_name like'yves__ '; Das
übereinstimmende Ergebnis lautet: Datensätze wie "yvesHe". (Ein Unterstrich kann nur mit einem Zeichen übereinstimmen, nicht mehr oder nicht weniger.)

Sonstige Operationen:

 Einfügen in tb (...) Werte (...), (...) ...; ist besser als Einfügen in tb (...) Werte (...); Einfügen in tb (...) Werte (...); ... Die Methode des Batch-Einfügens ist hocheffizient [Grund]: Der Hauptgrund für die hohe Effizienz der zweiten SQL-Ausführung ist hier das Protokollvolumen nach dem Zusammenführen (MySQLs binlog- und innodb-Transaktionen machen das Protokoll reduziert), wodurch das Protokoll reduziert wird Die Menge und Häufigkeit des Datenbürstens, wodurch die Effizienz verbessert wird. Durch das Zusammenführen von SQL-Anweisungen kann auch die Anzahl der Parsing-Anweisungen für SQL-Anweisungen und die E / A für die Netzwerkübertragung verringert werden.

7. Verstehst du Prozesse und Threads? Was ist die Grundeinheit der CPU-Verarbeitung?

Der Prozess ist die Grundeinheit der Ressourcenzuweisung des Betriebssystems, und der Thread ist die Grundeinheit der Aufgabenplanung und -ausführung. Prozess ist ein Container mit Threads

8. Erzählen Sie mir von dem Algorithmus der CPU-Verarbeitung?

9. Was ist ein Prozess-Deadlock?

Definition von Deadlock: Deadlock ist das Phänomen, dass mehrere Prozesse in einem Prozesssatz aufgrund des Wettbewerbs um Ressourcen aufeinander warten. Zum Beispiel: A und B essen Knödel, A hält Sojasauce, B hält Essig, A will Essig und B will Sojasauce. Infolgedessen warten beide darauf, Knödel zu essen.

Ursachen des Deadlocks: unzureichende Systemressourcen, unangemessene Fortschrittssequenz mehrerer Prozesse, falsche Ressourcenzuweisung

Notwendige Voraussetzungen für einen Deadlock:

(1) Gegenseitiger Ausschluss: Ressourcen können nicht gemeinsam genutzt und nur von einem Prozess verwendet werden.

(2) Anforderungs- und Haltebedingungen (Halten und Warten): Prozesse, die bereits Ressourcen erhalten haben, können erneut neue Ressourcen beantragen.

(3) Nopre-Emission: Die zugewiesenen Ressourcen können nicht zwangsweise aus dem entsprechenden Prozess entzogen werden.

(4) Umlaufwartebedingung (Umlaufwartezeit): Mehrere Prozesse im System bilden eine Schleife, und jeder Prozess in der Schleife wartet darauf, dass die Ressourcen von benachbarten Prozessen belegt werden.

Es gibt vier Möglichkeiten, um mit Deadlocks umzugehen: 1) Verhindern von Deadlocks 2) Vermeiden von Deadlocks 3) Erkennen und Entfernen von Deadlocks

Deadlock verhindern: Zerstören Sie eine der vier notwendigen Bedingungen

① Zerstörung gegenseitiger Ausschlussbedingungen: Ermöglichen die gemeinsame Nutzung von Ressourcen. Beispielsweise kann die SPOOLing-Technologie es mehreren Prozessen ermöglichen, Druckdaten gleichzeitig zu generieren.

Nachteile: Die SPOOLing-Technologie ist nicht für alle Ressourcen wie Prozesstabellen usw. geeignet. Daher ist es schwieriger, den gegenseitigen Ausschluss von Ressourcen zu zerstören. Diese Methode ist nicht sehr gut

②Destruktionsanforderung und Aufbewahrungsbedingungen: Ressourcen werden sofort zugewiesen.

Nachteile: Mit diesem Mechanismus gilt der Prozess während des Ausführungsprozesses nicht mehr für Ressourcen, aber die Effizienz dieser Methode ist äußerst gering und Ressourcen können nicht vollständig genutzt werden.

③Brechen Sie die unveräußerliche Bedingung: Es gibt zwei Methoden: Die eine besteht darin, die ursprünglich belegten Ressourcen aufzugeben, wenn die angeforderten Ressourcen nicht erfüllt sind. Die andere Methode gilt nur für die Beantragung von Ressourcen mit höherer Priorität Wenn die Prozesspriorität der Ressource hoch ist, wenn die von einem Prozess angeforderte Ressource von anderen Prozessen belegt ist und die Priorität des Anwendungsprozesses höher ist, kann dies dazu führen, dass der Prozess, der die Ressource belegt, aufgibt. Diese Methode ist allgemein auf Prozessoren und Speicherressourcen anwendbar.

④ Wartebedingungen für den Zerstörungszyklus: Das System weist jedem Ressourcentyp eine Nummer zu, und jeder Prozess fordert die Ressource in der Reihenfolge zunehmender Anzahl an, und die Freigabe ist das Gegenteil (z. B. das Problem des Philosophenmahls).

Es gibt zwei Möglichkeiten, um einen Deadlock zu vermeiden: 1) Die Ressourcen werden in der richtigen Reihenfolge zugewiesen und 2) der Banker-Algorithmus.

Es gibt zwei Möglichkeiten, um Deadlocks zu beseitigen: 1) Methode zum Entzug von Ressourcen 2) Methode zum Abbrechen von Prozessen 3) Methode zum Zurücksetzen von Prozessen

10. Geben Sie die URL einer Website an. Notieren Sie sich alle URLs in dieser URL und alle URLs, die über diese URLs weitergeleitet werden und nicht dupliziert werden.

11. Was ist der Unterschied zwischen dem Inhaltstyp des Hochladens einer Datei und dem Klicken auf eine Schaltfläche? Was ist der Unterschied zwischen dem http-Übertragungsprotokoll?

Inhaltstyp:

Bezieht sich im Allgemeinen auf den auf der Webseite vorhandenen Inhaltstyp, der zum Definieren des Typs der Netzwerkdatei und der Codierung der Webseite sowie zum Bestimmen der Form und Codierung des Browsers zum Lesen dieser Datei verwendet wird. Dies ist das Ergebnis häufiger Klicks auf PHP-Webseiten. Ist der Grund für das Herunterladen einer Datei oder eines Bildes. Der Header teilt dem Client den Inhaltstyp des tatsächlich zurückgegebenen Inhalts mit. Es ist das Entitätsheaderfeld von HTTP. Es wird verwendet, um die Codierungsmethode der Anforderung oder des zurückgegebenen Nachrichtentexts zu beschreiben. Es ist sowohl im Anforderungsheader als auch im Antwortheader vorhanden.

Gängige Typen:

Text / (Plain, CSS, HTML, XML) (Text ,, CSS, HTML, XML) Typ
Anwendung / (X-Javascript, JSON, XML, Octet-Stream) (JS, JSON, XML, Binär-Stream Daten) Typ
Bild / png jpg gif image / *    

Excel-Datei hochladen: .xls     application/vnd.ms-excel

12. Algorithmusproblem: Geben Sie ein int-Array {1, 2, 5, -7, 8, -10} so aus, dass das kontinuierliche Subarray mit der größten Summe

 

um zusammenzufassen:

Die Vorbereitung dieses Mal ist hauptsächlich js Wissen. Ich hatte nicht erwartet, dass das Byte-Interview sehr niedrig war und ich habe es nicht überprüft. . . Ich habe die algorithmischen Fragen nicht aufgefrischt. Ich habe es eine halbe Stunde lang getan und konnte es nicht tun. . . Es fühlt sich viel schwieriger an als das Interview von Ant Financial vor einiger Zeit. . .

Ich denke du magst

Origin blog.csdn.net/weixin_45440502/article/details/109586398
Empfohlen
Rangfolge