Thiago Cantero

Tecnologia e Entretenimento

Arquitetura de SoftwareClinguagem de programaçãoPythonSistemas Operacionais

Systemcalls – Chamadas ao Sistema. Por que devemos saber?

Olá, mundo! Tudo bem com você?

Introdução

Gosto de trazer temas relevantes, que vejo que são escassos na área de desenvolvimento, ou qualquer área análoga da Informática, seja no campo da Telecomunicação, através das Redes Computacionais, até mesmo na Gestão de Banco de Dados complexos. O Profissional de hoje, sequer faz a ideia de como funciona e para o que ele realmente executa certos comandos que ele desenvolve em sua aplicação. Seja em qual for o segmento, Web, Mobile ou Desktop.

Isto é evidenciado nos projetos afora, na documentação do código, na elucidação dos problemas de maneira mais difícil, pois com o advento da tecnologia amplamente difundida, o indivíduo perdeu interesse na leitura, e isso é um grande mal.

Bom, deixamos essa breve reflexão e vamos ao que interessa.

Vamos ao trabalho\\

Talvez por curiosidade ou alguma informação no debug do seu código e/ou falha no seu jogo favorito tenha surgido alguma mensagem de erro, aquela famosa tela azul do Windows. O que significa?Como tratar, e o que tem relação com desenvolvimento ou qualquer área computacional? A resposta é simples, tudo!

Vamos ao conceito do Mestre Tanembaum:

Vimos que os sistemas operacionais têm duas funções principais: fornecer abstrações para os programas
de usuários e gerenciar os recursos do computador. Em sua maior parte, a interação entre programas de usuá-
rios e o sistema operacional lida com a primeira; por exemplo, criar, escrever, ler e deletar arquivos. A par-
te de gerenciamento de arquivos é, em grande medida, transparente para os usuários e feita automaticamente.
Desse modo, a interface entre os programas de usuários e o sistema operacional diz respeito fundamentalmen-
te a abstrações. Para compreender de verdade o que os sistemas operacionais fazem, temos de examinar essa
interface de perto. As chamadas de sistema disponíveis na interface variam de um sistema para outro (embora
os conceitos subjacentes tendam a ser similares).Somos então forçados a fazer uma escolha entre (1)
generalidades vagas (“sistemas operacionais têm chamadas de sistema para ler arquivos”) e (2) algum siste-
ma específico (“UNIX possui uma chamada de sistema read com três parâmetros: um para especificar o arqui-
vo, um para dizer onde os dados devem ser colocados e outro para dizer quantos bytes devem ser lidos”).Sistemas Operacionais Modernos, Andrew S. Tanembaum, 4ª Edição (2016), pág. 35 Editora Elsevier.

Com o que fora exposto pelo Mestre, podemos então fazer uma comparação como uma espécie de API, é isso mesmo, é uma API e não uma coisa que você achava que era exclusiva do Javascript, quando o utiliza em uma aplicação para fazer uma camada de Frontend se comunicar com a de Backend, atravé do seu Framework/Lib favorito (Angular, Vue.JS, ReactJS, NuxtJS, etc e etc). Viu como os conceitos são bem antigos?

Para que possamos realmente entender o que é uma Syscall (Chamada ao Sistema), vejamos este simplório programa em C que faz uma Chamada ao Sistema, demonstrando a data atual:

data.c

/*
*Programa Simples em C 
*para demonstrar a Chamada ao Sistema
*Thiago Cantero Mari Monteiro 2022
*/

#include<stdio.h>
#include<time.h>

int main()
{
    time_t t;   
    time(&t);

    printf("A Data atual é: %s", ctime(&t));
    
    return 0;
}

Como estou no Linux, uso o Gnu Compiler Collection, também há a possibilidade de instalar no Windows.

gcc data.c

ele gerará um arquivo a.out, execute-o:

./a.out

Quando programamos, neste caso solicitamos a hora atual do Sistema, parece algo relativamente simples, no entanto há muita coisa por de trás deste simples código. Vamos pormenorizar o que vimos a pouco:

As bibliotecas <stdio.h>  e <time.h> tem essa premissa, de atuar na camada do usuário, intermediando através da linguagem C (devidamente compilada), para acionar o Kernel, que por sua vez fará a abstração da informação no nível do hardware.

Agora com o conceito bem definido vamos para outros exemplos.

Vamos usar a biblioteca GTK, que possibilita a criação de interfaces amigáveis gráficas para C, C#, PHP, Python dentre outras linguagens. Vejamos um simplório exemplo em Python:

janela_python.py

#
#Exemplo de Chamada de Biblioteca Gráfica com Python
#Thiago Cantero Mari Monteiro 2022
#

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

window = Gtk.Window(title="Olá, Mundo!")
window.show()
window.connect("destroy", Gtk.main_quit)
Gtk.main()

Neste exemplo fizemos a mesma coisa, o mesmo comportamento, criamos um código, e na sequência executamos e chamamos o Sistema, na figura do Kernel do seu Sistema Operacional (Linux, MacOS, Windows) e manipulamos ações como abstração de Hardware, como o acionamento de uma Webcam, um dispositivo USB, o mouse, qualquer dispositivo de entrada/saída.

A cada exemplo vemos um comportamento, que podemos constatar que as Syscalls são nada mais, nada menos do que interações com o Sistema Operacional.

São basicamente cinco tipos de Syscalls (em qualquer S.O):

1 – Gerenciamento de Dispositivos (Drivers de Hardwares)

2 – Controle de Processos (Gerenciamento de Memória, Manipulação de Registradores de CPU, etc.)

3 – Gerenciamento de Arquivos (Sistemas de indexação e organização de Arquivos, FAT, NTFS, EXT4)

4 – Gerenciamento de Informações (Gestão de Processos em execução)

5 – Comunicação (Sockets, Pilhas TCP/IP)

Em uma aplicação Web, quando acionamos a Webcam para realizar uma conversa ou reunião, utilizamos o WebRTC, que tem o mesmo conceito de realizar a abstração do hardware para realizar tal feito. Isso é uma Syscall ou Chamada ao Sistema.

Agora tente imaginar quando você escreve um simples formulário, em que você aponta para selecionar e mandar seu arquivo para fazer upload, isso também é uma Syscall. Essa interação ao explorar a pasta para seleção do Arquivo é exatamente uma Chamada ao Sistema, através de uma API do Kernel.

É óbvio que passei bem superficial sobre o tema, mas é interessante pegar literatura para melhor entendimento, e sim!É de suma importância qualquer desenvolvedor saber dessas tratativas, pois assim saberá como aplicar as melhores estratégias para entender o porque de cada processo, as estruturas que servem de base para sua aplicação. E por que isso é importante?
Simples, se você não sabe como funciona, não conseguirá solucionar eventuais problemas que estão relacionados ao Sistema Operacional.

E isso acontece?

Vamos a um outro exemplo. Vamos forçar um erro “Crasso” em realizar alocar a memória, e novamente realocar o espaço. Isso não acontece em linguagem de alto nível como PHP, Ruby, Javascript, no entanto é possível fazer com C, C++, C#, Object Pascal, Rust, Go, etc.

/*
* Exemplo de Realocação de Memória - Fail Crash em C
* Thiago Cantero Mari Monteiro 2022
*/

#include <stdio.h>
#include <stdlib.h>

int
main()
{
  int *array;

  puts("Realocação em um array ...");

  array = malloc(sizeof(int) * 4);

  if (array) {
    puts("Realocação realizada");

    puts("Limpa o Array...");
    free(array);
  }

  puts("Limpa o Array...");
  free(array);

  puts("Ok");
}

 

Ao chamarmos a palavra reservada free() ele dispara um erro que já teve a segunda chamada e aborta, este comportamento é feito pelo Kernel ao ter esta constatação, no entanto realizada por intermédio de um código C compilado. Se quer saber como o Sistema Operacional aloca os endereços de memória, leia este artigo aqui.

A intenção deste artigo foi de transmitir os conceitos, que são muito complexos e bem abrangentes, de maneira mais superficial, mas que estimule seu interesse para entender como funciona a Sistemática por trás do funcionamento do seu Software. Não é só copiar e colar código, existe muito mais, como fila de processos, registradores de processadores trabalhando em pipeline, enfim! Se aprofunda para não se tornar um impostor, e sim um bom profissional.

Dedique seu tempo aos estudos, leia mais. É mais proveitoso do que vídeos.

Obrigado pela oportunidade, até mais. ; )

Códigos fontes no Github aqui.

 

Não despreze a tradição que vem de anos longínquos; talvez as velhas avós guardem na memória relatos sobre coisas que alguma vez foram úteis para o conhecimento dos sábios.