From 4ecf0d287a6ab76714a95dcc7f7aa5b162cad000 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 3 Jan 2002 00:40:57 +0000 Subject: [PATCH] A meta` del casino ... --- system.tex | 191 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 113 insertions(+), 78 deletions(-) diff --git a/system.tex b/system.tex index 145b1a0..8ec0f3b 100644 --- a/system.tex +++ b/system.tex @@ -8,32 +8,36 @@ stesso, quelle per il controllo dell'uso delle risorse da parte dei processi, quelle per la gestione dei tempi e degli errori. -\section{La configurazione del sistema} -\label{sec:sys_config} - -In questa sezione esamineremo le macro e le funzioni che permettono di -conoscere e settare i parametri di configurazione del sistema, di ricavarme -limiti e caratteristiche, e di controllare i filesystem disponibili, montarli -e rimuoverli da programma. +\section{La lettura delle caratteristiche del sistema} +\label{sec:sys_characteristics} + +In questa sezione tratteremo le varie modalità con cui un programma può +ottenere informazioni riguardo alle capacità del sistema. Ogni sistema infatti +è contraddistinto da un gran numero di limiti e costanti che lo caratterizzano +(i valori massimi e minimi delle variabili, o la lunghezza dei nomi dei file, +per esempio), e che possono dipendere da fattori molteplici, come +l'architettura hardware, l'implementazione del kernel e delle librerie, le +opzioni di configurazione. + +La definizione di queste caratteristiche ed il tentativo di provvedere dei +meccanismi generali che i programmi potessero usare per ricavarle è uno degli +aspetti più complessi e controversi coi cui i vari standard si sono dovuti +confrontare, spesso con risultati spesso tutt'altro che chiari. Proveremo +comunque a dare una descrizione dei principali metodi previsti dai vari +standard per ricavare sia le caratteristiche specifiche del sistema, che +quelle dei file. \subsection{Limiti e parametri di sistema} \label{sec:sys_limits} -In qualunque sistema sono presenti un gran numero di parametri e costanti il -cui valore può essere definito dall'architettura dell'hardware, -dall'implementazione del sistema, dalle opzioni con cui si sono compilati il -kernel e le librerie o anche configurabili dall'amministratore all'avvio del -sistema o durente le sue attività. - -Chiaramente per scrivere programmi portabili occorre poter determinare opzioni -disponibili e caratteristiche del sistema (come i valori massimi e minimi dei -vari tipi di variabili, o la presenza del supporto del supporto per -l'operazione che interessa). Inoltre alcuni di questi limiti devono poter -essere determinabili anche in corso di esecuzione del programma, per non dover -ricompilare tutti i programmi quando si usa una nuova versione del kernel o si -cambia una delle configurazioni del sistema. Per tutto questo sono necessari -due tipi di funzionalità: +Quando si devono determinare le le caratteristiche generali del sistema ci si +trova di fronte a diverse possibilità; alcune di queste infatti possono +dipendere dall'architettura dell'hardware, o dal sistema operativo, altre +invece possono dipendere dalle opzioni con cui si è costruito il sistema (ad +esempio da come si è compilato il kernel), o dalla configurazione del +medesimo; per questo motivo in generale sono necessari due tipi diversi di +funzionalità: \begin{itemize*} \item la possibilità di determinare limiti ed opzioni al momento della compilazione. @@ -43,20 +47,23 @@ due tipi di funzionalit La prima funzionalità si può ottenere includendo gli opportuni header file, mentre per la seconda sono ovviamante necessarie delle funzioni; la situazione è complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti -sono fissi in una implementazione mentre possono variare in un altra. -Quando i limiti sono fissi vengono definiti come macro nel file -\file{limits.h}, se invece possono variare, il loro valore sarà ottenibile -tramite la funzione \func{sysconf}. - -Lo standard ANSI C definisce dei limiti che sono tutti fissi e pertanto -disponibili al momanto della compilazione; un elenco è riportato in -\tabref{tab:sys_ansic_macro}, come ripreso da \file{limits.h}; come si vede -per la maggior parte attengono alle dimensioni dei tipi dei dati interi, le -informazioni analoghe per i dati in virgola mobile sono definite a parte e -accessibili includendo \file{float.h}. Un'altra costante prevista dallo -standard (l'unica che può non essere fissa e che pertanto non è definita in -\file{limits.h}) è \macro{FOPEN\_MAX}, essa deve essere definita in -\file{stdio.h} ed avere un valore minimo di 8. +sono fissi in una implementazione mentre possono variare in un altra. Tutto +questo crea una ambiguità che non è sempre possibile risolvere in maniera +chiara; in generale quello che succede è che quando i limiti del sistema sono +fissi essi vengono definiti come macro nel file \file{limits.h}, se invece +possono variare, il loro valore sarà ottenibile tramite la funzione +\func{sysconf}. + +Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo +saranno sempre disponibili al momento della compilazione; un elenco, ripreso +da \file{limits.h}, è riportato in \tabref{tab:sys_ansic_macro}; come si vede +per la maggior parte di questi limiti attengono alle dimensioni dei dati +interi che sono in genere fissati dall'architettura hardware (le analoghe +informazioni per i dati in virgola mobile sono definite a parte, ed +accessibili includendo \file{float.h}). Lo standard prevede anche un'altra +costante, \macro{FOPEN\_MAX}, che può non essere fissa e che pertanto non è +definita in \file{limits.h}, essa deve essere definita in \file{stdio.h} ed +avere un valore minimo di 8. \begin{table}[htb] \centering @@ -119,12 +126,19 @@ A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo \label{tab:sys_isoc90_macro} \end{table} -Lo standard POSIX.1 definisce 33 diversi limiti o costanti, 15 delle quali, -riportate in \secref{tab:sys_posix1_base}, devono essere sempre dichiarate, -in quanto definiscono dei valori minimi che qualunque implementazione che sia -conforme allo standard deve avere; molti di questi valori sono di scarsa -utilità, essendo troppo ristretti ed ampiamente superati in tutte le -implementazioni dello standard. +Ovviamente le dimensioni dei dati sono solo una piccola parte delle +caratteristiche del sistema; mancano completamente tutte quelle che dipendono +dalla implementazione dello stesso; questo per i sistemi unix-like è stato +definito in gran parte dallo standard POSIX.1 (che tratta anche i limiti delle +caratteristiche dei file che vedremo in \secref{sec:sys_file_limits}). + + + + +Lo standard POSIX.1 definisce 33 diversi limiti o costanti, 13 delle quali +devono essere sempre dichiarate, in quanto definiscono dei valori minimi che +qualunque implementazione che sia conforme allo standard deve avere. I loro +valori sono stati riportati in \secref{tab:sys_posix1_base}. \begin{table}[htb] \centering @@ -139,25 +153,27 @@ implementazioni dello standard. \func{exec}.\\ \macro{\_POSIX\_CHILD\_MAX} &6 & numero massimo di processi contemporanei che un utente può eseguire.\\ - \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\ - \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input - canonica del terminale\\ - \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input - del terminale\\ - \macro{\_POSIX\_NGROUPS\_MAX}&0 & numero di gruppi supplementari per - processo.\\ \macro{\_POSIX\_OPEN\_MAX} &16 & numero massimo di file che un processo può mantenere aperti in contemporanea.\\ - \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\ - \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\ - \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una - pipe\\ - \macro{\_POSIX\_SSIZE\_MAX}&32767& valore massimo del tipo - \type{ssize\_t}.\\ \macro{\_POSIX\_STREAM\_MAX}&8 & massimo numero di stream aperti per processo in contemporanea.\\ \macro{\_POSIX\_TZNAME\_MAX}& & dimensione massima del nome di una \texttt{timezone} (vedi ).\\ + \macro{\_POSIX\_NGROUPS\_MAX}&0 & numero di gruppi supplementari per + processo (vedi + \secref{sec:proc_access_id}).\\ + \macro{\_POSIX\_SSIZE\_MAX}&32767& valore massimo del tipo + \type{ssize\_t}.\\ + \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\ + \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\ + \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una + pipe\\ + \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\ + \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input + canonica del terminale\\ + \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input + del terminale\\ + \hline \hline \end{tabular} \caption{Costanti fisse, definite in \file{limits.h}, richieste @@ -165,7 +181,17 @@ implementazioni dello standard. \label{tab:sys_posix1_base} \end{table} -Oltre a questi valori lo standard ne definisce altri a riguardo +In genere questi valori sono di scarsa utilità, la loro unica utilità è quella +di indicare un limite superiore che assicura la portabilità senza necessità di +ulteriori controlli. Tuttavia molti di essi sono troppo ristretti, ed +ampiamente superati in tutti i sistemi POSIX in uso oggigiorno. + + +Per questo lo standard prevede anche che ogni implementazione definisca delle +macro coi valori effettivi dei limiti generali del sistema, riportate in +\ntab. + + \begin{table}[htb] @@ -174,21 +200,14 @@ Oltre a questi valori lo standard ne definisce altri a riguardo \begin{tabular}[c]{|l|r|p{8cm}|} \hline \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\ - \hline - \hline \macro{\_POSIX\_AIO\_LISTIO\_MAX}& 2& \\ \macro{\_POSIX\_AIO\_MAX}& 1& \\ \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\ \macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\ \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\ \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\ - \macro{\_POSIX\_NAME\_MAX}& 14& \\ - \macro{\_POSIX\_PATH\_MAX}& 256& \\ - \macro{\_POSIX\_PIPE\_BUF}& 512& \\ - \macro{\_POSIX\_SSIZE\_MAX}& 32767& \\ - \macro{\_POSIX\_STREAM\_MAX}&8 & \\ - \macro{\_POSIX\_TZNAME\_MAX}& 6& \\ - \hline + \hline + \hline \end{tabular} \caption{Macro definite in \file{limits.h} in conformità allo standard POSIX.1.} @@ -221,8 +240,10 @@ il valore attraverso la funzione \func{sysconf}, il cui prototipo \end{prototype} La funzione prende come argomento un intero che specifica quale dei limiti si -vuole conoscere; uno specchietto contentente tutti quelli disponibili in -Linux, e la corrispondente macro di \func{limits.h}, è riportato in \ntab. +vuole conoscere; uno specchietto contentente i principali valori disponibili +in Linux (l'elenco completo è contenuto in \file{bits/confname}, una lista più +esaustiva si può trovare nel manuale delle \acr{glibc}), e la corrispondente +macro di sistema, è riportato in \ntab. \begin{table}[htb] \centering @@ -238,18 +259,23 @@ Linux, e la corrispondente macro di \func{limits.h}, \texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}& Il numero massimo di processi contemporanei che un utente può eseguire.\\ - \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} & - Il numero di \textit{clock tick} al secondo, cioè la frequenza delle - interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\ + \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}& + Il numero massimo di file che un processo può mantenere aperti in + contemporanea.\\ \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}& Il massimo numero di stream che un processo può mantenere aperti in contemporanea. Questo liminte previsto anche dallo standard ANSI C, che specifica la macro {FOPEN\_MAX}.\\ \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}& La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\ - \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}& - Il numero massimo di file che un processo può mantenere aperti in - contemporanea.\\ + \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}& + Massimo numero di gruppi supplementari che può avere un processo (vedi + \secref{sec:proc_access_id}).\\ + \texttt{\_SC\_SSIZE\_MAX}&\macro{SSIZE\_MAX}& + valore massimo del tipo di dato \type{ssize\_t}.\\ + \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} & + Il numero di \textit{clock tick} al secondo, cioè la frequenza delle + interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\ \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}& Indica se è supportato il \textit{job conotrol} (vedi \secref{sec:sess_xxx}) in stile POSIX.\\ @@ -268,10 +294,22 @@ Linux, e la corrispondente macro di \func{limits.h}, -\subsection{Opzioni e configurazione del sistema} -\label{sec:sys_sys_config} +\subsection{I limiti dei file} +\label{sec:sys_file_limits} + +La funzione \func{statfs} ... +La funzione \func{pathconf} ... + + + + +\section{Opzioni e configurazione del sistema} +\label{sec:sys_config} + +\subsection{La funzione \func{sysctl}} +\label{sec:sys_sysctl} + -La funzione \func{sysctl} ... @@ -280,9 +318,6 @@ La funzione \func{sysctl} ... La funzione \func{statfs} ... -La funzione \func{pathconf} ... - - \section{Limitazione ed uso delle risorse} -- 2.30.2