Dlaczego platformy mobilne nie obsługują generowania pamięci śmieci?

11

Zarówno Windows Phone / Xbox, jak i Android nie obsługują generowania śmieci w trybie pokoleniowym. Jest to frustrujące dla wielu programistów. Wydaje się, że jest to uzasadniony powód techniczny, ale nie mogę tego rozgryźć.

Obecne telefony mają więcej pamięci i prawdopodobnie lepsze procesory niż komputery stacjonarne / laptopy z systemem .NET 1.1 z generacyjnym GC w 2001 roku, i nie mogę wymyślić żadnych powodów, dla których procesory ARM byłyby gorsze w generacyjnym GC niż x86. Istnieje również mniejsze zapotrzebowanie na wielozadaniowość na telefonach i konsolach, więc jest stosunkowo więcej wolnego miejsca na stosie.

Co więc daje?

Edycja: Kilka punktów do wyjaśnienia:

  • Platformy te używają wyrzucania elementów bezużytecznych wyłącznie do aplikacji, więc moje pytanie nie dotyczy tego, dlaczego GC nie jest obsługiwane; moje pytanie dotyczy tego, dlaczego generowanie śmieci nie jest generowane .
  • Powodem, dla którego ludzie są sfrustrowani brakiem pokoleniowej GC, jest to, że GG niegenracyjna jest niezwykle nieefektywna. (Oznacza to, że żywotność baterii nie jest powodem.)
  • Wierzę, że istnieje uczciwy techniczny powód braku generacyjnego wsparcia GC. To nie jest pytanie retoryczne.
Rei Miyasaka
źródło
Windows Phone (obecna generacja) ma funkcję wyrzucania elementów bezużytecznych. Działa tylko wtedy, gdy w urządzeniu brakuje
Tom Squires
@TomSquires GC na WP7 działa raz na 1 MB przydziałów. Myślę, że możesz myśleć o menedżerze zadań kernującym stare procesy.
Rei Miyasaka,

Odpowiedzi:

5

Myślę, że największym problemem jest żywotność baterii. Wyrzucanie elementów bezużytecznych to wygoda dla programistów kupiona za cenę dodatkowych cykli procesora na komputerze użytkownika . Gdy procesor jest podłączony (komputer stacjonarny) lub ma stosunkowo dużą baterię (laptop), użytkownicy są bardziej skłonni płacić za wygodę programistów dodatkową energią zużywaną przez procesor podczas usuwania śmieci. Gdy bateria jest stosunkowo mała, użytkownicy mogą nie być tak hojni. Mogą chcieć dla siebie tego dodatkowego baru - być może porozmawiać z przyjaciółmi lub zabić kilka dodatkowych świń podczas śmiertelnego spotkania ze złymi ptakami.

Bez względu na powody użytkowników programiści systemów operacyjnych nie chcą tworzyć wrażenia, że urządzenia z systemem operacyjnym wyczerpują baterię szybciej niż urządzenia z systemem konkurencji. Kupują więc lepsze postrzeganie oczekiwanego czasu pracy baterii swoich urządzeń w cenie wygody programistów: dla nich Twój ból nie jest niczym, o ile użytkownicy są zadowoleni z urządzeń.

