O que você gostaria que tivessem ensinado na primeira aula sobre ponteiros?

Olha. Eu gostaria de ter aprendido as diversas maneiras de se exibir tanto o endereço de memória como o conteúdo de memória apontado por um ponteiro.

Resumindo, seria mais ou menos o código abaixo. Se faltar alguma coisa, irei adicionando.

#include <stdlib.h>
int main()
{

    char ponteiro[5]="ABCDE";

    printf("Comandos equivalentes em C\n\n");

    printf("Considerando 'char ponteiro[5]=\"ABCDE\";'\n\n");

    printf("Primeiro endereco do ponteiro:%p \n\n",ponteiro);

    printf("Primeiro conteudo de ponteiro[0]: %c\n",ponteiro[0]);
    printf("Primeiro conteudo de   *ponteiro: %c\n\n",*ponteiro);

    printf("Conteudo de ponteiro[1]  : %c\n",ponteiro[1]);
    printf("Conteudo de *(ponteiro+1): %c\n\n",*(ponteiro+1));

    printf("Endereco de memoria de (&ponteiro[1]):%p\n",(&ponteiro[1]));
    printf("Endereco de memoria de (&ponteiro+1) :%p\n\n",(ponteiro+1));

  return 0;
}

O print de tela fica assim:

Postado em 13/01/2023 por Renato de Pierri.

Por que se usa tanto o hexadecimal na ciência da computação, quando decimal é mais fácil de entender?

Resposta publicada no Quora em 19/04/2021

Em computação, hexadecimal é muito mais fácil de entender.

Quando um programador que manja de hardware olha para um código hexadecimal, ele sabe exatamente como o hardware está se comportando, apenas fazendo contas de cabeça.

Por isso que o hexadecimal é utilizado.

Não leia o resto.

Modo nerdice on.

Computador trabalha com lógica binária.

Pensando em um computador de 8 bits, sabemos que ele consegue manusear 8 bits por vez em sua linha de dados.

No diagrama abaixo temos um computador simplificado:

  • Do lado esquerdo tem o processador e do lado direito tem a memória. Deixei de fora alguns detalhes para ficar mais fácil a explicação.
  • O processador e a memória são interligados pelo barramento de endereçamento, de dados e as linhas de controle.
  • O barramento de dados está detalhando os 8 bits que o compõe.
  • Cada seta no barramento de dados representa um bit de dados.
  • O processador consegue ler e escrever na memória, 8 bits de dados por vez, pois trata-se de um computador de 8 bits.

Os bits, são essas linhas que podem assumir valores binários de zero ou um.

Eletronicamente falando:

Essas linhas dos bits de dados podem estar energizadas ou não.

As linhas que estiverem energizadas terão o valor lógico VERDADEIRO (1 – um) e as que não estiverem energizadas terão o valor lógico FALSO (0 – zero).

Onde entra o hexadecimal:

Note que o barramento de dados foi separado em dois conjuntos de 4 bits.

  • Um conjunto de 4 bits engloba os bits de 0 a 3
  • O segundo conjunto de 4 bits engloba os bits de 4 a 7

A pergunta que a gente faz agora é: Quantas combinações a gente consegue fazer de bits ligados e desligados aqui?

Já dou a resposta, que são 256 combinações indo de todos os 8 bits com valor FALSO – desligados até termos todos os 8 bits com o valor VERDADEIRO – ligados.

Acompanhe, analisando os 4 primeiros bits:

https://qph.fs.quoracdn.net/main-qimg-85eaffbadd3963c04251e5859084f219

Os caras fizeram o seguinte, os quatro primeiros bits, dá para fazer 16 combinações indo do valor decimal zero até o valor decimal 15. Basta continuar com a tabela adicionando os bits que faltam e iremos chegar em 256 combinações, podendo representar os números de zero a 255..

Mais um detalhe: A posição do bit corresponde a um valor decimal. Se os bits zero e dois forem verdadeiros, significa que temos o número 5 nas notações decimal e hexadecimal, por exemplo.

Conforme dito, se pegar o segundo conjunto de 4 bits, também dá para fazer essas dezesseis combinações.

Juntando o primeiro e o segundo conjunto de 4 bits, dá para fazer 16 X 16 combinações, ou seja, dá para fazer 256 combinações, que é capaz de representar os valores decimais indo de zero a 255.

No fim de tudo é isso o que realmente importa:

Para simplificar isso aí, os bits são separados em grupos de 4 bits que são representados pelos símbolos indo de “0” até “F”.

Um código indicando quais linhas de cada conjunto de 4 bits estão ligadas ou desligadas.

Simples e brilhante.

Desenvolvendo computadores:

Agora, se coloque no lugar do desenvolvedor de computadores.

O cara tem que lidar com o circuito elétrico. Tem que olhar para um código e decodificar de cabeça quais linhas do barramento de dados estão energizadas ou não.

É muito mais fácil para um engenheiro de hardware:

  • Separar a linha de dados em grupos de 4 bits.
  • Trabalhar com a notação hexadecimal, 3A por exemplo.
  • Converter esse número, de cabeça para o binário “0011 1010”.
  • E identificar no barramento quais linhas de dados que estão energizadas ou não…

Do que fazer a conversão do número 58 (decimal) para seu correspondente binário, que é bem mais complicado.

É por isso que se utiliza o hexadecimal.

Hexadecimal é para humanos falarem com máquinas, enquanto que decimal é para máquinas falarem com humanos.

Recomendo que seja lido o livro do Tocci, que já indiquei em outras respostas por aqui.

Fontes:

Livro do Tocci:https://loja.grupoa.com.br/sistemas-digitais-principios-e-aplicacoes-12ed9788543025018-p1005546?tsid=34

Demais tabelas e infográficos: Acervo pessoal.

O que é um sistema operacional de tempo real?

Resposta originalmente traduzida no Quora em 06/07/2019.

Sistema Operacional de Tempo Real (Real Time Operating System) é um sistema operacional especializado que é responsável por gerenciar os processos em um sistema de tempo real ( real time system.)

  • Ele é responsável pelo gerenciamento de processos e alocação de recursos.
  • O sistema operacional em tempo real pode ser baseado em um kernel padrão que é usado inalterado ou modificado para uma aplicação específica.
  • Normalmente, não inclui recursos como gerenciamento de arquivos.

Componentes do Sistema Operacional de Tempo Real:

  1. Relógio de tempo real: (Real-time clock) Ele fornece informação para agendamento de tarefas
  2. Gerenciador de interrupções: (Interrupt handler) Gerencia solicitações de serviços assíncronas .
  3. Agendador: (Scheculer) Seleciona o próximo processo a ser executado.
  4. Gerenciador de recursos: (Resource Manager) Aloca os recursos de processador e memória.
  5. Despachante: (Dispatcher) Inicia a execução dos processos.

Os componentes de um sistema operacional de tempo real pode ser conforme abaixo:


-Adição do tradutor Renato de Pierri-

Diferenças entre o sistema operacional de tempo real e o de tempo não real – original: (Differences between Real time and Non-real time Operating system)

Clique na figura para ampliar.

Ashwin Dhakal é autor do livro “Software Engineering” ISBN:978-9937-0-3279-7

Para que serve o Garbage Collector

Publicado como resposta no Quora em 02/07/2019

O garbage collector (GC) serve para gerenciar automaticamente os pedidos de alocação dinâmica de memória.

Figura abaixo mostra a arquitetura do HotSpot JVM com o Garbage Collector

Fonte: Getting Started with the G1 Garbage Collector

Ele faz o gerenciamento automático e dinâmico da memória da seguinte forma:

  • Aloca memória do e a devolve para o sistema operacional.
  • Gerencia a memória para a aplicação à medida em que a aplicação requisita memória.
  • Determina quais partes da memória irão permanecer em uso pela aplicação.
  • Realoca memória não utilizada destinando-a para outra aplicação.

O Java HotSpot garbage collectors empregam várias técnicas para melhorar a eficiência dessas operações, entre elas:

  • Utiliza o algoritmo de reclamação de armazenamento de memória “generational scavenging” em conjunção com métodos de datação dos dados na memória a fim de concentrar os esforços nas áreas que contenham mais dados suscetíveis a serem reclamados.
  • Utiliza múltiplas threads para execução de operações paralelas, ou executa operações de longo tempo de execução em segundo plano enquanto rodando uma aplicação principal.
  • Procura liberar grandes blocos contíguos de memória pela compactação de objetos ativos (live objects).

Qual vantagem de se utilizar o Garbage Collector?

A vantagem de se utilizar o garbage collector é que ele libera o desenvolvedor de aplicações da tarefa manual de se fazer o gerenciamento de alocação de memória.

O desenvolvedor é liberado da necessidade de cuidar das alocações e liberações de memória e fica livre de ter que tomar conta das tarefas que alocam dinamicamente a memória.

Isso elimina completamente alguns tipos de erros relacionados a gerenciamento de memória bem como otimiza o tempo de execução da aplicação. O Java HotSpot VM possui um conjunto de algoritmos que executam essa tarefa.


Fonte, Documentação da Oracle: HotSpot Virtual Machine Garbage Collection Tuning Guide

Para saber mais: Getting Started with the G1 Garbage Collector

Last updated by at .