2014-05-19 15 views
7

W niektórych dokumentach dotyczących elementów środowiska wykonawczego GHC podano, że używa on epoll/kqueue/poll do wykrywania, czy deskryptor pliku jest gotowy do odczytu/zapisu.W jaki sposób środowisko wykonawcze GHC zajmuje się we/wy pliku?

Rozumiem, jak to się robi dla gniazda I/O. Ale co z dostępem do plików dyskowych? System syscall nie działa ze zwykłymi plikami, tylko z gniazdem I/O; prawdziwe?

Jedyną opcją mogę sobie wyobrazić, tu jest za pomocą puli wątków do blokowania syscalli, jeden wątek-per-życzenie ...

+0

Na platformach POSIX (takich jak Linux, OSX i BSD) deskryptor jest małą liczbą całkowitą i może to być plik, potok, gniazdo lub coś zupełnie innego. Wszystkie one obsługują głównie te same funkcje wsparcia, takie jak odpytywanie. –

+2

Sonda @JoachimPileborg na dysku plik fd zawsze zwraca, że ​​jest gotowy do IO, podczas gdy w rzeczywistości byłby blokowany. – user3489275

+1

@JoachimPileborg Przykro mi, ale to jest BS. Nie ma znaczenia, ile próbujesz przeczytać, mimo to może zablokować (nawet z O_NONBLOCK). – user3489275

Odpowiedz

3

W niegwintowanymi RTS, cała Runtime zablokuje. W nagwintowanym RTS wykona bezpieczne połączenia zagraniczne w ten sposób poprzez pulę wątków, więc możliwości nie będą blokowane.

Powiązane problemy