You are on page 1of 40

Diseo de Sistemas Operativos

Manuel Garca Garca


7 de junio de 2012

ndice
I Introduccin

1. Introduccin:

1.1.

historia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2.

Distribuciones Linux . . . . . . . . . . . . . . . . . . . . . . . . .

2. Caractersticas de los Sistemas Operativos

3. Fases de diseo de un S.O.

3.1.

Estructura

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2.

Fases de arranque del S.O. . . . . . . . . . . . . . . . . . . . . . .

3.3.

Planicacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3.1.

Los planicadores pueden ser: . . . . . . . . . . . . . . . .

3.3.2.

Para evitar tocar cosas en el mismo sitio tenemos:

. . . .

. . . . . . . . . . . . . . . . . . . . . .

3.4.

Direccionamiento virtual:

3.5.

Llamadas al sistema

. . . . . . . . . . . . . . . . . . . . . . . . .

3.6.

Decisiones a tomar en el diseo de un kernel . . . . . . . . . . . .

3.6.1.

Tolerancia a fallos y seguridad

3.6.2.

Proteccin basada en hardware vs proteccin basada en


software . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

3.6.3.

Microkernels y kernels monolticos

11

. . . . . . . . . . . . . . .

. . . . . . . . . . . . .

II Dispositivos, buers y cachs

13

4. Cach de datos.

14

5. Organizacin de un buer-cach.

14

6. Algoritmos del kernel para manejo del buer-cach.

15

7. Lectura/escritura de bloques en dispositivos

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

III Sistemas de Ficheros

18

8. Representacin interna y almacenamiento de los sistemas de


cheros
18
9. Llamadas al sistema para el sistema de cheros
2

19

IV Procesos

23

10.Organizacin y gestin de procesos

24

11.Estados y transiciones de estado de los procesos

24

12.Memoria para la gestin de procesos

25

13.Llamadas al sistemas para la gestin de procesos

25

14.Planicacin de procesos

26

V Memoria

30

15.Hardware

30

15.1. Modo real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

15.2. Modo protegido . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

15.3. Modo PAE

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

15.4. Long mode

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

15.5. Modo page

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

16.Memoria en el kernel y zonas de memoria

32

17.SLAB

32

18.El espacio direccionable de proceso

34

19.SWAP

35

19.1. Paginacin bajo demanda (lazy loading) . . . . . . . . . . . . . .

36

19.2. Paginacin anticipatoria . . . . . . . . . . . . . . . . . . . . . . .

36

VI Comunicacin entre procesos

36

20.Traza de procesos

36

21.Paso de mensajes. SYSTEM V IPC

37

21.1. Deadlock

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

21.2. Livelock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

21.3. SYSTEM V IPC

39

. . . . . . . . . . . . . . . . . . . . . . . . . . .

22.Memoria compartida

40

23.Semforos

40

ndice de guras
1.

Arquitectura de anillos . . . . . . . . . . . . . . . . . . . . . . . .

10

2.

inodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

3.

Estados de los procesos

4.

Slab

5.

Uso de

. . . . . . . . . . . . . . . . . . . . . . .

25

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

ptrace

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

Parte I

Introduccin
1. Introduccin:
1.1. historia
1965
1969

Laboratorios Bell: sistemas operativos multiusuario.


Multics.
Ken Thompson y Dennis Ritchie PDP-7

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-

ley Software Distribution)

1980

Richard Stallman estaba en el MIT y la impresora (Xerox 9700) vena


sin cdigo fuente y se pill un rebote y entonces empez con el movimiento
del software libre.

1983
1984
1985
1985
1987
1989

Stallman inicia el proyecto GNU


Stallman abandona el MIT
Stallman publica el maniesto GNU
Unix System V
Tannenbaum crea Minix (con nes educativos)
Stallman crea la licencia GPL (aplicado a editores de texto, compiladores y debugers)

1989

La universidad de California crea NET/1 (reescribiendo el cdigo de


4.3 BSD que era de ATT)

1991
1991

La universidad de California saca Net/2 y ATT les demanda


Linus Torvalds inicia el desarrollo de Linux a partir de herramientas
libres

1994

4.4 BSD Enumbered (para los que quisieran pagar a ATT) y 4.4 BSD
Lite

1995

4.4 BSD Lite Release 2 (ya continuando sin ATT)


De ah salieron FreeBSD, NetBSD, OpenBSD, DragonyBSD, ...
Las licencias de BSD permiten coger cdigo de ah y cerrarlo, como
por ejemplo:
Windows: TCP/IP
Darwin (kernel de OS/X, antiguo MacOS) est basado en 4.4 BSD
Lite 2 y FreeBSD
Solaris utiliza cdigo BSD

