<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matheus Gomes</title>
    <description>The latest articles on DEV Community by Matheus Gomes (@matheusgb).</description>
    <link>https://dev.to/matheusgb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F761606%2F2b0b4ca1-5871-4195-a492-9dbe5319276b.jpg</url>
      <title>DEV Community: Matheus Gomes</title>
      <link>https://dev.to/matheusgb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matheusgb"/>
    <language>en</language>
    <item>
      <title>Dia 24~26 - Gestão de Tarefas (Sistema Operacional)</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Thu, 24 Oct 2024 22:38:50 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-2326-gestao-de-tarefa-sistema-operacional-pde</link>
      <guid>https://dev.to/matheusgb/dia-2326-gestao-de-tarefa-sistema-operacional-pde</guid>
      <description>&lt;p&gt;Esses dias estive quebrando a cabeça para implementar gestão de tarefas utilizando contexto. &lt;a href="https://github.com/matheusgb/janelas/commit/575c0d4a1882f066929578ed9a31e56ce778adc3" rel="noopener noreferrer"&gt;Código aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como tudo nesse projeto, essa foi mais uma "task" do &lt;a href="https://wiki.inf.ufpr.br/maziero/doku.php?id=so:gestao_de_tarefas" rel="noopener noreferrer"&gt;conteúdo do professor Maziero&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre a implementação:
&lt;/h2&gt;

&lt;p&gt;Foi implementado um sistema de gerenciamento de tarefas usando contextos do sistema. Ele gerencia tarefas cooperativas executando uma tarefa até passar explicitamente para outra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura &lt;code&gt;task_t&lt;/code&gt;&lt;/strong&gt;: Representa uma tarefa, armazenando o contexto de execução, um identificador (ID), e ponteiros para facilitar a construção de uma fila duplamente encadeada de tarefas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typedef struct task_t
{
  struct task_t *prev, *next; // ponteiros para usar em filas
  int id;                     // identificador da tarefa
  ucontext_t context;         // contexto armazenado da tarefa
  short status;               // pronta, rodando, suspensa, ...
  // ... (outros campos serão adicionados mais tarde)
} task_t;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Inicialização&lt;/strong&gt;: A função &lt;code&gt;ppos_init()&lt;/code&gt; é chamada para configurar o contexto principal do programa. Isso prepara o sistema para gerenciar múltiplas tarefas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criação de tarefas&lt;/strong&gt;: Novas tarefas são criadas com &lt;code&gt;task_init()&lt;/code&gt;, onde você passa uma função e argumentos para ser executada dentro da nova tarefa. Essas tarefas recebem um novo contexto e pilha, e o ID da tarefa é atualizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mudança de contexto&lt;/strong&gt;: A função &lt;code&gt;task_switch()&lt;/code&gt; permite alternar entre tarefas, trocando o contexto atual pelo de uma tarefa especificada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finalização de tarefa&lt;/strong&gt;: Uma tarefa pode encerrar sua execução e retornar ao contexto principal com &lt;code&gt;task_exit()&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
      <category>c</category>
    </item>
    <item>
      <title>Dia 23 - Configurando o NixOS para utilizar o debbuger de C no VSCode</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Tue, 22 Oct 2024 01:46:01 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-23-configurando-o-nixos-para-utilizar-o-debbuger-de-c-no-vscode-32fl</link>
      <guid>https://dev.to/matheusgb/dia-23-configurando-o-nixos-para-utilizar-o-debbuger-de-c-no-vscode-32fl</guid>
      <description>&lt;p&gt;Eu instalo meus pacotes todos em &lt;code&gt;environment.systemPackages&lt;/code&gt; no &lt;code&gt;/etc/nixos/configuration.nix&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Então, além do &lt;code&gt;gcc&lt;/code&gt;, para utilizar o debbuger é necessário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment.systemPackages = with pkgs; [
...
vscode-fhs
gdb
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilizar o &lt;code&gt;vscode-fhs&lt;/code&gt; facilita muito o trabalho, instalar o pacote &lt;code&gt;vscode&lt;/code&gt; (sem o fhs) gera alguns transtornos. Mais informações &lt;a href="https://nixos.wiki/wiki/Visual_Studio_Code" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No vscode, instale essa extensão:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm244m8u52ilst43br4z1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm244m8u52ilst43br4z1.png" alt="extensão vscode c/c++" width="731" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para maior confiabilidade, "forcei" a criação de paths com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment.variables.PATH = "${lib.makeBinPath [
pkgs.gdb
pkgs.gcc_multi // esse é o pacote que utilizo pro gcc
]}:$PATH";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não esqueça de reiniciar o computador após o &lt;code&gt;sudo nixos-rebuild switch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro do projeto, crie uma pasta &lt;code&gt;.vscode&lt;/code&gt; e adicione um arquivo &lt;code&gt;launch.json&lt;/code&gt; e &lt;code&gt;tasks.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tasks.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: gcc arquivo de build ativo",
      "command": "/nix/store/2ap4rlj55kw8q5ndycl0r8w312ggpf1c-gcc-wrapper-13.2.0/bin/gcc",
      "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Tarefa gerada pelo Depurador."
    }
  ],
  "version": "2.0.0"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;launch.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug arquivo ativo",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "cwd": "${fileDirname}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "miDebuggerPath": "/nix/store/2ap4rlj55kw8q5nd2460r8w312ggpf1c-gdb-14.2/bin/gdb",  
      "preLaunchTask": "C/C++: gcc arquivo de build ativo",
      "internalConsoleOptions": "openOnSessionStart"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para o campo &lt;code&gt;command&lt;/code&gt; do &lt;code&gt;tasks.json&lt;/code&gt; utilize o comando &lt;code&gt;which gcc&lt;/code&gt; para pegar o caminho.&lt;br&gt;
