Byla vydána nová verze 1.16.0 klienta a serveru VNC (Virtual Network Computing) s názvem TigerVNC (Wikipedie). Z novinek lze vypíchnout nový server w0vncserver pro sdílení Wayland desktopu. Zdrojové kódy jsou k dispozici na GitHubu. Binárky na SourceForge. TigerVNC je fork TightVNC.
Byla vydána nová verze 4.6 (𝕏, Bluesky, Mastodon) multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v příspěvku na blogu.
Rozsáhlá modernizace hardwarové infrastruktury Základních registrů měla zabránit výpadkům digitálních služeb státu. Dnešnímu výpadku nezabránila.
Čínský startup Kimi představil open-source model umělé inteligence Kimi K2.5. Nová verze pracuje s textem i obrázky a poskytuje 'paradigma samosměřovaného roje agentů' pro rychlejší vykonávání úkolů. Kimi zdůrazňuje vylepšenou schopnost modelu vytvářet zdrojové kódy přímo z přirozeného jazyka. Natrénovaný model je dostupný na Hugging Face, trénovací skripty však ne. Model má 1 T (bilion) parametrů, 32 B (miliard) aktivních.
V Raspberry Pi OS lze nově snadno povolit USB Gadget Mode a díky balíčku rpi-usb-gadget (CDC-ECM/RNDIS) mít možnost se k Raspberry Pi připojovat přes USB kabel bez nutnosti konfigurování Wi-Fi nebo Ethernetu. K podporovaným Raspberry Pi připojeným do USB portu podporujícího OTG.
Konference Installfest 2026 proběhne o víkendu 28. a 29. března v budově FELu na Karlově náměstí v Praze. Přihlásit přednášku nebo workshop týkající se Linuxu, otevřených technologií, sítí, bezpečnosti, vývoje, programování a podobně lze do 18. února 0:15.
Fedora Flock 2026, tj. konference pro přispěvatele a příznivce Fedory, bude opět v Praze. Proběhne od 14. do 16. června. Na Flock navazuje DevConf.CZ 2026, který se uskuteční 18. a 19. června v Brně. Organizátoři konferencí hledají přednášející, vyhlásili Call for Proposals (CfP).
Z80-μLM je jazykový model 'konverzační umělé inteligence' optimalizovaný pro běh na 8-bitovém 4Mhz procesoru Z80 s 64kB RAM, technologii z roku 1976. Model používá 2-bitovou kvantizaci a trigramové hashování do 128 položek, což umožňuje zpracování textu i při velmi omezené paměti. Natrénovaný model se vejde do binárního souboru velkého pouhých 40 KB. Tento jazykový model patrně neprojde Turingovým testem 😅.
Digitální a informační agentura (DIA) na přelomu roku dokončila rozsáhlou modernizaci hardwarové infrastruktury základních registrů. Projekt za 236 milionů korun by měl zabránit výpadkům digitálních služeb státu, tak jako při loňských parlamentních volbách. Základní registry, tedy Registr práv a povinností (RPP), Informační systém základních registrů (ISZR) a Registr obyvatel (ROB), jsou jedním z pilířů veřejné správy. Denně
… více »Evropská komise (EK) zahájila nové vyšetřování americké internetové platformy 𝕏 miliardáře Elona Muska, a to podle unijního nařízení o digitálních službách (DSA). Vyšetřování souvisí se skandálem, kdy chatbot s umělou inteligencí (AI) Grok na žádost uživatelů na síti 𝕏 generoval sexualizované fotografie žen a dětí. Komise o tom dnes informovala ve svém sdělení. Americký podnik je podezřelý, že řádně neposoudil a nezmírnil rizika spojená se zavedením své umělé inteligence na on-line platformě.
Programming stuff. And stuff.
Den začal optimisticky s bug reportem, že jedna operace zabírá na linuxu neskutečné množství paměti (aplikace přeložena pro windows že stejných zdrojaků tímhle bugem netrpěla).
Říkám si, nějaký podivný memory leak. První zvláštní věc byla, že paměť narostla jenom jednou, při opakování daný operace už víc nenarostla. Možná kdesi v paměti zůstala zapomenuta kopie nějaké větší struktury. S debuggerem jsem zjistil že se to děje při vytváření tabulek křížových referencí, ale ani po pečlivém zkoumání jsem nenašel žádný zapomenutý new ani nic podobného.
Tabulky křížových referencí jsou ve zkratce hash_mapa mapující ukazatel symbolu na ukazatel třídy XrefEntry, která obsahuje malý hash_set a dva malé std::sety ukazatelů (malý = řádově do stovky prvků).
Co se dá dělat, podívám se na to s valgrindem. Leak tam nebyl ale ani podle valgrindu. Navíc valgrind ukazuje nárůst jenom o cca 15 MB reachable bloků, jenže top ukazuje nárůst o 300 MB v resident size. Vylučovací metodou zůstala jenom možnost fragmentace paměti. Že něco takového existuje jsem věděl, jenže nikdy předtím jsem na to nenarazil v míře, kdy by se 15 MB malých kousků roztahalo po 300 MB namapovaných stránkách.
Po mnoha náhodných pokusech s tím něco udělat nakonec zabrala výměna hash_set za obyčejný std::set v XrefEntry. Při dané operaci tabulky referencí používají velké množství malých (hash_)setů (jako členy XrefEntry). Instance XrefEntry často vznikaly a zanikaly, tím pádem často vznikaly i členské (hash_)sety, kterých kterých obsah se často měnil (a prudce kolísali ve velikosti, tj. maximum skutečně použité paměti bylo o hodně vyšší než 15 MB malých bloků po skončení operace).
Výhoda std::map a std::set oproti hash_ verzím je nejspíš v tom, že nepotřebuje alokovat extra malé kousky paměti pro buckety (u gcc i msvc je map/set implementován jako červeno-černý strom). Co způsobilo takové roztahaní po paměti byla zřejmě velmi specifická posloupnost alokací a dealokací bucketů u těch hash_setů a std::allocatoru to moc nesedlo.
Zkusil i jiné implementace map a setů. Např. boost::unordered_set měl v daném případě podobné problémy, ale roztahanost po paměti byla menší asi o 25%. Pro zajímavost, tady je porovnání několika dalších implementací (hash) tabulek:
Comparison of Hash Table Libraries
Hash tabulky mají konstantní složitost vkládání/vyhledávání/mazání, člověk by čekal že budou o hodně rychlejší než třeba červeno-černý strom s logaritmickou složitosti vkládání/vyhledávání/mazání. Prakticky u skutečných implementací musí být záznamů v tabulce hodně (nejméně desettisíce), aby byla hash tabulka rychlejší (extra režie). Neměřil jsem samozřejmě všechny implementace, ale boostí unordered a STL implementace (gcc, msvc) se chovají takhle.
Tiskni
Sdílej:
Njn, ja to cetl asi pred rokem kdyz jsem ten problem s fragmentaci pameti resil (taky jsem potreboval sablonoidne struktury, tim padem glib a ghthash vypadli). IMHO udelat poradny benchmark je neskutecne prace (proto vetsina benchmarku vypada tak jak vypada). Vzdy je lepsi (nebo spis nutny) si vsechno premerit (jine podminky, jine vysledky).
STL je urcite implementovana jako soucast gcc/msvc (i kdyz treba existuji separatni implementace jako STLport). C++ sablony navic ani nejde kompilovat (do strojoveho kodu; jedine do predkompilovanych headeru) pokud se neudela konkretni instanciace.
Na druhe strane implementace sablon urcite pouziva funkce z glibc (treba malloc/free pres new/delete a std::allocator), tim padem vykon znacne zavisi i od glibc.
Taky mam domnenku, ze od glibc zavisi rychlost vyjimek (tohle nemam jeste vyreseno, urcite jde o nejakou kombinaci z trojice glibc, binutils, libgcc_s.so), viz nasledujici pripad (__cxa_throw a _Unwind*):
Obe mereni je stejny testcase (specialni extremni pripad s 70000 vyjimkama, nemilujete proste specialni pripady?
). Vzdy prelozeno s gcc 4.1.2 (libgcc_s.so je soucasti gcc, tim padem i stejna libgcc_s.so odkud jsou _Unwind* funkce). Jednou na CentOS 4 s glibc 2.3.4 a jednou na CentOS 5 s glibc 2.5. Jedina rozdilna vec krome glibc jsou jiny verze binutils. No a ta CentOS 5 verze beha v danem pripade vic nez 5x rychleji.
(Nejspis ten problem s vyjimkama bude mat neco do cineni s timhle: http://gcc.gnu.org/ml/gcc/2005-02/msg00627.html ).
Pozn. v tech grafech pochazeji vsechny funkce pod __cxa_throw z libgcc_s.so krome dl_iterate_phdr (je z glibc) a __gxx_personality_v0 (je z libstdc++ i s uzlem pod nim).
Na druhe strane implementace sablon urcite pouziva funkce z glibc (treba malloc/free pres new/delete a std::allocator)
Ne nutně. Na unixových systémech to tak nejspíš většinou bude, ale nemusí to tak fungovat všude. Standardní C++ knihovna může být teoreticky naprosto nezávislá na standardní C knihovně.
Prilis si neumim predstavit jak by se implementovalo new/delete nebo std::allocator bez malloc nebo mmap. Snad jedine primym volanim do kernelu (pres preruseni), co je prilis low-level pro standardni C++ knihovnu.
malloc() a free() v libc. Uvědomte si, že C++ je jazyk zcela nezávislý na C, teoreticky byste mohl mít C++ i na platformě, kde vůbec neexistuje překladač céčka, a tedy ani standardní C knihovna. Koneckonců dřív používala i řada projektů psaných v C své vlastní náhražky za systémové malloc() a free() a autoři to zdůvodňovali tím, že jejich implementace jsou efektivnější, což by nebylo dost dobře možné, kdyby to byly jen nadstavby nad těmi systémovými implementacemi.
Tak tady doslo asi k nedorozumeni. Ja puvodne psal o zavislosti na glibc uz jenom proto (pripad Linuxu), ze na preimplementovani malloc/free potrebujete nejakou systemovou funkci jako mmap/brk, abyste mel _nejakou_ pamet nad ktorou postavite vlastni malloc/free. A mmap/brk je taky soucasti glibc (jinak musite volat kernel primo pres preruseni/syscall).
A mmap/brk je taky soucasti glibc (jinak musite volat kernel primo pres preruseni/syscall).
Odpověděl jste si sám: ty funkce nejsou nic jiného než wrappery nad příslušné syscally. A použití céčkových wrapperů není principiálně nutné. Navíc se na to pořád díváte příliš linuxocentricky.
True
Dival jsem se na na jiny implementace new, snad vsechny bezne non-embedded systemy volaji nejakou verzi malloc (vratane msvc). Pak jsem disassembloval mmap, abych videl ze nema extra rezii. K alokatorum se jeste dostanu.
BTW nechapu tvrzeni "Standardní C++ knihovna může být teoreticky naprosto nezávislá na standardní C knihovně." AFAIK musi C++ alespon implementovat vsechny funkce C, treba taky malloc?
malloc() mezi nimi sice je, ale neznamená to, že musí jít o stejnou implementaci jako v libc. Vztah mezi funkcí malloc() a operátorem new je takový, že malloc() nesmí k alokaci použít new
The functionsale na druhou stranu se výslovně uvádí, že není specifikováno, zda operátorcalloc(),malloc(), andrealloc()do not attempt to allocate storage by calling::operator new().
new používá malloc() nebo ne
Whether the attempt involves a call to the Standard C library function malloc is unspecified.
Takže operátor new může být nadstavba nad funkcí malloc(), ale stejně tak na ní může být úplně nezávislý. Funkce malloc() ale nesmí být implementována pomocí operátoru new, IMHO kvůli tomu, aby bylo možné beztrestně overloadovat new vlastní verzí využívající malloc().
<stdint.h>. V C++ programu se obecně nemůžete spolehnout na to, že je budete mít k dispozici (ani ty, jejichž dostupnost garantuje norma jazyka C).