Introduzione al Laboratorio di Sistemi Operativi
41 Questions
1 Views

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Cosa restituisce la funzione mkfifo() in caso di successo?

  • NULL
  • 1
  • 0 (correct)
  • -1

Quale tra questi non è un permesso specificato per il nuovo FIFO?

  • S_IWOTH (correct)
  • S_IWUSR
  • S_IXGRP
  • S_IROTH

Qual è il significato di S_ISUID nel contesto dei permessi dei file?

  • User-execute
  • Group-write
  • Set-user-ID (correct)
  • Sticky bit

Come viene specificato il mode per i permessi del nuovo FIFO?

<p>Utilizzando l'operatore OR (B)</p> Signup and view all the answers

Qual è il valore ottale di S_IRUSR?

<p>0400 (B)</p> Signup and view all the answers

Cosa accade quando un lettore tenta di leggere dati da una facility vuota?

<p>L'operazione di lettura si blocca fino a quando i dati non sono disponibili. (A)</p> Signup and view all the answers

Qual è l'importanza della sincronizzazione nella memoria condivisa?

<p>Impedisce che un processo legga dati mentre un altro li modifica. (D)</p> Signup and view all the answers

Quale strumento è frequentemente utilizzato per la sincronizzazione nella memoria condivisa?

<p>Semaphore. (C)</p> Signup and view all the answers

Quale affermazione è vera riguardo alla memoria condivisa?

<p>I dati sono visibili a tutti i processi che condividono quel segmento. (A)</p> Signup and view all the answers

Cosa si intende generalmente con il termine 'interprocess communication' (IPC)?

<p>Facilità di comunicazione tra processi sia sincronizzati che non. (D)</p> Signup and view all the answers

Qual è la principale funzione di un FIFO nei processi?

<p>Sincronizzare i processi lettori e scrittori. (C)</p> Signup and view all the answers

Cosa accade quando un processo apre un FIFO in modalità lettura?

<p>Il processo si blocca finché non viene aperto un FIFO in scrittura. (D)</p> Signup and view all the answers

Quale condizione deve essere soddisfatta affinché l'apertura di un FIFO in scrittura abbia successo?

<p>Un altro processo deve aprire il FIFO in lettura. (A)</p> Signup and view all the answers

Cosa accade se l'altra estremità di un FIFO è già aperta?

<p>L'apertura avviene immediatamente senza blocchi. (D)</p> Signup and view all the answers

Quale affermazione riguardo ai flag di apertura di un FIFO è corretta?

<p>O_WRONLY si blocca finché non viene aperto in lettura. (A)</p> Signup and view all the answers

Qual è la funzione di popen() nel contesto di un sistema operativo?

<p>Restituisce uno stream di file o NULL in caso di errore (A)</p> Signup and view all the answers

Cosa viene restituito dalla funzione pclose() in caso di successo?

<p>Lo status di terminazione della shell figlia (B)</p> Signup and view all the answers

Quale dei seguenti è un aspetto negativo dell'utilizzo della funzione popen()?

<p>Genera processi aggiuntivi che possono ridurre l'efficienza (B)</p> Signup and view all the answers

Quale è il corretto utilizzo della funzione popen()?

<p>fp = popen(cmdstring, 'r') (A)</p> Signup and view all the answers

Qual è la principale differenza tra un FIFO e un pipe?

<p>Un FIFO permette comunicazione tra processi non correlati (C)</p> Signup and view all the answers

Cosa dovrebbe essere fatto dopo aver completato le operazioni di I/O con popen()?

<p>Utilizzare pclose() per chiudere il pipe (B)</p> Signup and view all the answers

Quale valore indica che si è verificato un errore nella funzione pclose()?

<p>-1 (D)</p> Signup and view all the answers

Cosa fa il comando 'ls' passato a popen() nel codice fornito?

<p>Elenca i file e le directory nella cartella corrente (B)</p> Signup and view all the answers

Qual è la funzione principale di una FIFO nel contesto di un'applicazione client-server?

<p>Permettere la comunicazione tra client e server (D)</p> Signup and view all the answers

Come viene costruito il nome della FIFO per ciascun client?

<p>Da un template con l'ID di processo del client (B)</p> Signup and view all the answers

Quale delle seguenti affermazioni è vera riguardo i dati in pipe e FIFO?

