Professional Documents
Culture Documents
ndice
I Introduccin
1. Introduccin:
1.1.
historia
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.
Distribuciones Linux . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.
Estructura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.
3.3.
Planicacin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.1.
3.3.2.
. . . .
. . . . . . . . . . . . . . . . . . . . . .
3.4.
Direccionamiento virtual:
3.5.
Llamadas al sistema
. . . . . . . . . . . . . . . . . . . . . . . . .
3.6.
3.6.1.
3.6.2.
11
3.6.3.
11
. . . . . . . . . . . . . . .
. . . . . . . . . . . . .
13
4. Cach de datos.
14
5. Organizacin de un buer-cach.
14
15
15
7.1.
Elementos bsicos
. . . . . . . . . . . . . . . . . . . . . . . . . .
15
7.2.
Planicador de E/S . . . . . . . . . . . . . . . . . . . . . . . . . .
16
7.2.1.
Conceptos bsicos
. . . . . . . . . . . . . . . . . . . . . .
16
7.2.2.
Tipos de planicadores . . . . . . . . . . . . . . . . . . . .
16
18
19
IV Procesos
23
24
24
25
25
14.Planicacin de procesos
26
V Memoria
30
15.Hardware
30
30
30
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
32
17.SLAB
32
34
19.SWAP
35
36
36
36
20.Traza de procesos
36
37
21.1. Deadlock
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
21.2. Livelock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
39
. . . . . . . . . . . . . . . . . . . . . . . . . . .
22.Memoria compartida
40
23.Semforos
40
ndice de guras
1.
Arquitectura de anillos . . . . . . . . . . . . . . . . . . . . . . . .
10
2.
inodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
3.
4.
Slab
5.
Uso de
. . . . . . . . . . . . . . . . . . . . . . .
25
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
ptrace
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
Parte I
Introduccin
1. Introduccin:
1.1. historia
1965
1969
1971
PDP-11
Fortran y BCPL
1973
1977
1977-82
1977-86
Implementaron UNIX en C
500 sistemas UNIX (125 eran universidades)
Bell Unix System III
ATT y Universidad de California Berkeley: desarrollo de BSD (Berke-
1980
1983
1984
1985
1985
1987
1989
1989
1991
1991
1994
4.4 BSD Enumbered (para los que quisieran pagar a ATT) y 4.4 BSD
Lite
1995
(1994 - )
openSuSE
RedHat
(1995 - )
Fedora (2003 - )
Mandriva (2005 - ) / [Mandrake (1998 - ) / Conectiva (1995 - 2005)]
Knoppix
(2000 - )
Creacin
Terminacin
Suspensin
Comunicacin
...
3.3. Planicacin
3.3.1. Los planicadores pueden ser:
expropiativos: ceden el control de la CPU a los procesos durante un tiempo.
no expropiativos: esperan a que los procesos acaben.
Linkado esttico:
linkar
Linkado dinmico:
.a
.so (libc.so)
int 21
en MSDOS).
Mecanismo (mechanism):
Poltica (policy):
Arquitectura de anillo
Direccionamiento basado en capacidades (capabilities based addressing)
System 250 (1969) de Plessey Corportation
System/38 (1978) de IBM
OS/2 usa:
10
Ventajas:
No necesita espacios de direcciones separados
Flexibilidad en
Desventajas:
El tiempo que tarda en ejecutarse una aplicacin crece.
Tipado inexible
Ventajas:
Inconvenientes:
El diseo
Ventajas:
Inconvenientes:
11
La solucin basada en un modo privilegiado mezcla el mecanismo de proteccin con las polticas de seguridad mientras que en un sistema basado
en capabilities se distinguen claramente y esto lleva de forma intuitiva a
un sistema microkernel.
12
Parte II
Bloques
Discos duros
Se trabaja por bloques de datos (open, read, write, close, seek).
E/S en bruto, ls.
Caracteres
Teclados, ratones, algunos dispositivos.
Se trabaja de caracter en caracter (getc, putc) (libreras para trabajar
con lineas)
Red
Ethernet, wireless, bluetooth.
Hay que usar su propio interfaz.
Si haces
ls /dev/ -l
nador. Los que tienen al principio una c son dispositivos de caracteres, como
por ejemplo
/dev/tty0
/dev/usbmon0
Las interfaces que un usuario puede usar para acceder a un dispositivo tambin se divide en 3 categoras:
Interfaz bloqueante
Deniciones
Buer
se suele denir como una regin de memoria que almacena datos tem-
13
Cach
en algn sitio o calculados con anterioridad donde los originales son costosos de obtener (teniendo en cuenta el tiempo de acceso) o de calcular de
nuevo.
Se generan muchas peticiones de E/S.
Todas las peticiones de E/S se pasan a los drivers de dispositivos con la
estructura de datos del buer que contiene todo lo necesario para realizar la
operacin
Todos los dispositivos tienen un id. Si haces
ls -l /dev/sda
te sale donde
tiene como id
16...
4. Cach de datos.
5. Organizacin de un buer-cach.
El buer-cach se compone de dos partes funcionales:
Estado de un buer:
BH_update Tiene datos correctos y ninguna operacin pendiente.
BH_new Buer vaco (recin creado).
BH_lock Buer que est bloqueado para evitar accesos concurrentes.
BH_dirty Contiene datos nuevos que sern escritos pero cuya escritura no ha
sido planicada an.
4 KB
8 KB
Las pginas estn divididas en bloques (un buer est relacionado con un
bloque).
Posibles situaciones de cach de pgina:
1)
dirty_background_ratio
feres a
dirty del total. Cuando se alcanza esa proporcin, hay una opcin
a)
b)
2)
dirty_background_ratio.
Cuando los datos a dirty crecen ms de un lmite. Los procesos que hacen
ush van poco a poco escribiendo todas las pginas que se hayan modicado hace mas de
dirty_expire_centisecs (en mi
dirty_expire_centisecs.
caso = 3000). El
/proc/sys/vm.
dirty_expire_centisecs)
sctruct bio {
sector_t bi_sector;
struct bio * bi_next;
struct block_device * bi_bdev;
struct bio_vec * bio_io_vec;
unsigned short bi_vent;
15
bio.
struct_request,
que contienen
struct_bio.
Reordenacin
Planicador Deadline
disco antes que las escrituras (pa que no pase eso de que las escrituras maten de
hambre a las lecturas...). Al recibir una peticin, se le asigna un deadline: 500
ms para lecturas y 5 s para escrituras. Hay 3 colas:
Por un lado est la cola ordenada (SORTED-FIFO-QUEUE), que tiene toda
las peticiones que llegan ordenadas por orden de sector (para optimizar
los movimientos de aguja).
Hay una cola de lectura (READ-FIFO-QUEUE) ordenada por tiempo de deadline
16
Planicador Anticipatorio
anterior, que funcionan de manera similar. Tras hacer una lectura, espera sin
hacer nada dirante 6 ms. As, se le da tiempo a la aplicacin a que realice otra
peticin de lectura, que generalmente ser de una posicin de disco contiga,
consiguiendo de este modo un ahorro en el desplazamiento del cabezal de disco.
Planicador NOOP
que llegue antes, se ejecuta antes. Tiene sentido a la hora de hacer entrada/salida
en discos de estado /slido (SSD), ya que no tenemos el tema de que las agujas
se vayan a mover mucho y tal. para cambiar el planicador, en el arranque se
pone elevator=noop, hacemos que utilice este planicador
17
Parte III
Sistemas de Ficheros
Un sistema de cheros es un almacenamiento jerrquico de datos con una
estructura bien denida. Un chero es una cadena ordenada de bytes a los que
se le asigna un nombre.
/home/manolo/asd.ods
dentry ).
Donde
home
manolo
En Unix, los directorios son cheros que listan los cheros que contiene.
Adems, se separa el concepto del contenido de chero de su metadatos (permisos, propietario, fecha de creacin/modicacin/acceso, etc...). Estos metadatos
se almacenan en una estructura de datos distinta: el inodo. El superbloque contiene informacin sobre el sistema de cheros en general. En los sistemas de
18
Figura 2: inodos
cheros de Unix (ext2, ext3, ext4, xfs, jfs, reiferfs, ...), se implementan estos conceptos de forma nativa. El VFS interacta con todos estos sistemas de cheros,
haciendo de interfaz para el usuario. Sin embargo, para sistemas de cheros como vFAT, ntfs (Windows), hfs (Apple) que no estn basados en inodos, el VFS
simula como si lo fueran. Por ejemplo, en vFAT no existen permisos, por lo
que cuando se monta un sistema de cheros en vFAT en Linux, se le da una
serie de permisos por defecto. Hay 4 objetos bsicos con sus operaciones:
superbloque (superblock,
inodo (inode,
superblock_operations)
inode_operations)
dentry_operations)
file_operations)
Normalmente al formatear
(mkfs.ext4 /dev/sdb),
-N 4000
entonces crea 4000 inodos (si sabes que no se van a utilizar tantos...) Tambin,
al formatear un disco se reserva un % para el usuario root, pero en un disco duro
externo esto no sirve pa na... asi que mejor le pones
-m 0
es
/.
BLOQUES
oldstat
oldfstat
statfs
(posiciona el pun-
llseek
void *mmap(void *addr, size_t length, int prot, int flags, int
fd, off_t offset);
int munmap(void *addr, size_t length); (mapear/desmapear en memoria
el fichero)
mkdir
readdir
rmdir
chdir
fchdir
chown
fchown
lchown
chmod
fchmod
lchmod
link
symlink
readlink
ulink
int mknod(const char *pathname, mode_t mode, dev_t dev);
mount
umount
utime
access
20
sync
fsync
msync
ldatasync
rename
int dup(int oldfd)
int dup2(int oldfd, int newfd)
truncate
ftruncate
quotactl
bdflush
setfsuid
(cambia el
UID
setfsgid
(cambia el
GID
getdents
flock
readv
writev
pread64
pwrite64
getcwd
readahead
ACLs:
setxattr
fsetxattr
lsetxattr
getxattr
fgetxattr
lgetxattr
listxattr
inotify (para enviar noticaciones acerca de eventos relacionados con cheros):
inotify_init
inotify_init1
inotify_add_watch
inotify_rm_watch
21
Llamadas al sistema con direcciones relativas (path por un lado y descriptor por otro):
openat
mkdirnat
mknodeat
lchownat
futimesat
unlinkat
renameat
linkat
symlinkat
readlinkat
fhmodat
facessat
22
Parte IV
Procesos
Proceso
un conjunto de instrucciones planicable por el planicador
la unidad mnima de asignacin de recursos.
un programa en ejecucin.
el cdigo ejecutable de un programa ms los recursos usados:
cheros abiertos
seales pendientes
estado del procesador
datos internos del kernel
espacio de memoria direccionable
seccin de datos
etc...
Ms rpido
Problema ya que no se pueden ejecutar 2 hilos de un mismo proceso
a la vez
Menos estable
Menos rpido
Ms estable
De forma hbrida
En Linux existen los lpthreads (con la NPTL, Native POSIX Thread Library)
23
TASK_UNINTERRUPTIBLE
copy_flags
task_struct:
PF_SUPERPRIV
PF_FORKNOEXEC
get_pid()
Duplica o copia cheros abiertos, informacin del fs, signal handlers, espacio direccionable de memoria, etc...
Reporta el timeslice entre los procesos padre e hijo
copy_proccess
El hijo porque...
(tasklist,
24
init.
clone())
exit(int)(salir
de un proceso proceso)
25
del
proceso)
setuid() (cambiar el id del usuario del proceso, solo lo puede hacer root)
setgid() (cambiar el id del grupo del proceso, solo lo puede hacer root)
seteuid() ()
setegid() ()
setreuid() ()
setregid() ()
setfsuid() ()
wait() (para
wait4()
waitpid()
kill()
esperar a procesos)
sigaction()
sigsuspend()
sigpending()
sigreturn()
sigprocpask()
ptrace()
strace()
ltrace()
gdb()
nice()
getpriority()
setpriority()
sched_getscheduler()
sched_setscheduler()
sched_getparam()
sched_setparam()
sched_get_priority_max()
sched_get_priority_min()
sched_rr_get_interval()
sched_getaffinity()
sched_setaffinity()
sched_yield()
26
Prioridad de procesos:
+ CPU
+ prioridad
- prioridad
Recin creado
0 ms
5 ms
100 ms
800 ms
+
+
rendimiento
latencia
rendimiento
latencia
El planicador de Linux:
Es O(1): el algoritmo de planicacin se ejecuta en un tiempo independiente del nmero de procesos.
Perfecta escalabilidad: cada proceso es independiente.
Buena anidad SMP: se pueden agrupar tareas por CPU.
Buen rendimiento interactivo.
Es justo.
27
runqueue
struct prio_array{
int nr_active,
unsigned long bitmap[BITMAP_SIZE],
struct list_head queue[MAX_PRIO]
};
BITMAP_SIZE
donde
es 5 (2
MAX_PRIO
es 140
Podra tardar mucho O(n)
El reclculo de timeslice requiere bloquear la lista (lock)
El reclculo no es determinista (ocurre aleatoriamente)
Es feo
guarda la media de 0 a
se incrementa
menta.
sleep_avg
Balanceador de carga
1 runqueue
load_balance.
idle, cada
1.
field_busiest_queue,
2.
Se decide de qu
prio_array.
prio_array
de procesos activos.
28
3.
4.
prio_array
5.
29
pull_task
Parte V
Memoria
15. Hardware
15.1. Modo real
Memoria convencional
640 KB
640 KB
Memoria extendida
1 MB
...
1 MB
13 bits: ndice
32 bits: oset
Se podra decir que en realidad las direcciones lgicas son de 46 bits en vez de
48, ya que 2 bits son para el RPC (el cual no es direccin sino permisos).
a)
b)
a)
NAL 11)
3. Se compara el oset con el tamao del segmento, si se sale
4. Se suma la direccin base con el oset.
30
GPF
a)
b)
c)
*
*
*
__KERNEL_CS
__KERNEL_DS
__USER_CS
__USER_DS
base = 0
base = 0
base = 0
base = 0
size = 4 GB
size = 4 GB
size = 4 GB
size = 4 GB
DPL = 0
DPL = 0
DPL = 3
DPL = 3
a)
b)
c)
d)
a)
b)
c)
d)
e)
31
struct page {
page_flags_t flags;
atomic_t _count;
atomic_t _mapcount;
unsigned long private;
struct address_space * mapping;
pgoff_t index;
struct list_head lru;
void * virtual;
}
ZONE_DMA
ZONE_NORMAL
kernel
ZONE_HIGHMED
[896
17. SLAB
El struct SLAB y sus funcioncitas
Se trata de una capa que gestiona estructuras de datos genricos.
Las estructuras de datos usadas frecuentemente se reservan / liberan a
menudo, as que se cachean.
La lista de libres mejora enormemente la velocidad.
Si el allocator conoce conceptos como el tamao del objeto, de la pgina
y del total de cach puede tomar decisiones ms inteligentes.
Si parte de la cach se hace por el procesador (cada procesador tiene una
cach), no hace falta hacer un lock SMP
Si el allocator entiende de NUMA, puede hacer reservas en el mismo nodo
que los pide
UnCada cach se encuentra dividida en slabs que se componen de una o ms
pginas fsicamente contiguas. Las slabs contienen los objetos. Adems, cada
slab est en uno de los siguientes estados:
32
Figura 4: Slab
lleno
parcial
vaco
struct kmem_cache_s {
list slabs_full, slabs_partial, slabs_emptystored }
struct slab {
struct list_head list;
unsigned long colouroff;
void *s_mem;
unsigned int inuse;
kmem_bufctl_t free;
}
static void * kmem_getpages {
(kmem_cache_t * cachep, int lags, int nodeid);
kmem_freepages(..)
kmem_cache_create(const char * name, size_t size, size_t align,
unsigned long flags,
void (*ctor) (void *, kmem_cache_t *, unsigned
long),
33
long));
SLAB_NO_READ
SLAB_HWCACHE_ALIGN
SLAB_MUST_HWCACHE_ALIGN
SLAB_POISON ( a5a5a5a5)16 = 1010010110100101101001011010101)2 )
SLAB_RED_ZONE
SLAB_PANIC
kmem_cache_destry(kmem_cache_t * cachep)
8 KB ocupados
Si la pgina es de 8 KB
16 KB ocupados
Fault).
seccin de datos.
cat /proc/<pid>/maps.
vm_area_struct
mm_struct
task_struct
19. SWAP
Es una parte del disco duro a donde se copia memoria principal cuando esta
est to pet y hay que meter ms cosas.
El proceso para hacer
swap es el siguiente.
35
Ventajas
Optimiza el uso de la memoria, ya que no se cargan pginas que no se van
a usar.
El inicio del programa es ms rpido.
Menor carga del disco.
Desventajas
Ejecucin ms lenta, ya que cada vez que se pide una pgina hay que
cargarla.
Parte VI
ptrace():
exec(),
fork(..);
ptrace(PTRACE_TRACEME, ..)
exec(..);
O tambin, para trazar un pid concreto:
SET
PTRACE_TRACEME:
PTRACE_PEEKTEXT, PTRACE_PEEKDATA:
PTRACE_POKETEXT, PTRACE_POKEDATA:
PTRACE_GETREGS, PTRACE_GETFPREGS:
istros.
PTRACE_GETSIGINFO:
PTRACE_SETREGS, PTRACE_SETFPREGS:
registros.
PTRACE_SETSIGINFO:
PTRACE_CONT:
PTRACE_SYSCALL:
PTRACE_SINCLESTEP:
PTRACE_KILL:
PTRACE_ATTACH:
PTRACE_DETACH:
send(destino, mensaje)
recv(origen, &mensaje)
37
Figura 5: Uso de
ptrace
21.1. Deadlock
Cuando dos trenes se aproximan a un cruce, ambos se quedarn
completamente parados y no arrancarn hasta que el otro se haya
ido
Ley de Kansas
recursos.
3. Condicin de no expropiacin: los recursos no pueden ser expropiados.
4. Condicin de espera circular: 2 o ms procesos forman una cadena circular
donde cada proceso espera un recurso poseido por el siguiente proceso de
la cadena.
recurso.
2. Condicin de
antes de empezar. Otra opcin sera lliberar los recursos que se tienen
antes de pedir nuevos.
3. Condicin de no expropiacin: no existe solucin en general...
4. Condicin de espera circular: peticin de los recursos de acuerdo a un
orden establecido.
38
21.2. Livelock
Problema de los lsofos
La solucin de Dijkstra: aisgnando prioridades a los tenedores.
La solucin por jerarqua/orden (Chandy/Misra - 1984):
Para cada par de lsofos que comparten un recurso, se crea un tenedor
y se le asigna al lsofo con menor ID. Cada tenedor est en estado sucio/limpio. Inicialmente sucio, cuando un lsofo necesita un tenedor, se
lo pide al vecino. Si el tenedor est limpio, lo mantiene, y si est sucio, lo
limpia y se lo da.
sys/ipc.h:
key
puede ser
IPC_CREAT
IPC_EXCL.
/* operation perms */
/* size of segment (bytes)
/* last attach time */
};
time_t shm_dtime;
time_t shm_ctime;
unsigned short shm_cpid;
unsigned short shm_lpid;
short shm_nattch;
*/
struct
};
ipc_perm {
key_t key;
ushort uid;
ushort gid;
ushort cuid;
ushort cgid;
ushort mode;
ushort seq;
/*
/*
/*
/*
/*
40