Sistemi Operativi: Processi e Memoria
47 Questions
6 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

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

    Description

    Questo quiz esplora le dinamiche tra processi padre e figlio nei sistemi operativi. Verranno esaminate funzioni chiave come la creazione di processi, la gestione della memoria e l'attesa del termine di un processo figlio. Metti alla prova le tue conoscenze sui comandi e le funzioni utilizzate nei sistemi operativi.

    More Like This

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