1.2. Distribuciones Linux


Slackware (1993 - )
Debian (1993 - ) Muy puristas y muy libres
Ubuntu (2004 - )
Linux Mint
SuSE

(1994 - )

openSuSE
RedHat

(2005 - ) comprada por Novell (2003)

(1995 - )

Fedora (2003 - )
Mandriva (2005 - ) / [Mandrake (1998 - ) / Conectiva (1995 - 2005)]
Knoppix

(2000 - )

2. Caractersticas de los Sistemas Operativos


Un S.O. es el responsable de gestionar y coordinar la comparticin de recursos limitada de que se disponen atravs de llamadas al sistema. Un usuario
accede a la UI (User Interface), ya sea GUI (Graphical User Interface) o CLI
(Command Line Interface). Entre los servicios que provee un kernel:
Controlar la ejecucin de procesos permitiendo:

Creacin

Terminacin

Suspensin

Comunicacin

...

Planicar los procesos de forma adecuada para su ejecucin en la CPU


Reservar memoria principal para un proceso en ejecucin.

Si el kernel escribe procesos enteros a swap, el sistema operativo se


dice que es un SO con swapeo

Si escribe pginas a memoria swap, se llama un sistema paginable


(paging system)

Reservar memoria secundaria para almacenamiento y obtencin eciente


de datos de usuario: sistema de cheros.
Permite a los procesos controlar los dispositivos perifericos terminales,
unidades de cinta/disco, interfaces de red, usb, etc...

3. Fases de diseo de un S.O.


3.1. Estructura
Aplicaciones
Resto del S.O.
Kernel
Firmware
Hardware

3.2. Fases de arranque del S.O.


El boot loader empieza ejecutando el kernel en modo supervisor.
El kernel se inicializa y ejecuta el proceso init en espacio de usuario. init X
lanza los scripts que hay en /etc/rcX.d/.
El kernel prepara un espacio de direcciones para el proceso, carga el cdigo
de la aplicacin en memoria, reserva una pila y pasa la ejecucin a una
direccin dentro del proceso para ser ejecutado.

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.

3.3.2. Para evitar tocar cosas en el mismo sitio tenemos:


mutex: lo que ya sabemos to el mundo
spinlock: igual que un mutex, pero se queda en un bucle activo

3.4. Direccionamiento virtual:


Paginacin: memoria virtual / swap, paginacin por demanda...
Segmentacin
El kernel del sistema operativo est

rulando en un espacio de memoria distinto

de los procesos de usuario. Estos dos espacios son:


Espacio de kernel
Espacio de usuario
No obstante, cuando un proceso quiere acceder a un dispositivo, esto ha de
ejecutarse en el espacio de kernel, donde se ejecutarn los mdulos (drivers) de
Linux.

3.5. Llamadas al sistema


El sistema operativo provee de libreras para ser llamadas por los programas
de usuario. Estos, han de

Linkado esttico:

linkar

las libreras proveidas por el sistema:

se copian las funciones de la librera al programa, de esta

forma el ejecutable nal tiene las funciones de la librera. En linux:

Linkado dinmico:

.a

se pone una referencia de dnde est la librera, y se pone

en memoria dinmicamente. En tiempo de compilacin, ser ms lento,


ya que hay que ir a buscar la librera y cargarla en memoria. Sin embargo, la correccin de errores en la librera no implica la recompilacin del
programa, y tambin el programa ocupa menos. En linux:

.so (libc.so)

Formas de hacer una llamada al sistema


Usar una interrupcin por software (como la

int 21

en MSDOS).

Usar una puerta de enlace (call gate).


Usar una instruccin especial de la CPU para hacer system call.
Usar una cola de peticiones.

3.6. Decisiones a tomar en el diseo de un kernel


Es muy importante la proteccin frente a fallos (tolerancia a fallos) y comportamientos maliciosos (seguridad)

Mecanismo (mechanism):

es el soporte que permite la implementacin de

varias polticas diferentes.

Poltica (policy):

es un modo de funcionamiento concreto, el cmo se com-

porta el sistema ante un determinado problema.

Ejemplo: el sistema de acceso a un ordenador pregunta user/password. El


mecanismo es el que se encarga de validar ese user/password. La poltica es el cmo se hace eso, por ejemplo: comprobandolo en el archivo
/etc/password, o comprobndolo en un servidor ldap, o comprobndolo
en un servidor mysql. Estas son distintas polticas.
Los mecanismos y polticas pueden ser:
Estticos: vienen puestos de fbrica y no se pueden cambiar a menos que
se reconstruya todo el sistema.
Dinmicos: pueden aadirse o sustituir nuevos una vez instalados el sistema.
Tambin pueden ser clasicados en:
Preventivos
Post-deteccin del problema

