-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimplementacion-de-hilos-de-ejecucion-en-gnulinux.html
404 lines (335 loc) · 29.2 KB
/
implementacion-de-hilos-de-ejecucion-en-gnulinux.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> Implementación de hilos de ejecución en GNU/Linux
| frommelmak</title>
<meta name="author" content="Marcos Martinez">
<meta name="generator" content="Pelican v4.2.0">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css" integrity="sha512-oc9+XSs1H243/FRN9Rw62Fn8EtxjEYWHXRvjS43YtueEewbS6ObfXcJNyohjHqVKFPoXXUxwc+q1K7Dee6vv9g==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" integrity="sha512-+4zCK9k+qNFUR5X+cKL9EIR+ZOhtIloNl9GIKS57V1MyNsYpYcUrUeQc9vNfzsWfV28IaLL3i96P9sdNyeRssA==" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.min.css" integrity="sha512-+EoPw+Fiwh6eSeRK7zwIKG2MA8i3rV/DGa3tdttQGgWyatG/SkncT53KHQaS5Jh9MNOT3dmFL0FjTY08And/Cw==" crossorigin="anonymous">
<link rel="stylesheet" href="https://frommelmak.com/theme/css/main.min.css?3fd22780">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/js/bootstrap.bundle.min.js" integrity="sha512-iceXjjbmB2rwoX93Ka6HAHP+B76IY1z0o3h+N1PeDtRSsyeetU3/0QKJqGyPJcX63zysNehggFwMC/bi7dvMig==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.min.js" integrity="sha512-IsNh5E3eYy3tr/JiX2Yx4vsCujtkhwl7SLqgnwLNgf04Hrt9BT9SXlLlZlWx+OK4ndzAoALhsMNcCmkggjZB1w==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fitvids/1.2.0/jquery.fitvids.min.js" integrity="sha512-/2sZKAsHDmHNoevKR/xsUKe+Bpf692q4tHNQs9VWWz0ujJ9JBM67iFYbIEdfDV9I2BaodgT5MIg/FTUmUv3oyQ==" crossorigin="anonymous"></script>
<script src="https://frommelmak.com/theme/js/main.min.js?86e1c044"></script>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#ffc40d">
<meta name="theme-color" content="#ffffff">
<!-- Feeds -->
<meta name="keywords" content="threads, hilos">
</head>
<body class="bg-transparent pt-4">
<div class="container">
<a href="https://frommelmak.com" class="avatar-container float-left mx-4">
<div class="avatar animate ">
<div class="side"><img src="images/avatar.png" class="img-fluid"></div>
<div class="side back text-center pt-2 px-1 small">
Alien Life Form
</div>
</div>
</a>
<h1>
<a href="https://frommelmak.com" class="text-dark text-decoration-none">frommelmak</a>
<small class="text-secondary"><small>Yet another Melmacian interested in technology...</small></small>
</h1>
<nav class="navbar d-block navbar-expand-lg navbar-light bg-light shadow rounded-lg">
<a class="navbar-brand d-none" href="https://frommelmak.com" title="Yet another Melmacian interested in technology...">frommelmak</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#plumage-navbar-collapse-1" aria-controls="plumage-navbar-collapse-1" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="plumage-navbar-collapse-1">
<ul class="navbar-nav mr-auto mt-2 mt-lg-0">
<li class="nav-item ">
<a class="nav-link" href="/">
Home
</a>
</li>
<li class="nav-item ">
<a class="nav-link" href="https://frommelmak.com/pages/about.html">
About
</a>
</li>
</ul>
</div>
</nav>
</div>
<div class="container mt-5">
<div class="row">
<div class="
col-md-9
">
<h1>
<a href="https://frommelmak.com/implementacion-de-hilos-de-ejecucion-en-gnulinux.html" rel="bookmark" title="Permalink to Implementación de hilos de ejecución en GNU/Linux">Implementación de hilos de ejecución en <span class="caps">GNU</span>/Linux</a>
</h1>
</div>
</div>
<div class="row">
<div id="content" role="main" class="
col-md-9
">
<p>Llevo muchísimo tiempo lidiando con el sistema de paquetes <span class="caps">RPM</span> de Red Hat y la verdad es que nunca antes me haba encontrado con nada parecido al problema con el que me encontré a principios de semana.</p>
<p>El problema se resume así: Trabajando en un sistema vía <span class="caps">SSH</span> (Putty), me di cuenta que al hacer <code>RPM -q <paquete></code> me retornaba una versión de paquete distinta que si en ese mismo sistema lanzaba un <code>ssh rpm -q <paquete></code> desde otra máquina. Dado que lo único que podía cambiar de uno a otro escenario eran las variables de entorno bajo las cuales se ejecutaba la orden, me puse a ver cual era la que originaba el problema. Tras unas cuantas pruebas vi que la culpable era una variable llamada <code>LD_ASSUME_KERNEL</code>.</p>
<p>Como no tenia ni idea de en que manera podía esto afectar al resultado de una <em>query</em> tan simple a la base de datos <span class="caps">RPM</span>, empecé a documentarme sobre qué demonios hacía esta variable. Tras un buen rato tirando del <strong><span class="caps">HILO</span></strong> di con la respuesta. </p>
<p>El documento que viene a continuación intenta resumir todo lo que he aprendido a raíz de la dichosa variable.</p>
<p>Si lo preferís, podéis descargarlo en <span class="caps">PDF</span> desde <a href="http://nomeriasdeti.no-ip.com/files/docs/IHEGL.pdf">aquí</a>.</p>
<h1>Implementación de hilos de ejecución en sistemas <span class="caps">GNU</span>/Linux</h1>
<h2>LinuxThreads vs Native <span class="caps">POSIX</span> Threads (<span class="caps">NPTL</span>)</h2>
<p>23-Jan-2007
<a href="mailto:[email protected]">[email protected]</a></p>
<h3>Diferencias entre hilos de ejecución (threads) y procesos</h3>
<p>A grandes rasgos, la principal diferencia entre un proceso y un <em>thread</em> es que en la mayoría de los sistemas operativos, un proceso es una entidad relativamente independiente que dispone de su propio espacio de direcciones, su propia información de estado y que utiliza los mecanismos de comunicación entre procesos que le proporciona el sistema operativo para comunicarse con otros procesos.</p>
<p>Por otro lado, un <em>thread</em> seria una entidad más reducida capaz de convivir junto a otros <em>threads</em> bajo el contexto de un único proceso, permitiendo compartir la información de estado, el área de memoria y/o los recursos asociados a ese proceso.</p>
<p>Así, un <em>thread</em> no sería más que la habilidad de un proceso o programa para dividirse en varios hilos de ejecución simultáneos o aparentemente simultáneos.</p>
<p>Desde el punto de vista del algoritmo de scheduling del kernel -que decide que proceso ha de pasar a la <span class="caps">CPU</span> en cada momento- el proceso seria la unidad más grande capaz de ser manejada por el scheduler, mientras que el hilo seria la unidad más pequea capaz de ser llevada a la <span class="caps">CPU</span> por el scheduler del kernel.</p>
<h3>Hilos de ejecución en <span class="caps">GNU</span>/Linux</h3>
<p>Antes de la versión 2.6 del kernel Linux, no haba soporte real para manejar hilos a nivel de kernel. Las primeras versiones para el manejo de hilos en Linux (LinuxThreads) se implementaron en el área de usuario mediante llamadas a una función de sistema <code>clone()</code>, capaz de crear una copia de un proceso. Esta primera implementación además estaba muy lejos de ser compatible con los estándares <span class="caps">POSIX</span> de hilos de ejecución (<span class="caps">POSIX</span> threading standards).</p>
<p>Para mejorar el soporte de hilos en Linux, fueron necesarios retoques tanto a nivel de kernel (y su <span class="caps">ABI</span>) como a nivel de las libreras <span class="caps">GNU</span> C Library (Glibc) que implementaban el concepto de hilo.</p>
<p>Esto dio lugar a varios modelos/proyectos para la gestin de hilos, dependiendo de lo nuevo que fuera el sistema:</p>
<ul>
<li>LinuxThreads (with fixed stack size) </li>
<li>LinuxThreads (with floating stacks) </li>
<li><span class="caps">NGPT</span> (Next Generation <span class="caps">POSIX</span> Threads) liderado por <span class="caps">IBM</span> y abandonado por <span class="caps">NPTL</span>.</li>
<li><span class="caps">NPTL</span> (Native <span class="caps">POSIX</span> Thread) Proyecto liderado por Red Hat y liberado en 2003.</li>
</ul>
<p>Al añadir nuevas posibilidades al trabajo con hilos en el kernel de linux, se inició una etapa de transición en la que algunas aplicaciones requerían un esquema de hilos moderno (<span class="caps">NPTL</span>), mientras que otras utilizaban otro más tradicional como LinuxThreads. Todo ello, teniendo el sistema que poder correr aplicaciones basadas en un modelo de hilos más o menos avanzado.</p>
<p>Como se ha comentado al inicio, los nuevos modelos de soporte de hilos requerían cambios también a nivel de kernel. As, las diferentes libreras dinámicas (<span class="caps">DSO</span> Dinamic Shared Objects/Shared Libraries), además de una librera de hilos concreta, requerirán de una versión del kernel con una interfaz capaz de trabajar con dicha librera. A esta interfaz se la conoce con el nombre de Application Binary Interface (<span class="caps">ABI</span>).</p>
<p>Una <span class="caps">ABI</span> define la interfaz de bajo nivel entre la Aplicación y el sistema operativo o kernel , mientras que una <span class="caps">API</span> define el interfaz entre el código fuente y las libreras. </p>
<p>De la misma forma que una <span class="caps">API</span> permite que un código fuente sea compilado en cualquier sistema que soporte para dicha <span class="caps">API</span>, la <span class="caps">ABI</span> permite que un objeto binario pueda funcionar en un sistema con una <span class="caps">ABI</span> compatible.</p>
<p>Los <span class="caps">DSO</span> incluyen información relativa a la versión de <span class="caps">ABI</span> requerida, de manera que el enlazador o cargador dinámico (<span class="caps">LD</span>) de las Glibc (<code>ld.so/ld-linux.so</code>) sabe la versión <span class="caps">ABI</span> requerida por el <span class="caps">DSO</span>.</p>
<p>Las ABIs disponibles dependen de la versión del kernel que utilice el sistema, mientras que el modelo de hilos utilizado depende de las libreras de hilos (<code>libpthread.so</code>) disponibles. La decisión de qué libreras utilizar la toma el enlazador dinámico.</p>
<p>Así, la incursión de un nuevo modelo de hilos requería también de retoques en el enlazador dinámico de libreras, a fin de asegurar la compatibilidad total con las aplicaciones ya existentes, además de los ya mencionados cambios en el sistema (kernel y librera de implementación de hilos).</p>
<p>El enlazador dinámico (<code>ld-linux.so</code>) de DSOs (Dynamic Share Object .so) forma parte de las Glibc, y es capaz de ver los requerimientos en cuanto a kernel/<span class="caps">ABI</span> de un <span class="caps">DSO</span> y llamar a las librerías necesarias/compatibles en cada caso. En Red Hat 9, Fedora Core 1 y 2, estas libreras están en <code>/lib</code>, <code>/lib/i686</code> y <code>/lib/tls</code> en función de si implementan un sistema de hilos LinuxTread (fixed stacks), LinuxTread (floating stacks) o <span class="caps">NPTL</span> respectivamente.</p>
<h3>La variable <code>LD_ASSUME_KERNEL</code></h3>
<p>En los sistemas Red Hat Linux en los que conviven los diferentes acercamientos al modelo de hilos (LinuxThread y <span class="caps">NPTL</span>), existe una variable de entorno llamada <code>LD_ASSUME_KERNEL</code> capaz de modificar el comportamiento normal del enlazador dinámico de las Glibc para utilizar los <span class="caps">DSO</span>/<span class="caps">ABI</span> de uno u otro modelo de hilos.</p>
<p>En sistemas relativamente modernos, las libreras Glibc incluyen diferentes versiones de libreras capaces de implementar uno u otro modelo de hilos: </p>
<ul>
<li><code>/lib/libpthread.so.0</code> (LinuxThreads fixed stack size)</li>
<li><code>/lib/i686/libpthread-0.10.so</code> (LinuxThreads floating stacks)</li>
<li><code>/lib/tls/libpthread-0.34.so</code> (<span class="caps">NPTL</span> disponible por primera vez en Red Hat 9)</li>
</ul>
<p>Para saber el modelo de hilos utilizado podemos utilizar el comando getconf.</p>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="go">getconf GNU_LIBPTHREAD_VERSION</span>
<span class="go">NPTL 0.34</span>
</code></pre></div>
<p>Como hemos dicho, si bien en Red Hat 9 <span class="caps">NPTL</span> es el modelo de hilos utilizado por defecto, utilizando la variable <code>LD_ASSUME_KERNEL</code>, es posible forzar al enlazador dinámico (Dynamic Linker <span class="caps">LD</span>) a la hora de cargar los DSOs requeridos por un programa, de manera que cargue los correspondientes a un modelo de threads u otro al <span class="caps">ASUMIR</span> que la <span class="caps">ABI</span> que le ofrecer el kernel es de una versión anterior a la del kernel actualmente en ejecución.</p>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">LD_ASSUME_KERNEL=2.2.5</span>
<span class="err">getconf GNU_LIBPTHREAD_VERSION</span>
<span class="err">linuxthreads-0.10</span>
</code></pre></div>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">LD_ASSUME_KERNEL=2.4.1</span>
<span class="err">getconf GNU_LIBPTHREAD_VERSION</span>
<span class="err">linuxthreads-0.10</span>
</code></pre></div>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">LD_ASSUME_KERNEL=2.4.20</span>
<span class="err">getconf GNU_LIBPTHREAD_VERSION</span>
<span class="err">NPTL 0.34 </span>
</code></pre></div>
<p>Mediante el comando <code>eu-readelf</code> presente en el paquete <code>elfutil</code>s, es posible saber el modelo de <span class="caps">ABI</span> requerido por un <span class="caps">DSO</span>.</p>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="go">eu-readelf -n /lib/libnss_nis.so.1</span>
<span class="go">Note segment of 32 bytes at offset 0x000000f4:</span>
<span class="go">Owner Data size Type</span>
<span class="go">GNU 16 VERSION</span>
<span class="go">OS: Linux, ABI: 2.2.5</span>
</code></pre></div>
<p>En el ejemplo anterior, la librera <code>libnss_nis.so.1</code> requiere de una <span class="caps">ABI</span>/Kernel superior o igual a la que ofrecía un kernel de la versión 2.2.5.</p>
<p>Otros ejemplos:</p>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="n">eu</span><span class="o">-</span><span class="n">readelf</span> <span class="o">-</span><span class="n">n</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">i686</span><span class="o">/</span><span class="n">libc</span><span class="o">-</span><span class="mi">2</span><span class="p">.</span><span class="mi">3</span><span class="p">.</span><span class="mi">2</span><span class="p">.</span><span class="n">so</span>
<span class="n">Note</span> <span class="n">segment</span> <span class="k">of</span> <span class="mi">32</span> <span class="n">bytes</span> <span class="k">at</span> <span class="k">offset</span> <span class="mi">0</span><span class="n">x00000114</span><span class="p">:</span>
<span class="k">Owner</span> <span class="k">Data</span> <span class="k">size</span> <span class="k">Type</span>
<span class="n">GNU</span> <span class="mi">16</span> <span class="n">VERSIONOS</span><span class="p">:</span> <span class="n">Linux</span><span class="p">,</span> <span class="n">ABI</span><span class="p">:</span> <span class="mi">2</span><span class="p">.</span><span class="mi">4</span><span class="p">.</span><span class="mi">1</span>
</code></pre></div>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">eu-readelf -n /lib/tls/libc-2.3.2.so</span>
<span class="err">Note segment of 32 bytes at offset 0x00000134:</span>
<span class="err">Owner Data size Type</span>
<span class="err">GNU 16 VERSIONOS: Linux, ABI: 2.4.20</span>
</code></pre></div>
<h3>Errores derivados de un mal uso de <code>LD_ASSUME_KERNEL</code></h3>
<p>Las utilidades del sistema de paquetes <span class="caps">RPM</span> dependen de libreras que requieren una <span class="caps">ABI</span> y libreras con capacidades <span class="caps">NPTL</span>. Si utilizamos la variable <code>LD_ASSUME_KERNEL</code> para forzar al enlazador dinámico a utilizar las libreras de la implementación de hilos LinuxThreads, corremos el riesgo de obtener resultados inesperados o incluso de corromper la base de datos Berkley <span class="caps">DB</span> del sistema <span class="caps">RPM</span>, ya que esta base de datos está pensada y optimizada para su ejecución en un entorno de hilos <span class="caps">NPTL</span>.</p>
<p>Es por este motivo que es recomendable estar seguros de que <span class="caps">NO</span> hemos modificado el valor de dicha variable de entorno antes de proceder a construir, o instalar un paquete mediante las herramientas del sistema de paquetes <span class="caps">RPM</span>.</p>
<p>Las capturas siguientes muestran la estrecha relación que existe entre las herramientas <span class="caps">RPM</span> y el modelo de hilos <span class="caps">NPTL</span>.</p>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">ldd /bin/rpm</span>
<span class="err">librpm-4.2.so = /usr/lib/librpm-4.2.so (0x4002a000)</span>
<span class="err">librpmdb-4.2.so = /usr/lib/librpmdb-4.2.so (0x4007e000)</span>
<span class="err">librpmio-4.2.so = /usr/lib/librpmio-4.2.so (0x4015d000)</span>
<span class="err">libpopt.so.0 = /usr/lib/libpopt.so.0 (0x401bb000)</span>
<span class="err">libelf.so.1 = /usr/lib/libelf.so.1 (0x401c3000)</span>
<span class="err">libpthread.so.0 = tls/libpthread.so.0 (0x401d3000)</span>
<span class="err">librt.so.1 = tls/librt.so.1 (0x401e2000)</span>
<span class="err">libbz2.so.1 = /usr/lib/libbz2.so.1 (0x401f4000)</span>
<span class="err">libc.so.6 = tls/libc.so.6 (0x42000000)</span>
<span class="err">/lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0x40000000)</span>
</code></pre></div>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">ldd /usr/bin/rpmbuild</span>
<span class="err">librpmbuild-4.2.so = /usr/lib/librpmbuild-4.2.so (0x00bba000)</span>
<span class="err">librpm-4.2.so = /usr/lib/librpm-4.2.so (0x008a3000)</span>
<span class="err">librpmdb-4.2.so = /usr/lib/librpmdb-4.2.so (0x00252000)</span>
<span class="err">librpmio-4.2.so = /usr/lib/librpmio-4.2.so (0x00380000)</span>
<span class="err">libpopt.so.0 = /usr/lib/libpopt.so.0 (0x00d26000)</span>
<span class="err">libelf.so.1 = /usr/lib/libelf.so.1 (0x00aef000)</span>
<span class="err">libbeecrypt.so.6 = /usr/lib/libbeecrypt.so.6 (0x0061a000)</span>
<span class="err">librt.so.1 = /lib/tls/librt.so.1 (0x00d56000)</span>
<span class="err">libpthread.so.0 = /lib/tls/libpthread.so.0 (0x005ac000)</span>
<span class="err">libz.so.1 = /usr/lib/libz.so.1 (0x00c0e000)</span>
<span class="err">libbz2.so.1 = /usr/lib/libbz2.so.1 (0x00e55000)</span>
<span class="err">libc.so.6 = /lib/tls/libc.so.6 (0x00111000)</span>
<span class="err">/lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0x00364000)</span>
</code></pre></div>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">eu-readelf -n /lib/tls/librt.so.1</span>
<span class="err">Note segment of 32 bytes at offset 0x00000134:</span>
<span class="err">Owner Data size Type</span>
<span class="err">GNU 16 VERSION</span>
<span class="c">OS: Linux, ABI: 2.4.20</span>
</code></pre></div>
<div class="highlight pygments-style-monokai rounded shadow-sm mb-3"><pre><span></span><code><span class="err">eu-readelf -n /lib/tls/libpthread.so.0</span>
<span class="err">Note segment of 32 bytes at offset 0x00000114:</span>
<span class="err">Owner Data size Type</span>
<span class="err">GNU 16 VERSION</span>
<span class="c">OS: Linux, ABI: 2.4.20</span>
</code></pre></div>
<p>La conclusión que cabe sacar de todo esto es que un abuso de la variable <code>LD_ASSUME_KERNEL</code> puede tener consecuencias inesperadas y hacernos perder mucho tiempo tratando de averiguar qué es lo que esta provocando el problema.</p>
<p>La regla sera dejar que sea el sistema el encargado de establecer el modelo de hilos bajo en que se ha de ejecutar cada aplicación y solo forzar un modelo distinto cuando estemos seguros que es eso lo que requiere nuestra aplicación.</p>
<h3>Bibliografa:</h3>
<p><em>Wikipedia</em></p>
<ul>
<li><a href="">http://en.wikipedia.org/wiki/Thread_%28computer_science%29</a></li>
</ul>
<p><em>Red Hat</em></p>
<ul>
<li><a href="">http://people.redhat.com/drepper/assumekernel.html</a></li>
</ul>
<p><em><span class="caps">IBM</span></em></p>
<ul>
<li><a href="">http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/cins_nptl.html</a></li>
<li><a href="">http://www-128.ibm.com/developerworks/linux/library/l-threading.html?ca=dgr-lnxw07LinuxThreadsAndNPTL</a></li>
</ul>
<div class="comments mt-5">
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = "https://frommelmak.com/implementacion-de-hilos-de-ejecucion-en-gnulinux.html";
this.page.identifier = "implementacion-de-hilos-de-ejecucion-en-gnulinux.html";
};
(function() {
var d = document, s = d.createElement('script');
s.src = 'https://frommelmak.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus</a>.</noscript>
</div>
</div>
<div class="col-md-3">
<div class="card bg-light text-dark">
<ul class="list-group list-group-flush">
<li class="list-group-item">
<abbr title="2007-01-25T19:01:52+01:00"><i class="fas fa-calendar"></i> Thu 25 January 2007</abbr>
</li>
<li class="list-group-item">
<address>
<i class="fas fa-user"></i> By
<a href="https://frommelmak.com/author/frommelmak.html" rel="author">frommelmak</a>
</address>
</li>
<li class="list-group-item">
<a href="https://frommelmak.com/category/spanish.html" rel="tag" data-toggle="tooltip" class="badge badge-info" title="56 articles in this category">Spanish</a>
<a href="/tag/hilos.html" data-toggle="tooltip" class="badge badge-secondary" title="1 article with this tag">hilos</a>
<a href="/tag/threads.html" data-toggle="tooltip" class="badge badge-secondary" title="1 article with this tag">threads</a>
</li>
<li class="list-group-item">
<p>Found a typo? Fix it now:</p>
<a class="btn btn-info btn-block" href="https://github.com/frommelmak/blog/edit/master/content/posts/implementacion-de-hilos-de-ejecucion-en-gnulinux.md"><i class="fas fa-edit fa-fw"></i> Edit article on GitHub</a>
</li>
<li class="list-group-item">
<nav class="nav nav-pills nav-fill">
<a class="nav-link btn btn-outline-primary border-0 " href="https://frommelmak.com/asterisk-the-future-of-telephony.html" title="Asterisk: The Future of Telephony" rel="prev">
<span aria-hidden="true">←</span> Older
</a>
<a class="nav-link btn btn-outline-primary border-0 " href="https://frommelmak.com/tux-droid-tu-amigo-programable.html" title="Tux Droid, tu amigo programable" rel="next">
Newer <span aria-hidden="true">→</span>
</a>
</nav>
</li>
</ul>
</div>
</div>
</div>
</div>
<footer class="container-fluid mt-5 p-4 small">
<div class="row mx-5">
<div class="col-md-2">
<h6>Social</h6>
<ul class="list-unstyled">
<li><a href="http://twitter.com/frommelmak">
<i class="fab fa-twitter fa-fw"></i>
@frommelmak
</a></li>
</ul>
</div>
<div class="col-md-2">
<h6>Links</h6>
<ul class="list-unstyled">
<li><a href="http://linkedin.com/in/marcosmartinezjimenez">
<i class="fab fa-linkedin fa-fw"></i>
LinkedIn
</a></li>
<li><a href="http://github.com/frommelmak">
<i class="fab fa-github fa-fw"></i>
GitHub
</a></li>
<li><a href="http://www.youtube.com/user/melmak">
<img src="https://www.google.com/s2/favicons?domain=www.youtube.com" width="16" height="16" class="link-icon" alt="www.youtube.com icon">
Youtube
</a></li>
</ul>
</div>
<div class="col-md-2">
<h6>Browse content by</h6>
<ul class="list-unstyled">
<li><a href="https://frommelmak.com/categories/index.html"><i class="fas fa-th fa-fw"></i> Categories</a></li>
<li><a href="https://frommelmak.com/archives/index.html"><i class="far fa-calendar-alt fa-fw"></i> Dates</a></li>
<li><a href="https://frommelmak.com/tags/index.html"><i class="fas fa-tags fa-fw"></i> Tags</a></li>
</ul>
</div>
<div class="col-md-2 text-muted">
<h6>Copyright notice</h6>
<p class="small">
© Copyright
2005-2020
Marcos Martinez.
</p>
</div>
<div class="col-md-2 text-muted">
<h6>Disclaimer</h6>
<p class="small">
All opinions expressed in this site are my own
personal opinions and are not endorsed by, nor
do they represent the opinions of my previous,
current and future employers or any of its
affiliates, partners or customers.
</p>
</div>
<div class="col-md-2">
</div>
</div>
<div class="row mt-3">
<div class="offset-3 col-6 small text-muted text-center">
Site generated by <a class="text-dark" href="https://getpelican.com">Pelican</a>.<br>
<a class="text-dark" href="https://github.com/kdeldycke/plumage">Plumage</a>
theme by <a class="text-dark" href="https://kevin.deldycke.com">Kevin Deldycke</a>.
</div>
<div class="col-3 text-right d-flex flex-column">
<a class="mt-auto" href="#"><i class="fas fa-arrow-up"></i> Back to top</a>
</div>
</div>
</footer>
</body>
</html>