• Non ci sono risultati.

Sistemi operativi

N/A
N/A
Protected

Academic year: 2021

Condividi "Sistemi operativi"

Copied!
11
0
0

Testo completo

(1)

I/O non bufferizzato I/O non bufferizzato

(2) (2)

Capitolo 3 -- Stevens

(2)

Efficienza di I/O Efficienza di I/O

#include "ourhdr.h"

#define BUFFSIZE 8192 int main(void)

{

int n;

char buf[BUFFSIZE];

Sistemi operativi

char buf[BUFFSIZE];

while((n = read(STDIN_FILENO,buf,BUFFSIZE))>0) if (write(STDOUT_FILENO,buf, n) != n)

err_sys("write error");

if (n < 0) err_sys("read error");

exit(0);

}

-apertura file standard

-chiusura file - scelta di BUFFERSIZE

(3)

Condivisione di file Condivisione di file

Unix supporta la possibilità che più processi condividano file aperti

Prima di analizzare questa situazione esaminiamo le strutture

Sistemi operativi

Prima di analizzare questa situazione esaminiamo le strutture dati che il kernel utilizza per I/O

3 strutture dati per l'I/O

(4)

Strutture dati di file aperti Strutture dati di file aperti

Sistemi operativi

(5)

2 processi su uno stesso file 2 processi su uno stesso file

Sistemi operativi

(6)

Operazioni Atomiche Operazioni Atomiche

Immaginate il seguente scenario:

2 processi aprono lo stesso file

ognuno si posiziona alla fine e scrive (in 2 passi)

1.

lseek( fd, 0 ,SEEK_END );

2.

write ( fd, buff , 100 );

Sistemi operativi

se il kernel alterna le due operazioni di ogni processo si hanno

effetti indesiderati

(7)

Operazioni Atomiche Operazioni Atomiche

Unix risolve il problema:

Apre il file con il flag "O_APPEND"

Questo fa posizionare l’offset alla fine, prima di ogni write In altre parole, le operazioni di

1.

posizionamento

sono atomiche

Sistemi operativi

2.

write

In generale una operazione atomica è composta da molti passi che o sono eseguiti tutti insieme o non ne è eseguito nessuno

sono atomiche

(8)

dup & dup2 dup & dup2

#include <unistd.h>

int dup( int filedes );

int dup2( int filedes, int filedes2 );

Sistemi operativi

int dup2( int filedes, int filedes2 );

Descrizione: assegnano un altro fd ad un file che già ne possedeva uno, cioè filedes

Restituiscono entrambe: il nuovo fd se OK

-1 altrimenti

(9)

dup & dup2 dup & dup2

In particolare:

int dup( int filedes );

restituisce il più piccolo fd disponibile

Sistemi operativi

int dup2( int filedes, int filedes2 );

Assegna al file avente già file descriptor filedes anche il file descriptor filedes2

•Se filedes2 è già open esso è prima chiuso e poi è assegnato a filedes

•Se filedes2=filedes viene restituito direttamente filedes2

(10)

DS del kernel, dopo

DS del kernel, dopo dup dup

Nota che il nuovo fd condivide con il vecchio la stessa entry nella filetable

Sistemi operativi

(11)

esercizi esercizi

1.

copiare un file in un altro usando solo le funzioni di standard I/O getchar e putchar

hint: "duplicare" gli standard file

2.

copiare il contenuto di un file in un altro usando

Sistemi operativi

2.

copiare il contenuto di un file in un altro usando

esclusivamente read da standard input e write su

standard output

Riferimenti

Documenti correlati

• Bande IV / V : 470 ÷ 960 MHz: si tratta della banda attualmente in uso, con canalizzazione UHF, sulla quale si ammoderna il sistema televisivo analogico; si noti che queste

• Per alcuni e’ il primo sistema operativo in assoluto per sistemi batch. Sviluppato dalla General Motors per l’IBM701, basato su monitor

● una frame table: con un elemento per ciascun frame in memoria fisica, contenente informazioni su: il suo stato (libero o no), il numero di processi che condividono la pagina,

• La gestione della coda di processi associata al semaforo può essere affidata alle routine Wait e Signal del kernel:. ● Wait inserisce nella coda del semaforo il processo che

Far in modo che un thread T1 invii un signal su un semaforo ogni volta che si preme RETURN sulla tastiera; sul semaforo si mette in attesa un thread T2 che, quando riceve il

il processo deve attendere il completamento delle attività di

• Gli iteratori sono dei puntatori agli elementi di un contenitore e ci permettono di muoverci all’interno di esso:.. – Iteratori monodirezionali: Permettono di accedere

copiare il contenuto di un file in un altro usando esclusivamente read da standard input e write su