SOP-EngTel 2018 1: mudanças entre as edições

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 195: Linha 195:
</syntaxhighlight>
</syntaxhighlight>


 
<!--
{{collapse bottom}}
{{collapse bottom}}


Linha 348: Linha 348:


O ''status'' passado como parâmetro à função ''wait(&status)'' é, na verdade, o mecanismo de retorno de resultado do ''wait/waitpid''. Ao retornar, esta variável contém informações sobre o resultado da execução do processo filho. Por exemplo, se um processo terminou normalmente (i.e., chamou ''exit''), o comando ''WIFEXITED(status)'' retorna ''true''. Este comando retorna ''false'' se o processo foi abortado (e.g., ''segmentation fault'') ou morto (e.g., ''kill''). Investigue no manual do wait no Linux (''man wait'') o funcionamento do comando WEXITSTATUS(status), e use-o para modificar o exercício anterior para calcular o 5!, sendo que cada processo pode executar apenas uma multiplicação.
O ''status'' passado como parâmetro à função ''wait(&status)'' é, na verdade, o mecanismo de retorno de resultado do ''wait/waitpid''. Ao retornar, esta variável contém informações sobre o resultado da execução do processo filho. Por exemplo, se um processo terminou normalmente (i.e., chamou ''exit''), o comando ''WIFEXITED(status)'' retorna ''true''. Este comando retorna ''false'' se o processo foi abortado (e.g., ''segmentation fault'') ou morto (e.g., ''kill''). Investigue no manual do wait no Linux (''man wait'') o funcionamento do comando WEXITSTATUS(status), e use-o para modificar o exercício anterior para calcular o 5!, sendo que cada processo pode executar apenas uma multiplicação.
-->

Edição das 16h30min de 23 de fevereiro de 2018

1 Sistemas Operacionais

  • Professor: André D'Amato
  • Encontros: Segundas às 7:30 e sextas às 09:40 no Laboratório de Redes II.



2 Material de aula

2.1 Slides


2.2 Listas de exercícios

As listas de exercícios são compostas por exercícios selecionados do livro do Silberschatz, 8a edição. Há 10 volumes deste livro na biblioteca do campus.

SILBERSCHATZ, Abraham; GALVIN, Peter; GAGNE, Greg. Fundamentos de sistemas operacionais. 8. ed. Rio de Janeiro: LTC, 2011. 515 p., il. ISBN 9788521617471.

Exercícios selecionados:

  • Capítulo 1: 1-3, 6-8, 10, 13, 14, 17, 22, 23, 25.


3 Conteúdo

Unidade 01: Introdução

3.1 Unidade 01: Introdução

3.1.1 Apresentação do Curso

3.1.2 Visão geral de funções, responsabilidades e estruturas de um SO

3.1.3 Arquitetura de sistemas operacionais e modelos de programação

Unidade 02: Processos

3.2 Unidade 02: Processos

3.2.1 Gerência de tarefas; contextos, processos e threads

3.2.2 Escalonamento de tarefas

3.2.3 Comunicação entre Processos

3.2.4 Coordenação de processos

Unidade 03: Memória

3.3 Unidade 03: Memória

3.3.1 Introdução ao Gerenciamento de Memória

3.3.2 Memória Principal

3.3.3 Memória Virtual


Unidade 04: Armazenamento

3.4 Unidade 04: Armazenamento

3.4.1 Interface do Sistema de Arquivos

3.4.2 Implementação do Sistema de Arquivos

3.4.3 Estrutura de Armazenamento em Massa

3.4.4 Gerenciamento de Entrada e Saída


4 Laboratórios

Um Exemplo de Uso "API Padrão POSIX"

4.1 Um Exemplo de Uso "API Padrão POSIX"

Referências


Crie uma função soma que receba 2 ponteiros referenciando posições na memória, criadas utilizando nmap(), de maneira que estas posições armazenem números inteiros. A função soma deverá retornar a soma dos números apontados em regiões da memória sem a utilização de nenhuma rotina da biblioteca do C, que não sejam definidas por APIs posix, para criação destas regiões na memória (malloc, alloc, calloc). Após retornar o resultado da soma os devidos ponteiros deverão ser extintos da memória.


  • Experimento 1: Aumente o tamanho da memória alocada até quando for possível.

Qual o tamanho limite da memória que você conseguiu alocar?

  • Experimento 2: Mude o escopo para PROT_NONE, após executar e depurar o código explique o que aconteceu.

Em sua opinião NMAP trata-se de uma syscall ou de uma API? Afinal API e syscall são a mesma coisa? Explique.

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);

addr = Valor do início do mapeamento.
length = valor do tamanho da região a ser alocada.
prot = especificações de proteção da região alocada (consultar http://man7.org/linux/man-pages/man2/mmap.2.html).
flags = especificação do escopo e do tipo da região criada (exemplo publica ou privada, se é anônima ou não).


void* meu_malloc(size_t tamanho) {
  void* addr = mmap(0,                      // addr
                    tamanho,   // len
                    PROT_READ | PROT_WRITE,  // prot
                    MAP_ANON | MAP_PRIVATE, // flags
                    -1,                     // filedes
                    0);                     // off
  *(size_t*)addr = tamanho;
  return addr + sizeof(size_t);
}

int meu_free(void* addr) {
  return munmap(addr - sizeof(size_t), (size_t) addr);
}


int soma(int *N1, int *N2){

return (*N1+*N2);

}


int main(int argc, char* argv[]) {
  
  int* numero1 = meu_malloc(sizeof(int));
  int* numero2 = meu_malloc(sizeof(int)); 
  

  *numero1 = 10;
  *numero2 = 20;	

  int resultado = soma(numero1, numero2);

  printf("\n\n O resultado da soma é %d \n\n",resultado);	  	
  
  meu_free(numero1);
  meu_free(numero2);

  return 0;
}