Mostrando postagens classificadas por relevância para a consulta real time. Ordenar por data Mostrar todas as postagens
Mostrando postagens classificadas por relevância para a consulta real time. Ordenar por data Mostrar todas as postagens

Qual a diferença entre Low Latency e Real-Time no Linux?

Qual a diferença entre Low Latency e Real-Time no Linux?

Qual a diferença entre kernel Low Latency e kernel Real-Time no kernel Linux?


 Com o lançamento do Ubuntu vindo com kernel real-time, surgiu em minha ultima live a duvida na diferença entre kernel Low Latency e kernel Real-Time no Linux. E se trata de uma pergunta muito interessante já que ambos proporcionam performance. Então, o que diferencia um do outro? Aqui vamos nós tentar explicar. 
Primeiro, o que temos que entender é que ambos são real-time. Como já dito, ambos foram desenvolvidos para proporcionar melhor performance, porém, com características e propostas diferentes. Vamos então entender primeiro o que é o real-time.

Kernel real-time

 O kernel real-time visa garantir o máximo de resposta dentro do menor tempo possível. De acordo com a documentação do RHEL8, "em muitas cargas de trabalho, o ajuste completo do sistema melhora a consistência dos resultados em cerca de 90%." ... "Ajustar o kernel padrão produzirá 90% dos possíveis ganhos de latência. O kernel Real Time fornece os últimos 10% de redução de latência exigida pelas cargas de trabalho mais exigentes."


 Mas há um problema com o real-time. O kernel real-time pode acabar sacrificando o rendimento e a eficiência energética. Na mesma documentação da Red Hat descreve que "Há alguma sobrecarga adicional do kernel associada ao kernel real-time. Isto se deve principalmente ao tratamento de interrupções de hardware em threads agendados separadamente. O aumento da sobrecarga em algumas cargas de trabalho resulta em certa degradação no rendimento geral. A quantidade exata depende muito da carga de trabalho, variando de 0% a 30%".

Kernel Low Latency

 Já o kernel low latency tem como propósito priorizar as tarefas mais sensíveis e minimizar o tempo que os processos são executados (essa é a ideia de low latency – reduzir o tempo de resposta). De certa forma, low letancy acaba tendo o desempenho um pouco menor, porém, tendo melhor garantia. O kernel low latency é ideal para quem quer trabalhar com aplicações multimédia, jogos, entre outras, mesmo consumindo mais energia que o kernel genérico. Para se ter uma ideia do ganho de performance com o kernel low latency e da garantia de eficiência de energia, é que ele é utilizado até mesmo em embarcados.

Conclusão

 O kernel low latency também é real-time assim também como o kernel real-time também é low latency (ambos focam em performance) e isso pode inicialmente confundir a cabeça das pessoas. Porém, apesar do proposito de ambos ser o mesmo, cada um foi projetado com propostas diferentes, o que acabou por definir a distinção. Se você precisa de performance sem sacrificar eficiência energética, o kernel low latency é a melhor opção enquanto o kernel real-time serve mais para ambientes críticos onde o tempo faz toda a diferença. Já eficiência energética e calor gerado por isso acabam não sendo o problema sendo que esses ambientes são refrigerados.

 Quero aproveitar e indicar o projeto tuned que permite otimizar seu computador para obter melhor desempenho através de seus recursos como latency-performancy ou network-latency, permite otimizar seu desktop, para uso de streaming e muito mais.


O comando tuned-admin
O comando tuned-admin


A lista de recursos do tuned
A lista de recursos do tuned

PX5: Um dos melhores RTOSes do mercado

PSX5: Um sistema operacional Real Time ótimo para embarcados

PX5: Um sistema operacional Real Time ótimo para embarcados

 Em 2017 eu havia postado um artigo que, devido ao tamanho do Linux, RTOSes (Real Time Operating System = Sistemas Operacionais em Tempo Real) estavam ganhando mais destaque em IoT do que o Linux. Foi apresentado soluções de reverter essa situação reduzindo tanto o tamanho do kernel quanto do filesystem. Mas os RTOSes voltam a ganhar destaque; especificamente o PX5.


 O PX5 é um RTOS da quinta geração projetado para aplicações em embarcados como semáforos, mutex, fila de mensagens e IoT. Focado em tamanho, desempenho, segurança e proteção reduzindo o time-to-market, melhorando a qualidade de firmware e aprimorando a portabilidade entre plataformas.

 No site oficial do PX5 é descrito que:

 "Liinux é um dos sistemas operacionais mais populares no ambiente de embarcados detendo a marca de 70% deste mercado. Porém Linux é muito intensivo no uso de memória e de processamento dentro deste tipo de plataforma".

 E não; antes que algum apaixonado se manifeste, utilizar Rust NÃO solucionaria este problema. O que pode ocorrer na verdade é o contrario; os binários Rust são simplesmente enormes. A ideia do PX5 é trazer as pthreads da API POSIX encontrada em embarcados Linux para dentro do RTOS em dispositivos com recursos limitados.