<p>I dati sono trattati come uno stream di byte senza separazioni tra i messaggi (C)</p> Signup and view all the answers

Cosa devono fare il mittente e il destinatario in una comunicazione che utilizza FIFO?

<p>Stabilire un accordo su un protocollo per separare i messaggi (D)</p> Signup and view all the answers

Cosa deve sapere il server riguardo alla FIFO del client per rispondere correttamente?

<p>Il percorso della FIFO specifico per quel client (A)</p> Signup and view all the answers

Qual è un esempio di come viene costruito un percorso FIFO per un client?

<p>/tmp/seqnum_cl.6514 (C)</p> Signup and view all the answers

Quale approccio può essere utilizzato per separare i messaggi in una FIFO?

<p>Utilizzare marcatori di fine messaggio (B)</p> Signup and view all the answers

Cosa rappresenta l'ID di processo (PID) in relazione alla FIFO del client?

<p>Un identificatore unico per il client (B)</p> Signup and view all the answers

Cosa accade se si tenta di decrementare il valore di un semaforo sotto zero?

<p>Il kernel blocca l'operazione fino a un aumento del valore. (B)</p> Signup and view all the answers

Qual è la principale differenza tra un pipe e un FIFO?

<p>I FIFO possono essere utilizzati per la comunicazione tra processi qualsiasi. (C)</p> Signup and view all the answers

Come fa la shell a utilizzare l'output di un processo come input per un altro?

<p>Utilizza i pipe per collegare i processi. (A)</p> Signup and view all the answers

Che funzione viene utilizzata per creare un nuovo processo in un sistema operativo?

<p>fork() (C)</p> Signup and view all the answers

Quale comando permette di contare il numero di file in una directory?

<p>ls -al | wc -l (A)</p> Signup and view all the answers

Cosa rappresenta il file descriptor nel contesto di un pipe?

<p>Un puntatore per l'input e output standard. (D)</p> Signup and view all the answers

Qual è la funzione di un pipe in un sistema operativo?

<p>Collegare l'output di un processo all'input di un altro. (A)</p> Signup and view all the answers

Quale dei seguenti comportamenti è tipico di una nonblocking operation sul semaforo?

<p>Ritorna con un errore se l'operazione non può essere eseguita. (B)</p> Signup and view all the answers

Quando i processi sono collegati tramite un pipe, quale processo ha il write end del pipe?

<p>Il processo che scrive dati. (D)</p> Signup and view all the answers

Quale parte di un comando shell è collegata a stdout nel contesto di un pipe?

<p>Il processo scrittore. (C)</p> Signup and view all the answers

Flashcards

Memoria condivisa

Un meccanismo di comunicazione tra processi che condividono lo stesso segmento di memoria.

Sincronizzazione memoria condivisa

È necessaria per evitare che i processi accedano o modifichino dati in modo concorrente, causando errori.

Semaforo

Uno strumento di sincronizzazione usato per gestire l'accesso alla memoria condivisa.

Comunicazione tra processi(IPC)

Termine generico per descrivere le facilità di sincronizzazione tra processi.

Signup and view all the flashcards

Blocco lettura

Accade quando un processo tenta di leggere dati da una facility che non ne contiene, attendendo che altri processi scriva dati.

Signup and view all the flashcards

Decrement del semaforo sotto 0

Tentativo di ridurre il valore di un semaforo al di sotto di 0. Il kernel blocca l'operazione finché il valore del semaforo non aumenta a un livello compatibile.

Signup and view all the flashcards

Operazione non-blocking

Operazione che non blocca il processo se il valore del semaforo non permette l'esecuzione immediata dell'operazione. In questo caso viene restituito un errore.

Signup and view all the flashcards

Pipe

Meccanismo di comunicazione unidirezionale tra processi. L'output di un processo diventa l'input dell'altro.

Signup and view all the flashcards

FIFO

Una variante di pipe utilizzabile per la comunicazione fra processi qualsiasi.

Signup and view all the flashcards

Shell

Un'interfaccia di comando che permette di eseguire comandi sul sistema operativo.

Signup and view all the flashcards

Fork()

Funzione che crea un nuovo processo figlio.

Signup and view all the flashcards

Exec()

Funzione per avviare un nuovo programma su un processo.

Signup and view all the flashcards

Standard Output (stdout)

Flusso di output standard di un processo.

Signup and view all the flashcards

Standard Input (stdin)

