commit 475f28467085d8fd78acf82183fb9d3c54557737 Author: Marco Realacci (server) Date: Fri Oct 28 16:32:32 2022 +0200 We finally have files! diff --git a/Domande SO1.txt b/Domande SO1.txt new file mode 100644 index 0000000..c9b2fc8 --- /dev/null +++ b/Domande SO1.txt @@ -0,0 +1,584 @@ +1) Quale delle seguenti affermazioni sulle directory di un file system è vera? +> È sempre necessario identificare un file di un file system fornendone il path assoluto +> È sempre necessario identificare un file di un file system fornendone il path relativo alla directory corrente +> È sempre possibile dare lo stesso nome a file diversi +v Nessuna delle altre opzioni è vera + +2) Quale delle seguenti affermazioni sulla concorrenza tra processi o thread è falsa? +> La disabilitazione delle interruzioni impedisce la creazione di nuove interruzioni +> L'abuso della disabilitazione delle interruzioni fa diminuire la multiprogrammazione, a parità di numero di processi +> Se un processo può disabilitare le interruzioni tramite un'istruzione macchina dedicata, allora può far diminuire l'uso del processore +v La disabilitazione delle interruzioni non funziona su sistemi con più processori o più core + +3) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni è vera? +> Lo scheduler ha, tra i suoi obiettivi, quello di minimizzare il numero di processi che rispettano la propria deadline +> Lo scheduler ha, tra i suoi obiettivi, quello di minimizzare il volume di lavoro nel tempo +> Lo scheduler ha, tra i suoi obiettivi, quello di massimizzare il tempo di risposta +v Lo scheduler ha, tra i suoi obiettivi, quello di minimizzare il tempo di inattività del processore + +4) Quale delle seguenti affermazioni sul modello dei processi in UNIX SVR4 System V Release 4 è falsa? +> Se un processo è Zombie, allora è terminato ma il suo process control block è ancora in memoria +> Asleep in Memory coincide con Blocked +v Ha anche uno stato Zombie: serve per tutti i processi che sono terminati +> Ha 9 stati (10 con Exit) + +5) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è falsa? +> Quando un indirizzo non viene trovato nel translation lookaside buffer, è necessario consultare la normale tabella delle pagine +v Il translation lookaside buffer è una particolare cache, ma non è completamente trasparente al sistema operativo +> Il translation lookaside buffer permette di accedere direttamente al contenuto degli indirizzi di memoria virtuali usati più di recente +> In assenza di translation lookaside buffer, l'accesso ad un indirizzo virtuale può richiedere almeno 2 accessi in memoria + +6) Quale delle seguenti affermazioni sugli obiettivi di sicurezza di un sistema operativo è vera? +> Per "disponibilità" dell'hardware si intende la garanzia che le workstation restino sempre fisse in un posto +> Per "confidenzialità" dei dati si intende la garanzia che essi non possano essere generati automaticamente +v Nessuna delle altre opzioni è vera +> Per "integrità" dei dati si intende la garanzia che essi non vengano mai modificati + +7) Quale delle seguenti affermazioni sul buffering dell'I/O è vera? +> Nessuna delle altre opzioni è corretta +> Avviene direttamente su disco, altrimenti si rischia il deadlock per interferenze con il DMA +> Nel caso ci siano più buffer, vanno gestiti come nel problema dei lettori/scrittori +v Può consistere nel completare un'istruzione di output I (è una i) dopo che alcune istruzioni successive ad I siano state eseguite + +8) Quale delle seguenti affermazioni, riguardanti il joint progress diagram di 2 processi, è vera? +v Nessuna delle altre opzioni è vera +> Può essere usato per visualizzare le possibilità di deadlock, ma solo se i processi richiedono al massimo 2 risorse +> Può essere usato per determinare quando uno dei due processi va in esecuzione a discapito dell'altro +> Può essere usato per determinare quando uno dei due processi sperimenta un page fault + +9) Quale delle seguenti affermazioni sulla gerarchia della memoria è vera? +> Nessuna delle altre opzioni è corretta +> Andando dall'alto in basso, cresce il costo +> Andando dall'alto in basso, diminuisce la capacità +v Andando dall'alto in basso, diminuisce la frequenza di accesso alla memoria da parte del processore + +10) Quale dei seguenti elementi non fa parte del process control block? +> Il puntatore alla tabella delle pagine +v L’identificatore del thread +> Lo stato o modalità +> L’identificatore del processo + +11) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sugli algoritmi di scheduling è vera? +v Nessuna delle altre opzioni è vera +> Il quanto di tempo ottimale per lo scheduler round-robin è maggiore del tipico tempo di completa esecuzione di un processo interattivo +> Lo scheduler First Come First Served favorisce i processi I/O-bound +> Anche assumendo che tutti i processi prima o poi terminino, lo scheduler First Come First Served soffre di starvation + + +14) Quale delle seguenti affermazioni sulla segmentazione della memoria è falsa? +> Diversi segmenti possono avere diverse lunghezze +v Differentemente dalla paginazione, il programmatore assembler di un processo non interagisce esplicitamente con la gestione dei segmenti +> Per accedere ad un indirizzo contenuto in un segmento di un processo, tale segmento dovrà essere posizionato in memoria principale +> Un indirizzo di memoria principale va visto come un numero di segmento più uno spiazzamento all'interno di tale segmento + +15) Quale delle seguenti affermazioni sull'algoritmo per il rilevamento del deadlock visto a lezione è vera? +> Richiede in input, per ogni processo p e per ogni risorsa r, il numero massimo di istanze di r che p chiederà nel corso della sua esecuzione +> Se al passo 3 viene trovato un processo non marcato che soddisfi la condizione Qik ≤ wik, allora c'è un deadlock +v I processi marcati sono quelli che non sono coinvolti in un deadlock +> Nessuna delle altre opzioni è vera + +16) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sul long-term scheduler è falsa? +v Viene chiamato in causa esclusivamente quando viene creato un nuovo processo +> Avendo le necessarie informazioni, una tipica strategia è mantenere una giusta proporzione, stabilita a priori, tra processi I/O-bound e CPU-bound +> Avendo le necessarie informazioni, una tipica strategia è ammettere in memoria principale i processi che richiedono dispositivi di I/O diversi da [...] +> Decide quali processi, tra quelli appena creati, possono essere ammessi in memoria principale per l'esecuzione + +17) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è vera? +v Il difetto principale del prepaging è che potrebbe portare in memoria pagine cui poi non si fa riferimento +> Placement policy e replacement policy sono sinonimi ed indicano lo stesso insieme di metodologie +> Nessuna delle altre opzioni è corretta +> Il difetto principale del paging on demand è che causa molti page fault dopo alcuni secondi di esecuzione + +18) Quale dei seguenti requisiti deve soddisfare un meccanismo che offra la mutua esclusione? +v Non deve essere fatta alcuna assunzione sulla velocità di esecuzione dei processi coinvolti +> Se un processo fa richiesta di entrare nella sezione critica, deve poterlo fare subito +> Se un processo non fa richiesta di entrare nella sezione critica, deve comunque accordarsi all'esecuzione degli altri processi +> Si può assumere che un processo che non sia nella sezione critica prima o poi ci entri + +19) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è vera? +> Il principio di località afferma che poche pagine saranno sempre sufficienti per eseguire ogni processo senza thrashing +> Il thrashing si verifica quando l'overhead dovuto alla gestione della paginazione è molto basso +v Nessuna delle altre opzioni è corretta +> La paginazione con memoria virtuale funziona bene nonostante il principio di località + +20) UNSAFE Quale delle seguenti affermazioni sullo scambio messaggi per la gestione della concorrenza è vera? +> Nessuna delle altre opzioni è vera +> L'implementazione delle primitive per lo scambio messaggi non è garantita atomica dal sistema operativo +v Se un processo chiama receive, finché il messaggio non viene ricevuto, tutti gli altri processi che proveranno a chiamare receive verranno bloccati +> Per garantire la mutua esclusione, occorre ricorrere al busy waiting se sia invio che ricezione sono non bloccanti + +21) Quali delle seguenti affermazioni sui file system è vera? +> I dati possono essere ricavati dai metadati +> I metadati possono essere ricavati dai dati +v I file system, che adottano il metodo journaling, mantengono un log per le operazioni di sola scrittura da effettuare, realizzandole in seguito +> Un volume coincide sempre con un disco, quindi se un computer ha 2 dischi avrà 2 volumi + +22) Quale delle seguenti affermazioni sui dispositivi di I/O è vera? +v Nessuna delle altre opzioni è corretta +> Il data rate confronta le velocità di 2 diversi dispositivi di I/O +> Ciascun dispositivo di I/O può essere usato solo da un ben determinato tipo di applicazioni +> Tutti i dispositivi di I/O scambiano informazioni con la CPU in blocchi, per motivi di efficienza + +23) Quale delle seguenti affermazioni sui metodi di gestione dello spazio libero su disco è vera? +v Se viene usata la lista di blocchi liberi, c'è un overhead di spazio, contrariamente alla concatenazione di blocchi liberi +> Nessuna delle altre opzioni è vera +> Se ci sono blocchi da 1kB, e il disco contiene 1TB, l'occupazione dovuta alla lista di blocchi liberi è dell'1% +> Se viene usata la lista di blocchi liberi, una parte viene memorizzata su disco ed una parte in memoria principale + +24) UNSAFE Quale delle seguenti azioni va effettuata sia per un process switch che per un mode switch, assumendo di essere in un SO nel quale le funzioni di sistema sono eseguite all'interno dei processi utente? +v Salvataggio del contesto del programma +> Aggiornamento delle strutture dati per la gestione della memoria +> Spostamento del process control block nella coda appropriata (ready, blocked, ready/suspend) +> Scelta di un altro processo da eseguire + +25) Quale delle seguenti affermazioni è vera? +> Nessuna delle altre opzioni è corretta +v Nell'algoritmo di sostituzione basato su frequenza a 2 segmenti della page cache, un blocco passa da un segmento ad un altro esclusivamente per scorrimento +> L'algoritmo di LFU della page cache ha buone performance quando un settore viene acceduto molto spesso in poco tempo, per poi non essere più usato +> L'algoritmo di sostituzione basato su frequenza a 2 segmenti della page cache può non avere buone performance quando un settore viene acceduto spesso, ma tra il primo accesso e quelli successivi ci sono N accessi ad altri settori, diversi tra loro, con N pari alla dimensione del segmento nuovo + +26) Quale delle seguenti affermazioni sul kernel di un sistema operativo è vera? +> È responsabile dell'accensione del computer +> Viene swappato dal disco alla memoria principale ad ogni context switch +v È responsabile, tra le altre cose, della gestione dei processori +> Nessuna delle altre opzioni è corretta + +27) Quale delle seguenti affermazioni sul controllo di accesso è vera? +> Nel controllo di accesso basato su ruoli, ad ogni ruolo è assegnato un utente +> Nessuna delle altre opzioni è vera +> Nel controllo di accesso basato su ruoli, prima di stabilire se un'operazione è lecita, è necessario consultare una tabella soggetti-ruoli-oggetti +v Nel controllo di accesso discrezionale, prima di stabilire se un'operazione è lecita, è necessario consultare una tabella soggetti-oggetti + +28) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sulla preemption è vera? +> Se uno scheduler è non-preemptive, permette sempre ai suoi processi di essere eseguiti sul processore, senza interruzioni, fino al loro completamento +v Se uno scheduler è non-preemptive, è possibile che un processo monopolizzi il processore, anche in presenza di altri processi ready +> Se uno scheduler è preemptive, non è possibile che un processo monopolizzi il processore, anche in presenza di altri processi ready +> Per avere un trattamento equo sui processi, è sufficiente usare uno scheduler preemptive + +29) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sugli algoritmi di scheduling è vera? +> Con lo scheduler Shortest Process Next, i processi con una grande immagine su RAM potrebbero soffrire di starvation +v Lo scheduler round-robin virtuale migliora il round-robin classico, facendo sì che i processi I/O-bound non vengano sfavoriti +> Lo scheduler First Come First Served "degenera" nello scheduler round-robin se il quanto di tempo è troppo lungo +> Nessuna delle altre opzioni è vera + +30) Quale delle seguenti affermazioni sugli indirizzi di memoria principale è vera? +> Un indirizzo fisico fa sempre riferimento alla memoria secondaria +> Per rispettare il requisito di rilocazione, occorre trasformare indirizzi fisici in logici +v Gli indirizzi relativi sono usati nella paginazione +> Nessuna delle altre opzioni è corretta + +31) Quale delle seguenti affermazioni sui termini tipici della concorrenza è falsa? +v Una sezione critica è una porzione di memoria che contiene almeno una variabile condivisa tra più processi +> Una operazione atomica è una sequenza di istruzioni macchina tale che, se un processo la esegue, allora arriverà a termine senza interruzioni da altri processi +> Il requisito di mutua esclusione prevede che un solo processo possa eseguire un certo segmento di codice o accedere ad una determinata risorsa +> Una race condition è una violazione della mutua esclusione || È possibile che 2 distinti processi chiamino la stessa funzione atomica + +32) Quale dei seguenti elementi fa parte del process control block? +v Nessuna delle altre opzioni contiene elementi del process control block +> Le informazioni sul contesto del processo, aggiornate ad ogni istruzione eseguita +> L'intera immagine del processo in memoria +> La tabella delle pagine di secondo livello + +33) Quale delle seguenti informazioni non è presente in una tipica entry di una directory di un file system? +v Il gruppo cui appartiene l'utente che ha creato il file +> La data di creazione del file +> Autorizzazioni per l'accesso al file +> Dimensione del file + +34) Quale delle seguenti affermazioni sugli algoritmi di scheduling per i dischi è vera? +> L'algoritmo random ha la stessa funzione dell'algoritmo ottimo dei rimpiazzamenti di pagina: ha delle prestazioni ottime non raggiungibili dagli altri algoritmi +> Nessuna delle altre opzioni è corretta +v L'algoritmo C-SCAN deriva da SCAN, ed è stato sviluppato per evitare di favorire le richieste di tracce ai bordi del disco +> Per valutare le prestazioni dell'algoritmo con priorità è necessario fornire il ruolo dell'utente + +35) Quale delle seguenti affermazioni sugli algoritmi di scheduling per i dischi è vera? +> Nessuna delle altre opzioni è corretta +v L'algoritmo C-SCAN deriva da SCAN, ed è stato sviluppato per evitare di favorire le richieste di tracce ai bordi del disco +> Per valutare le prestazioni dell'algoritmo con priorità è sufficiente fornire il ruolo degli utenti dei processi che effettuano le richieste +> L'algoritmo random ha la stessa funzione dell'algoritmo ottimo dei rimpiazzamenti di pagina: ha delle prestazioni ottime non raggiungibili dagli altri algoritmi + +36) Quale delle seguenti affermazioni sul metodo di allocazione contigua dei file è vera? +> È possibile che ci sia frammentazione interna +v La compattazione permette di memorizzare file che altrimenti non potrebbero esserlo (pur essendo la loro dimensione minore di quella dello spazio libero) +> Non è necessaria la preallocazione +> La tabella di allocazione dei file necessita di memorizzare, per ogni file, il solo blocco di partenza + +37) Quale delle seguenti affermazioni sulla paginazione della memoria è vera? +v Frame e pagine devono avere la stessa dimensione +> Tutte le pagine di un processo dovranno essere, prima o poi, posizionate in un frame +> Nessuna delle altre opzioni è corretta +> Soffre del problema della frammentazione interna, e quindi necessita compattazione + +38) Quale delle seguenti affermazioni sul controllo di accesso è vera? +> Nel controllo di accesso basato su ruoli, ad ogni ruolo è assegnato un utente +> Nel controllo di accesso basato su ruoli, prima di stabilire se un'operazione è lecita, è necessario consultare una tabella soggetti-ruoli-oggetti +v Nel controllo di accesso discrezionale, prima di stabilire se un'operazione è lecita, è necessario consultare una tabella soggetti-oggetti +> Nessuna delle altre opzioni è vera + +39) Quale delle seguenti affermazioni è falsa? +> Nel caso delle risorse riusabili, in un grafo dell'allocazione delle risorse ci possono essere più archi tra lo stesso nodo-processo e lo stesso nodo-risorsa +> Nel caso delle risorse riusabili, in un grafo dell'allocazione delle risorse ci possono essere archi sia da nodi-processi a nodi-risorse che viceversa +v Un grafo dell'allocazione delle risorse è un grafo diretto aciclico +> In un grafo dell'allocazione delle risorse, all'interno di un nodo rappresentante una risorsa, c'è un pallino per ogni istanza di quella risorsa + +40) Quali delle seguenti affermazioni è vera? +> La confidenzialità di un sistema operativo consiste nel fatto che la shell del sistema operativo deve essere intuitiva e dare del tu agli utenti +v La disponibilità (availability) di un sistema operativo consiste nel fatto che il sistema operativo deve essere sempre pronto a rispondere alle richieste di un utente +> La disponibilità (availability) di un sistema operativo consiste nel fatto che devono esistere delle repository online che permettano sia di installare che di aggiornare il sistema operativo +> La confidenzialità di un sistema operativo consiste nel fatto che il sistema operativo deve essere sempre pronto a rispondere alle richieste di un utente + +41) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è vera? +v Il difetto principale del prepaging è che potrebbe portare in memoria pagine cui poi non si fa riferimento +> Nessuna delle altre opzioni è corretta +> Il difetto principale del paging on demand è che, dopo una prima fase di assestamento, causa molti page fault +> Placement policy e replacement policy sono sinonimi ed indicano lo stesso insieme di metodologie + +42) Quale delle seguenti affermazioni sui dispositivi di memoria di massa è vera? +v Nessuna delle altre opzioni è corretta +> Un settore di un disco magnetico a testina mobile è l'area di una corona circolare del disco stesso +> Una traccia di un disco magnetico a testina mobile è l'area compresa da 2 raggi del disco stesso +> Per selezionare un settore su una traccia di un disco magnetico a testina mobile, è sufficiente posizionare la testina sulla giusta traccia + +44) Quale delle seguenti affermazioni sui semafori per la gestione della concorrenza è falsa? +> Semafori generali e semafori binari hanno lo stesso potere computazionale (ovvero, permettono di risolvere gli stessi problemi) +> Le primitive sui semafori sono in grado di mettere un processo in blocked, senza usare, a tal proposito, il busy-waiting +v Per implementare le primitive sui semafori, servono un contatore ed una coda, che saranno condivisi da tutti i semafori usati +> L'implementazione delle primitive sui semafori è garantita atomica dal sistema operativo + +45) Quale delle seguenti affermazioni sugli algoritmi di scheduling per i dischi è falsa? +> Nell'algoritmo F-SCAN, immediatamente prima che vengano scambiati i contenuti delle code F ed R, la coda F è vuota, mentre la coda R contiene le richieste arrivate mentre si servivano le richieste dentro F +> L'algoritmo Minimum Service Time può portare alla starvation di un processo, che non verrà quindi mai selezionato, se la richiesta era bloccante, per andare in esecuzione sul processore +v L'algoritmo LIFO è il più equo nei confronti dei processi che effettuano le richieste al disco +> Gli algoritmi Minimum Service Time, SCAN, C-SCAN, N-steps-SCAN ed F-SCAN non sono ottimizzati per essere usati su dischi con testine multiple selezionabili elettronicamente + +46) Quale delle seguenti affermazioni sui meccanismi per la gestione della concorrenza è vera? +v Senza usare né semafori, né scambio messaggi, né istruzioni macchina atomiche, è possibile scrivere processi che non soffrano di starvation per garantire la mutua esclusione tra 2 processi +> Disabilitando gli interrupt, è possibile scrivere processi che non soffrano di starvation +> Usando i semafori di qualsiasi tipo, è possibile scrivere processi che non soffrano di starvation +> Usando le istruzioni macchina exchange e compare_and_swap, è possibile scrivere processi che non soffrano di starvation + +47) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sul long-term scheduler è falsa? +> Decide quali processi, tra quelli appena creati, possono essere ammessi in memoria principale per l'esecuzione +> Avendo le necessarie informazioni, una tipica strategia è mantenere una giusta proporzione, stabilita a priori, tra processi I/O-bound e CPU-bound +v Viene chiamato in causa esclusivamente quando viene creato un nuovo processo +> Avendo le necessarie informazioni, una tipica strategia è ammettere in memoria principale i processi che richiedono dispositivi di I/O diversi da quelli richiesti dai processi già attivi + +48) Quale delle seguenti affermazioni sui metodi di gestione dello spazio libero su disco è vera? +> Se ci sono blocchi da 1kB, e il disco contiene 1TB, l'occupazione dovuta alla lista di blocchi liberi è dell'1% +> Se viene usata la lista di blocchi liberi, tale lista viene interamente mantenuta in memoria principale +> Nessuna delle altre opzioni è vera +v Se viene usata la lista di blocchi liberi, c'è un overhead di spazio, contrariamente alla concatenazione di blocchi liberi + +49) Quale delle seguenti affermazioni sulle directory di un file system è vera? +> È sempre necessario identificare un file di un file system fornendone il path relativo alla directory corrente +> È sempre possibile dare lo stesso nome a file diversi +v Nessuna delle altre opzioni è vera +> È sempre necessario identificare un file di un file system fornendone il path assoluto + +50) Quale delle seguenti affermazioni sulla memoria cache è vera? +> La memoria cache è direttamente indirizzabile in assembler +> Nessuna delle altre opzioni è corretta +v È possibile che, in un dato istante, la cache e la memoria RAM non siano coerenti tra loro +> L'algoritmo di rimpiazzamento per la cache stabilisce quale blocco di RAM deve essere sostituito da un blocco di cache + +51) Quale delle seguenti affermazioni sui problemi dei produttori/consumatori e dei lettori/scrittori, nelle accezioni viste a lezione, è vera? +v Per il problema dei produttori/consumatori, non deve essere mai possibile che più consumatori accedano contemporaneamente al buffer, mentre nel problema dei lettori/scrittori deve sempre possibile che più lettori, in assenza di scrittori, accedano all'area di memoria +> Per il problema dei produttori/consumatori, non deve essere mai possibile che più produttori accedano contemporaneamente al buffer, mentre nel problema dei lettori/scrittori deve essere sempre possibile che più scrittori (in assenza di lettori) accedano all'area di memoria +> Nessuna delle altre opzioni è corretta +> Per il problema dei produttori/consumatori, deve essere sempre possibile che più consumatori accedano contemporaneamente al buffer, mentre nel problema dei lettori/scrittori non deve essere mai possibile che più scrittori accedano all'area di memoria + +52) Quale delle seguenti affermazioni, riguardanti il joint progress diagram di 2 processi, è vera? +> Può essere usato per determinare quando uno dei due processi sperimenta un page fault +> Può essere usato per visualizzare le possibilità di deadlock, ma solo se i processi richiedono al massimo 2 risorse +v Nessuna delle altre opzioni è vera +> Può essere usato per determinare quando uno dei due processi manda un segnale all'altro + +53) Quale delle seguenti affermazioni sui (vecchi) metodi per il partizionamento della memoria è vera? +> Con il partizionamento fisso, le partizioni devono avere tutte la stessa dimensione +> Con il buddy system, ogni indirizzo di memoria può ricadere in 2 porzioni +> Con il partizionamento fisso, ci possono essere al massimo N processi attivi (ovvero, accettati per l'esecuzione), dove N è il numero di partizioni +v Con il partizionamento dinamico, si manifesta il problema della frammentazione esterna + +54) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sulla preemption è vera? +> Se uno scheduler è preemptive e vi è più di 1 processo ready, non è possibile che un processo monopolizzi il processore +> Per avere un trattamento equo sui processi, è sufficiente usare uno scheduler preemptive +> Se uno scheduler è non-preemptive, permette sempre ai suoi processi di essere eseguiti senza interruzioni sul processore fino al loro completamento +v Se uno scheduler è non-preemptive, è possibile che un processo monopolizzi il processore, anche in presenza di altri processi ready + +55) Nel modello dei processi a 5 stati, quali delle seguenti transizioni non è possibile? +v Blocked ==> Running +> Running ==> Ready +> Blocked ==> Exit +> Blocked ==> Ready + +56) Quale delle seguenti affermazioni sul metodo di allocazione indicizzata dei file è vera? +> Il consolidamento permette sempre di ridurre la dimensione dell'indice +v Se usato con porzioni di dimensione variabile, i blocchi indice devono contenere anche la lunghezza di ogni porzione +> Nessuna delle altre opzioni è vera +> Non c'è modo per il sistema operativo di distinguere tra blocchi con dati e blocchi con indici + +57) Quale delle seguenti affermazioni sul requisito di rilocazione nella gestione della memoria è vera? +v Nessuna delle altre opzioni è corretta +> Se viene realizzato tramite sostituzione degli indirizzi nel programma sorgente (al momento della creazione del processo), allora il relativo processo dovrà cominciare sempre allo stesso indirizzo; tale indirizzo dovrà essere uguale per tutti i processi +> Se viene realizzato tramite sostituzione degli indirizzi nel programma sorgente (al momento della creazione del processo), allora il relativo processo potrà trovarsi in diverse posizioni della memoria in diversi momenti del sua esecuzione +> Se viene realizzato tramite sostituzione degli indirizzi nel programma sorgente (al momento della creazione del processo), serve hardware speciale + +58) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sulla preemption è vera? +> Se uno scheduler è non-preemptive, permette sempre ai suoi processi di essere eseguiti sul processore, senza interruzioni, fino al loro completamento +v Se uno scheduler è non-preemptive, è possibile che un processo monopolizzi il processore, anche in presenza di altri processi ready +> Se uno scheduler è preemptive, non è possibile che un processo monopolizzi il processore, anche in presenza di altri processi ready +> Per avere un trattamento equo sui processi, è sufficiente usare uno scheduler preemptive + +59) Quale dei seguenti requisiti deve soddisfare un meccanismo che offra la mutua esclusione? +v Non deve essere fatta alcuna assunzione sulla velocità di esecuzione dei processi coinvolti +> Se un processo non fa richiesta di entrare nella sezione critica, deve comunque sincronizzarsi all'esecuzione degli altri processi +> Se un processo è nella sezione critica, occorre che rilasci subito la sezione critica stessa +> Se un processo fa richiesta di entrare nella sezione critica, deve poter entrare subito nella sezione critica stessa + +60) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sul dispatcher è falsa? +> Il resource balancing è un criterio di sistema non prestazionale +> Il rispetto delle deadline è un criterio utente prestazionale +> Il throughput è un criterio di sistema prestazionale +v La predictability è un criterio utente prestazionale + +61) Quale delle seguenti affermazioni sugli interrupt (o eccezioni) è falsa? +> Devono essere gestiti da opportuno software di sistema +v Una volta gestito l'interrupt o l'eccezione, quando (e se) si torna ad eseguire il processo interrotto, l'esecuzione ripartirà sempre dall'istruzione successiva a quella dove è stato ricevuto l'interrupt o l'eccezione +> Normalmente, non vengono gestiti dal programmatore dell'applicazione che li ha causati +> Possono essere creati direttamente dai dispositivi di I/O + +62) Quale delle seguenti affermazioni sulle istruzioni macchina speciali per la gestione della concorrenza è vera? +> Sono basate sul busy-waiting, ovvero sul fatto che un processo si mette autonomamente in stato blocked +v Nessuna delle altre opzioni è vera +> Non riescono ad evitare il manifestarsi del deadlock, a meno che non sia presente un sistema a priorità +> Come per la disabilitazione delle interruzioni, non funzionano per architetture con più processori o core + +63) Quale delle seguenti affermazioni sui processi è vera? +> Nessuna delle altre opzioni è vera +v Per la terminazione normale di un processo, è tipicamente prevista un'apposita system call, come ad esempio exit +> Un processo può morire quando si effettua il process spawning +> Un processo può essere creato dal modulo di gestione della memoria per gestire la traduzione da indirizzi virtuali a fisici + +64) Quale delle seguenti affermazioni sui meccanismi software per la gestione della concorrenza è vera? +> Sia l'algoritmo di Dekker che quello di Peterson possono mettere in blocked uno dei 2 processi, quando ciò si rivela necessario +> Sia l'algoritmo di Dekker che quello di Peterson non funzionano se l'hardware sottostante riordina gli accessi in memoria +> Nell'algoritmo di Peterson, se la variabile turn è inizializzata ad 1, allora il processo 1 sarà sicuramente il primo ad entrare nella sezione critica nella prima iterazione +v Nell'algoritmo di Dekker, se la variabile turn è inizializzata ad 1, allora il processo 1 sarà sicuramente il primo ad entrare nella sezione critica nella prima iterazione + +65) Quale delle seguenti affermazioni sugli i-node di Unix è falsa? +> Ogni directory è identificata da un i-node +v Per modificare una directory, un utente deve aprire il file speciale corrispondente e poi modificarlo opportunamente +> Ogni directory è un file speciale, organizzato come una lista di entry, ciascuna delle quali contiene il nome di un file ed il relativo i-node number +> Ogni directory può contenere molti i-node + +66) Quale delle seguenti affermazioni è falsa? +v Nel caso di un sistema operativo a kernel separato, la gestione dei process switch è a sua volta un processo +> Nel caso di un sistema operativo in cui le funzioni del sistema operativo vengono eseguite all'interno dei processi utente, non c'è bisogno di un process switch per eseguire una funzionalità del sistema operativo +> Nel caso di un sistema operativo in cui le funzioni del sistema operativo vengono eseguite all'interno dei processi utente, se un processo effettua una syscall e poi può continuare ad essere eseguito, non avviene alcun process switch +> Nel caso di un sistema operativo in cui le funzioni del sistema operativo vengono eseguite come processi separati, c'è sempre bisogno di un process switch per eseguire una funzionalità del sistema operativo + +67) (corretta secondo @loryspat e @notherealmarco, da controllare) Quale delle seguenti affermazioni sulla paginazione della memoria è vera? +> La differenza tra paginazione semplice e paginazione con memoria virtuale è che nella seconda viene richiesto che tutte le pagine di un processo siano in memoria principale, affinché il processo stesso possa essere eseguito +> Con la paginazione con memoria virtuale, una sola pagina di ogni processo ready o in esecuzione è inizialmente caricata in memoria principale +v La differenza tra paginazione semplice e paginazione con memoria virtuale è che nella prima viene richiesto che tutte le pagine di un processo siano in memoria principale, affinché il processo stesso possa essere eseguito +> Nessuna delle altre opzioni è vera + + +68) Quale delle seguenti affermazioni sul metodo di allocazione concatenata dei file è vera? +> Il consolidamento permette di memorizzare file che altrimenti non potrebbero esserlo (pur essendo la loro dimensione minore di quella dello spazio libero) +> La tabella di allocazione dei file deve contenere l'intera catena +v Nessuna delle altre opzioni è vera +> Viene usato con porzioni di dimensione variabile, ma piccola + +69) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è vera? +> Nel caso di una tabella delle pagine a 2 livelli, viene tipicamente richiesto che tutte le tabelle delle pagine di secondo livello entrino in una pagina +> Il numero di bit di un indirizzo virtuale è necessariamente diverso a seconda che si usi una tabella delle pagine ad 1 o a 2 livelli +v Il numero di bit di una entry di una tabella delle pagine di ultimo livello è uguale al numero di bit di controllo più il logaritmo (arrotondato all'intero superiore) del massimo numero di frame in memoria principale +> Nessuna delle altre opzioni è corretta + +70) (corretta secondo Simone Sestito e @loryspat) Quale delle seguenti affermazioni sul deadlock è falsa? +> Affinchè ci sia un deadlock, sono necessarie le condizioni di attesa circolare, hold-and-wait, mutua esclusione e no preemption +v Per prevenire il deadlock, è necessario cercare di impedire almeno una delle 3 condizioni di mutua esclusione, hold-and-wait e no preemption +> Affinchè il deadlock sia possibile, sono necessarie le condizioni di mutua esclusione, hold-and-wait e no preemption +> Per prevenire il deadlock impedendo l'hold-and-wait, si può in alcuni casi imporre ai processi di richiedere tutte le risorse fin dall'inizio + +71) Quale delle seguenti affermazioni è vera? +> La modalità di un processo utente è sempre la modalità di sistema +> La modalità di un processo utente è inizialmente la modalità utente; può diventare modalità sistema nel momento in cui va in esecuzione il dispatcher +v Nessuna delle altre opzioni è vera +> La modalità di un processo utente è sempre la modalità utente + +72) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è vera? +v Nessuna delle altre opzioni è corretta +> Per ogni processo, il resident set contiene lo stesso numero di pagine +> Un tipico algoritmo per il replacement scope è quello dell'orologio +> La gestione del resident set tramite politica dinamica mira ad ampliare il numero di pagine di un processo durante l'esecuzione del processo stesso + +74) Quale delle seguenti affermazioni sulla concorrenza tra processi o thread è vera? +v L'istruzione exchange non può ricevere costanti in input su nessun suo argomento, mentre per l'istruzione compare_and_swap questo non vale +> Le istruzioni speciali exchange e compare_and_swap sono garantite atomiche dal sistema operativo +> Per realizzare opportunamente l'istruzione compare_and_swap è sufficiente disabilitare le interruzioni +> Nessuna delle altre opzioni è vera + +75) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sul dispatcher è falsa? +> Il response time è un criterio utente prestazionale +> Il turnaround time (normalizzato o no) è un criterio utente prestazionale +v Il throughput è un criterio di sistema non prestazionale +> La fairness è un criterio di sistema non prestazionale + +76) Quale delle seguenti affermazioni sul file system FAT è vera? +> Usa il metodo di allocazione contiguo +> Ogni cluster del disco contiene sia dati del disco che l'indirizzo del prossimo cluster (o l'indicazione che si tratta dell'ultimo cluster) +> La tabella di allocazione dei file contiene tante righe quanti sono i file memorizzati sul disco, più una riga speciale per i blocchi liberi +v Nessuna delle altre opzioni è vera + +77) UNSAFE Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è falsa? +> Il translation lookaside buffer, su alcuni processori, contiene un campo per il PID dei processi +> Il translation lookaside buffer funziona correttamente solo se tutti i frame validi contenuti al suo interno fanno riferimento a pagine effettivamente in RAM, e non swappate su disco +v Il mapping associativo permette al translation lookaside buffer di trovare una data pagina semplicemente sommando il numero della pagina con l'indirizzo di partenza del translation lookaside buffer stesso +> Quando un indirizzo viene trovato nel translation lookaside buffer, non è necessario consultare la normale tabella delle pagine + +78) Quale dei seguenti elementi non è una delle parti che definiscono un processo? +> Il contatore di programma +> La priorità +> I dati contenuti nella porzione di memoria a lui dedicata +v Informazioni sullo stato delle risorse + + +79) UNSAFE Quale delle seguenti affermazioni, riguardanti la classificazione delle risorse di un sistema operativo e la loro relazione con il deadlock, è vera? +> Nel caso delle risorse consumabili, se c'è un deadlock allora è stata richiesta almeno una risorsa già detenuta da un altro processo +v Nel caso delle risorse consumabili, se c'è un deadlock allora c'è una successione circolare di processi, ciascuno dei quali richiede una risorsa al processo successivo, che però la deve ancora creare +> Nel caso delle risorse riusabili, se c'è un deadlock allora è stata richiesta almeno una risorsa non ancora creata +> Nel caso delle risorse riusabili, se c'è un deadlock allora c'è una successione circolare di processi, ciascuno dei quali richiede una risorsa al processo successivo, che però la deve ancora creare + +80) UNSAFE Si supponga che ci siano N processi attivi, giostrati da uno scheduler round-robin su un sistema monoprocessore. Quale delle seguenti affermazioni è vera? +> Dal punto di vista del processore, ogni processo esegue sempre le proprie istruzioni senza interruzioni +v Per realizzare correttamente un process switch, il SO avrà necessità di usare le informazioni sul contesto contenute nel process control block +> Dal punto di vista di ogni processo, l'esecuzione avviene in interleaving con gli altri processi +> Nessuna delle altre opzioni è vera + +81) Quale delle seguenti affermazioni sulla traduzione di un indirizzo virtuale in fisico, in un sistema con memoria virtuale con paginazione (avente tabella delle pagine ad 1 livello), è falsa? +v L'hardware deve anche cercare il numero di pagina nelle entries della tabella delle pagine del processo in esecuzione. +> L'hardware deve anche estrarre dall'indirizzo virtuale il numero di pagina virtuale; tale operazione è equivalente ad una divisione intera +> L'hardware deve anche usare il numero di pagina per accedere alla tabella delle pagine del processo in esecuzione. A tal proposito, deve conoscere l'inizio di tale tabella, che viene definito dal software (sistema operativo). Tale indirizzo può cambiare durante l'esecuzione del processo: sta al sistema operativo mantenerlo aggiornato +> L'hardware deve anche usare il numero di frame ottenuto dalla tabella delle pagine per comporre, insieme con l'offset originale, l'indirizzo fisico. Tale operazione è equivalente ad uno shift seguito da una somma + +82) Quale delle seguenti operazioni non è tipicamente effettuata su un file? +> Apertura +v Connessione +> Posizionamento (seek) +> Lock/Unlock + +83) Quale delle seguenti affermazioni è falsa? +v Diversi thread di uno stesso processo condividono lo stesso thread identifier +> Tra le funzioni di sistema per i thread, è tipicamente prevista una funzione per bloccare e sbloccare esplicitamente i thread stessi +> Diversi thread di uno stesso processo condividono lo stesso process identifier +> Diversi thread di uno stesso processo condividono i file aperti + +84) Quale delle seguenti affermazioni sulla page cache è falsa? +v Nell'algoritmo di sostituzione basato su frequenza a 3 segmenti della page cache, i contatori vengono sempre incrementati, tranne quando sono nel segmento vecchio +> Nell'algoritmo di sostituzione basato su frequenza a 3 segmenti della page cache, i settori che possono essere sostituiti sono solo quelli del segmento vecchio +> Nell'algoritmo di sostituzione basato su frequenza a 3 segmenti della page cache, l'unico segmento in cui i contatori non vengono incrementati e i settori non possono essere sostituti è quello nuovo +> L'algoritmo di sostituzione basato su frequenza a 3 segmenti della page cache può avere buone performance anche quando dei settori vengono acceduti spesso, ma tra il primo accesso e quelli successivi ci sono molti altri accessi ad altri settori + +85) Quali delle seguenti affermazioni sulla efficienza di un sistema operativo è falsa? +> Deve minimizzare il tempo di risposta, tenendo presenti eventuali priorità +> Deve servire il maggior numero di utenti possibile, tenendo presenti eventuali livelli di accesso +v Deve dare accesso alle risorse in modo equo ed egualitario tra tutti i processi +> Deve massimizzare l'uso delle risorse per unità di tempo, tenendo presenti eventuali priorità + +88) Quale delle seguenti affermazioni sui metodi di gestione del deadlock è vera? +> Nessuna delle altre opzioni è vera +> L'unico metodo, che richiede di conoscere in anticipo il massimo numero di risorse che un processo dovrà chiedere, è quello per rilevare il deadlock +> Il metodo più permissivo nei confronti delle richieste di risorse è quello che consiste nel prevenire il deadlock +v L'unico metodo che non prevede mai la preemption delle risorse è quello che evita il deadlock + +89) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni è falsa? +> Lo scheduler ha, tra i suoi obiettivi, quello dell'equità tra i processi, a meno che non siano definite delle priorità +> Lo scheduler va scritto in modo che il suo overhead sia basso +v Lo scheduler ha, tra i suoi obiettivi, quello di evitare il deadlock +> Lo scheduler ha, tra i suoi obiettivi, quello di massimizzare il volume di lavoro dei processi nel tempo + +90) Quale delle seguenti affermazioni sugli scheduler per architetture multiprocessore è vera? +> Con l'assegnamento statico, si dà un processore a caso tra quelli liberi ai processi che mantengono un uso della RAM pressoché costante +> Assegnando i processi del sistema operativo con l'assegnamento dinamico, si rischia di creare un bottleneck su un solo processore +> Uno svantaggio dell'assegnamento statico è il suo overhead maggiore rispetto a quello dinamico +v Nessuna delle altre opzioni è vera + +91) Quale delle seguenti affermazioni sull'algoritmo del banchiere per evitare il deadlock visto a lezione è falsa? +v La matrice C - A può contenere elementi negativi, ma le matrici C ed A contengono solo elementi non negativi +> Richiede in input, per ogni processo p e per ogni risorsa r, il numero massimo di istanze di r che p chiederà nel corso della sua esecuzione +> All'inizio e alla fine di ogni invocazione dell'algoritmo, Vi = Ri - ∑j = 1, ..., nAi, j +> Se si procede da uno stato ad un altro, necessariamente è stata fatta almeno una richiesta ad almeno una risorsa da parte di almeno un processo + +92) Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sul dispatcher è falsa? +> Il throughput è definito come il numero di processi completati per unità di tempo +v Il turnaround time è definito, per un dato processo, come il tempo che intercorre tra la sua prima esecuzione sul processore e il suo completamento +> Un dispatcher con buone prestazioni sul response time deve tipicamente sia minimizzare il valore medio di sistema del response time, sia massimizzare il numero di utenti con un basso valore per il response time +> Il processor utilization è definito come il rapporto tra il tempo in cui il processore viene usato ed il tempo totoale del sistema + +93) Quale delle seguenti affermazioni sugli i-node di Unix è vera? +> Per ogni file-system su disco organizzato con i-node, tutti gli i-node di tutti i file su tale file-system sono memorizzati esclusivamente su disco +v I puntatori a tripla indirezione di un i-node vengono usati solo se la dimensione del file lo richiede +> Nessuna delle altre opzioni è vera +> Ad ogni file effettivamente memorizzato su disco può essere associato un solo numero di i-node + +94) UNSAFE Quale delle seguenti affermazioni sul modello dei processi a 7 stati è vera? +v Nessuna delle altre opzioni è vera +> Gli stati Ready, New e Blocked del modello a 5 stati vengono sdoppiati, e ne viene creata una versione Suspend +> Un processo è Suspend quando scade il timeout del dispatcher +> È possibile la transizione Ready/Suspend ==> Blocked/Suspend + +95) Quale delle seguenti affermazioni sui dischi magnetici a testina mobile è vera? +> Per selezionare un settore su una traccia di un disco magnetico a testina mobile, bisogna prima far ruotare il disco fino ad arrivare alla giusta traccia, e poi posizionare la testina sul giusto settore +> Una traccia di un disco è l'area compresa tra 2 raggi del disco stesso +v Il tempo di accesso ad un disco magnetico a testina mobile tiene conto sia del tempo che occorre per posizionare la testina che del tempo che occorre per far ruotare il disco, ma non del tempo che occorre per effettuare effettivamente il trasferimento di dati +> Nessuna delle altre opzioni è corretta + +98) UNSAFE Assumendo un sistema monoprocessore, quale delle seguenti affermazioni sugli algoritmi di scheduling è vera? +v L'exponential averaging permette di stimare la dimensione dell'immagine di un processo, a partire dalle precedenti immagini di quello stesso processo +> La funzione di decisione dello scheduler Highest Response Ratio Next considera tanto il tempo di esecuzione stimato quanto il tempo trascorso in attesa +> L'exponential averaging è una tecnica applicabile dal solo scheduler Short Process Next +> La funzione di decisione dello scheduler Shortest Remaining Time considera tanto il tempo di esecuzione richiesto quanto il tempo trascorso in attesa + +100) Quale delle seguenti affermazioni è vera sulla memoria virtuale con paginazione a segmentazione? +v Sia la tabella dei segmenti che quella delle pagine di un processo contengono, in ciascuna entry, un bit per indicare se la pagina o il segmento sono stati modificati +> Un indirizzo virtuale contiene anche un bit per indicare se la pagina corrispondente è o no in memoria principale +> La tabella delle pagine di un processo contiene una pagina speciale dove è memorizzato il process control block del processo stesso +> Ogni entry di una tabella delle pagine contiene un numero di pagina ed un offset + +99) (risposta corretta secondo @notherealmarco e Simone Sestito, non verificata da nessuna parte) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è vera? +v Per avere un overhead accettabile, occorre demandare la traduzione degli indirizzi all'hardware, mentre al software resta da gestire prelievo, posizionamento e sostituzione delle pagine +> Per avere un overhead accettabile, occorre demandare la traduzione degli indirizzi e la politica di sostituzione delle pagine all'hardware, mentre al software resta da gestire prelievo e posizionamento delle pagine +> Per avere un overhead accettabile, occorre demandare all'hardware la traduzione degli indirizzi ed il prelievo, il posizionamento e la sostituzione delle pagine +> Per avere un overhead accettabile, occorre demandare al software anche la traduzione degli indirizzi + +96) (risposta corretta secondo @notherealmarco, non verificata da nessuna parte) Riguardo alle differenze tra sistemi batch e sistemi time sharing (degli anni 60/70), quale delle seguenti affermazioni è falsa? +v I sistemi time-sharing puntavano a minimizzare l'uso del processore +> Nei sistemi time-sharing, le direttive al sistema operativo arrivavano dai comandi digitati su terminali +> Nei sistemi batch, le direttive al sistema operativo arrivavano dai comandi del job control language, che erano non-interattivi +> I sistemi batch puntavano a massimizzare l'uso del processore + +img=https://i.imgur.com/orqyjeh.png%12) Considerare un insieme di cinque processi P1, P2, P3, P4, P5 con i seguenti tempi di arrivo e tempi di esecuzione in millisecondi: Quale delle seguenti affermazioni è falsa? +> Non ci sono sufficienti informazioni per determinare come si comporterebbe l'algoritmo di scheduling a feedback classico di Unix +> Non ci sono sufficienti informazioni per determinare come si comporterebbe l'algoritmo di scheduling Virtual Round-Robin +> Non ci sono sufficienti informazioni per determinare come si comporterebbe l'algoritmo di scheduling Round-Robin +v Non ci sono sufficienti informazioni per determinare come si comporterebbe l'algoritmo di scheduling SRT + +img=https://i.imgur.com/orqyjeh.png%13) Considerare un insieme di cinque processi P1, P2, P3, P4, P5 con i seguenti tempi di arrivo e tempi di esecuzione in millisecondi: Assegnare questo insieme di processi ad un processore usando l'algoritmo di scheduling SRT, fino a che non terminano tutti. Quale delle seguenti affermazioni è falsa? +v Gli unici 2 processi che non sono serviti subito (ovvero, appena arrivati) sono P3 e P5 +> Il tempo medio di attesa è tra 10 ed 11 ms +> Il processo con il più lungo tempo di attesa è P1 +> Il tempo medio di turnaround è tra 2 e 3 ms + +img=https://i.imgur.com/5nWWwyF.png%101) Si consideri il seguente modo di implementare la mutua esclusione: Quale delle seguenti affermazioni è vera? +> La soluzione non implementa correttamente la mutua esclusione, ma può essere corretta nel seguente modo: int bolt = 0; void P(int i) { int key; while(true) { do (exchange(key, bolt) == 0) while(key != 0); critical_section(); bolt = 0; key = 1; } } +> La soluzione non implementa correttamente la mutua esclusione, in quanto key deve essere una variabile globale +v La soluzione non implementa correttamente la mutua esclusione, ma può essere corretta nel seguente modo: int bolt = 0; void P(int i) { int key; while(true) { key = 1; do (exchange(key, bolt) == 0) while(key != 0); critical_section(); bolt = 0; } } +> La soluzione implementa correttamente la mutua esclusione + +103) Quale delle seguenti affermazioni sulla memoria virtuale con paginazione è falsa? +> Diminuire la dimensione delle pagine ha effetti positivi sul numero di pagine che possono trovarsi in memoria principale +v Aumentare la dimensione delle pagine ha effetti positivi sulla frammentazione interna +> Diminuire la dimensione delle pagine ha effetti negativi sulla dimensione della tabella delle pagine +> Aumentare la dimensione delle pagine ha effetti negativi sulla multiprogrammazione \ No newline at end of file diff --git a/Domande SO2.txt b/Domande SO2.txt new file mode 100644 index 0000000..059a363 --- /dev/null +++ b/Domande SO2.txt @@ -0,0 +1,1214 @@ +1. A quanti gruppi può appartenere un utente nel SO Linux? +v Ad almeno un gruppo +> Ad un solo gruppo +> A zero o più gruppi + +2. Si supponga che nel sistema esiste un gruppo "studente" ed anche l'utente "utente1". +Si supponga quindi di eseguire il comando adduser utente1 studente. +Quale delle seguenti affermazioni è sbagliata? +v Il comando genera un errore perché per aggiungere un utente ad un gruppo si può utilizzare solo il comando addgroup +> Se "utente1" non appartiene al gruppo "studente" lo aggiunge a tale gruppo altrimenti non lo aggiunge +> Aggiunge utente1 al gruppo studente oppure genera un messaggio del tipo L'utente «utente1» fa già parte del gruppo «studente» + +3. Si supponga che nel sistema esiste un gruppo "studente" e non esista ancora l'utente "utente1". +Si supponga quindi di eseguire il comando sudo adduser utente1 studente +Quale sarà il risultato? +v Da errore perché utente1 non esiste +> Crea utente1 e, oltre a creare il gruppo utente1 lo aggiunge al gruppo studente +> Crea utente1, lo aggiunge al gruppo studente e non crea il gruppo utente1 + +4. Supponga di eseguire, come utente sudoer, i seguenti comandi: C1) sudo ls /home, C2) sudo su --command=’ls /homè. Quale affermazioneè corretta? +> C2 da errore "comando non trovato" +v C1 e C2 sono equivalenti +> C2 esegue una setUID mentre C1 no + +5. Quale è la differenza tra i comandi sudo e su +> sudo è un comando che permette di eseguire altri comandi come root; su è una scorciatoia per invocare il comando sudo +v su è un comando che permette di cambiare utente. sudo è un camando che permette di eseguire altri comandi come super-utente +> sudo si riferisce ad un gruppo di utenti. su è invece un comando che permette di cambiare utente + +6. Di quante sezioni è composto il man di Linux? +> 5 +> 7 +v 9 + +7. Supponga di voler creare un file vuoto e di voler settare il tempo di ultimo accesso al "2 giugno 2020 ore 12:00". Quale dei seguenti comandi è corretto? +v touch -at202006021200 filename +> touch -cat202006021200 filename +> touch -ct202006021200 filename + +8. Quale è il risultato del comando touch nomefile? +> Crea un file vuoto con nome nomefile +v Aggiorna, al tempo corrente, gli atttributi atime e mtime di nomefile +> Crea un file vuoto con nome nomefile e ctime uguale al tempo corrente. Se si usa l'opzione -t o -d si può specificare un altro tempo di creazione + +9. I premessi di acceesso della directory /tmp sono 1777/drwxrwxrwt +Cosa significa? +> Il bit SetGid è settato +> Lo sticky bit non è settatto +v Lo sticky bit è settato + +10. Supponga di voler mostrare l’albero delle directory con radice dir1 e con profondità 3. +Quale tra i seguenti comandi è il più apprropriato usare?(uscito 2 volte) +> tree -d 3 dir1 +v tree -L 3 dir1 +> tree --max-depth=3 dir1 + +11. Supponiamo vogliate visualizzare l’albero delle directory con radice nella vostra home. In particolare volete visualizzare solo le directory e non i file in esse contenuti. +Quali tra i seguenti comandi è il più appropriato? +v tree -d ~ +> tree -d -L 3 /home/myhomedir +> tree -a ~ + +12. Si supponga di avere un file di testo (filein) e di voler copiare in un altro file (fileout) i primi 100 caratteri. Quale di questi comandi è corretto? +v dd if=filein of=fileout bs=100 count=1 +> dd if=filein of=fileout bs=1 skip=1 count=100 +> dd if=filein of=fileout bs=10 skip=10 count=10 + +13. Si supponga di avere un file di testo (filein) contenente 1000 caratteri e di voler copiare in un altro file (fileout) 100 caratteri a partire dal decimo. Quale di questi comandi non produce il risultato atteso? +> dd if=filein of=fileout bs=1 skip=10 count=100 +v dd if=filein of=fileout bs=100 seek=10 count=1 +> dd if=filein of=fileout bs=10 skip=1 count=10 + +14. Quanti job in background crea il comando seguente? +sleep 30 | sleep 15 | sleep 10 & +v 1 +> Nessuno, da errore +> 3 + +15. Quanti file system principali ha linux? +> dipende dal numero di filesystem mondati al boot +v 1 +> dipende dal numero di dischi installati + +16. In che file è contenuta la lista dei filesystem montati al boot? +> /etc/mdev +> /etc/mtab +v /etc/fstab + +17. perché il comando passwd (ovvero il file eseguibile /usr/bin/passwd) ha il SetUID bit settato? +v Per consentire a qualsiasi utente di modificare la propria password +> Per evitare che un utente possa cancellare il file eseguibile passwd +> Per evitare che un utente possa modificare le password degli altri utenti + +18. Supponiamo di avere il seguente makefile (memorizzato in un file di nome makefile): +
merge_sorted_lists: merge_sorted_lists.c
+gcc -Wall -Wextra -O3 merge_sorted_lists.c \
+-o merge_sorted_lists
+sort_file_int: sort_file_int.c
+gcc -Wall -Wextra -O3 sort_file_int.c \
+-o sort_file_int
+.PHONY: clean
+clean:
+rm -f *.o merge_sorted_lists
+supponendo che non esistono entrambi i file merge_sorted_lists e sort_file_int e lanciando il comando make, quale target viene eseguito? +Adesso posso scrivere in bold con l'HTML nelle domande yeee +v merge_sorted_list +> entrambi +> nessuno dei due. Va specificato quale vogliamo eseguire con il comando make + +19. Assumiamo di compilare un file .c nei seguenti modi +
gcc file.c -o file1.o
+gcc -g file.c -o file2.o
+
+perché le dimensioni di file2.o sono diverse da quelle di file1.o? +> perché file2.o è stato ottimizzato, per occupare meno spazio in memoria, rispetto a file1.o +v perché file2.o contiene informazioni aggiuntive rispetto a file1.o utili per il debug +> non è vero che i due comandi di compilazione producono file di dimensioni diverse + +20. Assuma di avere due shell aperte, etichettate come shell_1 e shell_2 e supponga di eseguire la sequenza di comandi che segue +(shell_i: cmd indica che cmd è eseguitto nella shell_i, i=1,2). +
shell_1: xterm
+shell_2: ps -C xterm
+#restituisce xtermPID
+shell_2: kill -s SIGSTOP xtermPID
+shell_2: kill -s SIGCONT xtermPID
+Quale è il loro effetto su processo xterm? +> Il processo xterm viene prima mandato in esecuzione in background e poi riportato in foreground +v Il processo xterm viene mandato in esecuzione in background +> Il processo xterm viene prima portato nello stato stopped (T) e poi mandato in esecuzione in foreground + +21. Si assuma di avere due shell aperte, etichettate come shell_1 e shell_2 e si consideri la seguente sequenza di comandi +(shell_i:cmd indica che cmd è eseguitto nella shell i, i=1,2) +
shell_1: xterm
+shell_2: ps -C xterm
+#restituisce xtermPID
+shell_2: kill -s SIGSTOP xtermPID
+Quale è il loro effetto? +> Il processo xterm viene terminato con segnale SIGSTOP +> Il processo xterm viene mandato in esecuzione in background +v Il processo xterm viene messo in stato stopped (T) + +22. Supponga di avere 2 file hw1.c e hw2.c contenenti il seguente codice(uscita 2 volte) +hw1.c: +
#include 
+#include "hw2.c"
+int f(int argc, char *args[]) {
+  printf("Hello World!\n");
+  return 256;
+}
+
+hw2.c:
+int f(int argc, char *args[]);
+int main(int argc, char *args[]) {
+  return f(argc, args);
+}
+
+Quale dei seguenti comandi di compilazione genera errore? +> gcc -Wall hw1.c -o hw.out +v gcc -Wall hw1.c hw2.c -o hw.out +> gcc hw1.c + +23. Supponiamo di avere il file eseguibile (ottenuto dalla compilazione di una programma C) mioprogramma +Questi due modi di invocare il programma sono equivalenti? +$ ./mioprogramma A B C +$ ./mioprogramma < input.txt +dove input.txt contiene A B C +v no, nel primo caso A B C vengono caricati in argv, nel secondo caso vengono inviati sullo stdin +> dipende dalla logica del codice +> si sono equivalenti + +24. Quale è la differenza tra thread posix e processo linux (uscito 2 volte) +> Thread concorrenti condividono codice, segmento dati e file; i processi concorrenti pure +> Thread concorrenti condividono lo stack; i processi concorrenti anche +v Thread concorrenti condividono codice, segmento dati e file; i processi concorrenti no + +25. Per mostare il pid dei job in esecuzione in backgroud quali di questi comandi è corretto? +v jobs -p +> ps -p -u +> jobs + +26. Quale di queste stringhe non è valida come identificatore in C? +> _voltage +> rerun +v x-axis + +27. Quale di queste stringe è valida come identificatore in C? +v _voltage +> x-ray +> return + +28. Si consideri la seguente funzione f +
char *f(char *a, const char *b, size_t n) {
+    size_t i;
+    for (i = 0; i < n && b[i] != '\0'; i++)
+        a[i] = b[i];
+    for ( ; i < n; i++)
+           a[i] = '\0';
+        return a;
+}
+Cosa produce come risultato quando eseguita? +> Copia esattamente n caratteri della stringa b nella stringa a e restituisce a +> Concatena al piò n caratteri della stringa b alla stringa a e restituisce a +v Copia al piò n caratteri della stringa b nella stringa a e restituisce a + +29. Si consideri la seguente funzione f +
char *f(char *a, const char *b, size_t n) {
+    size_t l = strlen(a);
+    size_t i;
+    for (i = 0 ; i < n && b[i] != '\0' ; i++)
+        a[l + i] = b[i];
+    a[l + i] = '\0';
+return a;
+}
+Cosa produce come risultato quando eseguita? +> Copia al piò n caratteri della stringa b in a e restituisce a +> Copia esattamente n caratteri della stringa b nella stringa a e restituisce a +v Concatena i primi n caratteri della stringa b alla stringa a e restituisce a + +30. Si consideri la seguente dichiarazione di struttura +
struct point2D {
+    double x; // coordinata x
+    double y; // coordinata y
+}  pA={0, 0}, pB={1, 5};
+Quale delle seguenti assegnazioni è corretta? +> pA -> x = pB -> x; pA -> y = pB -> y; +> pA = &pB +v pA = pB; + +31. Si consideri il seguente ciclo for +
int scoreCount, a;
+for(scoreCount=0; scanf("%d",&a)==1; scoreCount++);
+Cosa produrebbe come risultato, se eseguito? +> Legge una sola volta da stdin e poi termina, qualunque sia l'input +> Legge da stdin senza mai terminare +v Legge ripetutamente numeri interi da stdin fintanto che è fornito un input di tipo diverso (ad esempio un carattere) + +32. Consideri il seguente frammento di codice +
int *ptr = malloc(sizeof(int));
+ptr = ptr+1;
+assumendo la malloc assegni a ptr la locazione di memoria 0x55c2b1268420 cosa contiene ptr dopo l’incremento? +> 0x55c2b1268421 +> l'incremento della variabile prt genera un errore di segmentazione in fase di esecuzione +v 0x55c2b1268424 + +33. Cosa stampa su stdout la seguente chiamata a printf? +printf("aaaaa\nbbbbb\f\rccccc\r\fddddd\reeeee\n"); +v aaaaa bbbbb ccccc eeeee +> aaaaa bbbbb ccccc ddddd +> aaaaa bbbbb ccccc ddddd eeeee + +34. Si consideri il seguente frammento di codice +
char **mptr, **mptr1, *ptr1;
+int i;
+mptr = calloc(10,sizeof(char *));
+mptr1 = mptr;
+for(i=0;i<10;i++){
+    mptr[i]=(char *)malloc(10);    
+}
+Per de-allocare tutta la memoria allocata, quale delle seguenti opzioni è coretta? +> for(i=0;i<10;i++) free(mptr1[i]); +v for(i=0;i<10;i++) free(mptr1[i]); free(mptr1); +> free(mptr1); + +35. Si consideri il seguente frammento di codice +
char **mptr, *ptr1;
+int i;
+mptr = calloc(10,sizeof(char *));
+for(i=0;i<10;i++){
+    mptr[i]=(char *)malloc(10);    
+}
+Quale delle seguenti strategie di de-allocazione crea un memory leakage? +> free(mptr); +> for(i=0;i<10;i++) free(mptr[i]); +v entrambe, ovvero sia (1) che (2) + +36. Si consideri un file contenente un programma in linguaggio C. Si assuma che è stata inserita la direttiva #include "stdio.h" . perché la compilazione potrebbe generare errori? +v perché cerca il file "stdio.h" nella directory corrente +> La compilazione non genera errori a meno che il file non esista nel filesystem +> perché il file stdio.h potrebbe non esistere + +37. Quale delle seguenti dichiarazioni di variabile inizializza una stringa? +> char r[10] = {`L´,`9´,` ´,`4´,`a´,`p`,`r´}; +v char r[] = ``L9 4apr´´; +> char r[] = {`L´,`9´,` ´,`4´,`a´,`p`,`r´}; + +38. Quale è il modo corretto per controllare che due stringhe str1 e str2 sono uguali? +if strcmp(s1,s2)==0 { printf("stringhe uguali") } +if (s1==s2) { printf("stringhe uguali") } +if strcmp(s1,s2) { printf("stringhe uguali") } + +39. Si consideri il seguente frammento di codice +
+FILE * pFile;
+pFile = open("myfile.txt","rw+");
+fprintf(pFile, "%f %s", 3.1416, "PI");
+
+Assumendo che myfile.txt non esiste, quale delle seguenti affermazioni è vera? +v Il programma genera un errore in fase di esecuzione +> Il programma genera errore in fase di compilazione +> Il programma scrive sul file myfile.txt la stringa 3.1416 PI + +40. Cosa fa il seguente segmento di codice se eseguito? +
scanf(“%d",&num); 
+do; {
+printf(“%d\n",num); 
+scanf(“%d",&num);
+}  while(num!=0);
+> Stampa il valore di num almeno una volta +> Cicla infinitamente se num è diverso da 0 +> Popipopi S.p.A. > CD Click s.r.l. +v Genera errore in fase di compilazione + +41. Si consideri il frammento di codice +
i=0; c=0; p=1;
+while (i++ < 10)
+c=c+1;
+p--;
+che valore conterrà p al termine dell'esecuzione del frammento di codice? +v 0 +> -10 +> -9 + +42. Supponiamo di eseguire separatamente i seguenti frammenti di codice +Frammento_1 +
close(2);
+if (fopen(".","r")) {
+           perror("main");
+}
+Frammento_2 +
close(2);
+if (fopen(".","r")) {
+               printf("main: %s \n", strerror(errno));
+}
+Quale delle seguenti affermazioni è falsa? +> Il frammento_1 non produce alcun output sul terminale +v La loro esecuzione produce sul terminale due stringhe identiche +> Il frammento_2 produce un output sullo stdout + +43. Consideriamo queste due line di codice +1. printf("main:%s\n",strerror(errno)); +2. perror("main"); +Quali delle seguenti affermazioni è corretta? +> Producono stringhe diverse e la prima la invia su stdout mentre la seconda su stderr. +> Inviano la stessa stringa su stdout +v producono la stessa stringa ma la 1 la invia su stdout, mentre la 2 su stderr + +44. Quale delle seguenti funzioni di libreria alloca memoria nello stack? +> void *calloc( size_t nmemb, size_t size ); +v void *alloca( size_t size ); +> void *malloc( size_t size ); + +45. Un processo può allocare memoria nello stack? +> no un processo può allocare memoria sono nell'heap +> si mediante la funziona di libreria malloc(3) +v si mediante la funzione di libreria alloca(3) + +46. Quale è la differenza tra la system call _exit(2) e la funzione di libreria exit(3)? (uscita 2 volte) +> _exit(2) chiude tutti i file descriptor mentre exit(3) no +v _exit(2) non invoca gli handler registrati con atexit e on_exit mentre exit(3) li invoca +> _exit(2) invoca gli handler registrati con atexit e on_exit mentre exit(3) non li invoca + +47. Quale attributi di un processo sono ereditati dal processo figlio? +> parent pid, timer, contatori risorse +v working directory, descrittori dei file, memoria condivisa +> timer, lock, coda dei segnali + +48. Si consideri il seguente frammento di codice +
pid_t pID = fork();
+if (pID == 0) {
+    Blocco_1
+} else if (pID < 0) {
+    Blocco_2
+} else {
+  Blocco_3
+}
+Quale blocco di codice (tra Bloccco_1, Blocco_2 e Blocco_3) verrà eseguito dal processo figlio? +> Blocco_3 +v Blocco_1 +> Blocco_2 + +49. Si consideri il seguente frammento di codice +
pid_t pID = fork();
+if (pID == 0) {
+    Blocco_1
+} else if (pID < 0) {
+    Blocco_2
+} else {
+  Blocco_3
+}
+Quale blocco di codice (tra Bloccco_1, Blocco_2 e Blocco_3) verrà eseguito dal processo padre? +v Blocco_3 +> Blocco_1 +> Blocco_2 + +50. Supponiamo che la system call +pid_t waitpid(pid_t pid, int *status, int options); +sia invocata con valore di pid uguale a 0. Quale è il suo comportamento? +Scegli un'alternativa: +> attende la terminazione di qualunque processo figlio il cui gruppo ID del processo sia diverso da quello del processo chiamante +v attende la terminazione di qualunque processo figlio il cui gruppo ID sia uguale a quello del processo chiamante (ovvero il processo padre) +> attende la terminazione di qualunque processo figlio + +51. Si consideri il seguente frammento di codice (i numeri a lato sono i numeri di riga delle istruzioni)(uscita 2 volte) +
1.    Pthread_t tid;
+2.    pthread_create(&tid, ... )
+3.    pthread_create(&tid, ...)
+4.    pthread_join(tid, ...);
+5.    printf("joined");
+quale delle seguenti affermazioni è falsa? +> la stringa "joined" è inviata su stdout solo quando il thread creato a riga 3 è terminato +v la stringa "joined" è inviata su stdout quando entrambi i thread sono terminati +> la chiamata pthread_join(...) attende la terminazione del thread con identificatore tid + +52. Si considerino i seguenti frammenti di codice (R1 e R2) +
R1: strPtr=(char *) calloc(SIZE_OF_ARRAY, sizeof(char) );
+R2: strPtr=(char *) malloc(SIZE_OF_ARRAY);
+    memset(strPtr, ´\0´, SIZE_OF_ARRAY);
+v R1 e R2 producono lo stesso risultato +> R2 dopo aver allocato la memoria la inizializza, mentre R1 no +> R1 alloca nell’heap, e quindi dopo è consigliabile “pulire" la memoria; mentre R2 alloca nello stack e quindi non c’è bisogno di “pulire" la memoria. + +53. Consideriamo la seguente invocazione della funzione realloc +strptr1=(char *) realloc(strptr, 10 * SIZE_OF_ARRAY); +strptr1 può essere diverso da strptr? +> si, la realloc modifica sempre l'indirizzo di partenza dell'area di memoria ridimensionata +> no, strptr1 è sempre uguale a strptr +v sì se a seguito del ridimensionamento della memoria allocata non è possibile trovare un numero sufficiente di locazioni contigue a partire dal strptr + +54. Supponiamo di voler modificare il comportamento di default di un processo quando esso riceve un segnale. Ovvero vogliamo modificare il gestore (handler) di un segnale. +Quale, tra le system call, o combinazione di system call di seguito riportate è possibile utilizzare? +v sigaction(2) +> sigaction(2) seguita da una fork(2) che esegue l’handler del segnale +> signal(2) seguita da una fork(2) che esegue l’handler del segnale + +55. Assumiamo di voler settare i permessi di accesso 0600 al file filename mediante l'uso della system call open(2). Quale delle seguenti chiamate è corretta? +> open( "filename", O_RDWR | O_CREAT | S_IRUSR | S_IWUSR); +> open("filename",O_RDWR | O_CREAT, S_IRUSR & S_IWUSR); +v open( "filename", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + +56. Si consideri la system call +
int open(const char *pathname, int flags);
+nel caso venga invocata con il flag impostato a
+O_CREAT | O_EXCL | O_RDONLY
+Quale è il comportamento atteso? +v Se il file non esiste viene creato ed aperto in lettura, se invece esiste ritorna errore +> Se il file non esiste lo crea e lo apre in lettura, altrimenti lo apre in lettura +> Se il file non esiste viene creato con i permessi di esecuzione (x) ed aperto in lettura. Se esiste vengono aggiunti i permessi di esecuzione se già non settati ed il file è aperto in lettura + +57. Si consideri il seguente frammento di codice +
char* file = argv[1];
+int fd;
+struct flock lock;
+fd = open (file, O_WRONLY);
+memset (&lock, 0, sizeof(lock));
+lock.l_type = F_WRLCK;
+fcntl (fd, F_SETLKW, &lock);
+....
+Quale è il suo comportamento? +> mette un lock mandatory in scrittura sul file file +> mette un lock advisory in scrittura sul file file +v mette un lock bloccante in scrittura sul file file. + +58. Quale è la differenza tra i seguenti frammenti di codice? +
C1: int fd, fd1;
+    fd=open(“filename", O_RDWR);
+    fd1=fd;
+
+
C2: int fd,fd1;
+    fd=open(“filename", O_RDWR);
+    fd1=dup(fd);
+> Dopo l’esecuzione di C1 e C2 fd1 contiene lo stesso valore +> Dopo l’esecuzione di C1 i due file descriptor puntano allo stesso file, mentre dopo l’esecuzione di C2 il file filename viene duplicato +v Dopo l’eseccuzione di C1 fd1 contiene lo stesso valore di fd; mentre dopo l’esecuzione di C2 fd1 contiene il valore del piu’ piccolo file descriptor disponibile + +59. Si consideri il seguente frammento di codice +
int fd,fd1;
+struct stat buf,
+buf1;
+fd=open(“filename", O_RDWR);
+fd1=dup(fd); 
+fstat(fd,&buf);
+fstat(fd1,&buf1);
+v buf.st_ino è uguale a buf1.st_ino +> buf.st_ino è diverso da buf1.st_ino +> st_ino non è membro della struttura stat + +60. Supponiamo di avere il seguente frammento di codice +
struct dirent *dentry; //directory stream
+    char *filename;
+    DIR *dstr=opendir(“mydir");
+    while ((dentry=readdir(dstr)) != NULL) {
+        /* Memorizzai nome file nella  directory  in filename  */
+         }
+Quale delle seguenti istruzioni deve essere posta all’interno del ciclo while per memorizzare in filename il nome dei file contenuti all’interno della directory mydir ? +v filename = dentry --> d_name; +> filename = dentry.filename; +> filename = dentry --> filename; + +61. Quali attributi di processo sono preservati dalla system call execve(2)? +> Memory locks +> Timer +v Umask + +62. Si consideri la system call execve(2). Quale delle seguenti affermazioni è corretta? +> la execve(2) permette di generare un proccesso figlio del processo chiamante senza utilizzare una fork ma semplicemente eseguendo un immagine contenuta in un file (execve esegue implicitamente la fork) +v la execve(2) permette di sostituire l'immagine di un processo con quella di un file eseguibile o di uno script di shell eseguibile +> la execve(2) è una estensione della funzione system(3). Infatti, execve(2) può eseguire un qualsiasi programma, incluso uno script di shell. + +64. Supponiamo di aver mappato un file in memoria con la system call mmap(2). A cosa serve invocare la msync(2)? +v Impostando il tipo di mapping a MAP_SHARED la msync(2) permette di scrivere le modifiche su disco prima dell' invocazione di una unmap(2) o prima della chiusura del file descriptor. +> è necessario invocare sempre la msync(2) se non si vogliono perdere le modifiche fatte in memoria. +> non serve invocare la mysinc perché quando si chiude il file descriptor tutte le modifiche fatte in memoria vengono scritte su disco + +65. Quale delle seguenti affermazioni sui processi Linux è falsa? +> In un determinato istante, non possono esserci 2 processi distinti con lo stesso PID +v Per creare i PID dei processi si usano dei numeri interi che crescono sempre +> In istanti diversi, possono esserci 2 processi distinti con lo stesso PID +> Ogni processo può conoscere il suo PID + +66. Quale delle seguenti affermazioni sui processi Linux è vera? +> Normalmente, il processo figlio, una volta terminata la sua computazione, attende, con una chiamata alla syscall wait, che il padre termini e gli restituisca il suo exit status +> Un processo diventa zombie se termina prima di almeno uno dei processi che abbia eventualmente creato +> Ogni processo può conoscere il proprio PID, ma non quello del processo che l'ha creato +v Con l'eccezione del primo processo, tutti i processi sono creati con una fork + +67. Quale delle seguenti affermazioni sui processi Linux è falsa? +v Digitare un comando sulla shell genera sempre un nuovo processo +> Esistono file che non possono essere eseguiti per diventare processi +> Affinché un file possa diventare un processo è necessario che abbia i permessi di esecuzione +> Qualsiasi computazione eseguita dal sistema operativo è contenuta dentro un qualche processo + +68. Quale delle seguenti affermazioni sui processi Linux è vera? +v Eseguendo k volte un file eseguibile, si generano k diversi processi +> Per poter lanciare un file eseguibile, è prima necessario aspettare che il comando precedente sia terminato +> Tutti i processi sono sempre in stato di RUNNING +> Un processo è sempre un'istanza di uno script bash + +69. Un programma scritto in linguaggio C: +> Rappresenta le stringhe ESCLUSIVAMENTE come array di caratteri terminate dal carattere ‘\n’ +> Rappresenta le stringhe ESCLUSIVAMENTE come array di caratteri terminate dal carattere ‘^M’ +> Rappresenta le stringhe ESCLUSIVAMENTE come array di caratteri terminate dal carattere ‘0’ +v Rappresenta le stringhe come array di caratteri terminate dal carattere ‘\0’ + +70. Quale delle seguenti affermazioni è vera? +> Linus Torvalds ha riscritto i pacchetti di Unix, creando i pacchetti GNU +> Tutte le opzioni sono false +> Linus Torvalds ha scritto il primo kernel di Linux all'inizio degli anni '80 +v Richard Stallman ha descritto per primo la licenza GPL + +71. Quali delle seguenti affermazioni è vera? +> A. Nessuna delle opzioni è vera +> È possibile montare un filesystem solo se è dichiarato nel file /etc/fstab +v È possibile montare un filesystem solo se è dichiarato nel file /etc/mtab +> D. Ad ogni filesystem corrisponde un disco fisico o parte di esso (partizione) + +72. Si supponga di avere il seguente frammento di codice: +FILE *stream = fopen(NOMEFILE, "w"); +Quale dei seguenti frammenti di codice ha lo stesso effetto? +> int fd = open(NOMEFILE, O_WRONLY | O_CREAT, 0666); +> int fd = open(NOMEFILE, O_WRONLY | O_TRUNC); +> int fd = open(NOMEFILE, O_WRONLY); +v int fd = open(NOMEFILE, O_WRONLY | O_CREAT | O_TRUNC, 0666); + +73. 10. (questa domanda ha una crisi d'identità) Quale delle seguenti affermazioni sulle syscall di Linux che riguardano i files è falsa? +> Chiamando la syscall select, è possibile monitorare un insieme di file descriptor, ed essere notificati non appena ce n'è uno che è diventato disponibile per un'operazione di lettura o scrittura +v Per richiedere un lock su un file (o su una porzione di esso), occorre chiamare la syscall ioctl +> È possibile usare la syscall select sia in modo bloccante che in modo non bloccante +> Le syscall ioctl e fcntl ammettono 2 o 3 argomenti, a seconda dell'operazione + +74. 11. (☢ UNSAFE, segnalate a @notherealmarco se è corretta o meno 🙏) Quale delle seguenti affermazioni sui segnali Linux è vera? +> Tutti i segnali, se non opportunamente catturati, provocano la terminazione del processo, con l'eccezione del segnale STOP +> Per un processo è sempre possibile ridefinire il comportamento di un qualsiasi segnale +> È possibile per un qualunque processo inviare un segnale ad un qualsiasi altro processo dello stesso utente +v Nessuna delle altre affermazioni è vera + +75. 12. Quale delle seguenti affermazioni sugli errori delle syscall di Linux è vera? +> Per stampare su stderr la spiegazione di un errore verificatosi in una syscall, il cui nome sia contenuto nella variabile syscall_name (di tipo char *), si può effettuare la seguente chiamata: perror("Si è verificato il seguente errore nella chiamata a %s", syscall_name); +v Per stampare su stdout la spiegazione di un errore verificatosi in una syscall si può effettuare la seguente chiamata: printf("%s\n", strerror(errno)); +> Per stampare su stdout la spiegazione di un errore verificatosi in una syscall è sufficiente chiamare perror +> Per stampare su stdout la spiegazione di un errore verificatosi in una syscall è necessario scrivere uno switch sulla variabile globale errno + +76. Si supponga di avere il seguente frammento di codice: +FILE *stream = fopen("file_esistente.txt", "r"); +fseek(stream, -100, SEEK_END); +long pos = ftell(stream); +Quale dei seguenti frammenti di codice ha lo stesso effetto? +a.
+int fd = open("file_esistente.txt", O_RDONLY);
+lseek(fd, -100, SEEK_END);
+long pos = lseek(fd, 0, SEEK_END);
+
+b.
+int fd = open("file_esistente.txt", O_RDONLY);
+lseek(fd, -100, SEEK_END);
+long pos = lseek(fd, 0, SEEK_CUR);
+
+c.
+int fd = open("file_esistente.txt", O_RDONLY);
+lseek(fd, -100, SEEK_END);
+long pos = lseek(fd, -100, SEEK_END);
+
+d.
+int fd = open("file_esistente.txt", O_RDONLY);
+lseek(fd, -100, SEEK_END);
+long pos = ltell(fd);
+
+> a +v b +> c +> d + +76. Si consideri la seguente funzione f +
+char *f(char *dest, const char *src, size_t n) {
+    size_t i;
+    for (i = 0; i < n && src[i] != '\0'; i++)
+        dest[i] = src[i];
+for ( ; i < n; i++)
+dest[i] = '\0';
+return dest;
+}
+
+Cosa produce come risultato quando eseguita? +> Genera sempre errore in fase di esecuzione perché non c'è alcun controllo sulla dimensione delle stringhe +> Concatena la stringa src a dest e restituisce dest +v Copia la stringa src in dest e restituisce dest + +77. Si consideri il seguente frammento di codice +
+sigset_t set, oset, pset;
+...
+sigemptyset( &set );
+sigaddset( &set, SIGINT );
+sigaddset( &set, SIGUSR1 );
+sigprocmask( SIG_BLOCK, &set, &oset );
+...
+
+v Prepara una sezione critica (ovvero dopo la sigprocmask può inizare la sezione critica) +> Disabilita tutti i segnali tranne SIGINT e SIGUSR1 +> Termina una sezione critica precedentemente iniziata + +78. Sia mylink un hard link al file myfile (ln myfile mylink). +Quale di queste afferrmazioni è vera? +> myfile e mylink hanno dimensione diversa +v myfile e mylink hanno lo stesso numero di inode +> myfile e mylink hanno un diverso numero di inode + +79. Supponendo di essere "loggato" in una shell come utente1. +Quali dei seguenti è un path assoluto? +> dir1/dir11/dir112/filename +v ~/utente1/dir1/dir11/dir112/filename oppure ~/dir1/dir11/dir112/filename + +80. Si supponga che nel sistema esiste un gruppo "studente". +Si supponga di voler creare "utente1" e di volerlo aggiungere al gruppo studente. +Quale dei seguenti comandi è corrretto? +v adduser utente1; adduser utente1 studente +> adduser utente1 utente1 studente +> adduser utente1 studente + +81. Si considerino le seguenti dichiarazioni di variabili: +
+int vect[10];
+int *ptr = NULL;
+
+Quale delle seguneti assegnazioni è corretta per far sì che ptr contanga il puntatore al vettore vect? +v ptr = vect; +> ptr = &vect +> ptr = vect[1]; + +82. Si supponda di avere 2 file hw1.c e hw2.c contenenti il seguente codice +
+hw1.c:
+#include 
+#include "hw.2.c"
+int f(int argc, char *args[]) {
+printf("Hello World!\n");
+return 256;
+}
+
+
+hw2.c:
+int f(int argc, char *args[]);
+int main(int argc, char *args[]) {
+return f(argc, args);
+}
+
+Quale dei seguneti comandi di compilazione non genera errore? +v gcc -Wall hw1.c hw2.c -o hw.out oppure gcc -Wall hw1.c -o hw.out +> gcc -Wall hw2.c -o hw.out + +83. Si consideri il seguente frammento di codice +
+pid_t pID = fork();
+if (pID == 0) {
+    Blocco_1
+} else if (pID < 0) {
+    Blocco_2
+} else {
+    Blocco_3
+}
+
+Quale blocco di codice (tra Bloccco_1, Blocco_2 e Blocco_3) verrà eseguito nel caso in cui la fork non vada a buon fine? +> Blocco_1 +> Blocco_3 +v Blocco_2 + +84. Si consideri il seguente frammento di codice +
+for (i=0;((i
+quando termina il ciclo for?
+> Termina solo se n1 è uguale a n2
+> Quando si raggiunge il più grande tra n1 e n2
+v Quando si raggiunge il più piccolo tra n1 e n2
+
+85. A seguito di una chiamata a fork(2), quale dei seguenti attributi del processo padre non è ereditato dal processo figlio?
+> groups id
+v coda dei segnali
+> descrittori dei file
+
+86. Si consideri il seguente frammento di codice
+
+struct stat *s;
+fd=open(“filename");
+fchmod(fd,00744);
+fstat(fd,s);
+
+Per visualizzare su sdtout i permessi di accesso a "filename", quale tra le seguenti opzioni è la più appropriata? +> printf("New File mode %x\n", s.st_mode); +v printf("New File mode %o\n", s.st_mode); +> printf("New File mode %s\n", s.st_mode); + +87. Si consideri il seguente frammento di codice +
+int n=2;
+int r=2 * (n++);
+
+
+int n=2;
+int r1=2 * (++n);
+
+Quale valori assumeranno le variabili r e r1 dopo l'esecuzione? +> r = r1 = 4 +> r=6 e r1=4 +v r=4 e r1=6 + +88. Supponiamo di avere la seguenti variabili +int x=1, y=7; +Quale delle seguneti espressioni è falsa? +v (x & y) == 7 +> (x | y) == 7 +> (x || y) == (x & y) + +89. Per visualizzare l’atime di un file quale dei seguenti comandi è corretto? +> ls -lc nomefile +v ls -lu nomefile +> ls -la nomefile + +90. Quali attributi del processo sono preservati dalla funzione di libreria execve()? +> Memory locks +> Timer +v Umask + +91. I permessi di accesso del file eseguibile /usr/bin/passwd sono 4755/-rwsr-xr-x +Cosa significa? +> Il bit SetUid non è settato +> Lo sticky bit è settato +v Il bit SetUid è settato + +92. Si assuma di avere due shell aperte, etichettate come shell_1 e shell_2 e si consideri la seguente sequenza di comandi +(shell_i:cmd indica che cmd è eseguitto nella shell i, i=1,2). +
+shell_1: xterm
+shell_2: ps -C xterm
+#restituisce xtermPID
+shell_2: kill -s SIGINT xtermPID
+
+Quale è il loro effetto? +> Il processo xterm viene messo nello stato stopped (T) +v Il processo xterm viene terminato con segnale SIGINT +> Il processo xterm viene messo in background + +93. Supponiamo di aver dichiarato ed inizializzato le seguenti variabili +int x = 1, y = 7; +Quale delle seguenti espressioni è vera (true)? +v (x & y) == (x && y) +> (x && y) == 7 +> (x & y) == (x | y) + +94. Si consideri la seguente funzione fa +
+char *f(char *dest, const char *src, size_t n) {
+    size_t dest_len = strlen(dest);
+    size_t i;
+    for (i = 0; i < n && src[i] != '\0'; i++)
+        dest[dest_len + i] = src[i];
+    dest[dest_len + i] = '\0';
+return dest;
+}
+
+> Copia la stringa src in dest e restituisce dest +v Concatena la stringa src a dest e restituisce dest +> Genera sempre errore in fase di esecuzione perché non c'è alcun controllo sulla dimensione delle stringhe + +95. Si supponga di avere un file di testo (filein) e di voler copiare in un altro file (fileout) 100 caratteri a partire dal decimo. +Quale di questi comandi è corretto? +> cp -n10 -i100 filein fileout +v dd if=filein of=fileout bs=1 skip=10 count=100 +> dd if=filein of=fileout bs=100 skip=10 count = 1 + +96. Sia mylink un soft link al file myfile (ln -s myfile mylink). +Quale di queste affermazioni è vera? +v myfile e mylink hanno un diverso numero di inode +> myfile e mylink hanno lo stesso numero di inode +> myfile e mylink hanno la stessa dimensione + +97. Si consideri il codice +
+struct stat *s;
+fd = open("filename");
+fstat(fs, s);
+
+Come faccio a sapere se il file "filename" è un link? +v Se S_ISLINK(s) == 1 +> Se s.st_size == 0 +> Se s_st_nlink == 1 + +98. Quale tra i seguenti comandi è il modo più corretto per verificare a quali gruppi appartiene un utente? +> groups nomeutente +> cat /etc/groups | grep nomeutente + +99. Cosa fa sto ciclo? +for(scoreCount = 0; scanf("%d", &a) == 1; scoreCount++); +v Legge ripetutamente numeri interi da stdin +> Legge una sola volta da stdin e poi termina +> Legge da stdin senza mai terminare + +100. Quale delle seguenti funzioni di libreria non alloca nell'heap? +> calloc +> malloc +v alloca + +101. Si consideri il seguente frammento di codice +
+sigset_t set, oset, pset;
+...
+sigemptyset( &set );
+sigaddset( &set, SIGINT );
+sigaddset( &set, SIGUSR1 );
+sigprocmask( SIG_BLOCK, &set, &oset );
+...
+
+> Termina una sezione critica precedentemente iniziata +> Disabilita tutti i segnali tranne SIGINT e SIGUSR1 +v Disabilita i segnali SIGINT e SIGUSR1 + +102. Per visualizzare contemporaneamente l'access time e status change time di un file, quale dei seguenti comandi è corretto? +v stat nomefile +> ls -la nomefile +> ls -lac nomefile + +103. Consideri il seguente frammento di codice +
int *ptr = malloc(sizeof(int));
+ptr = ptr+1;
+assumendo la malloc assegni a ptr la locazione di memoria 0x55c2b1268420 cosa contiene ptr dopo l’incremento? +> 0x55c2b1268421 +> 0x55c2b1268428 +v 0x55c2b1268424 + +104. Che cosa si intende per sudoer nel gergo Linux? +> Un comando per essere aggiunti al gruppo sudo +> Un gruppo che permette ai suoi membri di eseguire comandi come super-utente +v Un utente che appartiene al gruppo di utenti sudo + +105. Assumiamo che quando viene creata una directory i suoi permessi di accesso sono 0644. +Quale sarà la umask? +> 0644 +> 0022 +v 0133 + +106. Se una directory ha i permessi di accesso settati come 0222, quali operazioni è possibile fare su di essa? +v Nessuna operazione +> Operazioni di scrittura ed e possibile visualizzarne il contenuto senza vedere gli attributi dei file +> Operazioni di scrittura + +107. Assumete di voler visualizzare il numero di inode di un file, quale dei seguenti comandi è più corretto usare? +> ls -l -n nomefile +> stat -f nomefile +v ls -1 -i nomefile + +108. Quando si esegue il comando ls -l viene mostrato, come prima informazione, il totale (vedi figura, ma non sul bot :p) +Quale è il significato di questo campo? +v Dimensione della directory espressa in numero di blocchi su disco +> Dimensione della directory espressa in numero di file contenuti in essa e in tutte le sotto-directory +> Numero totale di sotto directory + +109. Si consideri il seguente frammento di codice: +
+int num = 5;
+int *numPtr;
+numPtr = #
+*numPtr = 10;
+
+Dopo la sua esecuzione, quale sara' il valore contenuto il num ? +> 5 +v 10 +> 0x123AF345 (indirizzo di memoria) + +110. Si consideri il seguente frammento di codice: +
+int n= 2;
+int r= 2*(n++); // r = 2 * 2, n = 3
+int r1= 2*(++n); // n = 3 + 1, r1 = 2 * 4
+
+Quale delle seguenti espressioni sarà vera (true) una volta eseguito il codice? +v r < r1 +> r > r1 +> r == r1 + +112. Si consideri il comando +gcc -c file.c -o file.o +Quali delle seguenti affermazioni perché falsa? +> Il comando produce un file oggetto a partire da un file precompilato +> Il comando produce un file oggetto +v Il comando produce un file eseguibile + +113. Cosa produce il seguente comando? +gcc file.o file2.o file3.o +v Un file eseguibile a.out +> Nulla, la sintassi è sbagliata +> Fa il linking dei file oggetto ma non produce nessun risultato finché non si specifica l'output + +114. Si consideri il seguente frammento di codice. Cosa fa una volta eseguito? +
+scanf("%d",&num);
+while(num!=0); {
+    printf("%d\n",num);
+    scanf("%d",&num);
+}
+
+> stampa il valore di num almeno una volta +v cicla infinitamente se num != 0 +> stampa il valore di num se num != 0 + +115. Cosa produce il seguente comando come risultato? +cat /etc/group | grep nomeutente +v Visualizza su stdout tutti i gruppi a cui appartiene l'utente "nomeutente", incluso il gruppo "nomeutente" (se esiste) +> Visualizza su stdout la lista dei gruppi a cui appartiene il gruppo "nomeutente" (se esiste) +> Genera un errore in quanto il file /etc/group non esiste + +116. Nel caso in cui la system call pid_t waitpid(pid_t pid, int *status, int options); +sia invocata con valore di pid uguale a -1. Quale è il suo comportamento? +> Attende la terminazione di qualunque processo figlio il cui gruppo ID del processo sia diverso da quello del processo chiamante +v Attende la terminazione di un qualunque processo figlio +> Attende la terminazione di qualunque processo figlio il cui gruppo ID del processo sia uguale a quello del processo chiamante + +117. Quali dei seguenti comandi permette di creare un intero path di directory? +> mkdir /dir1/dir2/dir3 +v mkdir -p /dir1/dir2/dir3 +> mkdir -m /dir1/dir2/dir3 + +118. Supponiamo di avere un file di nome filename e di creare un link a filename con il comando +ln filename link1 +quale delle seguenti affermazioni è vera? +v filename e link1 hanno lo stesso inode +> link1 occupa zero blocchi su disco anche se filename ne occupa un numero diverso da 0 +> filename e link1 hanno inode diverso + +119. Quali dei seguenti comandi change dir usa un path assoluto? (# indica il prompt di sistema) +> # cd ../studente/download +> # cd Immagini/../Immagini/faces/ +v # cd ~/Lezione1/esempi/filesystem + +120. Quali sono i permessi MINIMI che devono essere assegnati ad una directory affinchperché sia possibile: +- leggere il contenuto della directory inclusi gli attributi dei file; +- impostare la directory come cwd; +- attraversare la directory. +> rwx +v r-x +> rw- + +121. Supponiamo di avere il seguente makefile (memorizzato in un file di nome makefile): +
+merge_sorted_lists: merge_sorted_lists.c
+        gcc -Wall -Wextra -O3 merge_sorted_lists.c \
+        -o merge_sorted_lists
+sort_file_int: sort_file_int.c
+        gcc -Wall -Wextra -O3 sort_file_int.c \
+        -o sort_file_int
+.PHONY: clean
+clean:
+        rm -f *.o merge_sorted_lists
+
+In quali condizioni viene eseguito il target sort_file_int? +> Sempre, se invochiamo il comando make sort_file_int +v Se invochiamo il comando make sort_file_int. e se sort_file_int.c perché stato modificato dopo la data di creazione di sort_file_int.o +> Il target sort_file_int non verrà mai eseguito + +122. SI consideri il seguente frammento di codice: +
+int x, y, nread;
+float xx, yy;
+nread=scanf("%d %d",&x, &y);
+printf("x=%d, y=%d, nread=%d \n",x,y,nread);
+printf("xx=%f, yy=%f, nread=%d \n",xx,yy,nread);
+nread=scanf("%f %f",&xx, &yy);
+
+Assumiamo che, in fase di esecuzione, la prima scanf legge su stdin la sequenza +1 w +Quale sara' il valore di nread dopo l'esecuzione della seconda scanf? +v 0 +> 2 +> dipende dall'input letto su stdin dalla seconda scanf + +123. Si consideri il seguente frammento di codice +
+ 1: #include 
+ 2:  ....
+ 3: 
+ 4:  char str [80];
+ 5:  float f;
+ 6:  FILE * pFile;
+ 7:
+ 8:  pFile = fopen ("myfile.txt","w+");
+ 9:  fprintf (pFile, "%f %s\n", 3.1416, "PI");
+ 10: close(pFile);
+ 11: rewind (pFile);
+ 12: fscanf (pFile, "%f", &f);
+ 13: fscanf (pFile, "%s", str);
+
+Le chiamate di funzione a riga 10, 11, 12 e 13 vengono eseguite tutte? +v Sì +> Viene eseguita solo riga 10 poi genera errore ed il programma termina +> No, nessuna + +124. Cosa fa il seguente segmento di codice? +
+scanf(“%d”,&num); 
+do {
+printf(“%d\n”,num); 
+scanf(“%d”,&num);
+} while(num!=0);
+
+> stampa il valore di num se num è diverso da 0 +> Il ciclo do-while entra in un loop infinito +v stampa il valore di num almeno una volta + +125. Supponiamo di aver inizializzato un puntatore ad una variabile intera in questo modo +
+int num=5, *ptrnum;
+ptrnum=#
+
+> ptrnum = (int *) 10; +> ptrnum = 10; +v *ptrnum = 10; + +126. Quale dei seguenti dichiarazioni di variabile perché non valida, generando quindi un errore di compilazione? +v int goto=1; +> int goTo=1; +> int go_to=1; + +127. Si consideri il seguente frammento di codice +
+int scoreCount, a;        
+for(scoreCount=0; scanf("%d",&a)==1; scoreCount++);
+
+Se la sequenza letta in input dall scanf è +
+1 3 7 2 12 w
+
+Quale valore assumerà scoreCount al termine del ciclo? +> Il ciclo non termina. La scanf va in errore quando viene letta la w +v 5 +> 6 + +128. Si consideri il frammento di codice +
+  int K=10, c=0, p=1;
+  while (++K > 10)
+    c=c+1;
+  p--;
+
+che valore conterrà la variabile K al termine dell'esecuzione del frammento di codice? +> 11 +v L'esecuziuone del frammento di codice non termina perché Il ciclo entra in un loop infinito +> 10 + +129. In quale situazione le system call dup(2) e dup2(2) hanno lo stesso comportamento? +> Nel caso in cui gli passiamo gli stessi parametri +> Nel casa in cui invochiamo la dup2(2) settando a NULL il valore del nuovo file descriptor +v Nel caso in cui la dup2(2) venga invocata specificando che il nuovo file descriptor deve essere il file descriptor disponibile con il numero più piccolo + +130. Quali dei seguenti attributi di un processo non perché preservato a seguito di una chiamata alla funzione di libreria execve()? +> Groups id +v Memory mapping +> File locks + +131. Quale attributi di un processo non sono ereditati dal processo figlio? +> Descrittori dei file; terminale di controllo; memoria condivisa +v I timer, i record lock e i memory lock; i contatori delle risorse +> Real ed effective user e group ID; working directory; ambiente del processo + +132. Si consideri il seguente frammento di codice +
+char* file = argv[1];
+ int fd;
+ struct flock lock;
+ fd = open (file, O_WRONLY);
+ memset (&lock, 0, sizeof(lock));
+ lock.l_type = F_WRLCK; 
+ fcntl (fd, F_GETLK, &lock);
+
+Quale è il comportamento della system call fcntl? +> Verifica se sul file file perché gia' presente un lock descritto dalla struttura lock. Nel caso in cui nessun processo detiene un lock su file piazza il lock +v Verifica se sul file file perché gia' presente un lock descritto dalla struttura lock. Nel caso in cui nessun processo detiene un lock su file restituisce F_UNLOCK nel campo l_type di lock +> Verifica se sul file file perché gia' presente un lock descritto dalla struttura lock. In caso affermativo il lock viene rimosso ed il lock richiesto dal processo in esecuzione viene piazzato + +133. Un processo puo' allocare memoria solo nell'heap? +> Sì, mediante la funziona di libreria malloc(3) e calloc(3) +> Sì, mediante le funzioni di libreria malloc(3), calloc(3) e alloca(3) +v No. Può allocare anche memoria nello stack mediante la funzione di libreria alloca(3) + +134. Supponiamo di aver utilizzato, nella nostra funzione C, la funzione di libreria alloca(3) per allocare un'area di memoria. +È necessario liberare tale area di memoria mediante una free(3) prima della terminazione della funzione? +v No. l'area di memoria allocata nello stack viene liberata automaticamente +> Sì, ma mediante la chiamata di funzione dealloca(3) e non mediante la free(3) +> Sì, bisogna sempre liberare la memoria per evitare dei memory leak + +135. Si consideri la variabile globale errno. +Se una system call termina con successo, e immediatamente dopo la sua terminazione ispezioniamo il contenuto di errno, cosa otteniamo? +> Il valore zero essendo la system call terminata con successo +> Il codice di terminazione (con successo) in quanto non c'è una effettiva differenza tra codice di errore o di terminazione con successo +v Il codice di errore generato dall'ultima system call o funzione di libreria la cui esecuzione è terminata con errore + +136. Si consideri la system call + +int open(const char *pathname, int flags); + +nel caso venga invocata con il flag impostato a + +O_CREAT | O_EXCL | O_WRONLY + +Quale è il comportamento atteso? +v Se il file non esiste viene creato ed aperto in scrittura, se invece esiste ritorna errore +> Se il file non esiste viene creato con i permessi di esecuzione (x) ed aperto in scrittura. Se esiste vengono aggiunti i permessi di esecuzione se già non settati ed il file è aperto in scrittura +> Se il file non esiste lo crea e lo apre in scrittura, altrimenti lo apre in lettura + +137. Assumete di voler visualizzare il numero di inode di un file, quale dei seguenti comandi non produce l'output desiderato? +v stat -f nomefile +> ls -l -i nomefile +> stat nomefile + +138. Supponiamo di avere un file nomefile memorizzato nel nostro filesystem. +Quale perché il risultato del comando touch nomefile? +v Aggiorna, al tempo corrente, gli atttributi atime e mtime di nomefile +> Crea un file vuoto con nome nomefile in sostituzione dell'esistente +> Crea un file vuoto con nome nomefile in sostituzione dell'esistente e valore del ctime aggiornato al tempo corrente + +139. Si consideri un file contenente un programma in linguaggio C. Si assuma che è stata inserita la direttiva #include "stdio.h" . perché la compilazione potrebbe generare errori? +v Perché la direttiva dice di cercare il file stdio.h nella directory corrente, mentre tale header file è solitamente memorizzato in un altra directory del filesystem +> perché il file stdio.h potrebbe non esistere nella directory /usr/include, dove la direttiva dice di cercarlo +> L'inserimento della direttiva non genererà mai errori + +140. Dopo aver esegguito il comando +cpp helloworld.c > hw + +cosa conterrà il file hw? +> Un file identico a helloworld.c +> L'input per il debugger relativo al file helloworld.c +v Il precompilato di helloworld.c + +141. Quale perché il modo corretto per controllare che due stringhe str1 e str2 sono uguali? +> if (s1==s2) { printf("stringhe uguali") } +v if strcmp(s1,s2) == 0 { printf("stringhe uguali") } +> if strcmp(s1,s2) { printf("stringhe uguali") } + +142. Si consideri il seguente frammento di codice +
+int i, n1=10, n2=100;	
+for (i=0;((i
+quando termina il ciclo for?
+v Quando il valore di i è uguale a n1
+> Quando il valore di i è uguale a n2
+> Non termina perché n1 è diverso da n2
+
+143. Supponiamo di eseguire  separatamente i seguenti frammenti di codice
+Frammento_1
+
close(2);
+if (fopen(".","r")) {
+           perror("main");
+}
+Frammento_2 +
close(2);
+if (fopen(".","r")) {
+               printf("main: %s \n", strerror(errno));
+}
+Quale delle seguenti affermazioni è vera? +v Il frammento_1 non produce alcun output sul terminale +> La loro esecuzione produce sul terminale due stringhe identiche +> La loro esecuzione produce sul terminale due stringhe diverse + +51. Si consideri il seguente frammento di codice (i numeri a lato sono i numeri di riga delle istruzioni)(uscita 2 volte) +
1.    Pthread_t tid;
+2.    pthread_create(&tid, ... )
+3.    pthread_create(&tid, ...)
+4.    pthread_join(tid, ...);
+5.    printf("joined");
+quale delle seguenti affermazioni è vera? +v la stringa "joined" è inviata su stdout solo quando il thread creato a riga 3 è terminato +> la stringa "joined" è inviata su stdout quando entrambi i thread sono terminati +> la stringa "joined" è inviata su stdout quando uno dei due thread (non importa quale) è terminato \ No newline at end of file diff --git a/Ingegneria del Software/1/correct.txt b/Ingegneria del Software/1/correct.txt new file mode 100644 index 0000000..0179ee7 --- /dev/null +++ b/Ingegneria del Software/1/correct.txt @@ -0,0 +1,19 @@ +
+class Monitor
+
+InputReal x;  // plant output
+OutputBoolean y;
+
+Boolean z;
+
+initial equation
+
+y = false;
+equation
+z = (time > 0) and ((x > 5) or (x < 0));
+algorithm
+when edge(z) then
+y := true;
+end when;
+end Monitor;
+
\ No newline at end of file diff --git a/Ingegneria del Software/1/quest.txt b/Ingegneria del Software/1/quest.txt new file mode 100644 index 0000000..1d28ae0 --- /dev/null +++ b/Ingegneria del Software/1/quest.txt @@ -0,0 +1,3 @@ +Si consideri il seguente requisito: +RQ: Durante l'esecuzione del programma (cioè per tutti gli istanti di tempo positivi) la variabile x è sempre nell'intervallo [0, 5]. +Quale dei seguenti monitor meglio descrive il requisito RQ? \ No newline at end of file diff --git a/Ingegneria del Software/1/wrong 2.txt b/Ingegneria del Software/1/wrong 2.txt new file mode 100644 index 0000000..f31bec2 --- /dev/null +++ b/Ingegneria del Software/1/wrong 2.txt @@ -0,0 +1,19 @@ +
+class Monitor
+
+InputReal x;  // plant output
+OutputBoolean y;
+
+Boolean z;
+
+initial equation
+
+y = false;
+equation
+z =  (time > 0) and ((x > 0) or (x < 5));
+algorithm
+when edge(z) then
+y := true;
+end when;
+end Monitor;
+
\ No newline at end of file diff --git a/Ingegneria del Software/1/wrong.txt b/Ingegneria del Software/1/wrong.txt new file mode 100644 index 0000000..b80f909 --- /dev/null +++ b/Ingegneria del Software/1/wrong.txt @@ -0,0 +1,19 @@ +
+class Monitor
+
+InputReal x;  // plant output
+OutputBoolean y;
+
+Boolean z;
+
+initial equation
+
+y = false;
+equation
+z = (time > 0) and (x > 0) and (x < 5);
+algorithm
+when edge(z) then
+y := true;
+end when;
+end Monitor;
+
\ No newline at end of file diff --git a/Ingegneria del Software/10/correct.txt b/Ingegneria del Software/10/correct.txt new file mode 100644 index 0000000..00cf334 --- /dev/null +++ b/Ingegneria del Software/10/correct.txt @@ -0,0 +1 @@ +La risposta corretta è: La variabile x è nell'intervallo [1, 4] oppure nell'intervallo [15, 20] \ No newline at end of file diff --git a/Ingegneria del Software/10/quest.txt b/Ingegneria del Software/10/quest.txt new file mode 100644 index 0000000..6befac6 --- /dev/null +++ b/Ingegneria del Software/10/quest.txt @@ -0,0 +1,26 @@ +Si consideri il monitor seguente che ritorna true appena il sistema viola il requisito monitorato: +
+block Monitor
+
+input Real x;  
+output Boolean y;
+Boolean w;
+
+initial equation
+
+y = false;
+
+equation
+
+w = ((x < 1) or (x > 4)) and ((x < 15) or (x > 20));
+
+algorithm
+
+when edge(w) then
+y := true;
+end when;
+
+end Monitor;
+
+ +Quale delle seguenti affermazioni meglio descrive il requisito monitorato? \ No newline at end of file diff --git a/Ingegneria del Software/10/wrong 2.txt b/Ingegneria del Software/10/wrong 2.txt new file mode 100644 index 0000000..fe0ce72 --- /dev/null +++ b/Ingegneria del Software/10/wrong 2.txt @@ -0,0 +1 @@ +La variabile x è fuori dall'intervallo [1, 4] e fuori dall'intervallo [15, 20] \ No newline at end of file diff --git a/Ingegneria del Software/10/wrong.txt b/Ingegneria del Software/10/wrong.txt new file mode 100644 index 0000000..5303e44 --- /dev/null +++ b/Ingegneria del Software/10/wrong.txt @@ -0,0 +1 @@ +La variabile x è nell'intervallo [1, 4] e fuori dall'intervallo [15, 20] \ No newline at end of file diff --git a/Ingegneria del Software/2/correct.txt b/Ingegneria del Software/2/correct.txt new file mode 100644 index 0000000..23cbd0e --- /dev/null +++ b/Ingegneria del Software/2/correct.txt @@ -0,0 +1 @@ +6*A \ No newline at end of file diff --git a/Ingegneria del Software/2/quest.txt b/Ingegneria del Software/2/quest.txt new file mode 100644 index 0000000..78e700c --- /dev/null +++ b/Ingegneria del Software/2/quest.txt @@ -0,0 +1,2 @@ +Si consideri un software sviluppato seguendo un approccio plan-driven implementato con tre fasi: F1, F2, F3 ciascuna con costo A. Le "change request" possono arrivare solo al fine di una fase e provocano la ripetizione (con relativo costo) di tutte le fasi che precedono. Si assuma che dopo la fase F3 (cioè al termine dello sviluppo) arriva una change request. Qual è il costo totale per lo sviluppo del software in questione. +Scegli un'alternativa: \ No newline at end of file diff --git a/Ingegneria del Software/2/wrong 2.txt b/Ingegneria del Software/2/wrong 2.txt new file mode 100644 index 0000000..489e74c --- /dev/null +++ b/Ingegneria del Software/2/wrong 2.txt @@ -0,0 +1 @@ +5*A \ No newline at end of file diff --git a/Ingegneria del Software/2/wrong.txt b/Ingegneria del Software/2/wrong.txt new file mode 100644 index 0000000..63ca2eb --- /dev/null +++ b/Ingegneria del Software/2/wrong.txt @@ -0,0 +1 @@ +4*A \ No newline at end of file diff --git a/Ingegneria del Software/3/correct.txt b/Ingegneria del Software/3/correct.txt new file mode 100644 index 0000000..0dcbeca --- /dev/null +++ b/Ingegneria del Software/3/correct.txt @@ -0,0 +1 @@ +Per ciascun incremento di funzionalità, scrivi test automatizzati, implementa la funzionalità, esegui i test e rivedi l'implementazione come necessario. \ No newline at end of file diff --git a/Ingegneria del Software/3/quest.txt b/Ingegneria del Software/3/quest.txt new file mode 100644 index 0000000..da15497 --- /dev/null +++ b/Ingegneria del Software/3/quest.txt @@ -0,0 +1 @@ +Si consideri il Test-Driven Development (TDD). Quale delle seguenti affermazioni è vera? diff --git a/Ingegneria del Software/3/wrong 2.txt b/Ingegneria del Software/3/wrong 2.txt new file mode 100644 index 0000000..cf5eab4 --- /dev/null +++ b/Ingegneria del Software/3/wrong 2.txt @@ -0,0 +1 @@ +Per ciascun incremento di funzionalità, implementa la funzionalità, scrivi test automatizzati, esegui i test e rivedi l'implementazione come necessario. \ No newline at end of file diff --git a/Ingegneria del Software/3/wrong.txt b/Ingegneria del Software/3/wrong.txt new file mode 100644 index 0000000..2891ab7 --- /dev/null +++ b/Ingegneria del Software/3/wrong.txt @@ -0,0 +1 @@ +Scrivi test automatizzati per tutti i requisiti di sistema, esegui i test e rivedi l'implementazione come necessario. \ No newline at end of file diff --git a/Ingegneria del Software/4/correct.txt b/Ingegneria del Software/4/correct.txt new file mode 100644 index 0000000..6e771e9 --- /dev/null +++ b/Ingegneria del Software/4/correct.txt @@ -0,0 +1 @@ +A*(1 + p) \ No newline at end of file diff --git a/Ingegneria del Software/4/quest.txt b/Ingegneria del Software/4/quest.txt new file mode 100644 index 0000000..07df0c7 --- /dev/null +++ b/Ingegneria del Software/4/quest.txt @@ -0,0 +1 @@ +Si consideri un software costituito da due fasi F1 ed F2 ciascuna di costo A. Con probabilità p la fase F1 deve essere ripetuta (a causa di change requests) e con probabilità (1 - p) si passa alla fase F2 e poi al completamento (End) dello sviluppo. Qual'è il costo atteso per lo sviluppo del software seguendo il processo sopra descritto? \ No newline at end of file diff --git a/Ingegneria del Software/4/wrong 2.txt b/Ingegneria del Software/4/wrong 2.txt new file mode 100644 index 0000000..a9b1c29 --- /dev/null +++ b/Ingegneria del Software/4/wrong 2.txt @@ -0,0 +1 @@ +3*A*p \ No newline at end of file diff --git a/Ingegneria del Software/4/wrong.txt b/Ingegneria del Software/4/wrong.txt new file mode 100644 index 0000000..c24cae9 --- /dev/null +++ b/Ingegneria del Software/4/wrong.txt @@ -0,0 +1 @@ +A*(2 + p) \ No newline at end of file diff --git a/Ingegneria del Software/5/correct.txt b/Ingegneria del Software/5/correct.txt new file mode 100644 index 0000000..58964fc --- /dev/null +++ b/Ingegneria del Software/5/correct.txt @@ -0,0 +1 @@ +Se ci sono abbastanza monete è sempre possibile ottenere la bevanda selezionata \ No newline at end of file diff --git a/Ingegneria del Software/5/quest.txt b/Ingegneria del Software/5/quest.txt new file mode 100644 index 0000000..4ce9b89 --- /dev/null +++ b/Ingegneria del Software/5/quest.txt @@ -0,0 +1,2 @@ +img=https://i.imgur.com/2gg5nIM.png +Lo State Diagram in figura descrive (in modo semplificato) una macchina distributrice di bevande. Quale delle seguenti frasi è corretta riguardo allo State Diagram in figura? \ No newline at end of file diff --git a/Ingegneria del Software/5/wrong 2.txt b/Ingegneria del Software/5/wrong 2.txt new file mode 100644 index 0000000..a75a40c --- /dev/null +++ b/Ingegneria del Software/5/wrong 2.txt @@ -0,0 +1 @@ +Una volta inserite le monete bisogna necessariamente consumare almeno una bevanda \ No newline at end of file diff --git a/Ingegneria del Software/5/wrong.txt b/Ingegneria del Software/5/wrong.txt new file mode 100644 index 0000000..e47f380 --- /dev/null +++ b/Ingegneria del Software/5/wrong.txt @@ -0,0 +1 @@ +Anche se ci sono abbastanza monete potrebbe non essere possibile ottenere la bevanda selezionata \ No newline at end of file diff --git a/Ingegneria del Software/6/correct.txt b/Ingegneria del Software/6/correct.txt new file mode 100644 index 0000000..169e16e --- /dev/null +++ b/Ingegneria del Software/6/correct.txt @@ -0,0 +1 @@ +A*(2 + p + q) \ No newline at end of file diff --git a/Ingegneria del Software/6/quest.txt b/Ingegneria del Software/6/quest.txt new file mode 100644 index 0000000..52ea2b9 --- /dev/null +++ b/Ingegneria del Software/6/quest.txt @@ -0,0 +1 @@ +Si consideri un software sviluppato seguendo un approccio iterativo implementato con due fasi: F1 seguita da F2. Ciascuna fase ha costo A. Con probabilità p potrebbe essere necessario ripetere F1 una seconda volta. Con probabilità q potrebbe essere necessario ripetere F2 una seconda volta. Qual'e' il costo atteso dello sviluppo dell'intero software? \ No newline at end of file diff --git a/Ingegneria del Software/6/wrong 2.txt b/Ingegneria del Software/6/wrong 2.txt new file mode 100644 index 0000000..329e161 --- /dev/null +++ b/Ingegneria del Software/6/wrong 2.txt @@ -0,0 +1 @@ +A*(1 + p + q) \ No newline at end of file diff --git a/Ingegneria del Software/6/wrong.txt b/Ingegneria del Software/6/wrong.txt new file mode 100644 index 0000000..e8420ee --- /dev/null +++ b/Ingegneria del Software/6/wrong.txt @@ -0,0 +1 @@ +A*(3 + p + q) \ No newline at end of file diff --git a/Ingegneria del Software/69420/correct.txt b/Ingegneria del Software/69420/correct.txt new file mode 100644 index 0000000..431a7c5 --- /dev/null +++ b/Ingegneria del Software/69420/correct.txt @@ -0,0 +1,2 @@ +img=https://i.imgur.com/a8kMXoW.png +Serafina che tagga Sabrina \ No newline at end of file diff --git a/Ingegneria del Software/69420/quest.txt b/Ingegneria del Software/69420/quest.txt new file mode 100644 index 0000000..8fa4d25 --- /dev/null +++ b/Ingegneria del Software/69420/quest.txt @@ -0,0 +1 @@ +Chi insegna questo corso? \ No newline at end of file diff --git a/Ingegneria del Software/69420/wrong 2.txt b/Ingegneria del Software/69420/wrong 2.txt new file mode 100644 index 0000000..670e7eb --- /dev/null +++ b/Ingegneria del Software/69420/wrong 2.txt @@ -0,0 +1,2 @@ +img=https://i.imgur.com/F4evurl.jpg +Gioele che tagga Sabrina \ No newline at end of file diff --git a/Ingegneria del Software/69420/wrong 3.txt b/Ingegneria del Software/69420/wrong 3.txt new file mode 100644 index 0000000..673514a --- /dev/null +++ b/Ingegneria del Software/69420/wrong 3.txt @@ -0,0 +1,2 @@ +img=https://i.imgur.com/qyKmPIA.png +Deco che disegna un Hentai in aula studio \ No newline at end of file diff --git a/Ingegneria del Software/69420/wrong.txt b/Ingegneria del Software/69420/wrong.txt new file mode 100644 index 0000000..6e6963e --- /dev/null +++ b/Ingegneria del Software/69420/wrong.txt @@ -0,0 +1,2 @@ +img=https://corsidilaurea.uniroma1.it/sites/default/files/styles/user_picture/public/pictures/picture-23550-1602857792.jpg +Tronci \ No newline at end of file diff --git a/Ingegneria del Software/7/correct.txt b/Ingegneria del Software/7/correct.txt new file mode 100644 index 0000000..deba1f5 --- /dev/null +++ b/Ingegneria del Software/7/correct.txt @@ -0,0 +1,17 @@ +
+class Monitor
+InputReal x, y; 
+OutputBoolean wy;
+Boolean wz;
+
+initial equation
+
+wy = false;
+equation
+wz = (time > 60) and (delay(x, 10) > 0) and (y >= 0);
+algorithm
+when edge(wz) then
+wy := true;
+end when;
+end Monitor;
+
\ No newline at end of file diff --git a/Ingegneria del Software/7/quest.txt b/Ingegneria del Software/7/quest.txt new file mode 100644 index 0000000..b99e2e2 --- /dev/null +++ b/Ingegneria del Software/7/quest.txt @@ -0,0 +1,9 @@ +Si consideri il seguente requisito: + +RQ: Dopo 60 unità di tempo dall'inizio dell'esecuzione vale la seguente proprietà: + +se 10 unità di tempo nel passato x era maggiore di 0 allora ora y è negativa. + +Tenendo presente che, al tempo time, delay(z, w) ritorna 0 se time <= w e ritorna il valore che z aveva al tempo (time - w), se time = w. + +Quale dei seguenti monitor meglio descrive il requisito RQ? \ No newline at end of file diff --git a/Ingegneria del Software/7/wrong 2.txt b/Ingegneria del Software/7/wrong 2.txt new file mode 100644 index 0000000..f2a9214 --- /dev/null +++ b/Ingegneria del Software/7/wrong 2.txt @@ -0,0 +1,20 @@ +
+class Monitor
+InputReal x, y; 
+OutputBoolean wy;
+Boolean wz;
+
+initial equation
+
+wy = false;
+equation
+
+wz = (time > 60) or (delay(x, 10) > 0) or  (y >= 0);
+
+
+algorithm
+when edge(wz) then
+wy := true;
+end when;
+end Monitor;
+
\ No newline at end of file diff --git a/Ingegneria del Software/7/wrong.txt b/Ingegneria del Software/7/wrong.txt new file mode 100644 index 0000000..6a0d3e9 --- /dev/null +++ b/Ingegneria del Software/7/wrong.txt @@ -0,0 +1,19 @@ +
+class Monitor
+InputReal x, y; 
+OutputBoolean wy;
+Boolean wz;
+
+initial equation
+
+wy = false;
+equation
+
+wz = (time > 60) and (delay(x, 10) <= 0) and (y >= 0);
+
+algorithm
+when edge(wz) then
+wy := true;
+end when;
+end Monitor;
+
\ No newline at end of file diff --git a/Ingegneria del Software/8/correct.txt b/Ingegneria del Software/8/correct.txt new file mode 100644 index 0000000..b3843cf --- /dev/null +++ b/Ingegneria del Software/8/correct.txt @@ -0,0 +1 @@ +1.5*A \ No newline at end of file diff --git a/Ingegneria del Software/8/quest.txt b/Ingegneria del Software/8/quest.txt new file mode 100644 index 0000000..e4ebc4a --- /dev/null +++ b/Ingegneria del Software/8/quest.txt @@ -0,0 +1 @@ +Si consideri un software sviluppato seguendo un approccio plan-driven implementato con due fasi: F1, F2. La fase F1 ha costo A e la fase F2 ha costo il 50% di A. Qual'e' il costo dello sviluppo del software? \ No newline at end of file diff --git a/Ingegneria del Software/8/wrong 2.txt b/Ingegneria del Software/8/wrong 2.txt new file mode 100644 index 0000000..8c7e5a6 --- /dev/null +++ b/Ingegneria del Software/8/wrong 2.txt @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Ingegneria del Software/8/wrong.txt b/Ingegneria del Software/8/wrong.txt new file mode 100644 index 0000000..54d2e91 --- /dev/null +++ b/Ingegneria del Software/8/wrong.txt @@ -0,0 +1 @@ +0.5*A \ No newline at end of file diff --git a/Ingegneria del Software/9/correct.txt b/Ingegneria del Software/9/correct.txt new file mode 100644 index 0000000..e86ff88 --- /dev/null +++ b/Ingegneria del Software/9/correct.txt @@ -0,0 +1 @@ +1/1000 \ No newline at end of file diff --git a/Ingegneria del Software/9/quest.txt b/Ingegneria del Software/9/quest.txt new file mode 100644 index 0000000..7cae29d --- /dev/null +++ b/Ingegneria del Software/9/quest.txt @@ -0,0 +1 @@ +Il rischio R può essere calcolato come R = P*C, dove P è la probabilità dell'evento avverso (software failure nel nostro contesto) e C è il costo dell'occorrenza dell'evento avverso. Si consideri un software il cui costo per la failure è C = 1000000 EUR. Volendo un rischio non superiore a 1000 EUR quale è il valore massimo della probabilità di failure P accettabile? \ No newline at end of file diff --git a/Ingegneria del Software/9/wrong 2.txt b/Ingegneria del Software/9/wrong 2.txt new file mode 100644 index 0000000..78abc32 --- /dev/null +++ b/Ingegneria del Software/9/wrong 2.txt @@ -0,0 +1 @@ +1/100 \ No newline at end of file diff --git a/Ingegneria del Software/9/wrong.txt b/Ingegneria del Software/9/wrong.txt new file mode 100644 index 0000000..bb7060e --- /dev/null +++ b/Ingegneria del Software/9/wrong.txt @@ -0,0 +1 @@ +1/10 \ No newline at end of file diff --git a/motd.txt b/motd.txt new file mode 100644 index 0000000..ce356bd --- /dev/null +++ b/motd.txt @@ -0,0 +1,31 @@ +"Benvenuto 👑 +Con questo bot puoi esercitarti con le domande degli esami di Sistemi Operativi 🤞. + +✅ Al momento tutte le domande presenti sono state verificate con l'aiuto di più studenti +(un enorme grazie a @simone_s0, @loryspat, @Deco71, @raffox24 e sicuramente ne scordo qualcuno, perdonatemi 😢) + +🅱️ Purtroppo al momento nessuno dei due moduli contiene le nuove domande aggiunte agli esami del 2022 in quanto non le ho. Se doveste riuscire a recuperarle inviatemele 🙏! + +Non tutte le risposte sono state verificate da correzioni ufficiali degli esami. Ad alcune domande abbiamo dato la risposta che A NOI 🙋‍♂️🙋‍♂️ sembrava corretta. + +Non vorrei sentirmi in colpa per avervi fatto memorizzare risposte errate, per cui vi chiedo di segnalarmi tempestivamente eventuali errori. + +🆘 Per segnalare errori, per proporre nuove domande 🙏, o semplicemente se questo bot ti fa schifo 😢, non esitare a contattarmi: @notherealmarco + +🐢 Se il bot va offline sei invitato ad insultare la TIM insieme a me (o forse sono io che non voglio ammettere di aver fatto danni 🤷‍♂️) + +🧐 Per i più curiosi: il bot è scritto in C# (.NET 6.0) e gira su un server che ho dentro casa, in un container Docker 🐳. Come OS uso Unraid. + +⭕️ Informativa sulla privacy (conforme alle normative GDPR in vigore): +Il bot raccoglie i seguenti dati sull'utilizzo: +- ID utente Telegram: necessario per garantire la ricezione degli avvisi, questo dato viene memorizzato in modo permanente. + +Dati sulle risposte date NON vengono in alcun modo memorizzati in modo permanente e persistono in memoria RAM solo durante l'esecuzione di un quiz. Nessun essere umano può accedervi, servono solo al bot per mostrarvi le stat tra una domanda e l'altra. + +⭐️ Stanno arrivando i quiz di Ingegneria del Software (e forse anche OGA)! + +👷‍♀️Per avviare un modulo puoi utilizzare i seguenti comandi: +/8linux (Modulo I) +/so2 (Modulo II) + +Per cambiare modulo puoi usare il comando /leave \ No newline at end of file