PX5 RTOS + Linux Pthread
PX5 RTOS + Pthread do Linux

 Por esse motivo, o PX5 foi construído sobre a implementação das pthreads e tambem oferece extensões real-time como event flags, queues rápidas, cronômetros, e gerenciamento de memória. 

 Implementado sob funções da linguagem C, PX5 é um dos menores RTOSes dependendo de menos de 1KB de FLASH e 1KB de RAM em microcontroladores de 32 bits à 80MHz. O PX5 também é extremamente rápido e eficiente podendo completar o seu carregamento em menos de um microsegundo (podendo ser instalado e utilizado em minutos) além de conseguir determinar quais threads serão ou não necessárias para o dispositivo.

 O PX5 é projetado explicitamente para segurança em proteção incluindo a tecnologia patent-pending Pointer/Data Verification (PDV) que é uma técnica que ajuda a detectar e mitigar corrupção de memória intencional ou acidental. 

PX5 design
Design do PX5

 Seu código é também simples e fácil de manter. Devido sua API consistir em implementações nativas da pthreads POSIX, suas aplicações são facilmente portáveis tanto para Linux quanto para outros RTOSes. Muitas empresas já são parceiras do PX5 tanto em provedores de núvem, Semiconductores, embarcados e consultorias. Há também o Zephyr que é financiado pela Linux que eu pretendo abordar aqui no blog. Até a próxima, povo.


HAMMER 2 é melhor que o ZFS, Btrfs ou Ext4?

AqueleQueEmpunharEsteMarteloSeForDignoPossuiraOpoderDoDragonflyBSD
“Aquele que empunhar este martelo, se for digno, possuirá o poder do DragonflyBSD”.
 Durante o vídeo sobre FreeBSD ser melhor que Linux, surgiu a pergunta se o HAMMER 2 é um sistema de arquivos melhor que o ZFS, o Btrfs e o Ext4. Respondendo a essa pergunta, decidi elaborar um vídeo que assistirão aqui mesmo neste artigo.

 No Capitulo 1 Introduction - Em "What Can DragonFly Do?" é dito que:
"O HAMMER filesystem, padrão do DragonFly BSD, é o sistema de arquivos mais poderoso e mais confiável disponível em qualquer sistema operacional. Ele pode lidar com arquivos acima de um exabyte (ou 104876 tebibytes) e pode automaticamente se recuperar sem a necessidade da execução do fsck."
 Apesar de um sistema de arquivos realmente muito bom, desenvolvido e implementado em um perídio de tempo muito curto e com tamanha quantidade de recursos interessantes, eu honestamente não teria tamanha ousadia em dizer o mais poderoso e mais confiável. Apesar disso, não posso deixar de dizer que, sim, é muito poderoso e muito confiável.

 Prova disso é que há um link no próprio site do projeto intitulado Comercial que exibe seis empresas de países como Estados Unidos, Canada, Áustria, Alemanha, Itália e Reino Unido que utilizam o DragnflyBSD em ambientes de produção e para propósitos diferentes. Além das já citadas  no link do próprio site, há também um link que ficou (digamos) oculto dentro de Docs intitulado "Servidor de Backup em tempo real para clientes Microsoft Windows, Linux, Bsd  e Mac Os X" que poderia ter sido vinculado ao link anterior expondo assim melhor esse caso de sucesso.

 Trata-se de casos das empresas HIFX IT and Media Services PVT.LTD, Virtual Training Company e IPLOTZ que fazem uso do DragonflyBSD como servidor de arquivos Samba para realizar os backups de seus snapshots. Nesse link é possível conferir o cenário das empresas, o planejamento, a implantação e o resultado final que é o print abaixo:
Servidor de Backup em tempo real para cliente Microsoft Windows, Linux, Bsd e Mac Os X
Resultado da implantação do servidor de Backup em tempo real para cliente Microsoft Windows, Linux, Bsd e Mac Os X.
 Além de todos esses casos de sucesso do DragonflyBSD e do HAMMER/2 em ambientes de produção, podemos destacar também o compressor LZ4 que menciona o HAMMER como um de seus portifólios (e convenhamos, estar nessa lista ao lado do ZFS não é pouca coisa).
HAMMER 2 no site do LZ4
HAMMER 2 no site do LZ4
 OK, mostrado o máximo de qualidade e de sucesso do HAMMER /2, agora vamos ao cerne da questão. Para isso, elaborei um vídeo com informações interessantes. Confiram aí:

3 SISTEMAS OPERACIONAIS QUE NÃO SÃO ESCRITOS NA LINGUAGEM C

3 SISTEMAS OPERACIONAIS QUE NÃO SÃO ESCRITOS NA LINGUAGEM C
3 SISTEMAS OPERACIONAIS QUE NÃO SÃO ESCRITOS NA LINGUAGEM C

 Esse é mais um artigo que tive inspiração de escrever após o vídeo sobre Solaris e FreeBSD serem superiores a todos os sistemas operacionais... O primeiro artigo foi sobre recursos que somente Linux possui e em mais nenhum outro Unix (e nem a API POSIX). Já esse eu conto três sistemas operacionais que não são escritos em linguagem C. A linguagem C se torna quase padrão quando se trata do desenvolvimento de um sistema operacional, só que aqui mostramos que isso não é necessariamente uma ordem (ou pelo menos, grande parte de OS).

 MenuetOS é um sistema operacional de kernel monolítico pre-emptivo, real-time, multiprocessador e escrito inteiramente na linguagem assembly (vale duas ressalvas; a primeira que seus headers podem ser escritos em qualquer linguagem, a segunda é que o MenuetOS não é um Unix e nem segue a especificação POSIX).

 A ideia e vantagem em se trabalhar com uma linguagem de baixo nível eliminando camadas extras do sistema operacional. O resultado disso é um sistema operacional muito pequeno (uma imagem de apenas 1.4MB), extremamente rápido e evitando certos bugs.

 Trabalhar com desenvolvimento de baixo nível realmente proporciona melhor desempenho devido estar acesso diretamente ao hardware. O Ninja Build, que já tratei no canal e aqui no blog, é a exata prova disso; foi desenvolvido no Google para substituir o GNU make e acelerar o processo de compilação do port Google-Chrome para Linux. O Mantle da AMD e o Vulkan são outros grandes exemplos práticos de ganho de desempenho por trabalhar em baixo nível.

