Kuidas ma muutsin enda arvuti kiiremaks... muutes selle aeglasemaks (Versioon 20-22)

2017. aastal oli mul probleem - mu arvutis oli endiselt 1GB operatiivmälu, mehhaaniline 160GB kõvaketas, Intel Core 2 Duo protsessor ja ATI Radeon X1300 Series videokaart, mis küll omal ajal olid piisavalt kiired, kuid 2017. aastaks oli tehnoloogia juba edasi liikunud ja mul polnud veel uut arvutit.

Kuid kasutades ainult Markuse asjad tehnoloogiat ja Windows 7-sse sisseehitatud tööriistu tekkis mul küsimus - kas ma saaksin parandada arvuti käivitumisaega või vähemalt muuta käivitusprotsess kasutaja jaoks läbipaistvamaks?

Kuidas on võimalik buutimist siis kiiremaks muuta?

Laias laastus saab Windowsi arvuti käivitamisprotsessi jagada järgmistesse etappidesse:

  1. Riistvara initsialiseerimine ja kontrollimine (POST ehk Power On Self Test)
  2. Buuditava seadme otsimine
  3. Windowsi alglaadimine
  4. Windowsi operatsioonsüsteemi laadimine
  5. Taustateenuste käivitamine
  6. Käivitusprogrammide laadimine
Esimene asi, mida ma muutsin oli buutimisjärjekord. Seda saab teha arvuti BIOS-i seadistusprogrammis.

Seadistusprogramm minu vanas arvutis

Selleks, et arvuti ei peaks ilma asjata otsima buuditavaid seadmeid viisin ma enda arvuti kõvaketta järjekorras esimeseks ning kui oli vajadus muid seadmeid kasutada, siis sai seda teha eraldi F12 buutimismenüüst. Samuti lülitasin kasutamata SATA seadmed välja, et arvuti neid otsima ei hakkaks. See kõik vähendas BIOS-i aega mingi 5 sekundi võrra.

Kuid mida veel saan ma teha, et enda arvuti buutimisaega vähendada? Üks asi, mida ma tegin just nende taustateenustega oli Windowsi otsingu indekseerimisteenuse väljalülitamine.See ei olnud eriti vajalik ning võttis kõvasti protsessoriaega mu vanas arvutis.

Kasutaja informeerimine sõbraliku ekraaniga

Okei, seni tundub kõik nagu täiesti tavaline protsess, et arvuti buutimist natuke kiirendada. Aga mäletate, kuidas ma mainisin, et kuues oluline etapp on käivitusprogrammide laadimine? Tavaliselt Windows lihtsalt käib ükshaaval käivitusprogrammid läbi ja paneb need taustal tööle. Kuid kas poleks mitte hea, kui me saaksime arvuti kasutajale kuvada, millist programmi me hetkel käivitame ning kui kaugel me käivitusprotsessis oleme?

See ongi see koht, kus tuleb mängu spetsiaalne lahendus, mida ma programmeerisin ise kasutades mõningaid batch faile ja ühte WinForms C#-ga kirjutatud programmi.

Alustame viimasest, mis kuvatakse kasutajale pärast sisselogimist...

StartupLoader.exe ehk maskeeritud õudus

Nagu näete, kuvatakse kohe kiri "Üks hetk palun..." protsessiribadega. Kasutaja saab soovi korral jätkata "soojenemist" taustal või hoopis katkestada terve protsessi ja kasutada arvutit katkises olekus (jõuame selle punkti juurde hiljem tagasi). Olemas on ka linnuke "Sule protsessi lõpus automaatselt", mis paneb akna protsessi lõppedes kinni ja kuvab kasutajale töölaua. Ülemine protsessiindikaator näitab kogu "soojenemise" edenemist, samal ajal kui alumine praegust toimingut.

Lõpuks, kui "soojenemine" on lõppenud, on võimalik vajutada "Valmis" nuppu ja jätkata arvuti kasutamist "normaalselt" (või teine variant on, et programm sulgub ise ja töölaud kuvatakse automaatselt).

Kuidas on see võimalik?

Aeg on nüüd laskuda detailidesse. Kuidas on võimalik tuvastada kui kaua mingi programm käivitub ning üldse mis programm hetkel laeb? Tundub nagu võimatu missioon. Ning seda sellepärast, et see nii ongi. Ükski kolmanda osapoole programm kasutajaruumis ei saa kuidagi teada, mida Windows hetkel käivitab ning kui kaugele on ta sellega jõudnud. Et siis terve see programm on lihtsalt illusioon?