Faça o mesmo para &lt;code&gt;miDebuggerPath&lt;/code&gt; do &lt;code&gt;launch.json&lt;/code&gt; com o comando &lt;code&gt;which gdb&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Entre no arquivo que deseja depurar e aperte F5:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faak6eo7heoqd7eqwh3mc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faak6eo7heoqd7eqwh3mc.png" alt="imagem do depurador funcionando" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depure e seja feliz.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>c</category>
    </item>
    <item>
      <title>Dia 21 e 22 - Entendendo contextos em C</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Sun, 20 Oct 2024 23:20:19 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-21-e-21-entendendo-contextos-em-c-2imm</link>
      <guid>https://dev.to/matheusgb/dia-21-e-21-entendendo-contextos-em-c-2imm</guid>
      <description>&lt;p&gt;Em C, contexto é o estado atual de execução de um programa, incluindo registradores (pequenas áreas de armazenamento dentro da CPU, usadas para armazenar dados e instruções durante a execução de programas), variáveis e o fluxo de instruções, crucial para trocar tarefas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Troca de contextos para sistemas operacionais
&lt;/h3&gt;

&lt;p&gt;A principal função é permitir a multitarefa. Isso garante que o sistema possa alternar entre processos de forma eficiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wiki.inf.ufpr.br/maziero/doku.php?id=so:trocas_de_contexto" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; foi disponibilizado o arquivo &lt;code&gt;contexts.c&lt;/code&gt;. É um demonstrativo de como contextos funcionam.&lt;/p&gt;

&lt;p&gt;Logo no topo desse arquivo, percebemos a importação da biblioteca &lt;code&gt;ucontext.h&lt;/code&gt;. Ela permite manipular o contexto de execução.&lt;/p&gt;

&lt;p&gt;No trecho abaixo vemos que são criados 3 contextos, e esses 3 contextos terão a memória alocada do tamanho de &lt;code&gt;STACKSIZE&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#define STACKSIZE 64 * 1024 /* tamanho de pilha das threads */

ucontext_t ContextPing, ContextPong, ContextMain;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E logo depois, as funções Ping e Pong que serão executadas em seus respectivos contextos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void BodyPing(void *arg)
{
  int i;

  printf("%s: inicio\n", (char *)arg);

  for (i = 0; i &amp;lt; 4; i++)
  {
    printf("%s: %d\n", (char *)arg, i);
    swapcontext(&amp;amp;ContextPing, &amp;amp;ContextPong);
  }
  printf("%s: fim\n", (char *)arg);

  swapcontext(&amp;amp;ContextPing, &amp;amp;ContextMain);
}

/*****************************************************/

void BodyPong(void *arg)
{
  int i;

  printf("%s: inicio\n", (char *)arg);

  for (i = 0; i &amp;lt; 4; i++)
  {
    printf("%s: %d\n", (char *)arg, i);
    swapcontext(&amp;amp;ContextPong, &amp;amp;ContextPing);
  }
  printf("%s: fim\n", (char *)arg);

  swapcontext(&amp;amp;ContextPong, &amp;amp;ContextMain);
}

