Wiele rdzeni vs starsze gry

Odpowiedz


To pytanie jest elementem zabezpieczającym przed automatycznym zamieszczaniem postów.
Emotikony
:D :) :( :o :szok: :? 8) :lol: :x :P :marzy: ;) :| :mrgreen: :mur: :gugu: :obraza: :ble: :niesmialy: :buhaha: :tajemniczy: :plask:

BBCode włączony
[Img] włączony
[URL] włączony
Emotikony włączone

Przegląd tematu
   

Rozwiń widok Przegląd tematu: Wiele rdzeni vs starsze gry

autor: Elum » pn 02 sie 2010, 20:09

No tego się nie spodziewałem (prawie mi goosebumps po plecach przeszła z wrażenia ;)). Aż żałuję, że nie mam w tej chwili problemów z odpaleniem jakieś starszej przygodówki. Taki poradnik nie powinien się marnować. :)

A tak przy okazji, trochę odbiegając od tematu. Miło zobaczyć na forum jeszcze jednego Świętochłowiczanina. 8)

Wiele rdzeni vs starsze gry

autor: santo_ameno » ndz 01 sie 2010, 23:48

Zasadniczo, jeśli wasz system operacyjny potrafi obsługiwać wiele procesorów (lub procesory wielordzeniowe), każda aplikacja na tym systemie jest uruchamiana w trybie wielu procesorów/rdzeni. Właśnie to bywa przyczyną dziwnego zachowania niektórych gier lub programów. Dla starszych aplikacji konieczne jest zatem kontrolowanie ustawienia koligacji procesorów. Koligacja to nic innego jak zmiana przyporządkowanego procesora/rdzenia do konkretnego procesu lub wątku. W naszym przypadku konieczne jest uruchomienie aplikacji tylko na jednym rdzeniu/procesorze, gdyż do takiego trybu starsze aplikacje są przystosowane. Koligację można ustawić ręcznie dla każdego uruchomionego procesu w menedżerze zadań (klikając interesującą pozycję na karcie procesu prawym przyciskiem -> ustaw koligację...). Jest to ustalenie jednorazowe, tylko dla tej konkretnej instancji programu, co zmusza do powtarzania tej czynności przy każdym uruchomieniu. Dodatkowo, ten sposób nie sprawdzi się w przypadku aplikacji wysypujących się zaraz na starcie, nie dających nawet szansy na dostanie się do menedżera zadań w czasie ich pracy. Istnieją na rynku narzędzia służące do zarządzania zasobami procesora w przypadku starszych aplikacji. Zazwyczaj mają postać usług lub programów działających w tle i uruchamianych wraz z systemem. Dla procesorów AMD jest to AMD Dual-Core Optimizer (Śmig!). Niestety, nie we wszystkich przypadkach narzędzia te spisują się dobrze (przykładem może być Black Dahlia, która mimo użycia dual-core optimizera wiesza się i wysypuje).

Aby temu zaradzić można użyć Windows NT Image Configuration Utility (Plask!). Narzędzie stworzone przez microsoft, a dostarczone wraz z 'Windows 2000 Server Resource Kit Supplement One'. Pozwala m.in. TRWALE ustalić koligację procesorów (lub rdzeni) dla określonej aplikacji. Trwałość tego przypisania polega na modyfikacji nagłówka wybranego pliku wykonywalnego i zapisaniu w nim informacji odnośnie przydziału zasobów procesora. Należy zatem przed edycją opornej aplikacji sporządzić jej kopię zapasową, gdyż proces nie jest odwracalny (tzn. nie da się wymazać przypisania poprzez program). Jest to o tyle istotne, że po takiej modyfikacji aplikacja może nie zostać rozpoznana przez różne oficjalne patche (rozmiar i zawartość pliku często muszą się zgadzać co do bajtu), które przez to mogą odmówić dalszych czynności patchujących ;).

Plik 'imagecfg.exe' dla wygody należałoby zapisać w folderze 'C:\windows\system32' umożliwiając korzystanie z niego w każdym folderze, nadając mu rangę polecenia systemowego. Składnia polecenia jest następująca:

Kod: Zaznacz cały