the horse turns aout a little basic but boy, can it run
o cavalo fica um pouco básico. Mas, cara, ele corre.

 O MenuetOS possui suporte a TPC/IP, suporte SMP para 32 CPUs diferentes, multithreading, ring-3 protection, driver gráfico, driver de áudio, biblioteca C, biblioteca de matemática e muito mais.  Conferindo os prints, podemos dizer que é um OS até bonito com bordas semi transparente.





 Não é de hoje que existe sistema operacional escrito em Assembly; o Unics (que depois recebeu o nome de Unix) foi escrito inicialmente em Assembly. Linus Torvalds desenvolveu seu emulador de terminal na linguagem Assembly para poder aprender sobre seu processador.

 O problema e  desvantagem de se escrever um sistema operacional em tal linguagem de baixo nível é que toda vez que utilizá-lo em um computador diferente (mesmo em uma sub arquitetura diferente), será necessário reescreve-lo totalmente do zero. Logo abaixo podemos conferir dois exemplos de "Hello World" em Assembly para dois computadores diferentes (o DEC PDP-8 e o DEC PDP-11).

 Foi aí que Ken Thompson teve a ideia de criar uma linguagem de programação para permitir o reaproveitamento do código entre os computadores diferentes bastando somente compilá-lo. Então Ken se baseou na linguagem BCPL para criar a linguagem B que, com a ajuda de Denis Ritchie, a amadureceram, a aprimoraram e veio a se tornar a linguagem C.

 O sistema operacional está sob licença própria definindo-o somente para uso acadêmico e, se caso quiser utilizar para fins comerciais, deve pedir autorização formal do projeto para isso. Já a versão de 32 bits (que está chegando ao seu fim) está sob GPL (fim da GPL mesmo).

 Há um fork  do MEnuetOS chamado KolibriOS que, honestamente, não entendi a real proposta do projeto.


 Redox é um sistema operacional Unix-like microkernel que não segue as normas POSIX e é escrito na linguagem Rust. Possui os sistemas de arquivos RedoxFS com implementações do TFS (inspirado no ZFS), suporte a compatibilidade de binários Linux, seu proprio XFS, servidor gráfico Orbital e etc...


 Está sob licença MIT como principal, GPLv2 para GNU Unifont, GPLv3 para os ícones Faba e Moka, Open Font License 1.1 para Fira font,  um numero de licenças free software e BSD para a Newlib C library (ou seja, nem tudo do RedoxOS é Rust) e BSD 2-clause para o NASM (e uma parte que não é mencionada em sua docmentação, GPLv2 para a sua parte de isoLinux que é outra parte que não é Rust).

 A ideia por trás do sistema operacional é a inovação tecnológica tendo suas inspirações no Plan9, no Minix, no Linux e nos BSDs. Na verdade suas motivações de coisas que não gosta nesses sistemas operacionais. O time tem como argumento que apesar que o Linux domina o mundo, Linux não é ideal para inovação... Os BSDs lideraram muitas a inovações nas ultimas duas décadas... com coisas como o Jails e o ZFS... Mas como seu kernel também é monolítico, cai no mesmo conceito. O Minix é bem dentro dos mesmos conceitos mas é escrito em C. Se bem que os argumentos apresentados não são tão reais o quanto alegam; confiram no vídeo abaixo que eu debato por que:

 Aqui será aplicado um video que irei gravar para debater o que é verdade ou não sobre o que a comunidade REdoxOS diz em seu Doc:


JX system

 É um sistema operacional microkernel que podemos dizer ser uma prova de conceito, para demonstrar que é possível um sistema operacional completamente em Java mantendo boa qualidade de desempenho. Completamente em partes pois seu microkernel é escrito em C e Assembly (ou Assembler) devido a rotinas de baixo nível que não podem ser fornecidas pela linguagem Java como system initialization após o boot, saving and restoring CPU state, low-level protection-domain management e monitoring.


 Inicialmente o projeto rodava sobre Linux e que depois passaram a portar as ferramentas do Linux para o metaXaOS.

 Em Benchmarks realizados, o JX atingiu entre 40% à100% do desempenho do Linux em file system e em torno de 80% no NFS (fora outros testes realizados).

Benchmarks realizados entre o JX e o Linux.
Benchmarks realizados entre o JX e o Linux.
 Possui licenças mistas como JX Ltd e GPLv2 e bom, se a ideia é ter um sistema operacional que rode Java, o Android já é uma prova disso (só que não por completo) além da Sun Microsystem já ter tido o JavaOS. Moral da história é que não se dá para ter um sistema operacional escrito em uma unica linguagem (nem mesmo os que apresentei são isentos disso). O Linux mesmo é escrito em linguagens diferentes como C, C++, Objective-C, Assembly e outras. O importante mesmo é saber aonde devidamente aplicar cada uma.