Flusso di input standard di un processo.

Signup and view all the flashcards

popen()

Una funzione che crea un pipe, esegue un comando shell e restituisce un file stream per la lettura o la scrittura.

Signup and view all the flashcards

pclose()

La funzione usata per chiudere il pipe creato da popen() e attendere la terminazione del processo figlio (la shell). Restituisce lo status di terminazione del processo figlio.

Signup and view all the flashcards

fp = popen("cmdstring", "r")

Esegue il comando cmdstring dalla shell e restituisce un file stream per la lettura dell'output del comando.

Signup and view all the flashcards

fp = popen("cmdstring", "w")

Esegue il comando cmdstring dalla shell e restituisce un file stream per la scrittura dell'input del comando.

Signup and view all the flashcards

Vantaggi popen()

Offre semplicità d'uso. Gestisce automaticamente la creazione del pipe, la duplicazione dei file descriptor e la gestione dei dettagli di fork() ed exec().

Signup and view all the flashcards

Svantaggi popen()

Meno efficiente rispetto all'utilizzo diretto di fork() ed exec(). Crea almeno due processi in più: uno per la shell e uno o più per i comandi eseguiti.

Signup and view all the flashcards

Utilizzo popen() in programmi privilegiati

L'uso di popen() in programmi privilegiati è sconsigliato. Potrebbe aprire vulnerabilità di sicurezza.

Signup and view all the flashcards

Esempio di utilizzo di popen() e pclose()

L'esempio di codice mostra come utilizzare popen() e pclose() per elencare i file in una directory. Il codice legge l'output del comando 'ls' e lo stampa a schermo.

Signup and view all the flashcards

mkfifo()

La funzione mkfifo() crea un nuovo FIFO (First In, First Out) con il pathname specificato. Un FIFO è un tipo speciale di file che permette la comunicazione tra processi.

Signup and view all the flashcards

Cosa sono le costanti S_IRUSR, S_IWUSR, S_IXUSR?

Queste costanti rappresentano i permessi di accesso per l'utente (user) del nuovo FIFO. S_IRUSR indica lettura, S_IWUSR scrittura e S_IXUSR esecuzione.

Signup and view all the flashcards

Come si impostano i permessi del FIFO?

I permessi vengono impostati usando l'operatore OR (|) per combinare le costanti desiderate. Ad esempio, S_IRUSR | S_IWUSR concede all'utente il permesso di lettura e scrittura.

Signup and view all the flashcards

Cosa significa un valore di ritorno pari a 0 per la funzione mkfifo()?

Un valore di ritorno pari a 0 indica che la creazione del FIFO è avvenuta con successo.

Signup and view all the flashcards

Utilizzo FIFO per la sincronizzazione

I processi che utilizzano un FIFO per la comunicazione si sincronizzano mediante l'apertura del FIFO in lettura e scrittura.

Signup and view all the flashcards

Sincronizzazione FIFO: Apertura in lettura

Quando un processo apre un FIFO in lettura, si blocca fino a quando un altro processo non lo apre in scrittura.

Signup and view all the flashcards

Sincronizzazione FIFO: Apertura in scrittura

Quando un processo apre un FIFO in scrittura, si blocca finché un altro processo non lo apre in lettura.

Signup and view all the flashcards

Sincronizzazione FIFO: Apertura immediata

L'apertura di un FIFO è immediata se l'altra estremità è già aperta da un altro processo.

Signup and view all the flashcards

FIFO per comunicazioni client-server

Un FIFO (First In, First Out) è utilizzato per la comunicazione tra un server e un client. Il server è responsabile di gestire più client contemporaneamente e utilizza un FIFO dedicato per ogni client per inviare le risposte.

Signup and view all the flashcards

Come viene identificato il FIFO del client?

Il client fornisce al server le informazioni necessarie per costruire il nome del suo FIFO. Questo nome viene generalmente costruito utilizzando un modello basato sul PID (Process ID) del client

Signup and view all the flashcards

Separazione dei messaggi in FIFO

Dato che i FIFO trasmettono i dati come un flusso di byte, è necessario un metodo per separare i messaggi multipli. Questo richiede un accordo tra il mittente e il destinatario su come suddividere i dati.

Signup and view all the flashcards

Protocolli di comunicazione

Un protocollo di comunicazione è un set di regole che definiscono come i dati vengono scambiati tra due o più sistemi come parte di una comunicazione. Per i FIFO, il protocollo stabilisce come separare i messaggi e la struttura dei dati da inviare.

Signup and view all the flashcards

Esempio: protocollo FIFO

In un esempio di protocollo FIFO, si potrebbe usare un carattere speciale (come un newline o un punto e virgola) per separare i messaggi. Inoltre, ogni messaggio potrebbe avere un codice di inizio e di fine per indicare l'inizio e la fine del messaggio.

Signup and view all the flashcards

Comunicazione unidirezionale FIFO

I FIFO sono unidirezionali, ovvero i dati possono essere inviati solo in una direzione. Per la comunicazione bidirezionale, è necessario creare due FIFO separati, uno per il client verso il server e uno per il server verso il client.

Signup and view all the flashcards

Vantaggi dell'utilizzo dei FIFO

I FIFO offrono un metodo robusto e semplice per la comunicazione tra processi. La comunicazione è indipendente dall'architettura (locali o su reti) e forniscono un metodo affidabile per gestire i dati non elaborati.

Signup and view all the flashcards

Svantaggi nell'utilizzo dei FIFO

I FIFO non forniscono meccanismi di sincronizzazione. Se un processo tenta di leggere dati da un FIFO vuoto, si blocca in attesa che altri processi scrivano dati. Questa situazione può causare problemi di deadlock se non gestita correttamente.

Signup and view all the flashcards

Study Notes

Introduzione al Laboratorio di Sistemi Operativi

  • Il laboratorio si concentra su sistemi operativi, introducendo l'IPC (Inter-Process Communication) tramite pipe e FIFO.
  • Il docente è Daniele Radicioni.

Argomenti del Laboratorio UNIX

  • Introduzione a UNIX
  • Integrazione C: operatori bitwise, precedenze, preprocessore, pacchetto di codice, compilazione condizionale e utility make.
  • Controllo dei processi
  • Segnali
  • Pipe e FIFO
  • Code di messaggi
  • Memoria condivisa
  • Semafori
  • Introduzione alla programmazione bash

Credits

  • Il materiale è principalmente tratto da testi come "The Linux Programming Interface" di Michael Kerrisk e "Advanced Programming in the UNIX® Environment" di W. Richard Stevens e Stephen A. Rago.

IPC Facilities

  • Gli strumenti UNIX per comunicazione e sincronizzazione sono divisi in tre categorie funzionali:
    • Comunicazione: faciliti lo scambio di dati tra processi.
    • Sincronizzazione: faciliti la sincronizzazione delle azioni dei processi.
    • Segnali: sebbene originariamente non progettati per la sincronizzazione, in alcune situazioni possono svolgere questo ruolo.

Data-transfer facilities

  • Byte stream: i dati scambiati (pipe, FIFO, datagram socket) sono considerati come un flusso di byte. Ogni operazione di lettura può leggere un numero arbitrario di byte. Questo modello riflette il modo tradizionale in cui i file sono rappresentati in UNIX.
  • Messaggi: i dati scambiati (code di messaggi, socket) sono sotto forma di messaggi delimitati. Ogni operazione di lettura legge un intero messaggio e non è possibile leggere parzialmente un messaggio o più messaggi in una sola operazione.

Memoria Condivisa

  • Permette ai processi di scambiarsi informazioni mettendole in una regione di memoria condivisa.
  • E' uno strumento veloce per la comunicazione, in quanto non richiede chiamate di sistema per i trasferimenti utente-kernel.

Semafori

  • Un semaforo è un intero mantenuto dal kernel il cui valore non può essere minore di 0.
  • I processi possono decrementare o incrementare il valore di un semaforo.
  • Se un tentativo di decremento porta un valore sotto 0, il kernel blocca l'operazione fino a che il valore del semaforo non aumenta nuovamente.
  • In alternativa è possibile richiedere un'operazione senza blocco (non-blocking), che restituisce un errore se l'operazione non può essere eseguita.

Pipe

  • Le pipe offrono una soluzione al problema di far sì che l'output di un processo sia utilizzato come input di un altro.
  • I FIFO sono una variazione dei pipe, che consentono la comunicazione tra processi qualsiasi.

Pipes

  • Per eseguire comandi come ls -al | wc -l, la shell crea due processi (uno per ls e uno per wc).
  • L'output di ls (fd=1) è connesso all'input di wc (fd=0) tramite il pipe.
  • I processi non sono a conoscenza della pipe; leggono/scrivono da/su descrittori di file standard.