Selleks, et näha, mida see programm tegelikult teeb, kasutame dekompilaatorit Jetbrains dotPeek, mis on mõeldud just .NET raamistikku kasutavate rakenduste jaoks. Avades Form1 koodi näeme sellist pilti:

Pettumust avaldav reaalsus - koodijupp StartupLoader-ist

Nagu näha, siis StartupLoader ise ei tee eriti midagi peale ühe pakkfaili, asukohas "C:\mas\startup_optimize.bat", avamise. Ning isegi, kui me üritame StartupLoader-i käsitsi käivitada, siis näeme sellist ekraani:

StartupLoader.exe käivitamine ilma välise abita

Kuid, miks jääb ta kinni teenuste käivitamise faasi? Kui me avaksime 2017. aastal C:\mas kataloogi, näeksime seal ühte pakkfaili nimega servicestart.bat. See, mida see pakkfail konkreetselt tegema peab ei ole hetkel tähtis, kuid peamine on see, et kui me käivitame selle müstilise servicestart.bat-i, siis käivitatakse üks teine müstiline pakkfail startup_optimize.bat ning protsessiga liigutakse edasi.

Üks asi, mida me koodis näeme on see, et programm kontrollib pidevalt erinevate logifailide olemasolu ning liigub nende eksisteerimisel edasi. Ehk teisisõnu, StartupLoader ise ei tee midagi, tegelik protsess toimub nendes pakkfailides.

Mis tegelikult siin toimub?

Nüüd asume selle lahenduse tegeliku implementatsiooni kirjeldamise juurde. Esimene asi, mida ma tegin oli erinevate Windowsi teenuste täielik väljalülitamine. Mitte käsitsi käivitumine, täielik keelamine. Sinna kuulusid erinevad olulised teenused, mis arvuti käivitumisaega pikendasid. Siis, kui arvuti käivitus ja kasutaja sisse logis, käivitati esimese asjade servicestart.bat, mille eesmärk oli just need teenused sisse lülitada ja käivitada ning seejärel luua fail service.log, mille olemasolu StartupLoader tuvastas.

Teine asi, mida ma tegin oli KÕIKIDE käivitusprogrammide keelamine. Jah, sealhulgas videokaardi ja heli draiverid. See on ka põhjus, miks protsessi katkestamine on ohtlik - võimalik, et seda tehes arvuti lihtsalt ei lae draiverite jaoks vajalikke kasutajaruumi tarkvarakomponente. Seejärel lisasin nad kõik ükshaaval käsitsi pakkfaili startup_optimize.bat. Selle pakkfaili eesmärk oli käivitada need programmid samade argumentidega, kuid pärast iga käivitumist tegi see pakfaili vastava logifaili, mille olemasolu StartupLoader tuvastas ning seejärel lihtsalt ootas mõni sekund. Ooteaeg sõltus käivitatud programmist. Programmi käivitumisel tegin kindlaks mitu sekundit selle programmi käivitamine aega võttis ning lisasin selle aja vastavalt pakkfaili ja StartupLoader-i loogikasse.

Ning see ongi põhimõtteliselt kõik, mis toimus 2017. aastal, kui ma enda arvuti sisse lülitasin. Kuid sellel lahendusel on mitu probleemi, sh uute programmide installimisel ja desinstallimisel tuleb potensiaalselt terve loogika ümber kirjutada ja Windowsi uuesti installimisel tuleb teha palju käsitsi seadistamist, et programm jälle õigesti toimiks. See on ka põhjus, miks hilisemates Markuse arvuti asjade versioonides ma lihtsalt lõpetasin StartupLoader-i kasutamise ja arendamise.

Kuid mis oli asja mõte? Kas see lahendus tegelikult kiirendas arvutit mingil viisil? Mõte oli viivitada programmide käivitamist, et vähendada protsessori koormust ning seeläbi tagada sujuv arvuti kasutamise kogemus kohe pärast käivitumise lõppu.

Allalaadimised huvilistele

Juhul, kui teil tekkis huvi proovida selle vana Markuse asjad komponendi käivitamist virtuaalses arvutis, siis allpool leiate allalaadimise lingi, mis sisaldab StartupLoader.exe faili ja kahte dummy pakkfaili, mis simuleerivad programmide käivitamist (tegelikult nad lihtsalt viivitavad ja kirjutavad logifaile, need tuleb kopeerida C:\mas kausta, mis omakorda tuleb luua, kui seda olemas juba ei ole).

Link: https://drive.google.com/drive/folders/1mSyTbrFT7zVcn6nneDsKwcc3ToiQTeJx?usp=sharing

Kommentaarid