Dobrze byloby gdybys poznal roznice pomiedzy malloc a mmap, bo ewidentnie mylisz pojecia.
Ujmę to tak. Ostatni raz pisałem kod w C obsługujący operacje dyskowe z bezpośrednim żądaniem do kontrolera DMA w 1992 r.
I na pewno nie mylę żadnych pojęć bo szczegóły wirtualizacji pamięci i plików i urządzeń o których raczyłeś wspomnieć, to zupełnie inna bajka i z zupełnie innej epoki.
A mozesz opisac w jaki sposob Java realizuje te gwarancje?
No cóż. :-) Tak jak jest napisane:
http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html
Ale ponieważ to wytłumaczenie jest dla "specjalistów" z drugiej dekady 21. wieku, więc nie ma tam żadnej informacji o tym, że operacje dyskowe są w komputerach PC od mniej więcej 30 lat wykonywane za pomocą urządzenia innego niż CPU. I jak na razie to się nie zmieniło. A to, że współcześnie jest to schowane głęboko w systemie i wszystko robi za Ciebie API systemu, a na nim API Javy, to już zupełnie inna sprawa.
[Uwaga, archeologia, bezużyteczna dla osób znających tylko Javę :-)]
Tak przypadkiem to DMA, który jest sprzętowym kontrolerem też musi zostać zaprogramowany zanim cokolwiek robi. I znowu przypadkiem obecnie robi to jedna z niskich warstw systemu. Ale za czasów gdy istniał jeszcze BIOS, znano takie pojęcia jak PIO i DMA oraz pracowało się w trybie rzeczywistym CPU - nie robiła tego systemowa procedura API, lecz każdy musiał sobie samemu zaprogramować porty kontrolera, żeby mieć szybki i niezależny od obciążenia procesora transfer dyskowy. Bo miałeś dostępnego tylko DOSa (i Xenixa, ale mało kto to miał).
Fakt, że jest to zamierzchła przeszłość i archeologia, ale jeżeli tego się nie wie, to nie można naprawdę zrozumieć wpływu bezpośredniego alokowania bufora w pamięci (i to fizycznej), na to jak program wykonywany przez JVM przeprowadza operacje dyskowe. Dlatego w javadocu jest tylko formułka sprowadzająca się do tego, że "tak jest lepiej".
Być może nie będzie się tego rozumiało jeżeli samodzielnie nie spróbuje się napisać sterownika dyskowego. Albo jeszcze lepiej procedury I/O operującej na sprzęcie z pominięciem systemu (choć w trybie chronionym CPU nie jest to realnie możliwe).
- Bufory na stercie sa niemapowalne na pliki. Nie wiem skad pozyskales wiedze ze sa.
Zaraz. Zaczynam mieć wrażenie, że mówimy o czymś zupełnie innym. Prosiłbym, żebyś nie wciskał mi żadnych rzeczy, których nie napisałem.
Napisałem tylko, że jeżeli masz ochotę, to możesz sobie sam na piechotę mapować dowolny plik na zarządzane przez siebie bufory. I tylko to. A jeżeli jednak upierasz się na pliki mapowane na pamięć, to jak najbardziej Java NIO też to przecież ma. Ale jest to tak jak napisałem - skrót zrobiony dla wygody - bezużyteczny dla obsługi bezpośredniego zapisu wycinków pliku tekstowego (chyba, że będą to pliki z kodowaniem natywnym JVM, czyli UTF-16LE).
- Do skorzystania z DMA nie jest potrzebne żadne "przeprogramowanie". To juz jakas kompletna bzdura.
To dla mnie trochę śmieszne, ale jeżeli nie wiesz, że różne sprzętowe kontrolery się programuje zanim wykonają dla Ciebie jakąś pracę, to w zasadzie ciężko o jakiś wspólny punkt zaczepienia. Dzisiaj rzeczywiście nie jest potrzebne programowanie sprzętu bo robi to za Ciebie metoda z API Javy, a za nią kolejne warstwy JVM, następnie API systemu, a już na szarym końcu sterownik systemu. Ale, to że coś robi to za Ciebie nie zmienia faktu, że każda operacja dyskowa składa się z dwóch elementów: Przygotowania bufora, a następnie zaprogramowania kontrolera żeby dane zostały przez niego wczytane lub zapisane. Finito. Tylko wtedy nie musisz czekać na operację dyskową i kod leci sobie w wątku dalej.
- Zero-copy data transfer jest w Javie dostepny od 1.5 poprzez NIO (zwlaszcza bufory i channele).
Racja, a nawet od 1.4. Ale mi chodziło o NIO2, które dopiero od tej edycji jest użyteczne do obsługi np. plików tekstowych. Dopiero od Javy 7 API operacji I/O Javy jest "współczesne" i kompletne. I sam dopiero od tej wersji zacząłem używać w Javie wydajnych operacji dyskowych bo wcześniej było to średnio użyteczne.
http://en.wikipedia.org/wiki/Non-blocking_I/O_%28Java%29#JDK_7_and_NIO.2
Polecam szczególnie akapit "Channels".
Myślę, że jednak wiem o czym mówię. :P
I nie sądzę, że coś mi się miesza. Aż tak jeszcze nie zdziadziałem... :-)
Ale chętnie dowiem się że istnieje jakaś książka, której jeszcze nie udało mi się przeczytać.
Pozdrawiam.