Linguagens que o kernel Linux é escrito.
Linguagens que o kernel Linux é escrito.


XanMod Kernel agora abrangendo novos ramos

Logo do dragão do XanMod Kernel
XanMod Kernel agora abrangendo novos ramos
 XanMod kernel, segundo o autor do projeto, trata-se de um kernel de tempo real que é mais eficiente na redução dos tempos de resposta pois a redução, ou até a eliminação das latências, abrangerá em todas as camadas do sistema resultando em maior estabilidade e precisão de frame rate e comandos ao jogo assim, oferecendo para o usuário, uma experiência de “maior conexão de pessoa com hardware”.
“Quero oferecer um Linux mais robusto e poderoso para aplicações de jogos e produção. O objetivo é simples, atrair um maior público gamer para o ambiente Linux.”

 Os recentes lançamentos de placas de vídeo da AMD e Nvidia trazem agora em seus drivers para Windows um novo recurso de redução do tempo de resposta (Input-Lag) que seria o atraso que existe entre uma ação realizada em um dispositivo de entrada como o mouse ou teclado e a exibição da ação na tela do computador. Porém essa hack, para reduzir à latência via driver, abrange apenas uma ou mais camadas especificas de execução do kernel do Windows.

 O projeto XanMod agora possui um novo segmento do kernel Linux, uma versão real-time (RT), focado para o público mais profissional e entusiastas que precisem executar aplicações de tempo crítico em desktops como produção ao vivo, streaming, e principalmente jogos de eSports.
Baixe o XanMod kernel
 O novo kernel possui as mesmas características do segmento LTS, mas agora com adição dos patches PREEMPT_RT para preempção básica em tempo real para desktops.

Rust no kernel Linux: A guerra sem trégua

Strap in, get ready for more Rust drivers in Linux kernel

Rust no kernel Linux: A guerra sem trégua

 Em 2023 eu escrevi o artigo Rust no Linux: Um caso de amor e ódio e depois dessa nova temporada de Rust no kernel, eu estava pensando em fazer um vídeo porém, como ando muito ocupado, preferi escrever aqui no blog mesmo.

 Bom, a treta de Rust no kernel Linux continua. Tentaram de todas as formas e contra todos os gostos promover Rust no kernel Linux, houve resistência por parte de muitos desenvolvedores e até mesmo de Linus Torvalds mas por fim, foi feita a adoção. Depois disso houveram novos problemas, o principal responsável por Rust no kernel saiu do projeto e em Fevereiro desse ano, começou o processo tudo de novo; ninguém dá trégua nessa bagaça. Muitos desenvolvedores não apoiam sua adoção mas a cartada final dada por Greeg Kroah-Hartman:

"Adicionar outra linguagem não deveria ser um problema, já lidamos com coisas muito piores no passado."