imagecfg -a 0x1 c:\program.exe
Wywołanie programu nastąpiło z parametrem '-a', który służy do ustalenia koligacji (a, od affinity). Argumentem jest 0x1, co oznacza pierwszy rdzeń (lub pierwszy fizyczny procesor). Analogicznie 0x2 oznaczałoby drugi itd. Na końcu podajemy tylko ścieżkę do problematycznego programu i po zabawie - aplikacja od tej pory będzie korzystać tylko z jednego rdzenia. Plik w takiej postaci można potem zarchiwizować, uznając go w pewnym sensie za spatchowany i zapisać gdzies na cd lub poratować nim kolegę z wyrwanymi włosami. Zasadniczo, koniec tematu.

Jeszcze garść informacji odnośnie działania programu. Imagecfg.exe został zaprojektowany dla starszych aplikacji, sprzed epoki wielordzeniowości. Muszą być to jednak aplikacje typu win32. Dosowe lub zaprojektowane dla windows 3.11. nie są obsługiwane przez program. Przy próbie użycia go na takowych otrzymacie komunikat:
IMAGECFG: unable to modify DOS or Windows image file - program.exe
Dla plików dosowych, systemy operacyjne rodziny Windows NT (czyli od Windows 2000 wzwyż) zostały zaopatrzone w aplikację ntvdm.exe (NT Virtual Dos Machine, zlokalizowaną w c:\windows\system32), służącą do emulacji systemu MS-DOS na potrzeby starszych aplikacji. Ntdvm.exe uruchamiane jest zawsze, gdy pojawia się wywołanie dosowej aplikacji i wówczas również może się pojawiać problem obsługi wielu rdzeni/procesorów. Tutaj sprawa jest jeszcze prostsza - jako,że nie da się użyć imagecfg na dosowym programie, należy ustawić koligację dla ntvdm.exe (kopia zapasowa, żeby nie było płaczu). Wtedy każda uruchamiana przez ntvdm.exe aplikacja będzie od razu korzystać z jednego tylko rdzenia/procesora. Czyli:

Kod: Zaznacz cały

imagecfg -a 0x1 C:\WINDOWS\system32\ntvdm.exe
I starsze aplikacje mamy również załatwione. Inna sprawa - dla dosowych aplikacji polecam dosboxa (Łubudu!), dla którego problem wielordzeniowości nie istnieje.

Przy pierwszym użyciu na danej aplikacji, program imagecfg.exe zwróci komunikat (no chyba, że nie uruchamiacie go z wiersza poleceń - wtedy nie zdążycie zobaczyć co zwróci, bo mignie i zniknie):
program.exe contains no configuration information
program.exe contains a Subsystem Version of 4.0
program.exe updated with the following configuration information:
Process Affinity Mask: 00000001
Oznacza to, że aplikacja wcześniej nie była modyfikowana pod tym kątem (nie zawiera danych konfiguracyjnych) oraz, że zauktualizowano dane konfiguracyjne i od tej pory koligacja została ustawiona na pierwszy rdzeń/procesor. Jest też informacja, że podsystem jest w wersji 4.0, cokolwiek to znaczy...

Po użyciu na tym samym pliku polecenia:

Kod: Zaznacz cały

imagecfg -a 0x2 c:\program.exe
dostaniemy następujący komunikat:
program.exe contains the following configuration information:
Process Affinity Mask: 00000001
program.exe contains a Subsystem Version of 4.0
program.exe updated with the following configuration information:
Process Affinity Mask: 00000002
To z kolei, oznacza, że dla aplikacji ustalono wcześniej koligację na pierwszy rdzeń oraz, że po aktualizacji zmieniono ją na drugi. Tu znów pojawia się tajemnicza informacja o wersji podsystemu, która wprowadza nieco intrygi w całą sprawę.

Należałoby jeszcze dodać, że oprócz rozwiązywania problemu wielordzeniowości/wieloprocesorowości w starszych aplikacjach, program Imagecfg jest remedium także na intelowską technologię Hyper-Threading (źródło). Jak widać, to małe cacko jest bardzo wszechstronne. Na dowód podam znów przykład Black Dahlii, dla uruchomienia której użycie imagecfg.exe jest kluczowe..., ale odpaleniu tej gry należałoby poświęcić osobny temat.

Na górę