3.6.1. Tolerancia a fallos y seguridad


Concptos bsicos:

Principio de mnimo privilegio

dada una capa de abstraccin, cada mdulo

(proceso, usuario, etc) debe ser capaz de acceder slo y exclusivamente a


la informacin y recursos necesarios para su propsito legtimo, ni ms, ni
menos.

TCB (Trusted Computing Base)

es el conjunto de componentes (HW, rmware,

SW) que son crticos para la seguridad del sistema.

Arquitectura de anillo
Direccionamiento basado en capacidades (capabilities based addressing)
System 250 (1969) de Plessey Corportation
System/38 (1978) de IBM

Figura 1: Arquitectura de anillos

Los privilegios de uso de la memoria estn divididos en capas o anillos:

El anillo 0 es el kernel mode o espacio de kernel


Aunque los SO deberan tener 4 anillos, los sistemas operativos usan menos:
Windows y Linux usan solo:

Anillo 0 para kernel y drivers

Anillo 3 para aplicaciones

OS/2 usa:

Anillo 0 para kernel y drivers

Anillo 2 para cdigo privilegiado (accesos de entrada/salida y de red)

Anillo 3 para aplicaciones

Hypervisor: controla el acceso HW desde el anillo 0 o desde el anillo -1 (ah


con to la potencia de ser kernel) (Intel Vanderpool, AMD Pacca). Algunos de
ellos:
vmware
virtualbox
xeni
qemu
kvm

10

3.6.2. Proteccin basada en hardware vs proteccin basada en software


Proteccin basada en software: El kernel slo ejecuta cdigo compilado
able.

Ventajas:
No necesita espacios de direcciones separados
Flexibilidad en

Desventajas:
El tiempo que tarda en ejecutarse una aplicacin crece.
Tipado inexible

3.6.3. Microkernels y kernels monolticos


En un microkernel se incluyen mecanismos para abstraer el mayor nmero
de comportamientos posibles, e implementa las polticas en mdulos o en
espacio de usuario. Consisten en una capa de abstraccin para el HW con
un conjunto (pequeo) de

syscalls para implementar los servicios (gestin

de memoria, multitarea, comunicacin entre procesos, ...).

Ventajas:

Es ms modular, se pueden hacer cambios con facilidad.


Es ms seguro, los fallos estarn localizados en sitios concretos.
Se pueden programar partes del kernel en distintos lenguajes (por
ejemplo en lenguajes de alto nivel).

Se podra actualizar el kernel sin tener que pararlo.

Inconvenientes:

Hay ms cambios de contexto, es ms lento.

monoltico est inducido por la proteccin basada en la sepa-

El diseo

racin de espacio de usuario/kernel. Pech de cdigo en plan pelotera ah


a muerte.

Ventajas:

Como es un tocho de cdigo mu grande, no hay tantos cambios


de contexto.

Inconvenientes:

Es un tocho de cdigo y hacer cambios puede ser muy dicil.

11

Programacin en un solo lenguaje, como por ejemplo, el kernel


de Linux est hecho en C, y punto.

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

Dispositivos, buers y cachs


Los dispositivos se pueden categorizar en 3 tipos:

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

vers que salen to los dispositivos que hay en el orde-

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

El SO bloquea el proceso hasta que no termine el

acceso a los datos. Es lo ms usado, ya que si normalmente haces una


lectura, va a ser para trabajar con eso que has leido... as pues, hay que
esperar a que el SO me devuelva lo que quiero
Interfaz no-bloqueante El SO no bloquea los procesos que quieren acceder a los datos.
Interfaz asncrona El proceso hace la peticin al SO, el cual le da el dato
cuando ya haya acabado, interrumpiendo al proceso de forma asncrona.

Deniciones
Buer

se suele denir como una regin de memoria que almacena datos tem-

poralmente mientras son transferidos de un sitio a otro

13

Cach

es un conjunto de datos que duplican unos valores originales guardados

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

debera estar el tamao, dos nmeros.

brw-rw---- 1 root disk 8, 0 2012-03-14 22:07 /dev/sda


Donde aparecen los dos nmeros debera aparecer el tamao del archivo, pero
dado que

/dev/sda es un dispositivo, 8, 0 es el id del dispositivo. /dev/sda1


8, 1, /dev/sda2 tiene como id 8, 2, /dev/sdb tiene como id 8,

