d5634775cd3a51a75702e54ffd845946960a20df
[gapil.git] / thread.tex
1 %% thread.tex
2 %%
3 %% Copyright (C) 2007-2018 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11
12 \chapter{I thread}
13 \label{cha:threads}
14
15
16 \itindbeg{thread} 
17
18 Tratteremo in questo capitolo un modello di programmazione multitasking,
19 quello dei \textit{thread}, alternativo al modello classico dei processi,
20 tipico di Unix. Ne esamineremo le caratteristiche, vantaggi e svantaggi, e le
21 diverse realizzazioni che sono disponibili per Linux; nella seconda parte
22 tratteremo in dettaglio quella che è l'implementazione principale, che fa
23 riferimento all'interfaccia standardizzata da POSIX.1e.
24
25
26 \section{Introduzione ai \textit{thread}}
27 \label{sec:thread_intro}
28
29 Questa prima sezione costituisce una introduzione ai \textit{thread} e
30 tratterà i concetti principali del relativo modello di programmazione,
31 esamineremo anche quali modelli sono disponibili per Linux, dando una breve
32 panoramica sulle implementazioni alternative.
33
34
35 \subsection{Una panoramica}
36 \label{sec:thread_overview}
37
38 % riferimenti
39 % http://vergil.chemistry.gatech.edu/resources/programming/threads.html
40 % http://math.arizona.edu/~swig/documentation/pthreads/
41 % http://www.humanfactor.com/pthreads/
42
43 Il modello classico dell'esecuzione dei programmi nei sistemi Unix, illustrato
44 in sez.~\ref{cha:process_interface}, è fondato sui processi. Il modello nasce
45 per assicurare la massima stabilità al sistema e prevede una rigida
46 separazione fra i diversi processi, in modo che questi non possano disturbarsi
47 a vicenda. 
48
49 Le applicazioni moderne però sono altamente concorrenti, e necessitano quindi
50 di un gran numero di processi; questo ha portato a scontrarsi con alcuni
51 limiti dell'architettura precedente. In genere i fautori del modello di
52 programmazione a \texttt{thread} sottolineano due problemi connessi all'uso
53 dei processi:
54 \begin{itemize}
55 \item
56 \item 
57 \end{itemize}
58
59
60
61 \subsection{\textit{Thread} e processi}
62 \label{sec:thread_process}
63
64 Per un utilizzo effettivo dei \textit{thread} è sempre opportuno capire se
65 questi sono davvero adatti allo scopo che ci si pone.
66
67
68 \subsection{Implementazioni alternative}
69 \label{sec:thread_other}
70
71 Vedremo nella prossima sezione le caratteristiche del supporto per i
72 \textit{thread} fornita dal kernel, ma esistono diversi possibili approcci
73 alle modalità in cui questi possono essere realizzati. 
74
75 % TODO cenni su pth e le implementazioni in userspace
76
77
78 \section{I \textit{thread} e Linux}
79 \label{sec:linux_thread}
80
81 In questa sezione tratteremo le implementazioni dei \textit{thread}
82 disponibili con Linux che ha visto un radicale cambiamento nel passaggio dalla
83 serie 2.4 alla serie 2.6, che ha portato alla versione attuale. 
84
85 \subsection{I \textit{LinuxThread}}
86 \label{sec:linux_old_thread}
87
88
89 \subsection{La \textit{Native Thread Posix Library}}
90 \label{sec:linux_ntpl}
91
92
93
94
95
96 % http://www.gnu.org/software/pth/
97
98
99 \section{Posix \textit{thread}}
100 \label{sec:thread_posix_intro}
101
102
103 Tratteremo in questa sezione l'interfaccia di programmazione con i
104 \textit{thread} standardizzata dallo standard POSIX 1.c, che è quella che è
105 stata seguita anche dalle varie implementazioni dei \textit{thread} realizzate
106 su Linux, ed in particolare dalla \textit{Native Thread Posix Library} che è
107 stata integrata con i kernel della serie 2.6 e che fa parte a pieno titolo
108 della \acr{glibc}.
109
110
111 \subsection{Una panoramica}
112 \label{sec:pthread_overview}
113
114
115 \subsection{La gestione dei \textit{thread}}
116 \label{sec:pthread_management}
117
118
119 Benché la funzione sia utilizzabile anche con i processi, tanto che a partire
120 dalla versione 2.3 della \acr{glibc} viene a sostituire \func{\_exit} (tramite
121 un \textit{wrapper} che la utilizza al suo posto) per la terminazione di tutti
122 i \textit{thread} di un processo si deve usare la funzione di sistema
123 \func{exit\_group}, il cui prototipo è:
124
125 \begin{funcproto}{
126 \fhead{linux/unistd.h}
127 \fdecl{void exit\_group(int status)}
128 \fdesc{Termina tutti i \textit{thread} di un processo.} 
129 }
130 {La funzione non ha errori e pertanto non ritorna.}
131 \end{funcproto}
132
133 La funzione è sostanzialmente identica alla \textit{system call} \func{\_exit}
134 ma a differenza di quest'ultima, che termina solo il \textit{thread}
135 chiamante, termina tutti \textit{thread} del processo. 
136
137
138 \section{La sincronizzazione dei \textit{thread}}
139 \label{sec:pthread_sync}
140
141 \subsection{I \textit{mutex}}
142 \label{sec:pthread_mutex}
143
144
145 \subsection{Le variabili di condizione}
146 \label{sec:pthread_cond}
147
148
149 \itindend{thread} 
150
151
152 \subsection{I \textit{thread} e i segnali.}
153 \label{sec:thread_signal}
154
155 % TODO trattare tkill e tgkill per l'invio di segnali a thread, fare un
156 % capitolo apposito su thread e segnali
157
158
159
160
161 % TODO troppe cose, ma segue list di notizie correlate
162 % aggiunta rt_tgsigqueueinfo con il kernel 2.6.31
163
164
165
166 % LocalWords:  thread multitasking POSIX sez Posix Library kernel glibc mutex
167
168
169 %%% Local Variables: 
170 %%% mode: latex
171 %%% TeX-master: "gapil"
172 %%% End: 
173