"Sim, bases de códigos de linguagens mistas são grosseiras e difíceis de manter, mas somos desenvolvedores de kernel, droga. A gente vem mantendo e fortalecendo o Linux por mais tempo que qualquer um já pensou que fosse possível"

 Não tem como discordar do Gregg nesse ponto já que nós sysadmins passamos bastante por situações parecidas, mas alguns até mesmo abandonaram o desenvolvimento como Karol Herbst que deixou o desenvolvimento do driver nouveau depois que adotaram o driver Nova como substituto do Nouveau; Christoph Hellwig bateu de frente com todos (inclusive com Linus) e esse debate parece não tem fim.

 Estamos em um período de transição na tecnologia onde novos processadores, novos chips e novas linguagens estão surgindo. Muito se fala hoje em dia sobre segurança de memória (apesar que este assunto já dura mais de 30 anos) e seus benefícios; Em 2017 foram reportados cerca 40 CVEs somente do kernel Linux relacionados a falhas de segurança de memória. Então, se for para o bem, sim eu acredito que uma linguagem que possua recursos relacionados a segurança de memória deva ser adotada no desenvolvimento do Linux, mas Rust não é esta linguagem; outras linguagens são muito mais interessantes para se integrar ao kernel Linux do que Rust, como é o caso de Lua e Nim. Bom, o argumento que podem apresentar é que Lua é uma linguagem interpretada por scripts. Sim, porém o NetBSD possui drivers escritos em Lua, o carregador de boot do FreeBSD é escrito em Lua e o interpretador do rpm é escrito em Lua:


 Lua é uma linguagem que facilmente se comunica com a linguagem C e C se comunica com tudo; geralmente é comum incorporar códigos C a alguma aplicação Lua para se comunicar com outras coisas. Lua na verdade já nasceu tendo como uma de suas características ser amigável com a linguagem C; inclusive um dos melhores recursos da linguagem Lua é exatamente o design de sua API que lhe permite integrar seu código a bibliotecas C ou fazer com que scripts Lua sejam executados de forma muito rápida junto ao código C dos jogos. Alias, se precisar portar seu código Lua para C, se torna uma tarefa muito mais fácil do que qualquer outra linguagem. E SIM, LUA POSSUI SUPORTE A SEGURANÇA DE MEMÓRIA!

 Eu conheci Lua por volta de 2007 ou 2008 em um PDF como uma linguagem para integrar a linguagem C e fazer coisas que a linguagem C não faz; depois eu descobri que Lua já era amplamente utilizada em muitas aplicações como desenvolvimento da maioria dos jogos (inclusive liderando a parte de scripts de jogos e já até ganhou prêmios na parte de jogos), aplicações industriais, estações espaciais e petrolíferas, sistemas embarcados, os sites Wikipedia e Github são implementados em Lua, Netflix faz forte uso de Lua, Adobe Photoshop Lightroom, Ultradefrag, VLC, nmap, wireshark (1, 2), snort (1, 2), Metaplace, teclados da Logitech. Lua é um grande caso de sucesso e mais presente do que imaginamos sem essa necessidade de propaganda e comoção que foi feito em cima de Rust.

 Nim é outra linguagem muito mais apropriada e interessante para o kernel Linux (existem ao menos dois sistemas operacionais escritos em Nim) e seus recursos únicos, que eu vou descrever mais a frente, são muito mais interessantes do que Rust.

 Muitos projetos se beneficiarão de Rust e há exemplo real disso que é o caso do Android que se beneficiou de Rust tendo redução de 76% para 24% de seus bugs; por outro lado o port do fish shell de C++ para Rust não resultou em nenhum benefício, não entregou nenhum novo recurso e quando estes surgiram, não estavam vinculados a linguagem Rust... já por outro lado, outros projetos poderão ser afetados ao adotar Rust tanto que há programas que estão sendo migrados de Rust para outras linguagens como é o caso do gerenciador de pacotes da distribuição Glaucus Linux que foi portado de Rust para Nim (sintax mais simples e mais fácil de manter, melhor desempenho e menos uso de memória, de CPU) e a linguagem Roc que está sendo reescrita de Rust para Zig pela sua eficiência no processo de compilação ser maior e possuir menos dependências (1; 2. Valeu Nilton por compartilhar estas informações); o projeto Prisma que migrou de Rust para JavaScript e que tornou seu código 90% menor, mais de 3,4 vezes mais rápido, utilizar menos uso de CPU, ter menos complexidade no deploy e mais fácil de a comunidade fazer contribuições (23 de Julho de 2025: Prisma ORM Rust to TypeScript Migration: Rationale, Benchmarks, & GA launch, Prisma ORM without Rust: Latest Performance Benchmarks). Outro grande exemplo de projeto que foi prejudicado ao adotar Rust é o Ubuntu que ao adotar o Rust coreutils, teve seu desempenho afetado em até 17 vezes se comparado com as ferramentas tradicionais.

 É questão de adotar o que se adéqua ou não a necessidade corretamente (aprendam isso). Honestamente, esta terceira opção é a mais provável que venha acontecer com o kernel Linux. Sim, eu vejo isso acontecer e sou bem pessimista quanto a Rust.

 Não é de hoje que tentam substituir a linguagem C como menciona o próprio autor da linguagem C Plus Prolog (ou simplesmente C+P) que descreve sobre a  linguagem C como sendo a única linguagem útil* (*portável, com desempenho que mais se aproxima de Assembly e consegue se comunicar com tudo) e que cientistas vem tentando há quase 50 anos encontrar uma solução para (digamos) substituir a linguagem C. E alguns até criaram C mais parecida com a linguagem Prolog e outros criaram o inverso, Prolog parecido com C."

 O grande problema não é a linguagem Rust, o problema é mais uma questão psicológica. Os usuários estão querendo adotar Rust de forma eufórica e irracional, sem pesar na balança as vantagens e desvantagens assim como todas as linguagens possuem, sem pensar nas consequências; só estão querendo adotar acreditando que Rust é a oitava maravilha do mundo que solucionará todos os problemas da humanidade. A maioria não são desenvolvedores e os que são, além de nunca nem mesmo terem explorado o real potencial da linguagem C, estão cheios de amores por Rust... Rob Landley, autor do toybox que eu sempre menciono, disse em seu artigo de 21/09/2024 da melhor forma:

"Eu desisti de Rust porque todo puritano de Rust que eu encontro há anos trata NÃO escrever código em Rust como um pecado... ...A multidão "all must rust away" não conseguem explicar as vantagens de Rust a não ser "não é C"...

 A única coisa que vemos é essa frescura de "rewrite in Rust", o que é uma bela de uma burrice já que o kernel Linux possui quase 1 Gigabyte somente de código na linguagem C. Levariam vários anos só para porta-lo para Rust e mais muitos outros anos somente para torna-lo estável (reescrever drivers será uma mão de obra intensa e que introduzirá mais problemas do que soluções — reescritas sempre introduzem bugs). Por vezes eu já vi desenvolvedores sugerir aos desenvolvedores de Rust desenvolverem as mesmas soluções do zero ao invés de ficarem querendo reescrever tudo em Rust. O autor da linguagem Hare sugeriu:

"Um grupo motivado de talentosos desenvolvedores de sistema operacional em Rust poderiam construir muito rápido um kernel compatível como Linux do zero e sem necessidade de se envolverem na política LKML"... 

"Eu acho que se o montante de esforços sendo colocados no Rust-for-Linux fossem aplicados em um novo sistema operacional compatível com Linux, poderíamos ter algo pronto para produção para alguns casos de uso dentro de alguns anos."