dasblinkenlight
źródło
3
Generacyjna GC jest w większości przypadków znacznie bardziej wydajna, więc można by pomyśleć, że zmniejszyłaby liczbę cykli zegara. Nie wyjaśnia również, dlaczego coś takiego jak Xbox nie ma generacyjnej GC, ponieważ Xboksy są podłączone.
Rei Miyasaka
Cóż, właśnie to usłyszałem na Stack Overflow. Jednak niewiele wiem o XBoxach.
dasblinkenlight
3
To wciąż nie odpowiada na pytanie. Nawet jeśli wyrzucanie elementów bezużytecznych zużywa więcej mocy niż jawna alokacja (co jest wysoce dyskusyjne - i nie będę się w to angażować), pytanie nie brzmi, czy / dlaczego alokacja jawna jest lepsza niż GC na urządzeniach mobilnych, to czy / dlaczego nie- generacyjna GC jest lepsza niż generacyjna GC na urządzenia mobilne.
Rei Miyasaka,
1
@Rei: Gry zazwyczaj wymagają, aby wszystko było deterministyczne; przynajmniej potrzebują przewidywalnej wydajności. Kilka zmarnowanych tu nanosekund i kilka nanosekund zmarnowanych - w nieprzewidywalnych czasach - może zepsuć grę. Generatory śmieci są nieprzewidywalne.
Ant
2
@djacobson Nie sądzę, że to prawda. Jak powiedziałem w pytaniu, gdyby były to tylko platformy Microsoftu zaniedbujące generacyjną GC, to prawdopodobnie byłby to logistyczny / biurokratyczny powód i nie zawracałbym sobie głowy pytaniem. Ale Android ma ten sam problem, więc jest to prawdopodobnie powód techniczny, co oznacza, że ​​ktoś na P.SE może mieć ostateczną odpowiedź.
Rei Miyasaka,
3

Domyślam się, że nie jest to powód techniczny, ale że programiści tych platform telefonicznych po prostu jeszcze nie włożyli wysiłku. Wiem, że nie jest to odpowiedź, na którą liczysz, ale jeśli wykonałeś jakiś rozwój mobilny, prawdopodobnie zauważyłeś, że jest dużo nisko wiszących owoców. Prawdopodobnie po prostu nie mieli czasu na napisanie wielu implementacji GC, dostrojenie ich wszystkich i wybranie tej, która najlepiej sobie radzi. Dlaczego ktoś miałby spędzać czas na nowo opracowując koło, kiedy zamiast tego mógł wypuszczać nowe, krzykliwe, źle przemyślane interfejsy API? ;)

FWIW i jako potwierdzenie mojej teorii, nowy środowisko uruchomieniowe Androida (ART) ma generacyjny GC i planuje w przyszłości kompaktować GC .

aij
źródło
2

Istnieje generowanie dodatkowych kosztów związanych z generowaniem śmieci.

Kolektor generacyjny musi być w stanie dowiedzieć się, kiedy starsze obiekty wskazują nowe obiekty. Nie możemy prześledzić starszego obiektu w celu znalezienia tych przypadków, ponieważ byłoby to sprzeczne z celem gromadzenia pokoleń. Zamiast tego musimy jakoś wykryć, kiedy to nastąpi, i zanotować to na etapie gromadzenia. Niezależnie od tego, jak to zrobisz, spowoduje to dodatkowe obciążenie procesu zbierania.

W systemie stacjonarnym Twój system operacyjny zajmuje się różnymi rzeczami z pamięcią za kulisami. Obsługuje takie funkcje, jak współdzielenie stron między procesami, zapisywanie nieużywanych stron na dysku, zapewnianie mapowania pamięci między procesami itp. Rozumiem, że niektóre z wykorzystywanych tam funkcji umożliwiają bardziej efektywne śledzenie zmienianych wskaźników. Operacja już martwi się tym, co zmieniasz w pamięci, więc wykorzystanie tych informacji do nowych celów nie stanowi problemu.

Podejrzewam, że systemy mobilne nie robią tych samych rzeczy za kulisami. W rezultacie nie mają takiego samego poziomu informacji, jaki miałby pulpit. W rezultacie narzut związany z wdrożeniem ogólnej kolekcji jest wyższy i mniej prawdopodobne, że będzie tego wart.

Winston Ewert
źródło
Maksymalne wykorzystanie generacji GC wymaga użycia płotów zapisu w celu wykrycia, kiedy zapisywane są obiekty starszej generacji. Z drugiej strony, nawet jeśli część „oznaczenia” GC nie mogłaby skorzystać z pokoleń, pomyślałabym, że można by poprawić wydajność jedynie poprzez przenoszenie rzeczy w nowszych pokoleniach (właściwie, wykonując fazę „tagowania” u starszych generacji jako nowszy może być przydatny, jeśli pozwala dowiedzieć się, ile pamięci można odzyskać w każdym pokoleniu).
supercat