






























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
SOII UERJ - P2
Tipologia: Notas de estudo
1 / 38
Esta página não é visível na pré-visualização
Não perca as partes importantes!































Aula 15
A idéia é mandar dados e o dispositivo faz alguma coisa com esses dados, por exemplo, o disco grava, a impressora imprime. Apenas o so que roda em modo núcleo pode mandar o dispositivo parar de funcionar ou não, apenas o so consegue executar instruções de IN e OUT (entrada e saída) para o dispositivo, por segurança, por exemplo, vírus. Ou seja, apenas o so se comunica diretamente com o dispositivo. Os device driver é um pedaço do sistema operacional que controla os dispositivos.
Antigamente no Unix ao trocar um dispositivo tinha que trocar redigitar a linha de código do sistema operacional, hoje em dia, ficou uma coisa isolada do so para que ao trocar o dispositivo basta trocar o device driver. Até porque hoje em dia quem programa o device drive muitas vezes não é quem desenvolve o so, mas sim quem desenvolve o dispositivo. Existe um device drive para cada tipo de dispositivo. O device drive fornece uma visão de mais alto nível para o sistema operacional. Todos os sistemas operacionais são assim, não precisam alterar uma linha de código ao alterar o dispositivo, pois basta trocar o device drive. No DOS os devices drivers fica configurado no arquivo de sistemas chamado CONFIG.SYS, por exemplo: Device = C: \DOS\KEYBORD.SYS -> configura o teclado.
Compatibilizando velocidade CPU e dispositivo:
Existem diversas para obter dados de um dispositivo.
1ª - Espera ocupada: Existe uma questão que é a CPU manda a ordem e espera que o dispositivo responda. Existe no dispositivo uma porta de status. Exemplo fictício: OUT 3F0H, 80H; ler algo do disco, ou seja, envio uma ordem a um dispositivo de saída. VOLTA: IN 3F1H AX; AX=0 não lido e AX≠0 é lido; JZ VOLTA ; enquanto AX for zero, ou seja, não lido. Até que o dispositivo mude de status de não lido para lido
Onde: 3F0H é porta de comando; 3F1H é porta de status;
A grande vantagem de fazer isso é que a CPU fica pressa enquanto aguarda o dispositivo, não muda o estado. Esse tipo de E/S é chamada de Espera Ocupada, serve apenas para mudar o estado.
Aula 16
Revisão:
- Instruções de E/S: OUT porta, valor (ou reg => OUT 50, valor(reg) IN porta, reg => IN 51, reg - E/S mapeada em memória: MOV [50], valor MOV REG, [51]
Compatibilizando velocidade entre CPU e dispositivo:
A CPU é muito mais rápida que o dispositivo então tem que compatibilizar velocidade. Existem algumas formas de fazer essa compatibilização:
1ª - Espera ocupada ou polling:. A CPU executa o loop de espera, esperando que o dispositivo venha a estar disponível. E como a CPU sabe disso? Existe uma porta de status, que vai dizer isso a CPU. A CPU vai consultar essa porta de status e verificar se o dispositivo está disponível. (Visto na aula passada!) Enquanto a CPU está esperando o dado fica pronto no dispositivo, ela fica em loop ociosamente, só executando duas instruções uma de IN e outra de OUT. LOOP : IN Porta_status, AX JZ LOOP ; fica e, loop enquanto AX=0; IN PortaLeitora, BX; Como dito acima, o problema de estar em loop é que a CPU não executa mais nada. Mas, existem outras formas de E/S mais eficientes de sincronizar a velocidade.
2ª - Por Interrupção: O dispositivo avisa quando está pronto, ao invés da CPU perguntar se está pronto, o dispositivo tem a proatividade de avisar. Qual o mecanismo de hardware que identifica esse tipo de atividade? É a interrupção, a CPU pode estar executando qualquer coisa que esta será interrompida quando acontecer um evento. Esse é um outro modo de fazer E/S.
Comparação: Na espera ocupada, mantinha-se uma ordem de leitura. Depois executa um comando de leitura para receber o dado. A ordem para ler tem que continuar existindo para ler o disco. O que deixa de existir é o loop. Como fica? Tem uma parte que é o SO executando, conforme exemplo abaixo:
Execução Normal DO SO . . . OUT PORTA_CONTROLE, VALOR;ORDEM LEITORA . . . SO escalona outro processo.
Quando o dado fica disponível no dispositivo, este gera interrupção, a CPU para o que estava fazendo e executa a rotina de tratamento de interrupção e voltar a executar o que estava executando antes da interrupção.
Tratamento de Interrupção: Rotina que vai executar quando o dado estiver disponível no disco, quando o status muda, e gera a interrupção quando o status é dado disponível. Salvamento dos Registradores para que as rotinas antes da interrupção acontecer continue executando ao terminar a interrupção, mas para isso, antes de terminar tem que restaurar os registradores. IN PORTA_LEITORA, BX; lê o conteúdo da porta e coloca em BX MOV AX, [500]; carrega o ponteiro MOV [AX], BX ; salva o dado na memória INC AX : incrementa o ponteiro INC AX; MOV [500], AX ; salva o ponteiro
. ; Restauração dos Registradores . RET I ; acaba o tratamento da interrupção;
3º - Por DMA(Direct Memory Access) : É um acesso direto de memória. Como funciona? Existe uma comunicação entre a CPU e a memória, essa comunicação é feita por um componente chamado barramento de memória que sai da CPU e vai para memória.
mas respondeu que este não é um acesso longo, porque alguma coisa do tamanho do barramento, por isso mesmo que haja concorrência, o tempo de espera é pequeno. Existe um chip, que é o árbitro do barramento, onde pode configurar quem utilizará o barramento, a CPU ou o DMA.
Existem outros dispositivos, por exemplo, a placa de vídeo, que não precisa compatibilizar velocidade, pois tem a memória da placa que é praticamente compatível com a CPU.
Todos os dispositivos que precisa compatibilizar velocidade de transferência de dados com a CPU e cujo volume de dados é muito grande utiliza esse mecanismo, o DMA, que é o mais eficiente. Quando o volume dados é pequeno é utilizada a interrupção, 1 byte, por exemplo. Exemplos de dispositivos que utiliza interrupção, por transferir 1 byte por vez: mouse, teclado, modem.
Vamos ver com mais cuidado para lidar com arquivo que é o disco. O disco tem que ser identificado de alguma forma para que consiga localizar um arquivo qualquer. Existem dois tipos de dispositivos, que armazenam dados(Ex.: CD-ROM, disco rígido, disco flexível), enquanto isso tem-se placa de rede, teclado, mouse e modem. Os dispositivos que armazenam dados têm que ter a capacidade de recuperação de dados que foi salvo antes, tem a capacidade de endereçamento, como se manifestam? O disco é visto como unidade de armazenamento. São também chamados de dispositivos de bloco.
Dispositivos que armazenam dado ou dispositivos de bloco
Dispositivos que não armazenam dado ou dispositivos de caracter
CD ROM / Disco rígido / Disco Flexível Placa de Rede/ Teclado/Mouse/Modem
Os dispositivos de não armazenamento de dados são chamados de dispositivos de caracter, pois não há a necessidade de ter a unidade localizável. E como é a forma que o windows usa esse tipo de dispositivo? Esse tipo de dispositivo é usado indiretamente, terá um conjunto de rotinas do SO que existem, para lidar com cada tipo de dispositivo (teclado, mouse e etc.), são chamadas que o programador pode fazer. A cada dispositivo que for inventado, ou usará uma API que já existe ou terá que inventar uma API nova. Enquanto isso, o Unix terá uma maneira diferente, na chamada ao dispositivo o Unix considera o dispositivo como um arquivo, todo o dispositivo do Unix entra no C do arquivo, poderá ser mandado dado aos dispositivos como se estivesse escrevendo ou lendo o arquivo, isso diferencia a programação.
No Unix existe o arquivo especial, e que não existe no windows. São pseudo-arquivos que representam dispositivos. Por exemplo: /dev/lpt – representa a impressora cp arq 1 arq2 – copia arq1 para arq cp arq1 /dev/ept –copia o arq1 para impressora, ou seja, imprime arq 1
Existem duas abordagens para usar dispositivos: 1ª - Como se fossem arquivos(UNIX); 2ª - Como chamadas ao SO específicas para cada tipo de dispositivo (windows).
Exemplo no MS-DOS: copy arq1 pln ; imprime arq 1
Dispositivo de Armazenamento ou de Bloco - Disco:
A idéia é ter uma cabeça magnética que se mexe ao longo do raio do disco. Os discos são divididos em setores, trilhas e superfícies.
Qual o problema? É de testar a capacidade de magnetização de um certo disco, depende da massa de metal magnético que disco tem. Quanto mais massa mais capacidade ele tem. Então, a capacidade de magnetização proporcional à massa.
Massa = densidade X volume (constante)
A densidade é fixa pois depende do material e a capacidade proporcional ao volume
Volume = espessura X comprimento X largura Onde: K = constante
A espessura e a largura são constantes, mas o comprimento não é constante, pois cada setor tem um comprimento diferente. A capacidade é proporcional ao comprimento, o problema é que o comprimento não é constante ao longo do eixo. Então os setores mais externos eram subutilizados eram menos usados do que a capacidade de armazenar existia um desperdício dos setores mais externos. Como resolver essa deficiência? Mudando a rotação, exemplo do CD-ROM e outra solução usar um conversor analógico/digital que consigua converter a taxas diferentes.
Hoje em dia os discos são como mostrado abaixo.
A idéia é manter a mesma velocidade para ler o setor interno e externo. Tanto o interno como o externo fica como descrito no setor interno descrito acima. Isto acontece com o CD-ROM.
O disco do CD-ROM tem um problema de lentidão. Não é a solução mais usada.
Aula 18
Aula do dia 25/06/
Nos discos simples quanto nos discos antigos em que os setores tinham que ser endereçados a uma certa unidade de gravação que é um setor, para isso tinha que ser especificado duas coisas:
Quando uma cabeça se mexe todas as outras se mexem juntas, então só precisa de dois motores, um que gira e outro que mexe as cabeças. Quando vou ler ou escrever no setor, duas coisas acontecem : 1º - A cabeça tem que mexer por inteiro 2º - O setor que será lido ou escrito tem que passar por baixo da cabeça
Esses dois movimentos têm que esperar para que o setor seja lido, esses tempos são os abaixo:
Esta é uma visão que é complicada para o SO, o SO não conhece, as três dimensões, então existe uma função no hardware que se chama linearização do disco que transforma o disco em uma coisa lógica com uma dimensão. O hardware dá a visão do disco como uma visão linear.
Escalonamento:
Tempo de transferência: é o tempo que demora a passar ao longo do setor para transferir o dado para a memória controladora (DMA, normalmente). Enquanto esta executando um pedido pode chegar outro pedido no cilindro10 e outro no 50 e ainda está atendendo o pedido 10, chegou outro pedido no 20. Neste caso, se for escolhido ordem de chegada, terá um seek maior. O hardware roda o algoritmo e o SO envia os pedidos.
Algoritmos de Escalomento em Disco:
FCFS (First Come First Served): Primeiro a chegar é o primeiro a ser atendido. Isso é ruim porque pode gerar zigue-zague. Porém é mais justo que o SSTF, mas é mais lento; O mais simples, mas geralmente não fornece o serviço mais rápido. Ele atende a fila de pedido de acesso a disco na forma que ela está, ou seja, pode ocorrer caso desse escalonamento atender pedidos que movimentem muito a cabeça do disco, e não pedidos próximos.
O SSTF (Shortest Seek Time): Evita o zigue-zague, ele vai para o pedido mais próximo ao que está sendo atendidos. Assim, pedidos distantes demoram a ser atendido. Embora com isso ele reduza o movimento da cabeça é mais injusto. O algoritmo SSTF seleciona o pedido com o tempo de busca mínimo a partir da posição atual da cabeça.Como o tempo de busca aumenta com o número de cilindros percorridos pela cabeça, o SSTF escolhe o pedido pendente mais próximo da posição atual da cabeça.Ele é basicamente uma forma de escalonamento shortest-job-first (SJF). Problema: Estarvation (paralização), como a chegada de pedido de acesso a disco é uma coisa que pode acontecer todo tempo, se os pedidos que estão entrando na fila forem pedidos próximo à posição atual da cabeça, ele pode ficar atendendo a esses pedidos, fazendo que um pedido velho mais longe da cabeça fique esperando indefinidamente. Embora o algoritmo SSTF seja uma melhoria substancial em relação ao algoritmo FCFS, ele não é ótimo.
O elevador ou SCAN: É menos eficiente que o SSTF, mas é mais justo que o SSTF. Problema: Ele é mais generoso para os pedidos do meio, pois como ele atende nos dois sentidos os pedidos do meio são atendidos na ida e na volta. Embora seja menos justo que o elevador circular é mais rápido que o mesmo, avaliando apenas os algoritmos do elevador e sua variação o circular. No algoritmo SCAN, o braço do disco começa em uma ponta do disco e se movimenta em direção à outra ponta, atendendo os pedidos assim que chega em cada cilindro, até atingir a outra ponta do disco. Na outra ponta, o sentido do movimento da cabeça é invertido percorrendo o disco no outro sentido. Ao chegar na ponta e voltar, no início dessa volta tem poucos pedidos, pois a cabeça do disco acabou de passar por ali, ficando um maior número de pedidos e mais velhos na outra ponta. Dessa forma os pedidos do meio serão privilegiados, serão atendidos mais rápidos.
Elevador circular ou C-SCAN: Resolve o problema de privilegiar os cilindros do meio, pois só atende subindo ou descendo. É mais lento que o elevador, mas é mais justo. O algoritmo SCAN circular (C-SCAN) é uma variante de SCAN projetado para fornecer um tempo de espera mais uniforme. A diferença é que ao chegar na ponta do disco, ele move a cabeça imediatamente para o início da outra ponta sem atender nenhum pedido nesse trajeto. Só então ele percorre o disco atendendo os pedidos, ou seja, os pedidos só são atendidos em um sentido. O nome circular é devido a este comportamento, ou seja, trata os cilindros como uma lista circular, ligando o último ao primeiro.
No algoritmo look o braço do disco só vai até o último pedido e inverte o sentido. Ao contrário do algoritmo SCAN e C- SCAN que movem o braço do disco por toda a extensão do mesmo. Essas versões de SCAN e C-SCAN são chamadas de LOOK e C-LOOK, porque procuram por um pedido antes de continuar a mover em determinado sentido.
Ao avaliar um algoritmo deste estamos avaliando velocidade e justiça. Dentro todos os algoritmos citados acima o SSTF é o mais rápido de todos. Quem roda o algoritmo é o disco, o SCSI, que aceita vários pedidos, pois o IDE aceita apenas um pedido por vez e trava o barramento quando está atendedo, como veremos a seguir e quem envia o pedido é o sistema operacional. Normalmente é o elevador o algoritmo utilizado. Seleção de um algoritmo de escalonamento de disco o SSTF é comum e tem um grande apelo. O SCAN e o C-SCAN têm desempenho melhor em sistemas com uso pesado de disco, porque têm menos probabilidade de ter o problema de paralisação. Com qualquer algoritmo de escalonamento, o desempenho depende muito do número e dos tipos de pedidos. Por exemplo, se a fila tiver um único pedido em espera, todos os algoritmos de escalonamento terão o mesmo comportamento, todos se comportarão como o escalonamento FCFS. O método de alocação de arquivo também influencia os pedidos de acesso a disco. A leitura de um arquivo alocado continuamente gerará vários pedidos próximos no disco, resultando em um movimento limitado da cabeça. Por outro lado, um arquivo indexado ou encadeado pode estar "espalhado" no disco, com isso, provocando muita movimentação da cabeça. A localização da estrutura de diretório e blocos de índices deve estar o mais próximo possível dos dados, evitando muita movimentação da cabeça entre a pesquisa e o acesso aos dados. Armazenar em cache na memória principal os diretórios e blocos de índice também pode ajudar a reduzir o movimento da cabeça para pedidos de leitura. Os algoritmos descritos acima estão levando em conta a distância de busca, mas um fator que também influencia muito é a latência rotacional. Os discos mais atuais não revelam a posição física dos blocos, logo fica difícil para o Sistema Operacional escalonar para melhorar a latência rotacional. Para resolver esse "problema", os fabricantes de disco incorporam no hardware de disco, hardware de controle com implementação de algoritmos de escalonamento de disco. Neste caso, o Sistema Operacional pode enviar um lote de pedido para a controladora, ela pode colocar na fila para escalonar e melhorar o tempo de busca e a latência rotacional. O hardware de disco melhora o desempenho de I/O. Porém só isso não basta, então entra o Sistema Operacional para controlar a ordem de serviço de pedidos. O Sistema Operacional pode escalonar os pedidos e enviar um a um para a controladora de disco, de acordo com a prioridade. Por exemplo, se o cache estiver com poucas páginas livres, ele pode dá preferência a escrita (na escolha de página vítima) en disco e não a leitura. Outro exemplo pode ser o temporizador, que de 30 em 30 segundos no UNIX e poucos segundos no Windows grava as informações dos blocos modificados da cache em disco. O sistema operacional também é responsável pela inicialização dos discos, a carga do sistema a partir do disco e a recuperação de blocos defeituosos.
Saber onde está o cilindro depois que lineariza não é tão simples, pois não é constante o tamanho, pois trilhas mais interna tem menos setores e trilhas mais externas tem mais setores. Hoje em dia, o device drive já conhece o disco linearizado. Existe disco grande, mas é mais barato colocar vários discos menores do que um disco grande. Com dois discos a probabilidade de falha é maior do que um único disco. Exemplo: um disco: falha após 10000 horas; Dois discos a falha média ocorre após 5000 horas. Quanto mais disco o tempo de falha cai, mas colocando a visão de vários discos como um único se um deles falhar falha tudo. Para se proteger contra as falhas deve ter redundância. O RAID soluciona este problema ocasionando a redundância de acordo com o seu tipo. RAID é a capacidade da máquina enxergar vários discos como um só e poder ter redundância da informação protegendo contra falhas, isto vai depender do tipo de RAID. O RAID só é útil quando tem redundância, pois enxergar vários discos como um só quando uma falha todos falha. O esquema abaixo mostra um disco lógico que é a junção de quatro disco menores:
**Tipos de RAID (Redundant Array of Inexpensive Disks).
Resolve o problema do RAID 0 que falha mais. Tem a mesma definição do RAID, onde se tem uma visão de vários discos que parece ser um só, mas o que acontece é que tem uma cópia do disco dois a dois. Se tiver quatro disco de 20Giga bytes parece que tem 80Giga bytes. Se falhar um disco o outro consegue responder. Mas, perde em capacidade. Manda a ordem em paralelo para disco diferente. Não quebra por setor, no esquema abaixo temos o disco A replicado em outro disco, o mesmo acontece com B. A mesma ordem é enviada para o disco 0 e disco 1, ou seja, dois discos diferentes, ou seja, duas ordens iguais ficarão no disco 0 e 1 e duas ordens iguais ficarão no disco 2 e 3.
3) RAID 1 + 0 (não oficial): Ganha em tempo em relação ao RAID 1, porque manda a ordem tanto de leitura quanto escrita em paralelo para disco diferente já que é um barramento SCSI, parecido com o anterior, com a diferença que ele quebra o setor lógico em dois discos diferentes, mas continua perdendo metade da capacidade como o RAID 1. Por exemplo, se tem quatro disco de 20Giga bytes totalizando 80Giga bytes sendo que está com capacidade de 40Giga bytes para o disco lógico, já que existe a redundância. É parecido com o RAID1, mas antes de enviar a ordem ele quebra o setor em dois, por exemplo, ao enviar a ordem envia duas ordens iguais para o disco 0 e 1, onde o scrip é o 0 e o a segunda parte da ordem quebrada para o disco 2 e 3, onde está o scrip 1.
Aula 20
Exemplo de leitura de arquivo por partes em C (3): ler(&a, “dados.dat”, 100, 0); . . . ler (&b, “dados.dat”, 100, 100); . . . ler(&c, “dados.dat”, 100, 200);
O sistema operacional tem que testar se o arquivo existe, caso não exista ele retornará um erro. Existe uma chamada que é a abertura do arquivo que testa se o arquivo existe, ela devolve identificador do arquivo. Exemplo (4): int identificadorarq; identificadorarq = abre(nomearq, modo-de-abertura); lerB(identificadorarq, variável-onde-ficarao-dados-lidos, tam-variavel); . . . ler(identificadorarq, &b, 100); close(identicadorarq); onde: modo-de-abertura pode ser:
No Windows:
Dois processos podem abrir o mesmo arquivo se o modo de abertura for de leitura. A leitura de um arquivo pode ser por parte em seqüência ou o arquivo inteiro ou saltando, sendo que para este último não é comum, mais veremos mais adiante uma chamada. Na leitura por partes é o programador que controla de quantos em quantos bytes será lido.O sistema operacional controla a próxima posição da seqüência a ser lida, desta forma pode ser eliminado este último parâmetro (pos-inicial-no- arquivo) de leitura, já que o próprio sistema operacional controla isto. Ele controla isto utilizando um ponteiro que indica o próximo bloco a ser lido. Assim a sintaxe de leitura ficaria:
ler (variável-onde-ficarão-dados-lidos, nome-arq, tamanho-da-variável);
Usando apenas a chamada de leitura a cada chamada ler é feito à verificação se o arquivo existe. Vide exemplo(3). Quando tem o “open” antes da chamada de leitura “read” é verificado uma única vez, apenas no arquivo. No Word ao abrir um arquivo não é só a chamada open que é feita. Na verdade é a chamada open seguido da chamada read se o arquivo for pequeno, se o arquivo for grande são vários reads, a cada scroll é feito um read. No wordpad a leitura é feita de uma só vez. Existe uma outra chamada que permite que seja lido o arquivo saltando, como descrito anteriormente, que é o lseek. Ela muda a posição corrente para a posição desejada, ou seja, altera a posição corrente do arquivo. As chamadas das bibliotecas em C que utilizam a biblioteca padrão não são as apresentadas acima, são chamadas de mais alto nível, e tem dois propósitos:
Sintaxe: lseek (identificadorarq, nova-pos, a-partir-de-onde); Onde: a-partir-de-onde : 1) a partir do início do arquivo ou;
Exemplo (6): 1) Supondo um arquivo de 100 bytes. char buf[200]; int id = open(“dados.dat”, O-READ); tam-lido = read(id, buf, 200); // não retorna erro! O sistema operacional não vai conseguir ler 200 bytes, pois o arquivo tem apenas 100 bytes, então o sistema operacional vai ler apenas os 100 bytes do arquivo. Por isso, existe a variável de retorno com a quantidade lida pelo sistema operacional.
2) Supondo agora um arquivo de 1024 bytes. 1 char buf1[100], buf2[1024], buf3[1024] 2 int id = open (“dados.dat”, O-WRITE); 3 write (id, buf1, 100); // vai sobrescrever ou altera os 100 primeiros bytes. 4 lseek(id, 0, SEEK-END); //desloca a posição corrente para o fim do arquivo. 5 tam-escrito = write(id, buf2, 1024); // faz crescer o arquivo. Agora ele terá 2048 bytes. 6 lseek(id, 2048, SEEK-END); // aponta para a posição depois da 2048 que não existe, depois do fim. 7 write(id, buf3, 1024);
onde:
- Na linha 4: o SEEK-END do Unix indica que o deslocamento é a partir do fim. - Na linha 5: qualquer escrita a partir do fim do arquivo faz o arquivo crescer. O único caso que o tamanho escrito é diferente do tamanho da variável é quando o disco encheu. Então o tamanho escrito é menor que o tamanho da variável. Não ocorre erro, mas retorna um valor diferente. Ele só ignora o que não conseguiu escrever. Por isso, é bom testar a instrução “write” verificando se o tamanho escrito foi igual ao indicado nesta instrução. - Na linha 7: esta escreve no arquivo a partir da posição 1024 a partir do fim do arquivo. Faz sentido isto? Depende do sistema operacional. No caso do Unix faz sentido. No caso do Windows, depende do sistema de arquivo FAT ou NFS. No caso do DOS não faz sentido. O sistema operacional completa o espaço em branco, este pedaço tem que existir pela definição de arquivo da visão lógica, que um arquivo é uma seqüência de byte. Mas, não existe fisicamente estes espaços em branco no disco, ou seja, o arquivo tem 5 Kbyte, mas fisicamente no disco ele ocupa 3
Aula 21
Resumo aulas anteriores:
- Conceito de arquivo: 1) Seqüência de bytes 2) Seqüência de registros.
Disco lógico:
Para o SO é como se o disco lógico fosse como um disco físico, o device drive sabe que é lógico, mas os arquivos não sabem. Como os usuários identificam o disco lógico? Existem duas formas de usar e enxergar os disco lógicos: 1ª - Identificação do disco lógico (windows, DOS). Ex.: C:, D: 2ª - Uma única árvore de diretórios (UNIX)
Diferença: A do windows é mais fácil de implementar, pois há uma marcação forte entre o nome e a posição física do disco lógico. No UNIX o disco onde está o arquivo não é identificável facilmente pelo nome, pois a árvore contém vários discos lógicos. Exemplo: C:\arquivos de programas\office\word.exe => Windows. É mais fácil de usar e de entender /bin/office/word => Unix
Em qual disco que está?Se o disco enche o que é feito? No windows apaga alguma coisa ou transfere para outro disco vazio o D:, por exemplo. O problema é que se tiver que copiar o executável e houver referências a este nome, o arquivo que referenciou vai parar de funcionar. E no Unix? Não acontece isso, pois não há referências aos nomes dos arquivos. É possível configurar a máquina na qual o nome para o usuário permaneça o mesmo e o programa continua funcionando. Para isso acontecer é feito o ponto de montagem. Tem um disco principal ( root device ): têm alguns arquivos. A operação de montagem coloca um disco sobre um diretório dos diretórios existentes, se existir arquivo ou diretório vazio no processo de montagem vai pegar os dois e vai montar e o resultado final vai ser pegar o Disco 2 e pegar o device e em seguida juntar. Menciona o nome do device (arquivos especiais do Unix). Podem ser montados outros discos. Nesta operação menciona duas coisa: o device e o diretório destino Exemplo: mount /dev/hd2/ /bin/office.
Uma coisa que é difícil é salvar arquivo no disquete, pois como eu sei onde está identificado o disquete? Como montar o disquete na árvore? Em máquinas mais novas quando é colocado o disquete este é montado sozinho e para tirar o disquete terá que desmontar, mas se tiver algum arquivo desse disquete sendo usado por um programa ele não é desmontado (O SO não deixa). Depois que é feito o open o SO garante que o arquivo vai existir, se tirar o disco as operações de read e write não começam, o open tem que garantir que aquele arquivo permaneça existindo quando o arquivo tiver aberto. Se houver um arquivo referenciado no disquete e houver a retirada essas operações irão falhar(read e write).
Diretório
1º caso : Como é no Unix e no NT com NTFS? Diretório com alo.c e nada.txt.
Dados da estrutura do arquivo : hora de criação, tamanho do arquivo, etc. No caso do NT esses dados não estão contidos no diretório. Só tem 1 número que aponta para tais informações. O Nº interno de identificação aponta para uma outra estrutura que lá contém unidades de controle.