..."desenvolver um sistema operacional baseado em um design comprovado como o do Linux é muito mais fácil e pode ser feito muito rápido. Eu trabalho em meu próprio sistema operacional de novo design (um microkernel) há alguns anos e ainda está travado no design e precisa urgentemente ser repensado; por outro lado eu escrevi um clone aceitável do Unix em menos de 30 dias."

 O MIT também já desenvolveu um kernel assim chamando Biscuit o e apresentou no Usenix de 2018. Biscuit é kernel monolítico POSIX escrito na linguagem Go e é tão compatível com Linux que roda as aplicações do próprio Linux sem nenhuma necessidade de modificação do código fonte das aplicações. Por que a galera de Rust não acata essa proposta? Outro grande exemplo de escrever algum programa do zero e não de porta-lo é o bzip2; no meu artigo Qual o futuro do Bzip2? descrevi que os novos mantenedores foram questionados se portariam bzip2 para Rust, o que foi respondido que eles preferem trabalhar no suporte a multithreading em C, que para Micah é algo que seria muito interessante principalmente nas futuras versões 1.2 ou 2.0, do que qualquer coisa em Rust (lembram-se que eu mencionei que muitos que estão cheios de amores por Rust nunca nem mesmo exploraram o real potencial da linguagem C? Aqui está uma prova disso) e por fim foi indicada a implementação do Bzip2 em Rust desenvolvida do zero.

 Lanldey também argumenta sobre o desenvolvimento de um sistema operacional escrito em Rust do zero e ainda apresenta a percepção das intenções da comunidade Rust:

"Se quizerem escrever um novo sistema operacional inteiramente em Rust, com kernel e userspace e toolchain, tudo em Rust, eu respeitaria isso e desejaria tudo de bom para eles. Mas não é o que eles querem. eles acreditam que lhes é devido Linux e eles querem sequestrar Linux (ainda que majoritariamente escrito em C)"... ..."E eles acreditam que ADICIONAR COMPLEXIDADE ADICIONAL resultará em sistemas melhores"

 Sim, essa é percepção que se passa; não é que querem ter uma linguagem secundária no kernel Linux com a intenção de melhorar sua segurança e sim de aos poucos dominar o kernel substituindo todo o código por Rust para se autopromover. Rescrever algo em Rust pode se tornar uma cilada; imaginem a complexidade será reescrever o código rust para outra linguagem; você pode acabar ficando atrelado a ela (coincidência ou não, já vi desenvolvedores reclamando de coisas parecidas do projeto GNU).

 O que esquecem de nós contar é exatamente os contras da linguagem: Curva de aprendizado terrível; difícil de debugar; complexa (não é a toa que o autor do minibase diz que o Rust coreutils o forneceu uma grande inspiração por lhe mostrar como não escrever o coreutils); tempo de compilação enorme; ecossistema pequeno; otimizada para a maioria dos processadores i686 e x86_64 porém, em outras plataformas como armel, armhf, armv7, mips{64}, powerpc{64} e riscv{64} carece de suporte de primeira classe, fora "recursos" de Rust que podem causar erros e bugs no LLVM; utilizar  HLL pode causar perdas de desempenho, uso excessivo de CPU, memória e I/O; foram o tamanho dos biários ser enorme.

rust coreutils
Diferença de tamanho dos binários UUtils e toybox



 Se gabam unicamente de segurança de memória sem mencionar à que custo... E tudo tem um custo. O artigo The benefits and costs of writing a POSIX kernel in a high-level language faz uma ótima análise descrevendo os benefícios de escrever seus programas e sistemas operacionais em linguagens com segurança de memória ao custo de sacrificar o desempenho que foi de 5% a 15%. Segurança de memória pode também afetar os seus programas; o autor da linguagem C3 descreve em seu artigo Por que eu parei tudo e comcei a escrever  em C de novo:

"...Quem consegue escrever um jogo de estratégia com milhares de units cada tendo sua própria versão de mundo sem ter um garbage collector rodando o inferno? De fato meu amigo tentou escrever o jogo e falhou. Garbage collectors são péssimos e todos os meu projetos em Lisp possuem aplicações muito limitadas apenas por causa do garbage collector. ..."

 Ok, o segundo argumento que podem querer apresentar é que Rust não utiliza garbage-collection por acreditarem não ser um recurso eficiente. Ao invés disso, Rust aplica a técnica de analisar o código fonte durante o processo de compilação para garantir que não haja brechas de segurança; PORÉM este tipo de recurso já é empregado na linguagem C há muito, mas muito tempo. A biblioteca dietlibc emprega ao menos seis linker warnings (avisos) durante o processo de compilação para ajudar os desenvolvedores escrever melhores códigos:

  1. Avisa se assert for utilizado (pode indicar debug code)
  2. Avisa se stdio for utilizado (bloat)
  3. Avisa se sprintf for utilizado  e indica utilizar snprintf por ser melhor e mais seguro¹
  4.  Avisa se *printf/*scanf for utilizado (bloat e recomenda utilizar -lowfat)
  5. Avisa se system for utilizado (risco de segurança)
  6. Avisa se mktemp/tempnam/tmpnam for utilizado (race condition)

 E esse é um dos grandes problemas; Rich Felker, autor da biblioteca musl, descreveu em seu artigo intitulado Overcommit que "há um monte de mal entendidos relacionados a gerenciamento de memória no Linux que levam à um monte de programas ruins que falham de forma robusta com condições de baixa memória e geram mitos". OK, gerenciamento de memória e segurança em memória são coisas diferentes, mas a mesma situação se aplica-se a ambos os casos, ou seja, não vai adiantar nada adotar outra linguagem se os desenvolvedores não souberem tratar corretamente seus códigos.

 Falando em musl, além de também fazer a mesma coisa por trabalhar com o conceito de quality safe code (visando ser correta no senso conformidades padrões e segurança) é utilizada para encontrar bugs através do recurso fail-safe da biblioteca.

 A Red hat adicionou a flag -FORTIFY_SOURCE aos compiladores GCC e Clang para detectar falhas como buffer over flow (1). O GCC também possui (desde 1998) a extensão StackGuard que é uma Stack Smashing Protection (SSP) (1) que ajuda o compilador detectar e prevenir ataques buffer-overflow que alias, o OpenBSD faz forte uso deste recurso.

 O tinycc possui a opção -b (bound checker) há no mínimo 15 anos... E o GCC há uns 10... E se perguntar para boa parte dos que estão estão com fascínios por Rust, eles nem sabem disso...


TinyCC Bound checker
Bound checker no tinycc

Como bound checker funciona no TinyyCC

Opção -b em invoke no manual do tinyCC

 Fora o recurso ASan (AddressSanitizer) que é um plugin detector de erros de memória para C/C++ utilizado inclusive no Google Chrome do Android, no Chrome OS, simulador do iOS, Linux, Mac, e Windows de 64 bits e disponível no LLVM há mais ou menos uns 15 anos (1, 2, 3), -fstack-protector, -fsanitize=safe-stack, UBSan (-fsanitize=bounds) e o SafeCode. Alias, a própria Wiki do  ASan sugere o uso da ferramenta como cgroups para limitar o consumo de memória. Por que não incluir Pledge a esta lista? Ou seja, existem vários mecanismos para se utilizar somente com a linguagem C, mas a solução que encontraram foi adotar outra linguagem que pode gerar uma série de outros problemas... ... ... Enquanto isso Rust possui um recurso chamado unsafe que a galera de rust se refere como o "segredinho sujo" que eles utilizam em todos os lugares mas está tudo bem... São eles que estão usando... não é?

 Está certo que utilizar recursos como verificação do código fonte acaba gerando binários um pouco maiores por acabar adicionando mecanismos de segurança, mas em Rust isso tinha que ser tão exagerado? O Rust coreutils por exemplo, contendo apenas apenas 87 comandos e sendo linkado dinamicamente, possui o tamanho de mais de 12MB enquanto o toybox, sendo linkado estaticamente e contendo 233 comandos (quase três vezes mais que o Rust Coreutils), ocupa apenas 724KB (mais de 17 vezes menor levando em conta sua ligação estática e a quantidade de comandos). Já houve quem dissese que isso acontecem em Rust apenas em X86 por conta das dependências e não ocorre em embarcados. O que não é verdade pois geralmente Rust gera binários praticamente do mesmo tamanho.   

 O interessante mesmo é poder decidir quando utilizar segurança de memória. No livro Nim in action descreve que algumas linguagens de programação, como C, não possuem segurança de memória porque ela permite que programas sem atribuição possa acessar a memória. Por outro lado, linguagens possuem segurança de memória oferecem essa segurança ao custo de não permitir que programas acessem detalhes de baixo nível da memória quando se faz necessário; e é aí que Nim se torna uma linguagem muito interessante. Por padrão Nim já oferece proteção contra erros de memória porém, porém Nim oferece as duas opções (escrever códigos com ou sem segurança de memória) permitindo que você decida quando utilizar cada uma delas. Ainda no livro Nim in Action descreve que "...há situações quando muitos querem evitar garbage collectors; eles são considerados por muitos ser inadequados para certas aplicações como embarcados e jogos. Por essa razão, Nim possui suporte a um número diferente de garbage collectors com diferentes aplicações em mente. Garbage collector pode também ser removido completamente, lhe dando a habilidade de você mesmo gerenciar memória." ... "Aplicações escritas em Nim são muito rápidas, em muitos casos, tão rápidas quanto aplicações escritas em C, e mais de trinta vezes mais rápido do que aplicações escritas em Python. Eficiência é  maior prioridade, e alguns recursos toram otimização de código fácil. Isso vai de mãos dadas com um soft real-time garbage collector, que lhe permite especificar o montante de tempo que deve ser gasto coletando memória. Esse recurso se torna importante durante desenvolvimento de jogos, onde um garbage collector comum pode desacelerar a renderização de frames na tela se utilizar muito tempo coletando memória. Também é útil em sistemas real-time que precisam rodar em frames de tempo muito estrito." Nim, além de por padrão já proteger seu programa contra todos os tipos de erro de memória, possui também recursos muito mais interessantes como meta programação, style intensitivity; seu type system (que apesar de ser estática, incorpora o recurso type inference que lhe permite acelerar o desenvolvimento do seu código sem sacrificar a segurança), type safety e type-checking dinâmico; Generics (que lhe permite reutilizar o código sem sacrificar type safety) e muito mais.

 (13/08/2025) Linguagens como C e C++ possui suporte a segurança em memória, mas algo que é feito manualmente. Os desenvolvedores que devem verificar seus próprios códigos e identificar o problema (algo que já vimos aqui Rich Felker denunciando). Os desenvolvedores do Busybox por exemplo fazem isso muit bem, no dia 03/08/2025, Denys Vlasenko corrigiu o vazamento de memória  causado pela otimização do compilador.



 (13/08/2025) Além destes recursos, a equipe do Btrfs implementou no dia 12/08/2025 o ref_tracker que detecta vazamentos e printa os traços da pilha que ainda não liberadas e assim poderem corrigir os problemas.

 Vale ressaltar que essas técnicas de memory safety também são possíveis na linguagem C e C++ não somente manualmente como muitos acreditam mas também através de garbage collector para C e C++ que foi desenvolvido pelos três pesquisadores Hans-J. Boehm, Demers e Weiser (por isso o nome bdwgc) em meados da década de 90... Este recurso lhe permite utilizar garbage collector nas duas linguagens quando quiser bastabdo definir #include "gc.h" em seu código. O bdwgc também oferece o recurso Leak Detector.

 (28/03/2025) No dia 26 de Fevereiro de 2025 a equipe de desenvolvedores do XFS implementou o recurso garbage collection no zoned do XFS todo desenvolvido em C (e que vai para o kernel 6.15-rc). E no dia 19 de Março foi adicionado a opção gc_pressure no mount do XFS para evitar um risco no garbage collection em circunstancias distintas. O que nos leva a questionar se realmente se faz necessário a adoção de uma linguagem secundária no kernel Linux somente pelo recurso de segurança em memória ao custo de perda de desempenho, binários enormes, alto consumo de memória, CPU e etc sendo que tal recurso já está presente de tantas formas (linguagens mais adequadas, algoritmos, bibliotecas, flags, extensões), há tanto tempo (uns há quase trinta anos) e que já poderiam estar sendo empregados...

xfs: implement zoned garbage collection
Garbage Collection no zoned do XFS

Garbage Collection no f2fs


 E o mais interessante de tudo: Se lembram do artigo da Casa promovendo que todos deveriam migrar de linguagens como C e C++ para linguagens com segurança de memória? Pois é, estranhamente parece que a Casa Branca voltou atrás e não vai mais promover segurança de memória já que o mesmo link está indisponível.


 Bom, eu acho que agora sim neste segundo artigo eu tenha abordado elementos o suficiente para pensar no assunto; o assunto de segurança em memória vai muito além do que simplesmente adotar uma linguagem com tal recurso achanado que solucionará os problemas de forma definitiva.


QUER APRENDER LINUX? ENTÃO CONFIRA O MEU CURSO DE MIGRAÇÃO PARA LINUX CLICANDO AQUI :)
QUER APRENDER LINUX? ENTÃO CONFIRA O MEU CURSO DE MIGRAÇÃO PARA LINUX CLICANDO AQUI :)

Lançado novo Minicurso de atributos no Linux
E não esqueçam de conferir também o meu mini curso de atributos no Linux


Marcadores

A pior história sobre Linux que já ouvi (6) A.I (2) ambiente gráfico (19) AMD (14) analise (10) Andriod (17) android (9) Apple (1) arm (5) artigo (5) aws (1) bc (24) benchmark (6) BetrFS (1) biglinux (1) blackhat (1) BSDs (36) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (18) canonical (1) canto do Diego Lins (2) certificações Linux (7) Código Fonte (53) comandos (34) comp (1) compressores (9) consoles (1) container (8) CPU (20) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (14) Debian (31) desempenho (2) desenvolvimento (105) desktop (19) DevOps (3) DevSecOps (4) dic (1) Dica de leitura (91) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (4) diocast (1) dioliunx (3) distribuições Linux (15) Docker (13) DragonflyBSD (24) driver (2) dropbear (3) ead Diolinux (2) edição de vídeo (5) embarcados (1) EMMI Linux (4) emuladores (9) endless (5) English interview (3) Enless OS (2) entrevista (17) espaço aberto (82) evento (6) facebook (1) Fedora (11) filesystem (82) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (23) Funtoo Linux (13) games (96) garbage collector (1) gerenciadores de pacotes (4) glaucus (8) GOG (3) google (9) gpu (4) hacker (2) hardware (104) hash (1) helenos (3) I.A (1) init system (13) Intel (16) inteligencia artificial (2) IoT (1) ispconfig (1) jogos (40) kde (1) kernel (144) lançamento (64) leis (1) LFCS (1) libs (2) licenças (10) Linus (16) linus torvalds (2) Linux (196) linux foundation (3) linux para leigos (1) live (4) lkgr (1) LPI (8) LTS (1) Mac (1) machine learning (1) matemática (9) mesa redonda (27) microcontroladores (1) microsoft (6) microst (1) muito além do GNU (183) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (13) nimlang (5) nintendo (2) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) ONLYOFFICE (5) open source (85) OpenBSD (8) OpenShift (1) oracle (1) os vários sabores de Linux (46) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (3) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (72) promoção (1) propagandas com Linux (8) ps4 (1) real-time. (1) Red Hat (23) redes (4) resenha nerd (5) Resumo da Semana do Dlins (2) resumo do Tux (19) retrospectiva Linux (1) risc-V (14) RISCV (13) rtos (2) runlevel (2) rust (16) Sega (1) Sega Saturn (1) segurança digital (28) servidor web (2) servidores (3) shell (13) shell script (10) sistema operacional (26) skarnet (2) smartphones (3) Software livre e de código aberto (150) sorteio (3) Steam (11) Steam no Linux (9) supercomputadores (4) suse (7) systemd (9) terminal (91) terminal de comandos (22) toca do tux (1) toybox (32) tutorial (6) Tux (3) ubuntu (1) unboxing (7) UNIX (17) UNIX Toolbox (13) vartroy (1) vga (1) virtualização (3) vulnerabilidade (7) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) yash (1) ZFS (16) zsh (3)