tiene como id

16...

4. Cach de datos.
5. Organizacin de un buer-cach.
El buer-cach se compone de dos partes funcionales:

Buers libres 512 bytes, 1024, 2048, 2096, 8192


La cach una tabla hash que es un vector de punteros a cadena de buers que
tienen todos el mismo ndice hash
Hay un LRU (Last Recently Used) por cada tipo de buer:

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.

BH_mapped El buer est mapeado en memoria.


BH_Req El buer se est usando en una peticin de E/S.
BH_Async_Read Se est haciendo uan peticin asncrona de lectura.
BH_Async_Write Se est haciendo uan peticin asncrona de escritura.
14

6. Algoritmos del kernel para manejo del buercach.


El kernel siempre trabaja con pginas. Una

pgina unidad mnima de memo-

ria con la que el kernel trabaja.


Para sistemas operativos de 32 bits

4 KB

Para sistemas operativos de 64 bits

8 KB

Las pginas estn divididas en bloques (un buer est relacionado con un
bloque).
Posibles situaciones de cach de pgina:

1)

Cuando la memoria libre baja de un lmite.

dirty_background_ratio
feres a

(en mi caso = 5) indica la proporcin de bf-

dirty del total. Cuando se alcanza esa proporcin, hay una opcin

wakeup_flusher_thread, que se encarga de llamar


flush-maj:min (en mi caso al hacer ps aux | grep flush
[flush-8:0]). [flush-8:0] para sda y [flush-8:0] para sdb.

del kernel llamada


al proceso
aparece

El proceso termina cuando:

a)
b)
2)

Se ha escrito el nmero mnimo de pginas especicado


La cantidad de memoria libre es superior a

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

temporizador expira cada

Todas estas cosicas (dirty_background_ratio ,


estn en

/proc/sys/vm.

dirty_expire_centisecs)

7. Lectura/escritura de bloques en dispositivos


7.1. Elementos bsicos
En el kernel 2.6 (3.x) el contenedor bsico para E/S es la estructura

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.

unsigned short bi_idx;


...
};
sctruct bio_vec {
struct page * bv_page;
unsigned int bi_vent;
unsigned short bi_idx;
};
request_queue

es la cola de peticiones pendientes de E/S de bloques a un

dispositivo. Est compuesta por

struct_request,

que contienen

struct_bio.

7.2. Planicador de E/S


El objetivo principal es mejorar el rendimiento, reducir los posicionamientos
de la aguja de disco.

7.2.1. Conceptos bsicos


Combinacin Cuando hay dos peticiones a dos bloques contiguos de disco, el
planicador lo pone como si fuera una sola peticin a un bloque (los dos bloques
juntos) de disco.

Reordenacin

Que la cola de peticiones (request_queue) est ordenada de

forma ascendente o descendente en la misma pista para que la aguja no tenga


que moverse pech

7.2.2. Tipos de planicadores


El elevador de Linus (Torvalds)

Estuvo en el kernel hasta la versin 2.4. Es

un algoritmo de combinacin y reordenacin. El unico problema es que reordena


por el principio del disco y deja to tirao a peticiones que pertenecen a cachos
ms del nal del disco.

Planicador Deadline

Algo muy importante es que las lecturas accedan a

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

(o de llegada, que es el mismo).


Y una cola de escritura (WRITE-FIFO-QUEUE) ordenada por tiempo de
deadline (o de llegada, que es el mismo).
Cuando va a planicar una peticin, compara las cabezas de las 3 colas,

SI se ha cumplido la hora de la de la cabeza de READ-FIFO-QUEUE


coge la cabeza de READ-FIFO-QUEUE
SINOSI se ha cumplido la hora de la de la cabeza de WRITE-FIFO-QUEUE
coge la cabeza de WRITE-FIFO-QUEUE
SINO
coge la cabeza de SORTED-FIFO-QUEUE

Planicador Anticipatorio

Tiene las tres mismas colas que el planicador

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 CFQ (Complete Fair Queueing) [este es el que se usa por


defecto en las distribuciones Linux hoy en da] Tiene una lista por cada
bloque de disco, y reordena las colas de cada lista (tambin combina peticiones
de disco contiguas) para que las agujas de disco se muevan de forma ptima.

Planicador NOOP

Tiene solo una lista FIFO y ni reordena ni recombina, lo

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.

8. Representacin interna y almacenamiento de


los sistemas de cheros
VFS (Virtual File Sistem)

Es el subsistema de Linux que se encarga de ab-

straer todas las operaciones que pueden realizarse sobre un sistema de


