Sistemi Operativi: Processi e Memoria

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

Qual è la funzione utilizzata per creare un processo figlio in un sistema operativo?

  • clone()
  • fork() (correct)
  • execve()
  • wait()

Cosa succede alla memoria del processo padre quando viene creato un processo figlio?

  • Il padre e il figlio hanno accesso a memoria completamente separata.
  • Il figlio condivide direttamente la memoria con il padre.
  • La memoria del padre è copiata nel figlio. (correct)
  • La memoria del padre viene eliminata.

Quale dei seguenti comandi viene utilizzato dal processo padre per attendere che un processo figlio termini?

  • fork()
  • wait() (correct)
  • execve()
  • exit()

Qual è il compito principale della funzione execve()?

<p>Eseguire un nuovo programma in un processo. (D)</p> Signup and view all the answers

Quale affermazione è vera riguardo a un processo padre e un processo figlio?

<p>Il processo figlio può eseguire azioni indipendenti dal padre. (D)</p> Signup and view all the answers

Cosa deve fare un processo padre dopo aver creato un processo figlio?

<p>Eseguire altre azioni senza attendere il figlio. (D)</p> Signup and view all the answers

Qual è un risultato atteso dell'uso della funzione fork()?

<p>Si crea un nuovo processo con una copia della memoria del padre. (A)</p> Signup and view all the answers

Qual è la differenza principale tra un processo padre e un processo figlio?

<p>Il processo padre viene creato per primo e ha il controllo iniziale. (C)</p> Signup and view all the answers

Qual è la funzione principale del segmento di dati inizializzati in un processo?

<p>Memorizza le variabili globali e statiche che sono esplicitamente inizializzate. (A)</p> Signup and view all the answers

A cosa serve l'heap in un processo?

<p>Per allocare memoria in modo dinamico durante il tempo di esecuzione. (D)</p> Signup and view all the answers

Perché i dati non inizializzati vengono memorizzati in un segmento separato?

<p>Per evitare l'allocazione di spazio su disco quando il programma è salvato. (D)</p> Signup and view all the answers

Cosa rappresenta uno stack frame in un processo?

<p>L'allocazione per una funzione attualmente chiamata. (A)</p> Signup and view all the answers

Cosa accade se una variabile globale non è esplicitamente inizializzata?

<p>Viene inizializzata automaticamente a 0 dal sistema. (A)</p> Signup and view all the answers

Qual è il risultato della funzione 'square' se l'input è 4?

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

Qual è il valore di 'key' nel contesto del main?

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

Qual è l'area della memoria in cui le variabili 't' e 'result' vengono allocate?

<p>Nel frammento dello stack della funzione in esecuzione. (D)</p> Signup and view all the answers

Cosa restituisce la system call fork() nel processo padre dopo una chiamata riuscita?

<p>Il process ID del figlio (D)</p> Signup and view all the answers

Dopo l'esecuzione della fork(), quali variabili possono essere modificate dai processi senza influenzare l'altro?

<p>Le variabili nei segmenti di stack, data e heap (B)</p> Signup and view all the answers

Quale affermazione è vera riguardo alla fork()?

<p>Crea un processo figlio che è una copia del padre (B)</p> Signup and view all the answers

Qual è il significato del valore restituito da fork() nel nuovo processo figlio?

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

Quale descrizione si applica ai processi padre e figlio creati da fork()?

<p>Hanno stack e heap distinti (A)</p> Signup and view all the answers

In quali condizioni una chiamata a fork() restituirà -1?

<p>In caso di errore nella creazione del processo (A)</p> Signup and view all the answers

Cosa permette di fare il process ID restituito a un processo padre dopo la fork()?

<p>Distinguerlo da altri processi (B)</p> Signup and view all the answers

Quale di queste affermazioni è falsa riguardo alla fork()?

<p>Dopo una fork(), i processi comunicano tramite memoria condivisa (D)</p> Signup and view all the answers

Cosa restituisce la fork() nell'ambiente del processo figlio?

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

Quale syscall può essere utilizzata insieme a wait() per la gestione dei processi?

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

Che cosa causa l'indeterminatezza dell'esecuzione dopo una fork()?

<p>Il sistema operativo sceglie casualmente quale processo eseguire (B)</p> Signup and view all the answers

Quale valore deve restituire fork() per indicare un errore?

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

Quale variabile contiene l'ID del processo del figlio dopo una fork()?

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

Che cosa avviene all'allocazione della variabile 'idata' dopo la fork()?

<p>Viene duplicata per ogni processo (B)</p> Signup and view all the answers

Quale tecnica deve essere utilizzata per garantire un ordine di esecuzione specifico tra processi?

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

Cosa svolge il processo genitore nel contesto della terminazione dei processi?

<p>Attende il completamento del processo figlio con wait (D)</p> Signup and view all the answers

Qual è il risultato dell'istruzione fork() nell'illustrazione fornita?

<p>Si creano due istanze del programma A (C)</p> Signup and view all the answers

Dopo l'esecuzione di fork(), cosa succede alla memoria del processo genitore?

<p>Viene copiata nel processo figlio (A)</p> Signup and view all the answers

Cosa può fare il processo figlio dopo aver eseguito fork()?

<p>Eseguire un programma diverso con execve (A)</p> Signup and view all the answers

Qual è lo scopo dell'istruzione wait(&status) nel contesto della gestione dei processi?

<p>Attendere che un processo specifico termini (A)</p> Signup and view all the answers

Qual è il ruolo del comando execve nel processo figlio?

<p>Sostituisce l'immagine del processo figlio con un altro programma (C)</p> Signup and view all the answers

Che tipo di processo è creato da un'istruzione fork()?

<p>Un processo figlio (B)</p> Signup and view all the answers

Cosa accade se un processo non utilizza wait() dopo fork()?

<p>Il processo figlio può continuare a funzionare autonomamente (B)</p> Signup and view all the answers

Cosa succede se la funzione fork() fallisce nel codice fornito?

<p>Il programma termina con un errore di fork. (D)</p> Signup and view all the answers

Qual è il valore restituito da execve() in caso di successo?

<p>Mai restituito (A)</p> Signup and view all the answers

Quale delle seguenti funzioni exec() consente di specificare solo il nome del file?

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

Cosa stampa il processo padre dopo aver dormito per 3 secondi?

<p>--- terminazione padre --- (C)</p> Signup and view all the answers

Quale di queste funzioni non è menzionata come parte delle funzioni exec()?

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

Quale output rappresenta l'identificativo del processo padre nel codice?

<p>PID(padre): <qualcosa> (D)</p> Signup and view all the answers

Cosa accade all'esecuzione nel caso di errore di execve()?

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

Quali argomenti sono passati a execve() nella funzione principale?

<p>argv, argVec, envVec (C)</p> Signup and view all the answers

Flashcards

Processo padre

Il processo che crea un nuovo processo figlio.

Processo figlio

Il processo creato dal processo padre.

fork()

Sistema operativo che crea un nuovo processo figlio in Linux.

execve()

Funzione per sostituire il codice in esecuzione del processo figlio.

Signup and view all the flashcards

wait(&status)

Funzione del processo padre per attendere la terminazione del processo figlio.

Signup and view all the flashcards

Memoria condivisa

I processi padre e figlio condividono lo stato della memoria.

Signup and view all the flashcards

Esecuzione parallela

Padre e figlio possono eseguire azioni diverse.

Signup and view all the flashcards

Comunicazione tra processi

Il processo padre può comunicare col figlio.

Signup and view all the flashcards

Segmento dei dati inizializzati

Contiene le variabili globali e statiche inizializzate esplicitamente. I valori vengono letti dal file eseguibile al caricamento del programma.

Signup and view all the flashcards

Segmento dati non inizializzati

Contiene le variabili globali e statiche non inizializzate esplicitamente. Il sistema le inizializza a 0 prima dell'esecuzione.

Signup and view all the flashcards

Stack

Segmento dinamico che cresce e decresce. Contiene i frame di attivazione delle funzioni.

Signup and view all the flashcards

Frame di attivazione

Un'unità di spazio nello stack, contenente variabili locali, argomenti e valore di ritorno di una funzione.

Signup and view all the flashcards

Heap

Area di memoria da cui vengono allocate dinamicamente le variabili durante l'esecuzione.

Signup and view all the flashcards

Variabili automatiche

Le variabili locali dichiarate all'interno di una funzione.

Signup and view all the flashcards

Variabili statiche

Variabili la cui durata è per tutta la vita del programma.

Signup and view all the flashcards

Segmento di codice (o testo)

Contiene le istruzioni del programma. E' letto-solo, per evitare modifiche accidentali.

Signup and view all the flashcards

fork() in Sistemi Operativi

La system call fork() crea un nuovo processo (figlio) che è una copia quasi identica del processo chiamante (padre).

Signup and view all the flashcards

Restituzione di fork() (padre)

Nel processo padre, fork() restituisce l'ID del processo figlio appena creato.

Signup and view all the flashcards

Restituzione di fork() (figlio)

Nel processo figlio, fork() restituisce sempre 0.

Signup and view all the flashcards

Memoria del figlio

Memoria del figlio: All'inizio, lo spazio di memoria del figlio è una copia esatta dello spazio di memoria del padre. Le variabili hanno i valori dello stesso momento in cui fork() è stato chiamato.

Signup and view all the flashcards

Indipendenza dei processi (fork)

Dopo la chiamata a fork(), ogni processo può modificare le proprie variabili senza influenzare le variabili dell'altro.

Signup and view all the flashcards

Differenza tra i processi (dopo fork())

I processi, pur eseguendo lo stesso codice, hanno stack, dati ed heap separati.

Signup and view all the flashcards

Esecuzione figlio

Il processo figlio inizia l'esecuzione dalla prima istruzione successiva alla chiamata a fork() nel programma.

Signup and view all the flashcards

Distinguere processi

Il valore di ritorno di fork() permette al padre di distinguere il figlio da altri processi e di tenere traccia dei nuovi processi creati.

Signup and view all the flashcards

fork() in C

Funzione di sistema che crea un nuovo processo figlio, utilizzando una copia dell'ambiente del processo padre.

Signup and view all the flashcards

Valore di ritorno fork()

Restituisce -1 in caso di errore, 0 nel processo figlio, e il pid del figlio nel processo padre.

Signup and view all the flashcards

getpid()

Funzione che restituisce l'ID del processo chiamante.

Signup and view all the flashcards

getppid()

Funzione che restituisce l'ID del processo padre chiamante.

Signup and view all the flashcards

Race condition

Problema che si verifica quando due o più processi o thread accedono e modificano le stesse risorse in modo concorrente e il risultato finale dipende dall'ordine di esecuzione non prevedibile.

Signup and view all the flashcards

Segmento dati

Area di memoria utilizzata per memorizzare le variabili globali di un programma.

Signup and view all the flashcards

Segmento stack

Area di memoria utilizzata per memorizzare le variabili locali (automatiche), dati temporanei e gli indirizzi di ritorno delle chiamate di funzione.

Signup and view all the flashcards

switch-case fork()

Struttura di controllo che consente di gestire diversi casi, utilizzando il ritorno di fork() come condizione d'esecuzione di codice diverso per figlio o padre.

Signup and view all the flashcards

Memoria copiata

Il processo figlio riceve una copia della memoria del processo padre quando viene creato.

Signup and view all the flashcards

Azioni indipendenti

Il processo padre e il processo figlio possono eseguire azioni diverse in modo parallelo, dopo la creazione del figlio.

Signup and view all the flashcards

Comunicazione

Padre e figlio possono comunicare tra loro durante l'esecuzione.

Signup and view all the flashcards

execve() cosa fa?

Sostituisce il codice in esecuzione del processo figlio con un nuovo programma.

Signup and view all the flashcards

execve() parametri

Accetta 3 parametri: il percorso del programma, gli argomenti e l'ambiente.

Signup and view all the flashcards

Differenze exec*()

Le funzioni exec*() differiscono per il modo in cui specificano il percorso del programma, gli argomenti e l'ambiente.

Signup and view all the flashcards

Ritorno exec*()

Nessuna delle exec*() restituisce il valore se ha successo, ritorna -1 in caso di errore.

Signup and view all the flashcards

argv[] in execve()

Array di stringhe che contiene gli argomenti passati al programma.

Signup and view all the flashcards

envVec[] in execve()

Array di stringhe che contiene le variabili d'ambiente del programma.

Signup and view all the flashcards

Study Notes

Laboratorio di Sistemi Operativi - Controllo dei Processi

  • Il laboratorio esplora argomenti relativi ai sistemi operativi, in particolare il controllo dei processi.
  • L'argomento principale è UNIX.
  • Gli argomenti del laboratorio comprendono: Introduzione a UNIX, integrazione C (operatori bitwise, precedenze, preprocessore, pacchettizzazione del codice, compilazione condizionale e utility make), controllo dei processi (segnali, pipe, code di messaggi, memoria condivisa, semafori), introduzione alla programmazione bash.
  • Le lezioni si basano su materiale del Prof. Gunetti, nonché su libri di riferimento come: The Linux Programming Interface - a Linux and UNIX System Programming Handbook di Michael Kerrisk, Advanced Programming in the UNIX® Environment di W. Richard Stevens e Stephen A. Rago.

Process ID e Process ID Padre

  • Ogni processo possiede un Process ID (PID), un intero positivo che lo identifica univocamente nel sistema.
  • I PID sono utilizzati e restituiti da diverse chiamate di sistema.
  • La chiamata di sistema getpid() restituisce il PID del processo chiamante.
  • Ogni processo ha un genitore, ovvero il processo che lo ha creato.
  • La chiamata di sistema getppid() restituisce il PID del processo genitore.
  • L'attributo PID padre di ciascun processo rappresenta la relazione ad albero di tutti i processi nel sistema.

Layout della Memoria di un Processo

  • La memoria allocata a ogni processo è composta da diversi segmenti.
  • Il segmento di testo contiene le istruzioni in linguaggio macchina del programma in esecuzione.
  • È un solo in lettura (read-only) per evitare modifiche accidentali.
  • È condivisibile, permettendo a più processi di condividere una stessa copia del codice.
  • Il segmento dati inizializzato contiene le variabili globali e statiche inizializzate esplicitamente. I loro valori sono letti dal file eseguibile al momento del caricamento del programma.
  • Il segmento dati non inizializzato contiene le variabili globali e statiche non inizializzate. Prima dell'esecuzione del programma, la memoria in questo segmento è inizializzata a 0.
  • Lo stack è un segmento in crescita e contrazione dinamica che contiene i frame dello stack. Ogni frame dello stack è allocato per ogni funzione attualmente in esecuzione e contiene le variabili locali, gli argomenti e il valore di ritorno della funzione.
  • L'heap è un'area dalla quale la memoria può essere allocata dinamicamente durante l'esecuzione.

Controllo dei Processi

  • Il controllo dei processi include la creazione, l'esecuzione e la terminazione dei processi.
  • Le system call (fork(), exit(), wait(), execve()) sono richieste al sistema operativo per agire a nome del programma dell'utente.
  • fork() crea un nuovo processo (figlio) che è una copia quasi esatta del processo padre (con copie degli stack, dati, heap e segmenti di testo).
  • exit() termina un processo.
  • wait() attende la terminazione di un processo figlio (e restituisce il suo stato di terminazione).
  • execve() carica un nuovo programma nella memoria del processo, sostituendo il precedente.

Creazione dei Processi

  • La creazione dei processi (ad esempio, usando fork()) può essere un'operazione utile per suddividere un compito, come in un server di rete che gestisce richieste dei clienti creando nuovi processi per ogni richiesta.

Terminazione dei Processi

  • Un processo può terminare in due modi: normalmente usando _exit() o in modo anomalo, per esempio se riceve un segnale il cui default è terminare del processo.
  • exit() esegue diverse azioni prima di chiamare _exit() inclusi lo svuotamento delle variabili e la liberazione delle risorse.

Monitoraggio dei processi

  • Il monitoraggio dei processi aiuta a comprendere lo stato e l'attività dei processi, soprattutto quando si hanno più processi contemporaneamente. La system call wait() è importante nella gestione delle richieste di terminazione dei processi.

wait() e waitpid()

  • wait() attende la terminazione di un figlio; se nessun figlio è terminato, la chiamata si blocca (ad esempio, per attendere la terminazione di un processo figlio).
  • waitpid() è più flessibile e consente di attendere un particolare processo figlio o tutti i figli nel medesimo processo group, o un processo figlio qualsiasi.
  • A volte è utile una non blocking wait, in modo da ottenere immediatamente l'informazione che nessun figlio ha ancora terminato la propria esecuzione.

Condizioni di Errore di System Call e exec()

  • Diversi valori di ritorno della system call (e.g., -1 o valori di errno) indicano errori durante l'esecuzione di operazioni quali la creazione o l'esecuzione di processi.
  • Esistono delle macro e delle funzioni per gestire i vari codici di errore (includendo <errno.h> e <string.h>).
  • Errore ECHILD, se un processo padre tenta di avviare un processo wait() ma non ha figli.

Esecuzione di nuovi Programmi - exec()

  • La chiamata exec() esegue un nuovo programma, sostituendo il programma corrente.
  • Diverse funzioni di libreria (execl(), execlp(), execvp(), ecc.) forniscono diverse modalità per specificare il programma da eseguire e i suoi argomenti e ambiente.
  • La funzione execl() richiede esplicitamente una lista di parametri, mentre execlp() cerca il programma richiesto nella variabile d'ambiente PATH quando il pathname non è assoluto.

Orfani e Zombie

  • I processi orfani sono processi figli che hanno perso il loro genitore.
  • I processi zombie sono processi figli che hanno terminato la loro esecuzione, ma il padre non ha ancora chiamato la wait() per raccogliere le informazioni sulla terminazione.
  • Il processo init adotta i processi orfani e i processi zombie, permettendo al sistema di gestire correttamente i processi.

Studying That Suits You

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

Quiz Team

More Like This

Advanced Operating Systems CE5301
10 questions
Systems 2 Final Flashcards
23 questions
Operating Systems and C Programming Quiz
45 questions
Betriebssystem Ressourcen und Management
45 questions
Use Quizgecko on...
Browser
Browser