/*****************************************************/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na função main, é utilizado &lt;code&gt;malloc&lt;/code&gt; para reservar as stacks, onde posteriormente são atribuidos com &lt;code&gt;uc_stack.ss_sp&lt;/code&gt; ao contexto, e &lt;code&gt;swapcontext&lt;/code&gt; é usado para alternar entre eles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int main(int argc, char *argv[])
{
  char *stack;

  printf("main: inicio\n");

  getcontext(&amp;amp;ContextPing);

  stack = malloc(STACKSIZE);
  if (stack)
  {
    ContextPing.uc_stack.ss_sp = stack;
    ContextPing.uc_stack.ss_size = STACKSIZE;
    ContextPing.uc_stack.ss_flags = 0;
    ContextPing.uc_link = 0;
  }
  else
  {
    perror("Erro na criação da pilha: ");
    exit(1);
  }

  makecontext(&amp;amp;ContextPing, (void *)(*BodyPing), 1, "    Ping");

  getcontext(&amp;amp;ContextPong);

  stack = malloc(STACKSIZE);
  if (stack)
  {
    ContextPong.uc_stack.ss_sp = stack;
    ContextPong.uc_stack.ss_size = STACKSIZE;
    ContextPong.uc_stack.ss_flags = 0;
    ContextPong.uc_link = 0;
  }
  else
  {
    perror("Erro na criação da pilha: ");
    exit(1);
  }

  makecontext(&amp;amp;ContextPong, (void *)(*BodyPong), 1, "        Pong");

  swapcontext(&amp;amp;ContextMain, &amp;amp;ContextPing);
  swapcontext(&amp;amp;ContextMain, &amp;amp;ContextPong);

  printf("main: fim\n");

  exit(0);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output do programa executado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main: inicio
    Ping: inicio
    Ping: 0
        Pong: inicio
        Pong: 0
    Ping: 1
        Pong: 1
    Ping: 2
        Pong: 2
    Ping: 3
        Pong: 3
    Ping: fim
        Pong: fim
main: fim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, podemos perceber que mesmo alterando os contextos, os valores que "fluem" pela função são mantidos, um exemplo nesse caso é o índice do &lt;code&gt;for&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Você deve ter percebido que existe um malloc para o contexto de Ping e de Pong, mas vemos que existe um contexto para &lt;code&gt;main&lt;/code&gt; também, por qual motivo não existe um malloc para ele?&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;ContextMain&lt;/code&gt; não precisa de uma stack separada porque ele opera na stack do thread principal, enquanto os contextos Ping e Pong têm suas próprias stacks alocadas dinamicamente.&lt;/p&gt;

&lt;p&gt;Se crio um contexto e não aloco memória para ele, quando utilizamos o &lt;code&gt;swap&lt;/code&gt;, ele vai para a stack principal do programa.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Esse código é do &lt;a href="https://wiki.inf.ufpr.br/maziero/doku.php?id=so:pingpongos" rel="noopener noreferrer"&gt;professor Maziero&lt;/a&gt;, encontrado no sub-projeto desenvolvido do PingPongOS "Trocas de Contexto".&lt;/em&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>c</category>
    </item>
    <item>
      <title>Dia 20 - Reimplementando lista circular duplamente encadeada</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Sat, 19 Oct 2024 15:14:13 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-20-reimplementando-lista-circular-duplamente-encadeada-4ba8</link>
      <guid>https://dev.to/matheusgb/dia-20-reimplementando-lista-circular-duplamente-encadeada-4ba8</guid>
      <description>&lt;p&gt;Fiz alguns ajustes na &lt;a href="https://dev.to/matheusgb/dia-10-generics-1p94"&gt;versão incial da minha lista&lt;/a&gt;, agora ela atende os requisitos dispostos no &lt;a href="https://wiki.inf.ufpr.br/maziero/doku.php?id=so:biblioteca_de_filas" rel="noopener noreferrer"&gt;material do professor Maziero&lt;/a&gt;. Ajustei para passar os testes, e também resolvi utilizar readaptar para C. A compilação juntamente com o arquivo de teste disponibilizado me pareceu menos problemática desse modo.&lt;/p&gt;

&lt;p&gt;Revisitando o código dessa lista, precisei revisitar listas mais simples que vem antes da circular duplamente encadeada, assim consegui montar um raciocínio sólido na hora de codificar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lista duplamente encadeada
&lt;/h2&gt;

&lt;p&gt;É uma estrutura na qual cada nó contém três partes: Valor, ponteiro para o próximo nó, e ponteiro para o nó anterior.&lt;/p&gt;

&lt;p&gt;Permite navegação bidirecional, e para remover ou adicionar um nó, é necessário somente ajustar os ponteitos do nó anterior e do nó seguinte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[head] &amp;lt;-&amp;gt; [nó1] &amp;lt;-&amp;gt; [nó2] &amp;lt;-&amp;gt; [tail]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lista circular
&lt;/h2&gt;

&lt;p&gt;Pode ser simplesmente encadeada (sentido unilateral) ou duplamente encadeada (esse é o que estou usando para o projeto).&lt;br&gt;
O último nó da lista está conectado ao primeiro, o que faz com que a lista não tenha um ponto de término natural.&lt;br&gt;
A lista pode ser percorrida indefinidamente, pois ao chegar no final, ela retorna ao início.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lista circular duplamente encadeada e sua relação com sistemas operacionais
&lt;/h2&gt;

&lt;p&gt;Utilizar uma lista circular duplamente encadeada, faz com que o sistema operacional tenha caracterísica de escalonamento circular.&lt;/p&gt;

&lt;p&gt;Dito isso, após o último processo ser executado, o sistema retorna ao primeiro e continua a execução.&lt;/p&gt;

&lt;p&gt;Imaginando que um sistema operacional possui três processos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[P1] &amp;lt;-&amp;gt; [P2] &amp;lt;-&amp;gt; [P3] &amp;lt;-&amp;gt; [P1] ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após o P3 terminar seu tempo de execução, a lista voltará diretamente para P1, garantindo uma execução contínua.&lt;/p&gt;

&lt;p&gt;O código atual do sistema operacional pode ser encontrado &lt;a href="https://github.com/matheusgb/janelas" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57uvenpap6lbvtpjzzo1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57uvenpap6lbvtpjzzo1.png" alt="resultados dos testes" width="631" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>c</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Dia 19 - Retornando a criação do meu sistema operacional</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Fri, 18 Oct 2024 01:33:06 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-19-retornando-a-criacao-do-meu-sistema-operacional-cnc</link>
      <guid>https://dev.to/matheusgb/dia-19-retornando-a-criacao-do-meu-sistema-operacional-cnc</guid>
      <description>&lt;p&gt;Hoje está sendo um dia de difícil assimilação para conteúdos escritos então resolvi consumir alguns conteúdos mais práticos sobre sistemas operacionais.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://www.youtube.com/@waine_jr" rel="noopener noreferrer"&gt;Waine&lt;/a&gt; há alguns conteúdos para membros de sistema operacional baseado na literatura do &lt;a href="https://wiki.inf.ufpr.br/maziero/doku.php?id=start" rel="noopener noreferrer"&gt;Professor Maziero&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O conteúdo é voltado para embarcados utilizando a linguagem Zig e C. Mas tentarei ir adaptando pro meu sistema operacional feito em C++. (talvez eu me renda e faça em zig e C também)&lt;/p&gt;

&lt;p&gt;Com essa decisão, me livrei do Windows, e agora estou utilizando vscode + NixOS para codar em C++.&lt;/p&gt;

&lt;p&gt;NixOS é uma distribuição Linux com configuração declarativa, baseada no gerenciador de pacotes Nix, que oferece ambientes reprodutíveis, reversíveis e altamente controlados.&lt;/p&gt;

&lt;p&gt;Esse vídeo do DioLinux fala um pouco sobre: &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BODYe-Jy2AQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;A instalação de tudo é extremamente simples e dificilmente dá problema, e se der, você pode retornar a versões mais antigas do seu sistema operacional.&lt;/p&gt;

&lt;p&gt;Os próximos dias serão voltados a série de vídeos do Waine e ao Inglês, eventualmente retornarei ao livro.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
      <category>cpp</category>
      <category>c</category>
    </item>
    <item>
      <title>Dia 17 e 18 - Recalibrando meu GPS</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Wed, 16 Oct 2024 22:08:19 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-16-e-17-recalibrando-meu-gps-38eg</link>
      <guid>https://dev.to/matheusgb/dia-16-e-17-recalibrando-meu-gps-38eg</guid>
      <description>&lt;p&gt;Esses dias tenho estado com a internet ruim, então pausei a leitura e outras coisas para me reorganizar.&lt;/p&gt;

&lt;p&gt;Certa vez escutei uma frase: "O caminho que trilhamos precisa ser frequentemente recalibrado, como se fosse um GPS."&lt;/p&gt;

&lt;p&gt;Então estou usando esses dias para relembrar meus objetivos e como vou fazer para alcançá-los.&lt;/p&gt;

&lt;p&gt;Me dei conta que minha jornada à física computacional é composta por "subjornadas":&lt;br&gt;
Há a jornada da computação, da matemática e física, do inglês e do desenvolvimento pessoal.&lt;/p&gt;

&lt;p&gt;As que tenho mais investido atualmente é a da computação e do desenvolvimento pessoal, porém, percebi que algumas(talvez várias) oportunidades estão passando por não saber inglês.&lt;/p&gt;

&lt;p&gt;Então, vai ser mais um ponto que irei focar.&lt;/p&gt;

&lt;p&gt;Com relação as "outras jornadas", pretendo terminar o livro referente a computação que tenho colocado resumos aqui, e continuar cuidando de mim e da minha saúde (mudei alguns hábitos alimentícios,  intensifiquei os treinos na academia e dei uns ajustes no visual).&lt;/p&gt;

&lt;p&gt;Com essa jornada eu tenho percebido que eu tenho sido frequentemente testado. Desde que comecei, sempre acontece alguma coisinha que interfere diretamente na rotina, dessa vez foi a internet com problemas.&lt;/p&gt;

&lt;p&gt;Creio que esses "testes do universo" faz parte do jogo, e gosto disso. Parece que tem frequentemente alguém falando: "Você não quer? Dá teu jeito".&lt;/p&gt;

&lt;p&gt;Isso me lembra um trecho de João, capítulo 5, versículos 8 a 10 (Eu não sou nem um pouco religioso, mas algumas coisas quando se destacam temos que dar a devida atenção):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Então, Jesus lhe disse: ― Levante‑se! Pegue a sua maca e ande. Imediatamente, o homem ficou curado, pegou a maca e começou a andar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Engole o choro e segue 😅.&lt;/p&gt;

&lt;p&gt;Então é isso, continuarei lendo o livro sobre computação, quero terminar ele logo para voltar a codar em C/C++ e fazer meu sistema operacional. Terminando isso vou começar minha jornada na física/matemática.&lt;/p&gt;

&lt;p&gt;Esse livro vai ser um looooongo caminho, fiz uma estimativa, se eu ler uma seção por dia, demoraria mais de 100 dias para terminar. Devagar e sempre, não tem ninguém com pressa 🐢.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MAS!!!&lt;/strong&gt; Inglês eu vou dar uma atenção especial, pois já posso fazer proveito dele no momento que vivo. Vou tentando trazer algo aqui durante as seções dos livros de computação.&lt;/p&gt;

&lt;p&gt;Seguimos!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Dia 16 - 1.6 Desempenho - Parte 1</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Tue, 15 Oct 2024 03:06:32 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-16-16-desempenho-parte-1-3o90</link>
      <guid>https://dev.to/matheusgb/dia-16-16-desempenho-parte-1-3o90</guid>
      <description>&lt;h5&gt;
  
  
  Esse post fala sobre o capítulo 1.6 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"
&lt;/h5&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo desempenho
&lt;/h2&gt;

&lt;p&gt;Na computação há duas medidas de desempenho: &lt;code&gt;largura de banda&lt;/code&gt; e &lt;code&gt;tempo de execução&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tempo de execução: Tempo total exigido para o computador completar uma tarefa.&lt;/p&gt;

&lt;p&gt;Largura de banda: Número de tarefas completadas por unidade de tempo.&lt;/p&gt;

&lt;p&gt;Tomar medidas para reduzir o tempo de resposta, quase sempre melhora a largura de banda. (por exemplo, trocar o processador por uma versão mais rápida) Essa medida é categorizada como escalonamento vertical.&lt;/p&gt;

&lt;p&gt;Aumentar a quantidade de processadores normalmente só melhora a largura de banda, porém, se o processamento for tão grande quanto a largura da banda, o tempo de resposta também é melhorado, pois diminuiria tempo de espera de tarefas enfileiradas. Essa medida é categorizada como escalonamento horizontal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relacionando desempenho e tempo de execução
&lt;/h2&gt;

&lt;p&gt;Comparando dois computadores:&lt;br&gt;
Se computador A executa um programa em 30 segundos, e B em 60, o quanto A é mais rápido que B?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1x9lgz5oygr5y7zr8yp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1x9lgz5oygr5y7zr8yp.png" alt="fórmula de desempenho em tempo de execução" width="640" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;6030=2\frac{60}{30} = 2 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;30&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;60&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;A é 2 vezes mais rápido que B. Ou seja, B é 2 vezes mais lento que A.&lt;/p&gt;

&lt;p&gt;Então:&lt;br&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;A2=B\frac{A}{2} = B &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Medindo desempenho
&lt;/h2&gt;

&lt;p&gt;O tempo é a principal medida de desempenho do computador. Mas há distinção entre o tempo decorrido e o tempo que o processador está trabalhando em nosso favor.&lt;/p&gt;

&lt;p&gt;O tempo de CPU é o tempo real que a CPU gasta para uma tarefa específica, podendo ser separado em:&lt;/p&gt;

&lt;p&gt;Tempo de CPU do usuário: tempo gasto de CPU em um programa.&lt;/p&gt;

&lt;p&gt;Tempo de CPU do sistema: tempo gasto do sistema operacional realizando tarefas em favor do programa.&lt;/p&gt;

&lt;p&gt;"Para melhorar o desempenho de um programa, deve-se ter uma definição clara de qual é a métrica de desempenho de interesse."&lt;/p&gt;

&lt;h2&gt;
  
  
  Desempenho da CPU e seus fatores
&lt;/h2&gt;

&lt;p&gt;Ciclo de clock: Tempo para um periodo de clock do processador que trabalha em uma taxa constante.&lt;/p&gt;

&lt;p&gt;Período de clock: Extensão de cada ciclo de clock.&lt;/p&gt;

&lt;p&gt;Para calcular o tempo de execução da CPU:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevcv611pm40ys6bmtnpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevcv611pm40ys6bmtnpc.png" alt="Fórmula de tempo de execução da CPU" width="726" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, para melhorar o desempenho é necessário reduzir o número de ciclos de clocks, ou o tamanho do ciclo do clock.&lt;/p&gt;

&lt;p&gt;Por exemplo, temos um computador A que executa um programa em 10 segundos. O clock dele é de 2 GHz. E queremos montar um computador B que execute esse programa em 6 segundos, o computador B exigirá 1,2 vezes a quantidade de ciclos de clock do computador A. Precisamos achar que taxa de clock o computador B deve ter.&lt;/p&gt;

&lt;p&gt;Computador A:&lt;br&gt;
2 GHz == 2x10⁹&lt;br&gt;
a == ciclos de clock de CPU&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;10=a2x10⁹10 = \frac{a}{2x10⁹} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;10&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;a=10x2x10⁹=20x10⁹ciclosa = 10x2x10⁹ = 20x10⁹ ciclos &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;10&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;20&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal"&gt;i&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mord mathnormal"&gt;l&lt;/span&gt;&lt;span class="mord mathnormal"&gt;os&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Computador B:&lt;br&gt;
b == taxa de clock&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;6=1,2x20x10⁹b6 = \frac{1,2x20x10⁹}{b} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;20&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;b=1,2x20x10⁹6b = \frac{1,2x20x10⁹}{6} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;20&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;b=0,2x20x10⁹1b = \frac{0,2x20x10⁹}{1} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;20&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;b=4x10⁹1=4GHzb = \frac{4x10⁹}{1} = 4GHz &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mord"&gt;10⁹&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord mathnormal"&gt;G&lt;/span&gt;&lt;span class="mord mathnormal"&gt;Hz&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Dia 15 - 1.5 Tecnologias para construção de processadores e memórias</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Mon, 14 Oct 2024 00:19:33 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-15-15-tecnologias-para-construcao-de-processadores-e-memorias-1c7m</link>
      <guid>https://dev.to/matheusgb/dia-15-15-tecnologias-para-construcao-de-processadores-e-memorias-1c7m</guid>
      <description>&lt;h5&gt;
  
  
  Esse post fala sobre o capítulo 1.5 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"
&lt;/h5&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;p&gt;Um transistor é uma chave liga/desliga controlada por eletricidade (é aqui que o binário que vimos na seção 1.3 começa a fazer sentido). E o circuito integrado é a combinação de vários transistores em um único chip. a Lei de Moore que vimos na seção 1.2 é prevista na taxa de crescimento do número de transistores por chip. E isso também explica o motivo de a Lei de Moore estar desacelerando nos últimos anos (limitação física).&lt;/p&gt;

&lt;p&gt;Um circuito com centenas de milhares de transistores se chama VLSI (Very-large-scale integration).&lt;/p&gt;

&lt;p&gt;Desde 1977 a capacidade de transistores por chip de DRAM aumentou em mais de 16.000 vezes.&lt;/p&gt;

&lt;p&gt;O restante da seção se prolonga sobre como são fabricados os circuitos integrados e como seu custo é fundamental para projetistas de computador. E bom, hoje é domingo e esse trecho honestamente não me interessou. Nos vemos na próxima seção do livro. 😅&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Dia 14 - 1.4 Sob as tampas</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Sun, 13 Oct 2024 00:37:26 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-14-14-sob-as-tampas-4hnc</link>
      <guid>https://dev.to/matheusgb/dia-14-14-sob-as-tampas-4hnc</guid>
      <description>&lt;h5&gt;
  
  
  Esse post fala sobre o capítulo 1.4 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"
&lt;/h5&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;p&gt;"O hardware de qualquer computador realiza as mesmas funções básicas: entrada, saída, processamento e armazenamento de dados."&lt;/p&gt;

&lt;p&gt;Com essa frase, iniciamos o principal tema do livro: Como essas funções são realizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os cinco componentes do computador:
&lt;/h3&gt;

&lt;p&gt;São eles: entrada, saída, memória, caminho de dados e controle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89d5ribcpexb04gb9sms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89d5ribcpexb04gb9sms.png" alt="Os cinco componentes do computador" width="480" height="405"&gt;&lt;/a&gt;&lt;br&gt;
"O processador obtém instruções e dados da memória. A entrada escreve dados na memória e a saída lê os dados desta. O controle envia os sinais que determinam as operações do caminho de dados, da memória, da entrada e da saída."&lt;/p&gt;

&lt;p&gt;O restante do capítulo se prolonga em como os hardwares funcionam baseados na definição acima. Desde monitores até circuitos integrados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitetura do conjunto de instruções
&lt;/h3&gt;

&lt;p&gt;É uma abstração que inclui tudo que os programadores precisam saber para fazer um programa em linguagem de máquina binária funcionar corretamente (um exemplo é a arquitetura &lt;code&gt;x86&lt;/code&gt;, desenvolvida pela Intel, e amplamente usada).&lt;/p&gt;

&lt;p&gt;O sistema operacional geralmente guarda os detalhes das funções de baixo nível do sistema para que os programadores de aplicações não precisem se preocupar com esses detalhes.&lt;/p&gt;

&lt;p&gt;A junção do conjunto de instruções e da interface do sistema operacional é chamada de &lt;code&gt;interface binária de aplicação (ABI)&lt;/code&gt;. (Define um padrão para a portabilidade binária entre computadores).&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceitos de memória:
&lt;/h3&gt;

&lt;p&gt;Memória volátil: Conserva os dados apenas quando há alimentação de energia.&lt;br&gt;
Memória não volátil: Os dados são conservados mesmo com ausência de energia.&lt;/p&gt;

&lt;p&gt;Memória principal: É usada para armazenar programas enquanto estão sendo executados (DRAM).&lt;br&gt;
Memória secundária: Memória não volátil usada para armazenar programas e dados entre execuções. (por ex. HDD).&lt;/p&gt;

&lt;p&gt;### Comunicação entre computadores&lt;br&gt;
As redes constituem o backbone dos sistemas de computação atual.&lt;/p&gt;

&lt;h4&gt;
  
  
  Vantagens
&lt;/h4&gt;

&lt;p&gt;Comunicação: Informações trocadas em alta velocidade entre computadores.&lt;br&gt;
Compartilhamento de recursos: Os dispositivos I/O podem ser compartilhados pelos computadores que compõem a rede.&lt;br&gt;
Acesso remoto: Conexão a computadores por meio de longas dintâncias.&lt;/p&gt;

&lt;p&gt;Por fim, o capítulo finaliza com o seguinte desafio:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A memória semicondutora DRAM, a memória flash e o armazenamento de&lt;br&gt;
disco diferem significativamente. Para cada tecnologia, descreva a principal diferença quanto a cada um dos seguintes aspectos: volatilidade, tempo de acesso relativo aproximado e custo relativo aproximado em comparação com a DRAM. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em resumo, DRAM é volátil, então, perde dados quando não há energia. Seu tempo de acesso é rápido e o custo, nesse caso, serve como base de comparação (considerado médio). A memória flash é não volátil mas seu tempo de acesso é mais lento que o da DRAM, com um custo mais barato. O armazenamento em disco também é não volátil, possui um tempo de acesso muito mais lento que a DRAM e mais lento que a memoria em flash, e seu custo é o mais barato.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Dia 13 - 1.3 Por trás do programa</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Sat, 12 Oct 2024 02:05:47 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-13-13-por-tras-do-programa-31da</link>
      <guid>https://dev.to/matheusgb/dia-13-13-por-tras-do-programa-31da</guid>
      <description>&lt;h4&gt;
  
  
  Esse post fala sobre o capítulo 1.3 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"
&lt;/h4&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;p&gt;O começo desse capítulo deixa explícito que o computador só pode executar instruções de baixo nível e há várias camadas que interpretam ou traduzem as operações de alto nível para baixo nível. Esse é um grande exemplo de abstração.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xmk852axcjoictnpvuz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xmk852axcjoictnpvuz.png" alt="computação em camadas" width="713" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essas camadas demonstram a organização de maneira hierárquica. &lt;code&gt;software de sistemas&lt;/code&gt; seria serviços como: sistemas operacionais, compiladores, carregadores e montadores.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Software de aplicações&lt;/code&gt; é o que nós, devs, normalmente codamos muito: apps de web, desktop e afins.  &lt;/p&gt;

&lt;p&gt;Há muitos &lt;code&gt;software de sistemas&lt;/code&gt;, mas os mais fundamentais são: sistemas operacionais e compiladores.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um ponto interessante é que, no contexto desse livro, C/C++ é considerado linguagem de alto nível. Já vi algumas pessoas falando isso também, e faz sentido, mas quando comparado com Python por exemplo, eu também acho que faz sentido chamar C/C++ de baixo nível. Será que cabe perspectiva nessa "discussão"? Honestamente não ligo muito para essa terminologia 😅.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Continuando, sistema operacional é importante por conta da manipulação de operações básicas de entradas e saídas, alocamento de memória, além de ser o caminho de comunicação amigável entre o usuário e o hardware. Já o compilador é responsável por traduzir linguagens de alto nível para instruções de máquina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sobre instruções de máquina:
&lt;/h3&gt;

&lt;p&gt;Nossas instruções são grupos de bits que o computador entende e obecede. Nada mais são que sinais elétricos resumidos em 0's e 1's.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gostaria de fazer uma menção honrosa ao excelente jogo &lt;a href="https://store.steampowered.com/app/1444480/Turing_Complete/" rel="noopener noreferrer"&gt;"Turing Complete"&lt;/a&gt; isso é bastante demonstrado lá.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Sobre montador (assembler):
&lt;/h3&gt;

&lt;p&gt;Um assembler traduz a versão simbólica de uma instrução para binário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add A,B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;seria traduzido para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1000110010100000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa instrução diz para o computador somar dois números &lt;code&gt;A&lt;/code&gt; e &lt;code&gt;B&lt;/code&gt;. E essa linguagem simbólica foi denominada como &lt;code&gt;assembly&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqdh8uy2sznj3raoldv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqdh8uy2sznj3raoldv7.png" alt="poder da abstração" width="334" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também existem linguagens que ignoram essa etapa intermediária já traduzindo diretamente para linguagem de máquina. Um exemplo é o GoLang, que após utilizamos o &lt;code&gt;go build&lt;/code&gt;, é gerado um executável binário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Então, por que não codamos em binário e assembly?
&lt;/h3&gt;

&lt;p&gt;Utilizar linguagens de alto nível:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Permite que o programador pense em uma linguagem mais natural, e também há linguagens projetadas para fins específicos.&lt;/li&gt;
&lt;li&gt;Aumento de produtividade.&lt;/li&gt;
&lt;li&gt;Permite que os programas sejam independentes do computador no qual estão sendo desenvolvidos. Compiladores e Montadores traduzem o programa para instruções binárias de qualquer máquina.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Dia 12 - 1.2 Oito grandes ideias sobre arquitetura de computadores</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Fri, 11 Oct 2024 00:03:17 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-12-12-oito-grandes-ideias-sobre-arquitetura-de-computadores-235b</link>
      <guid>https://dev.to/matheusgb/dia-12-12-oito-grandes-ideias-sobre-arquitetura-de-computadores-235b</guid>
      <description>&lt;h4&gt;
  
  
  Esse post fala sobre o capítulo 1.2 do livro "Organização e Projeto de Computadores: Interface Hardware/Software"
&lt;/h4&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 - Projete pensando na "Lei de Moore"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lei de Moore é uma observação feita por Gordon Moore, cofundador da Intel, em 1965. Essa lei declara que os recursos do circuito integrado dobram a cada 18 a 24 meses. O livro nesse trecho alega: Como projetos de computador podem durar anos, os recursos disponíveis por chip podem facilmente dobrar ou quadruplicar entre o inicio e o final do projeto, então o ideal, é que antecipemos onde a tecnologia estará quando terminarmos o projeto.&lt;/p&gt;

&lt;p&gt;Fazendo algumas pesquisas, achei uma &lt;a href="https://www.terra.com.br/byte/analise-a-lei-de-moore-perdeu-folego-mas-nao-morreu,86068b16e73380dfb6c77ec67a8da382rgv8nchd.html#:~:text=Pois%20bem%2C%20a%20Lei%20de,patamar%20na%20evolu%C3%A7%C3%A3o%20dos%20chips." rel="noopener noreferrer"&gt;matéria no Terra&lt;/a&gt; explicando que a Lei de Moore está desacelerando, pois os desafios físicos e de engenharia estão tornando cada vez mais difícil manter o ritmo de miniaturização dos transistores.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;2 - Use a abstração para simplificar o projeto&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse trecho é dito como tivemos que inventar técnicas para nos tornar mais produtivos, se não, o tempo de projeto aumentaria de modo insustentável quando os recursos aumentassem pela Lei de Moore. Então, uma técnica de produtividade é a &lt;code&gt;abstração&lt;/code&gt;, os detalhes de baixo nível são ocultados, enquanto oferece um modelo mais simples de alto nível. (Um exemplo para melhor entendimento, são as infinitas &lt;a href="https://numpy.org/" rel="noopener noreferrer"&gt;bibliotecas em Python escritas em C&lt;/a&gt;.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3 - Torne o caso comum veloz&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Tornar o caso comum veloz costuma melhorar mais o desempenho do que otimizar o caso raro."&lt;br&gt;
O caso comum é mais fácil de melhorar. Por ser comum, ele é mais simples. Saber o que é o "caso comum" será ensinado seções mais a frente no livro. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4 - Desempenho pelo paralelismo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse conceito também será aprofundado ao decorrer do livro, mas basicamente consiste em mais desempenho realizando operações em paralelo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;5 - Desempenho pelo pipelining&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É um padrão de paralelismo. Darei um exemplo:&lt;br&gt;
Imagine uma fábrica de carros com 5 estágios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chassis montado.&lt;/li&gt;
&lt;li&gt;Motor instalado.&lt;/li&gt;
&lt;li&gt;Pintura aplicada.&lt;/li&gt;
&lt;li&gt;Interior montado.&lt;/li&gt;
&lt;li&gt;Teste realizado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se a fábrica não utilizar pipelining, cada carro terá que passar por todos os cinco estágios antes que o próximo carro comece. Se cada estágio demorar uma hora, para montar o primeiro carro vai demorar cinco. Para otimizar isso, após o primeiro carro terminar o estágio um, será adicionado outro carro nesse estágio, enquanto o primeiro carro segue a pipeline, e assim funcionará sucessivamente. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;6 - Desempenho pela predição&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse é um conceito que honestamente não consegui entender pela definição do livro, então busquei outras fontes:&lt;/p&gt;

&lt;p&gt;Um exemplo é a &lt;code&gt;predição de desvio&lt;/code&gt;, técnica usada em processadores para melhorar o desempenho ao prever o caminho que o código seguirá em instruções condicionais (if, switch). Em vez de esperar pela avaliação da condição, o processador faz uma previsão e continua executando instruções antecipadamente. Se a previsão estiver correta, o desempenho melhora porque o processador não fica ocioso. Se errada, ele apenas descarta as instruções incorretas. Isso reduz o tempo ocioso e aumenta a eficiência do sistema, especialmente em loops e condições frequentes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;7 - Hierarquia de memórias&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É um conceito que organiza diferentes tipos de memórias de um sistema em níveis com diferentes velocidades e capacidades. Utilizando memórias mais rápidas e menores (cache) para armazenar dados frequentemente acessados e memórias mais lentas (disco rígido/SSD) para armazenar grandes volumes de dados menos utilizados.&lt;/p&gt;

&lt;p&gt;Um exemplo disso em sistemas web, é quando utilizamos o &lt;code&gt;Redis&lt;/code&gt; para realizar o cache de uma listagem frequentemente acessada pelo client. Isso reduz o tempo de resposta e o overhead de buscar novamente os dados no banco de dados.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;8 - Estabilidade pela redundância&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Além de rápidos, os computadores precisam ser estáveis."&lt;/p&gt;

&lt;p&gt;Em um serviço web por exemplo, isso pode se assemelhar a redes de servidor em cluster, onde há vários servidores que hospedam o serviço, e se caso um deles falhe, outro servidor assume a função. Nesses clusters é possível inclusive adicionar balanceadores de carga que distribuem requisições entre servidores. Caso um servidor fique sobrecarregado ou inativo, as requisições são direcionados a outro servidor.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Dia 11 - 1.1 Introdução - Organização e Projeto de Computadores: Interface Hardware/Software</title>
      <dc:creator>Matheus Gomes</dc:creator>
      <pubDate>Thu, 10 Oct 2024 01:08:27 +0000</pubDate>
      <link>https://dev.to/matheusgb/dia-11-resumo-do-livro-organizacao-e-projeto-de-computadores-interface-hardwaresoftware-11-introducao-27b3</link>
      <guid>https://dev.to/matheusgb/dia-11-resumo-do-livro-organizacao-e-projeto-de-computadores-interface-hardwaresoftware-11-introducao-27b3</guid>
      <description>&lt;p&gt;Antes de engrenar de vez na criação do meu sistema operacional, resolvi dar dois passos atrás e consumir dois livros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organização e Projeto de Computadores: Interface Hardware/Software - John Hennessy&lt;/li&gt;
&lt;li&gt;Sistemas Operacionais: Conceitos e Mecanismos - Prof. Carlos A. Maziero&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também está no meu radar: Arquitetura de Computadores - Uma Abordagem Quantitativa - John Hennessy&lt;br&gt;
Mas esse deixarei para o futuro.&lt;/p&gt;

&lt;p&gt;Começando:&lt;br&gt;
Esse capítulo destina-se a enfatizar a era "pós-PC", onde os PMD's (dispositivo móvel pessoal) estão substituindo os computadores desktop convencionais. Um exemplo de PMD é um smartphone, ou computador tablet.&lt;br&gt;
Também elaborou um pouco sobre SaaS (Software as a Service) e Computação em Nuvem e processadores embutidos.&lt;br&gt;
Após discorrer sobre esses assuntos, é apresentado uma série de questões que o livro propõe que poderão ser respondidas ao terminar de lê-lo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como os programas escritos em uma linguagem de alto nível, como C ou Java, são traduzidos para a linguagem de máquina e como o hardware executa os programas resultantes?&lt;/li&gt;
&lt;li&gt;O que é a interface entre o software e o hardware, e como o software instrui o hardware a realizar as funções necessárias?&lt;/li&gt;
&lt;li&gt;O que determina o desempenho de um programa e como um programador pode melhorar o desempenho?&lt;/li&gt;
&lt;li&gt;Que técnicas podem ser usadas pelos projetistas de hardware para melhorar o desempenho?&lt;/li&gt;
&lt;li&gt;Que técnicas podem ser usadas pelos projetistas de hardware para aumentar a economia de energia?&lt;/li&gt;
&lt;li&gt;Quais são os motivos e as consequências da mudança recente do 
processamento sequencial para o processamento paralelo?&lt;/li&gt;
&lt;li&gt;Desde o primeiro computador comercial em 1951, que grandes ideias os arquitetos de computador tiveram para estabelecer a base da computação moderna? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por fim, o capítulo termina com as seguintes perguntas ao leitor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O número de processadores embutidos vendidos a cada ano supera, e muito, o número de processadores para PC e até mesmo pós-PC. Você pode confirmar ou negar isso com base em sua própria experiência?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu, confirmo com um grandíssimo sim, principalmente por causa &lt;a href="https://olhardigital.com.br/2020/09/30/noticias/novos-processadores-da-intel-serao-focados-em-internet-das-coisas/" rel="noopener noreferrer"&gt;dessa notícia&lt;/a&gt;. Os processadores embutidos em sua grande maioria são usados em dispositivos IoT. E pensando na grande expansão desse mercado, é fácil confirmar isso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Como mencionado anteriormente, tanto o software quanto o hardware afetam o desempenho de um programa. Você pode pensar em exemplo nos quais cada um dos fatores a seguir é o responsável pelo gargalo no desempenho? O algoritmo escolhido, A linguagem de programação ou compilador, O sistema operacional, O processador, O sistema de E/S e os dispositivos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Algoritmo - Um algoritmo mal otimizado pode apresentar ineficiências. Complexidade computacional alta, uso ineficiente de memória e overhead desnecessário devem ser evitados ao máximo.&lt;/p&gt;

&lt;p&gt;Linguagem de programação ou compilador - Linguagens interpretadas (Python e Ruby) e com compilação JIT (Java e C#) adicionam uma camada extra de processamento durante a execução. E linguagens que fazem uso do garbage collector também tendem a ser mais lentas.&lt;/p&gt;

&lt;p&gt;Sistema operacional - Tenho certeza que há mais fatores, mas os que eu experienciei foram: má compatibilidade de suporte ao hardware (ubuntu), sobrecarga de segurança (windows defender) e gerenciamento de energia (notebook fora da tomada entrou em modo de economia).&lt;/p&gt;

&lt;p&gt;Processador - Clock (frequência do processador), incompatibilidade de arquitetura (ARM, x86, x64), superaquecimento, número de núcleos... (com certeza há mais fatores que desconheço)&lt;/p&gt;

&lt;p&gt;Sistema de E/S e os dispositivos - No momento, só me vem a cabeça o uso de discos rígidos lentos (HDD) e saturação de I/O.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