cheros. Por defecto estos sistemas de cheros en Linux son ext4 para los
discos duros, ext2 para los dispositivos USB y vFAT para las tarjetas SD.
En un sistema de cheros hay cuatro conceptos bsicos:
chero
inodo
entrada de directorio
punto de montaje
En unix las operaciones solbre un sistema de chero son:
creacin
borrado
montaje/desmontaje
lectura/escritura
etc...
Los cheros se organizan en directorios, por ejemplo:

/home/manolo/asd.ods

dentry ).

Donde

home

manolo

son entradas de directorio

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)

entrada de directorio (dentry,


chero (file,

dentry_operations)

file_operations)

Normalmente al formatear

(mkfs.ext4 /dev/sdb),

se crean un nmero deter-

minado de inodos (el que se cree conveniente), si se le pone adems

-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

y esto hace que no

se reserve nada para root.


Los inodos contienen una lista de bloques de disco que componen el chero.

El superbloque tiene un puntero a la entrada directorio raiz (s_root), que

es

/.

AHORA VIENE LA IMAGEN TO POTEN DE LOS INODOS Y LOS

BLOQUES

9. Llamadas al sistema para el sistema de cheros


Operaciones sobre cheros:

ssize_t read(int fd, void *buf, size_t count);


ssize_t write(int fd, const void *buf, size_t count);
19

int open(const char *pathname, int flags);


int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
int close(int fd);
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf); (funciona sobre el
enlace, no sobre lo que est apuntando)

oldstat
oldfstat
statfs

off_t lseek(int fd, off_t offset, int whence)

(posiciona el pun-

tero en un punto del chero)

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

con el que se accede al sistema de cheros en

lugar de usar el actual; hay que ser root para esto)

setfsgid

(cambia el

GID

con el que se accede al sistema de cheros en

lugar de usar el actual; hay que ser root para esto)

getdents
flock
readv
writev
pread64
pwrite64
getcwd

(get current working directory)

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

int sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned


int flags) (sirve para sincronizar una parte de un chero especco
La misma llamada puede venir en 3 formatos:
funcion coge el path del chero
uncion coge el descriptor del chero
lfuncon

tiene en cuenta que el chero es un enlace

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...

Thread, hilo, LWP (Light Weight Process)


Un thread es un tipo especial de proceso. Dos threads del mismo proceso son
solo dos procesos que estn en el mismo grupo de hilos. Cada thread incluye:
un contador de programa (PC, program counter)
una pila
el conjunto de registros del procesador
Los threads se pueden implementar de 3 formas:
Totalmente en espacio de usuario:

Ms rpido
Problema ya que no se pueden ejecutar 2 hilos de un mismo proceso
a la vez

Menos estable

Totalmente en espacio de kernel:

Menos rpido
Ms estable

De forma hbrida
En Linux existen los lpthreads (con la NPTL, Native POSIX Thread Library)

23

10. Organizacin y gestin de procesos


Creacin de procesos:
Nueva pila (stack), estructura, thread_info, task_struct
Se chequea el nmero mximo de procesos para dicho usuario
Algunos miembros de la estrctura de proceso se diferencian (estadsticas)
La tarea se pone a
Se llama a

TASK_UNINTERRUPTIBLE

copy_flags

que actualiza las los ags de

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

acaba y devuelve un puntero al nuevo hijo

Quien se pone a ejecucin despues de hacer un

fork? El padre o el hijo?

El hijo porque...

11. Estados y transiciones de estado de los procesos


El kernel guarda la lista de procesos en una lista circular doblemente enlazada

(tasklist,

struct task_struct, <linux/sched.h>)

Hay un proceso que se ejecuta al arrancar el sistema operativo:

24

init.

Figura 3: Estados de los procesos

12. Memoria para la gestin de procesos


13. Llamadas al sistemas para la gestin de procesos
fork() (crea
vfork()
execvp()
execv()
exec..

una copia del proceso con

clone())

(reemplaza el proceso por otro)

exit(int)(salir

de un proceso proceso)

getpid() (obtiene el id del proceso)


getppid() (obtiene el id del padre del proceso)
getgid() (obtiene el id del grupo del proceso)
getpgid() (obtiene el id grupo del padre
getegid() ()
getregid() ()
getuid() (obtiene el id del usuario del proceso)
getpuid() (obtiene el id del usuario padre del proceso)
getegid() ()
getregid() ()
getsid() (obtiene el id de la sesin del proceso)
getfsuid() ()

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)

(mandar una seal 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()

14. Planicacin de procesos


El planicador es el que se encarga de poner procesos en ejecucin para
que estos se ejecuten (aparentemente) de forma paralela. Entonces, el sistema
operativo es multitarea.
Multitarea cooperativa (Mac OS, Windows 9x)

26

Multitarea expropiativa (O(1))


Los procesos limitados por E/S o por procesador.

Prioridad de procesos:

Un algoritmo es usar la prioridar, (+ prioridad

timeslice). La prioridad puede ser modicada por el proceso, el SO o el usuario.


+ E/S

+ CPU

+ prioridad

- prioridad

Rango de prioridad estandar: [-20 (mximo timeslice) ... 0 (estndar) ...


+19 (mnimo)]

Mnima prioridad (+19)

Prioridad por defecto (0)

Mxima prioridad (-20)

Recin creado

0 ms

5 ms

100 ms

800 ms

1/2 de la del padre

tiempo del proceso ha expirado

Rango de prioridad en tiempo real: [1 (mximo) ... 99 (mnimo) 100 ...


140]
Con un timeslice alto:

+
+

rendimiento
latencia

Con un timeslice alto:

rendimiento
latencia

Cada quantum de tiempo que el proceso puede ejecutarse y el planicador se lo


niega, se incrementa la prioridad dinmica

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

por procesador, contiene procesos RUNNABLEs, contiene 2 prio_array


prio_array contiene una cola de procesos RUN-

(activos y expirados). Cada

ABLEs por nivel de prioridad (contiene un bitmap de prioridad)

struct prio_array{
int nr_active,
unsigned long bitmap[BITMAP_SIZE],
struct list_head queue[MAX_PRIO]
};
BITMAP_SIZE

donde

es 5 (2

= 32, tamao de un long) y

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

struct task_struct * prev = current;


prio_array * array = rq->active;
int idx = sched_load_first_bit(array->bitmap);
list_head * queue = array->queue + idx;
next = list_entry(queue->next, struct task_struct, run_list);
sleep_avg

MAX_SLEEP_AVG (10 ms). Despus de dormir


sleep_avq. Por cada tick que el proceso usa CPU, se decre-

guarda la media de 0 a

se incrementa
menta.

sleep_avg

calcua el nuevo timeslice (-20

Balanceador de carga

800 ms, 0 100 ms, +19 5 ms)

1 runqueue

Si no hay SMP, ni siquiera se compila


Si un runqueue se queda vaco, se llama a

load_balance.

El otro caso en que se llama es con un timer. Cada 1 ms si est en

idle, cada

200 ms en otro caso.

1.

field_busiest_queue,

devuelve la runqueue ms grande si tiene al menos

un 25 % ms procesos que la actual.

2.

Se decide de qu

prio_array.

Se preere el de procesos expirados (ya que

esos no se estn ejecutando en este momento, aunque si est vaco, se coge


el

prio_array

de procesos activos.

28

3.
4.

Busca la lista con ms prioridad con tareas


Se mira cada proceso de esa

prio_array

que no estcorriendo que se pueda

migrar y no est en la cach de la CPU. Si se encuentra

5.

Mientras no estn balanceados, se repiten 3 y 4.

29

pull_task

Parte V

Memoria
15. Hardware
15.1. Modo real
Memoria convencional

Memoria superior (Upper Memory Area)

640 KB

640 KB

Memoria extendida

1 MB
...

1 MB

Area de memoria alta (High Memory Area)

64 KB a partir de 1 MB menos 16 bytes

15.2. Modo protegido


En los 386 y posteriores se usan direcciones lgicas de 48 bits. En la unidad
de segmentacin se comprueban y traducen a direcciones lineales de 32 bits.
Una direccin lgica (48 bits) se compone de:
16 bits: selector de segmento

2 bits: RPC (Request Privilege Level)

1 bit: TI (Table Indicator)

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).

La direccin se calcula de la siguiente forma:


1. Se mira el indicador de tabla:

a)
b)

Global Description Table (si TI = 0)


Local Description Table (si TI = 1)

2. Se checkean los privilegios:

a)

Si DPL < max (CPL, RPL)

General Protection Fault (GPF, SIG-

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

5. Los 32 bits se dividen en 3 partes:

a)
b)
c)

10 bits que direccionan en el primer nivel de pginas


10 bits que direccionan en el segundo nivel de pginas.
12 bits que apuntan a un MB concreto del tercel nivel de pginas.

As, con 32 bits podemos direccionar 4 GB.

*
*
*

DPL = Descriptor Privilege Level


CPL = Current Privilege Level (viene dado por los 2 bits ms bajos de CS)
RPL = Request Privilege Level

