Jak wytłumaczysz zwykłego śmiertelnika o blokowaniu IO i niezablokowaniu IO? Zauważyłem, że te koncepcje nie są zbyt jasne wśród wielu programistów.Co to są proste słowa blokujące IO i non-blocking IO?
Odpowiedz
Blokowanie operacji we/wy oznacza, że wykonywanie programu jest wstrzymywane w trakcie operacji we/wy. Program czeka więc na zakończenie operacji I/O, a następnie kontynuuje jej wykonywanie. W nieblokujących I/O program może być kontynuowany podczas operacji we/wy.
prostu powiedział .. non blokowanie wejścia/wyjścia (Asynchronous) umożliwia inne operacje mają być przeprowadzone, gdy to robi jego rzecz i blokowanie I/O będzie blokować inne operacje
Jest to problem współbieżności. W normalnym przypadku po tym, jak jądro systemu operacyjnego otrzyma operację We/Wy z programu użytkownika, program ten nie zostanie uruchomiony ponownie, dopóki nie zakończy się operacja We/Wy. W międzyczasie inne programy są zazwyczaj planowane.
Rozwiązuje to wiele małych problemów. Na przykład, w jaki sposób program wie, ile bajtów zostało przeczytanych, chyba że operacje we/wy zostały zakończone po powrocie do trybu read(2)
? Skąd wiadomo, czy może ponownie użyć bufora write(2)
, jeśli operacja jest nadal w toku, gdy zwraca się write(2)
? Oczywiście, dla prawdziwie asynchronicznego I/O potrzebny jest bardziej złożony interfejs.
Ostatecznie wszystko sprowadza się do:
- I/O dzieje się synchronicznie w stosunku do programu, poprzez blokowanie programu aż do I/O zakończeniu
- I/O jest jedynie zaplanowane przez wywołanie systemowe i istnieje mechanizm powiadamiania o prawdziwym wyniku.
- Istnieje kompromis, w którym operatory we/wy po prostu nie działają, jeśli nie można ich natychmiast zakończyć. Jest to bardziej powszechne użycie "nieblokujących" we/wy w praktyce.
Cała sprawa komplikuje ponadto przez wysiłku, aby zaplanować programów wielowątkowych podczas I/O mogłaby blokować tylko jeden wątek, ale to już zupełnie inna kwestia ...
- 1. Jak w niezawodny sposób oczyszczać wątki Rusta blokujące IO?
- 2. i IO Monady
- 3. Przewodnik po scala.io i proste IO dla Scala 2.9?
- 4. Filtr IO [Maybe String] na IO [String]
- 5. Haskell monada: IO [Double] do [IO Double]
- 6. Różnica między IO-APIC-fasteoi i IO-APIC-edge
- 7. Jaka jest różnica między maven dependencies org.apache.commons: commons-io i commons-io: commons-io?
- 8. Co to są "rodzime" i "dosłowne" słowa kluczowe
- 9. kolejność wykonywania Haskell IO
- 10. Trzecie prawo monolityczne i IO?
- 11. Haskell IO Testowanie
- 12. aktorzy scala vs wątki i blokowanie IO
- 13. Idiomatic IO ze skalą
- 14. Io: protokół 'https' nieobsługiwany
- 15. Zalecane biblioteki Scala io
- 16. Memoizing IO Obliczenia Haskell
- 17. Dlaczego istnieje zagnieżdżona monada IO, IO (IO()), jako wartość zwracana przez moją funkcję?
- 18. Haskell Extensible IO Exceptions?
- 19. Obserwowalna analiza IO sieci
- 20. IO wewnątrz Get Monad
- 21. subprocess.Popen() Przekierowanie IO
- 22. Uploadify: error IO
- 23. IO i Być może interakcja z monadą
- 24. Konwertuj [IO Int] na IO [Int] w Haskell?
- 25. Golang io/ioutil NopCloser
- 26. Haskell IO - rękojeść zamknięta
- 27. Haskell i akcje niskiego poziomu IO
- 28. Funkcja Memoized IO?
- 29. wielu platform (linux/Win32) nonblocking C++ IO na stdin/stdout/stderr
- 30. doładowania IO Stream i ZLib przyspieszyć
... i jest zgłoszony za pośrednictwem oddzwanianie po zakończeniu operacji we/wy. Zmusza to do projektowania programów w różny sposób, ale sprawi, że będą one działać o wiele lepiej. –
@ Lex, każdy przykład blokowania i odblokowywania operacji? Dzięki. – Kalanidhi
@etc_passwd W JS jest to łatwe do zrozumienia; wywołanie funkcji 'alert(); 'jest blokowane, ponieważ wykonywanie jest wstrzymywane, dopóki użytkownik nie kliknie przycisku OK. Wywołanie AJAX nie jest blokujące, wykonanie jest kontynuowane podczas wysyłania żądania HTTP. –