2010-10-13 16 views
7

Powiel możliwe:
Java - C-Like Fork?jak rozwidlić JVM?

Chciałem wiedzieć, jak to jest możliwe, aby wysupłać podrzędny JVM z JDK lub nawet jest to możliwe, aby to zrobić?

Niektóre schematy, jak np. Widelec widelca dziecka JVM dla określonych zadań, więc proszę rzucić trochę światła na ten temat.

Dzięki!

+2

Dlaczego spadamy? To rozsądne pytanie. –

Odpowiedz

7

Generalnie nie wierzę, że jest to możliwe w tym sensie, jaki masz na myśli. Możesz System.exec() wywołać nowy proces i można wywołać w ten sposób nową maszynę JVM. Zauważ, że możesz zadzwonić pod numer fork() bezpośrednio z natywnego kodu, ale według słów plakatu here, "Nie rób, po prostu nie rób tego".

+1

Ten link jest zbyt specyficzny dla systemu Android, prawda? – ShiDoiSi

+1

Nie myśl, przynajmniej o czymś związanym i nie skopiowanym. Ta sama semantyka widelca stosuje się gdzie indziej ... Nie myśl, że widelec ma sens w JVM, bez dużo dodatkowego bagażu. – andersoj

13

Widelec jest często mylony z zaszczepiaczem. Spawn to fork + exec (co oznacza rozpoczęcie procesu , który zastępuje bieżący i dziedziczy niektóre z jego zewnętrznych zasobów, takich jak otwarte gniazda).

Spawn jest dostępny w języku Java (przez System.exec i podobne).

Widelec nie jest na Jawie, ponieważ byłby bardzo problematyczny.

Widelec wymaga sklonowania przestrzeni adresowej. Obsługa jądra, aby zrobić to skutecznie, nie jest dostępna w większości systemów innych niż systemy uniksowe; na przykład U/win i Cygwin zmagali się z , aby emulować fork pod Win32. W języku takim jak Java, garbage collector & kompilatory JIT miały tendencję do dotykania stron Vmem takich, jak , przez co przestrzeń nie byłaby długo udostępniana po rozwidleniu.

Klonowanie ma wiele skutków ubocznych. Np. Bufory wejściowe lub wyjściowe będą przetwarzane we wszystkich rozwidlonych elementach potomnych . Pamięć współdzielona SysV zostanie odłączona.

Większość języków i bibliotek po prostu odmawia rozwidlenia wsparcia w postaci . Obejmuje to API (POSIX) do gwintowania; Dziecko nie może używać wątków, dopóki nie wykona (tj. Zostanie odrodzeniem)!

Perl używa fork, ponieważ jego elementy wewnętrzne są bardzo zbliżone do C/Unix, , a wielowątkowość jest fatalna.

Powłoka Uniksa używa rozwidlenia według projektu, czyli jak migawki są wszystkie zmienne lokalne i stan. Właśnie dlatego nie ma przyzwoitej powłoki uniksowej dla środowiska innego niż środowisko uniksowe (012).

+0

Bardzo dobra odpowiedź. –