__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

15.3. Modo PAE


1. Para activar el modo PAE, hay que activar el bit 5 del CR4.
2. Los 32 bits de la direccin se dividen ahora en 4 partes:

a)
b)
c)
d)

2 bits para seleccionar dentro de la tabla de punteros del directorio


de pginas
9 bits que direccionan en el primer nivel de pginas
9 bits que direccionan en el segundo nivel de pginas.
12 bits que apuntan a un MB concreto del cuarto nivel de pginas.

15.4. Long mode


1. Aunque los punteros son de 64 bits, en la actualidad se usan solo 48 bits,
ya que no hay gente que tenga 16 EB (exabyte) de memoria.
2. Los 64 bits de la direccin se dividen ahora en 5 partes:

a)
b)
c)
d)
e)

9 bits que direccionan en el primer nivel de pginas


9 bits que direccionan en el segundo nivel de pginas
9 bits que direccionan en el tercer nivel de pginas.
9 bits que direccionan en el cuarto nivel de pginas.
12 bits que apuntan a un MB concreto del quinto nivel de pginas.

31

15.5. Modo page


40 bytes de struct page:

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;
}

16. Memoria en el kernel y zonas de memoria


Hay varias zonas de memoria:

ZONE_DMA

[0 - 16 MB] Los antiguos dispositivos ISA iban (a la fuerza)

aqu, aunque hoy en da cualquier dispositivo puede ir aqu.

ZONE_NORMAL

[0 ~ 1GB (896 MB)] Zona de memoria a la que accede el

kernel

ZONE_HIGHMED

[896

] Zona de memoria que no se mapea por el kernel

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

void (*dtor) (void *, kmem_cache_t *, unsigned

long));

Una llamada sera as:

kmem_cache_create(.., construye_estructura, destruye_estructura)


Los posibles ags seran:

SLAB_NO_READ
SLAB_HWCACHE_ALIGN
SLAB_MUST_HWCACHE_ALIGN
SLAB_POISON ( a5a5a5a5)16 = 1010010110100101101001011010101)2 )
SLAB_RED_ZONE
SLAB_PANIC

(Fallo de memoria en la zona del kernel, Kernel Panic)

kmem_cache_destry(kmem_cache_t * cachep)

La pila del kernel


Se usan 2 pginas por proceso para la pila del kernel.
Si la pgina es de 4 KB

8 KB ocupados

Si la pgina es de 8 KB

16 KB ocupados

18. El espacio direccionable de proceso


Una direccin de memoria es un valor del espacio de direcciones, generalmente se presenta en hexadecimal. A veces se prepresentan intervalos de direcciones al que un proceso puede acceder (se le llama rea de memoria), y se
escriben como 08048000-0804c000.
Las reas de memoria tienen permisos asociados: de lectura, escritura, ejecucin, ... Si un proceso se sale de ese rea

Fallo de Segmento (Segmentation

Fault).

Mapa de memoria de un proceso (ejecutable, archivo binario):


Un mapa de memoria del cdigo ejecutable del binario seccin de
texto.
Un mapa de memoria de las variables globales inicializadas del binario

seccin de datos.

Un mapa de memora de la pgina cero, con variables globales sin inicializar

seccin bss (block started by symbol ).


34

Un mapa de memora de la pgina cero, usado por la pila de espacio de


usuario del proceso.
Una nueva seccin de texto, datos y bss por cada librera compartida con
la que el proceso enlace (libc, ld, etc...).
Cualquier chero mapeado en memoria.
Cualquier segmento de memoria compartida.
Cualquier mapeo de memoria annima (por ejemplo de un malloc).
Las zonas de memoria de un proceso pueden verse haciendo

cat /proc/<pid>/maps.

vm_area_struct
mm_struct
task_struct

unsigned long do_mmap(struct file, unsigned long addr,


unsigned long len, unsigned long prot,
unsigned long flag, unsigned long offset);
PROT_READ
PROT_WRITE
PROT_EXEC
PROT_NONE
MAP_SHARED
MAP_PRIVATE
MAP_FIXED
MAP_ANONYMOUS
MAP_GROWSDOWN
MAP_DENYWRITE
MAP_EXECUTABLE
MAP_LOCKED
MAP_NORESERVE
MAP_POPULATE
MAP_NONBLOCK
mmap2 (void * start, size_t length, int prot, int ags, int fd, o_t
pyo )

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.

Se decide qu proceso que se va meter en memoria SWAP.


Se determina la localizacin del dato (lo que se va a mover) en el almacenamiento auxiliar.

35

Se obtiene una pgina vaca de RAM.


