Comandos Essenciais Linux, Estrutura e Conceitos de SO

Classificado em Computação

Escrito em em português com um tamanho de 11,39 KB

Comandos Essenciais da Shell (Bash)

  • echo $SHELL: Mostra qual o interpretador de comandos (Shell) que está a ser utilizado.
  • echo $BASH_VERSION: Mostra a versão da Bash.
  • who: Mostra quem está logado no computador.
  • ls -la: Lista os ficheiros da diretoria, incluindo aqueles que começam por um ponto final (ficheiros ocultos).
  • man: Manual do utilizador incluído no Linux e em sistemas Unix.
  • info: Comando parecido ao man, mas com uma estrutura mais robusta para agregação de páginas. Permite ligar com outras páginas e criar menus.
  • which: Localiza o caminho completo de comandos da Shell.
  • whereis: Localiza os ficheiros binários, de código fonte e de página de manual para um comando.
  • whatis: Procura na base de dados por pequenas descrições dos comandos de sistema e mostra o resultado.
  • wc: Mostra o número de linhas, palavras e bytes.
  • head -n3 <ficheiro>: Mostra as 3 primeiras linhas do ficheiro.
  • tail -n3 <ficheiro>: Mostra as 3 últimas linhas do ficheiro.

Estrutura de Diretórios (Árvore de Diretórios)

/bin
Contém ficheiros executáveis básicos do sistema.
/dev
Contém os ficheiros que representam dispositivos. Estão relacionados com periféricos (ex.: /dev/fd0, /dev/hda/sda, /dev/tty).
/etc
Contém os ficheiros de configuração do sistema e scripts de inicialização. Normalmente, só podem ser alterados pelo utilizador root (superutilizador). Ex.: passwd, group, profile.
/home
Contém os diretórios principais dos utilizadores. Nestes diretórios, os utilizadores têm permissões de leitura, escrita e execução.
/lib
Contém as bibliotecas necessárias para executar os comandos que se encontram em /bin e /sbin. São rotinas partilhadas por vários programas.
/sbin
Contém os ficheiros executáveis para administração do sistema.
/usr
Contém ficheiros utilizados pelo sistema em funcionamento, mas que não são imprescindíveis. Tem uma estrutura em árvore muito parecida à do diretório raiz.

Manipulação de Diretórios e Ficheiros

  • mkdir -p pp/{1,2/{2.1,2.2},3/{,"3,1"}}: Cria uma pasta com a estrutura de subdiretórios especificada.
  • rm -rf so: Remove o diretório so, subdiretórios e ficheiros. O parâmetro -r indica recursividade e -f força a eliminação (não indica erros por não existência). Pode ser adicionado o parâmetro -i para solicitar confirmação a cada eliminação.

Metacaracteres e Redirecionamento

Metacaracteres

Se quisermos filtrar diretórios/ficheiros, podemos usar metacaracteres:

  • ls -d1 so/[a-c]*: Lista todos os ficheiros/diretórios que começam com 'a', 'b' ou 'c'.
  • ls -d1 so/[a-c]*[b-d]: Lista os ficheiros que começam por 'a', 'b' ou 'c' e que terminam em 'b' ou 'd'.

Nota: Os metacaracteres podem ser utilizados nos mais diversos casos e não somente nas situações anteriores.

O ~ (tilde) especifica o diretório home do utilizador.

Redirecionamento de Entrada/Saída

  • cat: Concatena os ficheiros e mostra-os no standard output (por defeito).
  • stdin (Descritor 0): Corresponde ao dispositivo de entrada de dados (teclado), podendo ser redirecionado com o operador <.
  • stdout (Descritor 1): Corresponde ao dispositivo de saída de dados (monitor), podendo ser redirecionado com o operador > ou >>.
  • stderr (Descritor 2): Corresponde ao dispositivo de saída de erros (monitor), podendo ser redirecionado com o operador 2> ou 2>>.

Nota: O operador >> não apaga o conteúdo anterior do ficheiro (anexa), enquanto o operador > apaga o conteúdo existente (sobrescreve).

Pipes e Alias

Pipes

Um pipe é um mecanismo de comunicação unidirecional entre processos. É uma forma de redirecionamento usada pelo Linux e sistemas Unix para enviar o resultado (output) de um programa para outro programa para posterior processamento.

Exemplo: ls -l | more

Se um comando exibe mais informações do que as que podem ser mostradas na tela, o programa more fará uma pausa após a primeira tela cheia (página) e aguardará que o utilizador pressione ESPAÇO para ver a próxima página ou ENTER para ver a próxima linha.

Alias

Associa um nome a um comando.

Exemplo: alias ls='ls -l'