I pipe sono stream di byte

  • Un pipe è un flusso di byte. Non si fa riferimento a un concetto di messaggio o delimitazione.
  • Il processo di lettura può leggere blocchi di qualsiasi dimensione, ignorando le dimensioni dei blocchi scritti dal processo di scrittura.
  • I dati passano in sequenza, e non è possibile accedere ai dati in modo non sequenziale tramite Iseek().

Lettura da pipe

  • I tentativi di lettura su un pipe vuoto rimangono bloccati fino a quando non viene scritto almeno un byte nel pipe.
  • Quando la fine della scrittura (write end) è chiusa, il processo di lettura riceve un end-of-file (EOF) codice.
  • I pipe sono unidirezionali; i dati possono viaggiare solo in una direzione.

Capacità limitata

  • I pipe sono buffer in memoria con capacità massima.
  • Se il buffer è pieno, le scritture successive si bloccano fino a che il buffer non viene svuotato dal processo di lettura.
  • Le applicazioni non hanno bisogno di conoscere la capacità del buffer.

La funzione pipe()

  • La chiamata di sistema pipe() crea un nuovo pipe e fornisce due file descriptor: uno per la lettura (filedes[0]) e uno per la scrittura (filedes[1]).

Comunicazione tra processi non imparentati

  • I pipe possono essere utilizzati per la comunicazione fra processi non imparentati (ad es., client e server) utilizzando FIFO.
  • I FIFO hanno un nome nel file system e sono aperti come file.
  • Ciò consentirà comunicazioni tra tutti i processi.

Chiusura descrittori

  • I descrittori di file inutilizzati devono essere chiusi per evitare comportamenti errati o blocchi.

FIFO

  • I FIFO sono simili ai pipe, ma hanno un nome nel file system.
  • Possono essere utilizzati per la comunicazione tra processi non imparentati.

Utilizzo di FIFO

  • Quando un FIFO è aperto, è possibile usare le system call read() e write() come con i pipe.
  • I dati vengono letti nello stesso ordine in cui sono stati scritti.

Creazione di FIFO

  • La funzione mkfifo() crea un nuovo FIFO specificato dal path e da un mode (permessi).

Sincronizzazione con FIFO

  • L'apertura di un FIFO in modalità lettura blocca fino a quando non è aperto un FIFO in modalità scrittura.
  • L'apertura di un FIFO in modalità scrittura blocca fino a quando non è aperto un FIFO in modalità lettura.

Application client-server

  • Il server assegna numeri sequenziali univoci ai client.
  • I client inviano le richieste al server usando un singolo FIFO server.
  • Il nome del FIFO server è definito nel file di intestazione del protocollo.

Protocolli

  • I dati in pipe e FIFO sono stream di byte, i confini tra i multipli messaggi non sono preservati.
  • Il mittente e il ricevitore devono accordarsi su una convenzione per separare i messaggi.
  • Questo può essere un carattere delimitatore (es. newline).

Server

  • Crea il proprio well-known FIFO.
  • Apre il FIFO in modalità lettura finché un client non lo apre in scrittura.
  • Apre il FIFO in modalità scrittura (senza bloccare).
  • Crea un ciclo che legge e risponde alle richieste dei client.
  • Costruisce, tramite il nome client FIFO, il path del cliente ed apre il FIFO per la risposta.
  • Abbandona la richiesta del client se c'è un errore durante l'apertura del FIFO.

Client

  • Crea un FIFO.
  • Costruisce un messaggio contenente l'ID del processo client e la lunghezza della sequenza desiderata.
  • Apre il FIFO server e invia il messaggio.
  • Apre il proprio FIFO e legge e stampa la risposta del server.

Esempio di utilizzo su shell

  • Viene mostrato un esempio di utilizzo di comandi unix su shell per dimostrare come i FIFO vengono utilizzati con i pipe.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

Description

Questo laboratorio esplora i sistemi operativi, in particolare l'IPC attraverso pipe e FIFO. Gli studenti impareranno a gestire l'integrazione C e a controllare i processi in ambiente UNIX. Il corso utilizzerà testi di riferimento autorevoli per fornire una base solida nella programmazione di sistemi operativi.

More Like This

Use Quizgecko on...
Browser
Browser