Se cargan los datos en la pgina.
Se actualiza la tabla de pginas para mostrar la nueva pgina.
Se devuelve el control al programa reintentando transparentemente la instruccin que provoc el fallo de pgina.

19.1. Paginacin bajo demanda (lazy loading)


Las pginas se van cargando conforme van haciendo falta.

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.

19.2. Paginacin anticipatoria


Las pginas cargan antes al principio de la ejecucin del programa.
Ante un fallo de pgina, quizs luego se pidan las siguientes de direcciones
virtuales.
Si un programa acaba, dejando memoria libre, quizs se ejecute algn otro
desde SWAP.

Parte VI

Comunicacin entre procesos


20. Traza de procesos
Para que un padre pueda recibir la traza de un hijo se usa la llamada

ptrace():

long ptrace(enum __ptrace_request request, pid_t pid, void


* addr, void * data);
36

Se puede utilizar antes de llamar a

exec(),

para que el padre trace al hijo:

fork(..);
ptrace(PTRACE_TRACEME, ..)
exec(..);
O tambin, para trazar un pid concreto:

ptrace(PTRACE_ATTACH, pid, ..);


Tipos de request (los

SET

PTRACE_TRACEME:

son principalmente para procesos como el gdb y tal):

para trazar al propio proceso .

PTRACE_PEEKTEXT, PTRACE_PEEKDATA:

para cogeque llamar de memoria.

PTRACE_POKETEXT, PTRACE_POKEDATA:

para poner en memoria.

PTRACE_GETREGS, PTRACE_GETFPREGS:

para coger los valores de los reg-

istros.

PTRACE_GETSIGINFO:

para coger informacin acerca de las seales.

PTRACE_SETREGS, PTRACE_SETFPREGS:

para cambiar los valores de los

registros.

PTRACE_SETSIGINFO:
PTRACE_CONT:

para hacer continuar al proceso.

PTRACE_SYSCALL:

para hacer una llamada al sistema.

PTRACE_SINCLESTEP:
PTRACE_KILL:

para cambiar informacin acerca de las seales.

para que se ejecute una sola instruccin.

para hacer terminar el proceso.

PTRACE_ATTACH:

para trazar un determinado proceso.

PTRACE_DETACH:

para dejar de trazar un determinado proceso.

21. Paso de mensajes. SYSTEM V IPC


Hay un lmite N de cantidad de mensajes.

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

Condiciones de Coman para que aparezca un deadlock :


1. Condicin de exclusin mutua: un recurso no puede ser usado por ms de
un proceso a la vez.
2. Condicin de

Hold & Wait : procesos que ya tienen recursos piden nuevos

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.

Cmo solucionar las situaciones de las condiciones de Coman (1971):


1. Condicin de exclusin mutua: tener un

daemon que serializa el acceso al

recurso.
2. Condicin de

Hold & Wait : pedir todos los recursos que se necesitarn

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.

21.3. SYSTEM V IPC


Usos principales de System V IPC:
Sincronizarse con otros procesos mediante semforos.
Enviar mensajes y recibirlos.
Compartir un rea de memoria.
Un recurso IPC es persistente (semforos, colas de mensajes, memoria compartida) y contiene:

IPC key (id/nombre del chero/objeto)


Identicador IPC (descriptor de chero)
Ambos (IPC key e identicador IPC son enteros de 32 bits).
Para obtener estos recursos hay que hacer uso de las llamadas de

sys/ipc.h:

Semforo: int semget(key_t key, int nsems, int semflg); (sys/sem.h)


Cola de mensajes: int msgget(key_t key, int msgflg); (sys/msg.h)
rea de memoria compartida: int shmget(key_t key, size_t size,
int shmflg); (sys/shm.h)

key

puede ser

IPC_CREAT

IPC_EXCL.

Otras funcioncitas y structs interesantes:

void *shmat(int shmid, const void *shmaddr, int shmflg);


void *shmat(int shmid, const void *shmaddr, int shmflg);
struct shmid_ds {
struct ipc_perm shm_perm;
int shm_segsz;
*/
time_t shm_atime;
39

/* 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;
*/

last detach time */


last change time */
pid of creator */
pid of last operator */
no. of current attaches

struct

};

ipc_perm {
key_t key;
ushort uid;
ushort gid;
ushort cuid;
ushort cgid;
ushort mode;
ushort seq;

/*
/*
/*
/*
/*

/* owner euid and egid */


/* creator euid and egid */
/* access modes see mode flags below */
/* slot usage sequence number */

22. Memoria compartida


23. Semforos

40

You might also like