Para remover o alias: unalias <nome_alias> (neste caso, unalias ls).

Operadores Lógicos e Pipes Anónimos

Operadores Lógicos (&& e ||)

É possível utilizar os operadores && e || numa lista de comandos:

  • comando1 && comando2: O comando2 só será executado se o primeiro devolver sucesso (código de saída 0).
  • comando1 || comando2: O comando2 só será executado se o comando1 devolver insucesso (código de saída diferente de 0).

Pipes Anónimos

É um mecanismo de comunicação e sincronização entre processos hierarquicamente relacionados. É constituído por um buffer de capacidade limitada sobre o qual se pode escrever e ler seguindo a ordem FIFO (First-In, First-Out).

A criação do pipe é feita através de int pipe(int fd[2]). O fd é uma tabela de dois descritores para acesso ao pipe: fd[0] representa o descritor para leitura e fd[1] o de escrita.

Conceitos de Sistemas Operacionais

Interblocagem (Deadlock)

Um conjunto de processos bloqueados, cada um deles detendo um recurso e à espera de outro recurso que está na posse de um dos processos do conjunto.

Condições para a Interblocagem

  • Exclusão Mútua: Apenas um processo pode, em determinado instante, aceder ao recurso.
  • Posse e Espera: Um processo detém pelo menos um recurso e encontra-se à espera de adquirir recursos adicionais na posse de outros processos.
  • Não Preempção: Um recurso apenas é libertado de forma voluntária pelo processo que o detém.
  • Espera Circular: Existe uma cadeia circular de processos, onde cada um espera por um recurso detido pelo próximo processo na cadeia.

Preempção: O processador retira os recursos de um processo sem que este termine a sua utilização.

Soluções para Interblocagem

  • Prevenção ou Evitação: Recorrendo a um protocolo que previna ou evite o estado de interblocagem.
  • Deteção e Recuperação: Permitindo que o sistema entre num estado de interblocagem, que o detete e que recupere desse estado.
  • Ignorando o Problema (Algoritmo da Avestruz): Considera-se que os deadlocks ocorrem muito raramente (utilizado em Windows e Unix).

Comunicação e Sincronização entre Processos

  • Memória Partilhada: Consiste na forma mais rápida de comunicar entre processos (relacionados ou não). O sistema operativo identifica os segmentos através de uma chave ou de um identificador que garante a sua partilha.
  • Semáforos: Mecanismos que permitem a sincronização entre processos, sendo comumente utilizados na resolução de problemas como acesso concorrente a recursos partilhados. São identificados por uma chave ou um identificador.

Escalonamento e Concorrência

  • Escalonador (Scheduler): Toma decisões de escalonamento para assegurar o acesso justo de processos aos recursos disponíveis. Escolhe o próximo processo a ser executado e aloca o CPU.
  • Despacho (Dispatcher): Executa decisões de escalonamento, dando o controlo do CPU ao processo escolhido pelo escalonador.
  • Secção Crítica: Pedaço de código de um processo que manipula dados partilhados com N processos.
  • Condição de Corrida (Race Condition): N processos manipulam dados partilhados em simultâneo, ficando o resultado final dependente da ordem pela qual se deu o acesso dos diferentes processos.

Processos e Tarefas (Threads)

Processos

De um ponto de vista conceptual, um processo pode ser considerado como uma máquina virtual que executa diversas etapas de atividade definidas pelo algoritmo explicitado num programa.

Estrutura (Espaço de Endereçamento Próprio):

  • Secção de Código: Armazena o código do programa a ser executado pelo processador.
  • Secção de Dados: Armazena as variáveis globais e as variáveis estáticas do programa.
  • Secção de Heap: Armazena as variáveis criadas dinamicamente durante a execução do programa.
  • Secção de Pilha (Stack): Armazena dados temporários, como variáveis locais e endereços de retorno de chamadas a sub-rotinas.

Tarefas (Threads)

Fluxos de execução independentes e concorrentes que executam o mesmo programa no mesmo espaço de endereçamento do processo.

Partilham a secção de código, dados, heap e recursos E/S, mas cada tarefa tem o seu próprio conjunto de registos, uma secção de pilha (stack) e outros dados específicos (tratamento de sinais e exceções).

Sinais

Em Linux, é possível enviar sinais aos processos de modo a assinalar acontecimentos assíncronos e exceções.

Tipos de Sincronização

  • Síncrona (Bloqueante): O emissor bloqueia até o recetor receber a mensagem. O recetor bloqueia até colher a mensagem do emissor.
  • Assíncrona (Não Bloqueante): O emissor envia a mensagem e prossegue a execução. O recetor recebe mensagem válida ou nula.

Entradas relacionadas: