Sunteți pe pagina 1din 8

Sobre tipos reales Mensaje n.

23 FLIX ADAME TOLEDANO Febrero 24, 2011

En el libro dice acerca de los tipos reales, que se distinguen: "float" para precisin simpley "double" para precisin doble en lo que se refiere a nmeros en coma flotante (habitualmente 32 y 64 bits respectivamente), pero en el apartado de los "double" dice que si va precedido de "long" es de tamao igual a 10 bytes (80 bits). Significa esto que no tiene ningn sentido escribir "long float" en ningn tipo de compilador? Si no es as, De cuantos bits constara?. Perdn si la pregunta es muy tonta.
Mensaje n. 25 JOSE MANUEL MORATO ESCANDELL Febrero 24, 2011

El standard de C solo define tres tipos diferentes para los nmeros reales, que son los que aparecen en el libro (float, double, long double), por lo tanto si declaras una variable como long float seguramente te de un error de compilacion, ademas, si no me engao el tipo long double no tiene pq ser mayor que double depende del compilador, creo que el compilador de microsoft VC++ no hace distincion alguna. Si compilas con gcc este programa de ejemplo:
#include main() { printf("El tamao de double es %d bytes\n", (int)sizeof(double)); printf("El tamao de long double es %d bytes\n", (int)sizeof(long double)); }

veras por la salida de la consola:


jmorato$ ./test

El tamao de double es 8 bytes. El tamao de long double is 16 bytes. Como ves el tamao del long double es de 16 bytes por razones de almacenamiento pero el dato solo utiliza una precision de 10 bytes.

arrays con punteros Mensaje n. 63 FERMN SILVA Marzo 11, 2011

Tengo una duda al acceder a arrays basandome en la posicion inicial (osea el puntero). Viniendo del mundo de java y .net no estoy muy seguro de como se maneja esto, pero tengo mis ideas / sospechas. En el libro pone que para acceder al segundo elemento del array basta con *(puntero + 1). Para el tercero *(puntero + 2), etc. Ahora bien, si mal no tengo entendido puntero es una direccion de memoria, y el +1 me indica "la direccion inmediatamente siguiente". Que pasa si tenemos un array de double? la siguiente posicion de memoria no seguiria siendo parte del double? No deberiamos hacer *(puntero + 2) para acceder al segundo elemento? Peor aun si tenemos un array de structs...Seria correcto, como una solucion general, hacer algo como: i-esimo elemento = *(puntero + i * sizeof(tipo_elemento) / 4) ?? (puse dividido 4 porque sizeof devuelve el tamao en bytes, creo, asi que si las palabras son de 4bytes cada una - 32 bits-, habria que dividir por 4 para obtener la cantidad de palabras)
Mensaje n. 64 VICENTE DAVID CANTO CASASOLA Marzo 11, 2011

Vas bastante bien encaminado. Hay algo por ah que se llama aritmtica de punteros. Si lo buscas porla Web encontrars muchas pginas explicndolo con ms correcin, pero viene a ser algo as como que (puntero + 3) en realidad es una forma edulcorada de la direccin fsica puntero + 3 sizeof(*puntero) , donde es el signo de multiplicar (para evitar equvocos con la desreferenciacin de *). Haba un libro de C++ de Walter Savitch donde todo esto vena muy bien explicado. No es el mismo lenguaje, pero para ciertos aspectos se le parece.
Mensaje n. 68 FERMN SILVA Marzo 14, 2011

Tengo un amigo q me prestara un libro de C/C++ pero aun no lo vi.Veo que mi apreciacion era correcta. Sin embargo, no es que sizeof devuelve el tamao en bytes? Por ejemplo sizeof (int) en mi caso es 4, aunque en el libro ponga 2 (hoy en dia en todas las

computadoras modernas el int ocupa 32 bits supongo) No estaria sumandole 4 al puntero en vez de 1?
Mensaje n. 69 VICENTE DAVID CANTO CASASOLA Marzo 15, 2011

En tu caso, como bien dices, el tamao de un int es 4. (En el mo tambin) Pero en otra mquina puede ser distinto, por ejemplo 2. Con todo este lo se consiguie lo siguiente: si tienes una matriz que empieza en la posicin de memoria 9000, el siguiente elemento empezar en 9004, el tercero en 9008, que sern 9000, 9000 + 1 y 9000 + 2 EN ARITMTICA DE PUNTEROS. Si nos llevamos tu programa a la otra mquina, donde el tamaa de int era 2, podremos compilar el mismo programa y har referencia a las posiciones de memoria 9000, 9002 y 9004, pero seguirn siendo el 9000, 9000 + 1 y 9000 + 2 con la misma aritmtica. Ten cuidado con la mezcla C y C++. Hay muchas similitudes pero tambin diferencias sutiles.
Mensaje n. 72 DAVID GARCA NEZ Marzo 15, 2011

El compilador lo traduce al tamao adecuado: int p []= {1,2,3}; // (4 bytes) 0x080483cd <+9>: movl $0x1,0x34(%esp) 0x080483d5 <+17>: movl $0x2,0x38(%esp) 0x080483dd <+25>: movl $0x3,0x3c(%esp) char d [] = {1, 2, 3}; // (1 byte) 0x080483e5 <+33>: movb $0x1,0x1d(%esp) 0x080483ea <+38>: movb $0x2,0x1e(%esp) 0x080483ef <+43>: movb $0x3,0x1f(%esp)
Mensaje n. 76 FERMN SILVA Marzo 17, 2011

Osea que en conclusion puedo hacer puntero + indice y el compilador automaticamente avanzara a la direccion que le corresponda (saltando todos los bytes que tenga que saltar) sin que tenga que hacer sizeof ni nada, ok ? Mensaje n. 78 DAVID GARCA NEZ Marzo 17, 2011
Como has visto en el desensamblado el compilador convierte el tipo en una base y el desplazamiento en un multiplicador. Si tengo tipos "int", en 32 bits normalmente son 4 bytes. Para saltar al siguiente entonces es 4 * desplazamiento. Quiero llegar al tercer elemento de un array: tamao_int * (posicion_en_array-1) = desplazamiento direccin_del_primer_elemento_del_array + desplazamiento = comienzo_elemento_elegido
Mscara de modo simblica (s5s4s3) Mensaje n. 73 MIGUEL NGEL ALCAL ALFARAZ Marzo 16, 2011

Me surge la duda respecto a los caracteres de permisos referentes al grupo. Dado que un usuario puede pertenecer a varios grupos, cmo debe entenderse "los miembros del grupo al que pertenece el propietario del fichero" (pg. 126)? Se est refiriendo el texto al "grupo propietario" de cada fichero (pg. 124, 3.4.4)? Cmo se asigna el grupo propietario a un fichero en el momento de su creacin?Y a raz de estas dudas, salen otras: Puede el propietario de un fichero no pertenecer al grupo propietario de ese fichero? Si un usuario pertenece a dos grupos, uno que s tiene permisos sobre un fichero y otro que no los tiene sobre ese mismo fichero, qu prevalece?; imagino que el usuario tendra esos permisos.
Mensaje n. 74 VICENTE DAVID CANTO CASASOLA Marzo 17, 2011

Te cuento lo que he estado probando y los resultados. Primero he creado un fichero:


$ yes > foo.txt $ ^C (hay que pararlo o llenar el disco)

A continuacin, he mirado los permisos del fichero:


$ ls -l ./foo.txt

Y he obtenido el usuario y el grupo, entre otras cosas. He mirado a qu grupos pertenezco:


$ groups

Y he obtenido unos pocos, por ejemplo audio. He probado a cambiar el grupo a audio:
$ chgrp -R audio ./foo.txt $ ls -l ./foo.txt

Y el grupo est cambiado. He cambiado de usuario:


$ su $ (contrasea de root)

Y he mirado los permisos:


# ls -l ./foo.txt

(Ya los conoca) Como root, puedo cambiar los permisos que quiera. Lo he pasado al grupo root!!
# chgrp -R root ./foo.txt # ls -l ./foo.txt

Y salgo de root y miro permisos como usuario vulgar:


# exit $ ls -l ./foo.txt

Mi usuario no pertenece a ese grupo (afortunadamente). Vuelvo a cambiar el grupo a cdrom:


$ chgrp -R cdrom ./foo.txt

Me arrepiento e intento devolverlo a root:


$ chgrp -R root ./foo.txt

Y no me ha dejado. Ofuscado, borro el fichero y salgo:


$ rm ./foo.txt $exit
Mensaje n. 75 EQUIPO DOCENTE Marzo 17, 2011

En realidad donde pone "miembros del grupo al que pertenece el propietario del fichero" debera poner "miembros del grupo propietario del fichero". Cuando se crea un fichero el propietario es el creador (uid) y el grupo propietario coincide con el grupo (gid) asignado al creador del fichero. Pero se puede cambiar el propietario y el grupo propietario usando, por ejemplo, los comandos: chown y chgrp. De todas formas le recomiendo que haga pruebas del tipo de las propuestas por su compaero Vicente, ya que son muy didcticas.
Mensaje n. 80 MIGUEL NGEL ALCAL ALFARAZ Marzo 17, 2011

Tras haber estado haciendo unas cuantas pruebas (utilizo Ubuntu) obtengo algunas conclusiones: Al crear un usuario se crea un grupo homnimo. El usuario pertenece a ese grupo. Los archivos que cree pertenecern a ese grupo, independientemente de que el usuario pertenezca a otros grupos. En la correspondiente entrada del grupo en /etc/group no aparece el usuario. El usuario, por tanto, no puede dejar de pertenecer a su grupo homnimo. El archivo puede cambiar de grupo propietario. Los caracteres s5, s4 y s3 de la mscara de modo simblica se refieren al grupo propietario vigente. Al eliminar el usuario se elimina tambin su grupo homnimo, salvo que algn otro usuario pertenezca a ese grupo.

pause() SIGCONT Mensaje n. 91 ANTONIO JESS TORRES MERAL Marzo 23, 2011

Tengo una duda con respecto al funcionamiento de pause(). Por lo que s, la funcin pause() para a un proceso a la espera de recibir una seal. Al enviarle una seal se proceder a realizar la accin asociada a dicha seal. Bueno pues mi duda se plantea en este codigo :
void main() { pause(); printf("\nSe continua con el proceso\n"); exit(0); }

Si yo ejecuto este programa se creara un proceso que quedara parado por pause() a la espera de que se le enve alguna seal. Si yo desde un terminal le envo la seal kill -SIGCONT PID , el proceso debera continuar he imprimir el mensaje de printf y posteriormente finalizar su ejecucin. Bueno, pues yo hago eso y el proceso sigue parado, no hace absolutamente nada.
Mensaje n. 92 JOSE MANUEL MORATO ESCANDELL Marzo 23, 2011

Debe ser pq esta ignorando la seal. Prueba declarando explicitamente el manejador de la seal en el codigo:
#include #include #include void Manejador_SIGCONT (int sig); int main() { signal(SIGCONT, Manejador_SIGCONT); printf("\nSe pausa el proceso\n"); pause(); printf("\nSe continua con el proceso\n"); return 0; } void Manejador_SIGCONT (int sig) { }
Mensaje n. 93 EQUIPO DOCENTE Marzo 24, 2011

Lo que est sucediendo es que el comportamiento por defecto de la seal SIGCONT es ignorarla (ver Tabla 5.1, pp.213), por ello hay que cambiar su comportamiento con la llamada al sistema signal y especificar un manejador para la misma tal y como le indica su compaero Jose Manuel.

Mensaje n. 94 ANTONIO JESS TORRES MERAL Marzo 24, 2011


Efectivamente, no m percate de tal detalle importante y me estaba volviendo loco.

posible errata Mensaje n. 112 MIGUEL NGEL ALCAL ALFARAZ Abril 26, 2011

En la pgina 338 del manual, en el primer prrafo completo, podemos leer "Ciertas utilidades de usuario como newfs o mkfs permiten crear un sistema de ficheros UNIX en un disco fsico". Por el contexto creo que debe decir "en un disco lgico.
Mensaje n. 113 EQUIPO DOCENTE Abril 26, 2011

En realidad en vez de "disco fsico" debera decir "particin".

Direccin virtual y rea de intercambio Mensaje n. 124 DAMIAN USHEFF VELLIANITIS Mayo 3, 2011

me est costando bastante entender el tema 9 del libro. Tengo una pregunta (que quiz parezca medio tonta pero no veo dnde indica esto en el mismo libro). Si yo en un instante determinado de tiempo detengo TODO en el ordenador (procesos, intercambios... todo), exactamente dnde estara ubicada FSICAMENTE una direccin virtual (digamos, los bits que estn a 1 y a 0 que indican la direccin virtual) y el rea de intercambio?... entiendo que ambas deberan estar fsicamente alojadas en algn lugar del disco rgido pero... es as o estn en memoria principal o en memoria cach o en algn otro lado???
Mensaje n. 125 EQUIPO DOCENTE Mayo 4, 2011

UNIX utiliza la tcnica de gestin de demanda de pgina para gestionar la memoria. En consecuencia el espacio de direcciones virtuales de un proceso se descompone en pginas que se van cargando en la memoria principal conforme se van necesitando (fallos de pgina). Las tablas de pginas son las estructuras de datos que indican en que marco de la memoria principal (rango de direcciones fsicas) se aloja una determinada pgina de un proceso. Las pginas de un proceso se crean a partir de las regiones del espacio de direcciones virtuales del proceso, las cuales a su vez se crean a partir del fichero ejecutable ubicado en un sistema de ficheros en disco. Tambin existen pginas intercambiadas en el rea de intercambio en disco.
Mensaje n. 127 DAMIAN USHEFF VELLIANITIS Mayo 4, 2011

Esto quiere decir que los bits tanto que indican una direccin virtual como los bits del rea de intercambio estn todos guardados en el disco rgido, verdad?
Mensaje n. 131 EQUIPO DOCENTE Mayo 5, 2011

Las pginas en que se descomponen las regiones de cdigo y de datos del espacio de direcciones virtuales de un proceso se crean a partir de un fichero ejecutable que est alojado dentro de un sistema de archivos en memoria secundaria (tpicamente el disco duro). Cuando se referencia a una direccin virtual que hace referencia a una pgina que no est cargada en memoria principal se produce un fallo de pgina y la pgina es cargada en memoria principal desde memoria secundaria a partir del fichero ejecutable o desde el rea de intercambio (si la pgina ya se cre y fue intercambiada anteriormente).

semctl Mensaje n. 133 ESTEFANIA CASTRO VIZOSO Mayo 5, 2011

Hola, alguien me puede confirmar el significado de esta instruccin? u = semctl (x, 0, SETALL, 0); Se inicializa el valor de todos los semforos del array o conjunto de semforos indicado por el puntero x con el valor 0. Lo que no entiendo, que se semnum -> 0 (semnum es el identificador de un semforo concreto dentro del array), por lo que solo se debera cambiar el valor del semforo 0 no?

Colas de dispersin y lista de buffers libres Mensaje n. 141 MIGUEL NGEL ALCAL ALFARAZ Mayo 12, 2011

Me surge una duda al respecto de estas dos estructuras. Segn he entendido, cuando el ncleo necesita un bloque lo buscar en una de las colas de dispersin y slo en una, ya que un bloque, segn su nmero, slo puede ocupar una de las listas. Sin embargo, la lista de bloques libres abarca todas las colas de dispersin, tal y como puede comprobarse en la figura 8.4 (pg. 350). "Cuando el ncleo necesita un buffer libre, toma el buffer ms cercano a la cabecera", el usado menos recientemente, segn la estrategia LRU. Aqu es dnde aprecio una posible contradiccin. Si se toma el buffer ms cercano a la cabecera de la lista de buffers libres, ste puede pertenecer a cualquiera de las listas de dispersin y all se ubicara el bloque a cargar, aunque perteneciera a una cola de dispersin distinta a la que le correspondera por su nmero de bloque. Supongamos que un bloque por su nmero debe estar ubicado en la cola de dispersin a y, sin embargo, ha sido situado en la b; en esa situacin el ncleo no encontrara el bloque en la cola correspondiente y tendra que buscarlo en el resto de colas, perdiendo toda utilidad la estructura de colas de dispersin. Como esto no sera admisible, debo suponer que un buffer, aunque est libre, permanece en una cola de dispersin por si el ncleo necesitara de nuevo esos datos, siendo suficiente en ese caso eliminar el buffer de la lista de buffers libres. Por otra parte, entiendo que, cuando un bloque es cargado en un buffer, ste debe moverse a la correspondiente cola de dispersin mediante la manipulacin de los correspondientes punteros en la cola de dispersin inicial y la de destino. Supongo bien?
Mensaje n. 142 EQUIPO DOCENTE Mayo 12, 2011

Seguramente su duda surge de que la lista de buffers libres ha sido dibujada en la Figura 8.4 sobre la cach de buffers. Realmente la lista de buffers libres se implementa mediante punteros pero trabajando sobre direcciones de memoria, recuerdese que un buffer no es ms que un espacio de memoria principal, cada buffer tiene una direccin de memoria asignada por lo que no surge el problema que comenta. Otra cosa es saber que contiene cada buffer para luego poder utilizarlo cuando se busque, es hay donde entra en juego la implementacin de la cach mediante colas hash.

Pginas libres con contenido vlido Mensaje n. 148 MIGUEL NGEL ALCAL ALFARAZ Mayo 17, 2011

En la pg 412 del manual, en el tercer prrafo, se indica que el ncleo, al producirse un fallo de pgina, consultar la lista de marcos de pgina libres para, en caso de encotrar la pgina buscada, no tener que leerla desde el dispositivo de intercambio. Al final del prrafo leo "la pgina ser, de todos modos, intercambiada si ya se ha colocado en la lista de pginas que deben ser transferidas". Entiendo que "intercambiada" alude a que ser almacenada en el dispositivo de intercambio (porque se elimina de la lista de pginas para ser transferidas) y que el ncleo, para que permanezca en memoria, la eliminar de la lista de marcos de pgina libres y actualizar los campos correspondientes (valida, edad, etc.) en las diferentes tablas. Es correcto?
Mensaje n. 149 EQUIPO DOCENTE Mayo 17, 2011

Su razonamiento es casi correcto con una salvedad: la pgina es intercambiada (copiada en el rea de intercambio) porque se encuentra en la lista de pginas para ser transferida, no "(porque se elimina de la lista de pginas para ser transferidas)".
Mensaje n. 150 MIGUEL NGEL ALCAL ALFARAZ Mayo 17, 2011

Correcto, quera decir "porque NO se elimina[...]". Entonces debo entender "intercambiar" como sinnimo de transferir".
Mensaje n. 152 EQUIPO DOCENTE Mayo 17, 2011

As es.
Fallo de validez Mensaje n. 151 MIGUEL NGEL ALCAL ALFARAZ Mayo 17, 2011

En la pgina 415, en el ltimo prrafo, se habla de los casos en los que no hay que hacer una operacin de E/S ante un fallo de validez. El primer caso es que no se haya reasignado el marco de pgina; el segundo es que otro proceso haya causado que se cargue en otro marco. Se dice que en ambos casos se encontrar en la lista de marcos de pgina libres. En el primer caso lo veo claro, pero no entiendo por qu debe encontrarse necesariamente en esa lista en el segundo caso si la referencia de esa otra pgina es vlida. La razn es que en ese caso, en el de que otro proceso haya provocado su carga en otro marco de pgina, si la referencia es vlida, no se producir un fallo de validez? Supongo que la causa de mis dudas es que no tengo muy claro a quin pertenecen las diferentes estructuras. S que existe una tabla de regiones por proceso y una tabla de regiones que es propiedad del ncleo. La tabla de pginas reside en la correspondiente entrada de la tabla de regiones, segn leemos en la pg. 398, pero no s si es en la del proceso o la del ncleo. Si es en la del ncleo, debo entender que puede haber entradas de la tabla de regiones del ncleo que sean apuntadas simultneamente por diversas entradas de tablas de regiones de diferentes procesos. As desde ambos procesos se apuntara, a travs de la tabla de regiones del ncleo, a una nica tabla de pginas y, en el caso que ha provocado esta disquisicin, no se producira el fallo de validez si en la tabla de pginas el campo valida informa de que el contenido es vigente.
Mensaje n. 153 EQUIPO DOCENTE Mayo 17, 2011

>En el primer caso lo veo claro, pero no entiendo por qu debe encontrarse necesariamente en esa lista >en el segundo caso si la referencia de esa otra pgina es vlida. La razn es que en ese caso, en el de >que otro proceso haya provocado su carga en otro marco de pgina, si la referencia es vlida, no se >producir un fallo de validez?

Efectivamente tiene razn en su apreciacin se trata de una errata.


>La tabla de pginas reside en la correspondiente entrada de la tabla de regiones, segn leemos en la >pg. 398, pero no s si es en la del proceso o la del ncleo. Si es en la del ncleo, debo entender que >puede haber entradas de la tabla de regiones del ncleo que sean apuntadas simultneamente por >diversas entradas de tablas de regiones de diferentes procesos. As desde ambos procesos se >apuntara, a travs de la tabla de regiones del ncleo, a una nica tabla de pginas y, en el caso que >ha provocado esta disquisicin, no se producira el fallo de validez si en la tabla de pginas el campo >valida informa de que el contenido es vigente.

Su razonamiento es correcto.

Poltica de demanda de pginas para ficheros de datos Mensaje n. 155 MIGUEL NGEL ALCAL ALFARAZ Mayo 18, 2011

Tras repasar el tema 9 observo que en todo momento se habla de pginas asociadas a ficheros ejecutables (vase punto 9.2.1.2 en la pg. 402, en lo referido al campo tipo). En cuanto a los ficheros de datos, se cargan stos siempre en la cach de buffers? Si se reserva un 10% de la memoria para esta cach, dependiendo de la demanda de ficheros de datos, tambin habr que hacer algn intercambio de pginas. Imagino que la forma de cargar las pginas sera de tipo DF y que el tratamiento de los bits de proteccin depender de el modo de acceso al fichero determinado por el proceso. Puede el proceso indicar la caducidad de la pgina si conoce que los datos no volvern a ser utilizados? Tambin supongo que varios procesos podrn hacer referencia a una misma pgina de memoria y que, en el caso de que se haga una modificacin del contenido por parte de alguno de los procesos, se utilice el bit de copiar al escribir. Agradecera un comentario sobre todo, breve, puesto que sospecho que el tratamiento del sistema respecto a esta cuestin debe ser bastante complejo.
Mensaje n. 157 EQUIPO DOCENTE Mayo 18, 2011

Paso a intentar aclarar sus dudas:


"En cuanto a los ficheros de datos, se cargan stos siempre en la cach de buffers? Si se reserva un 10% de la memoria para esta cach, dependiendo de la demanda de ficheros de datos, tambin habr que hacer algn intercambio de pginas. Imagino que la forma de cargar las pginas sera de tipo DF y que el tratamiento de los bits de proteccin depender de el modo de acceso al fichero determinado por el proceso. "

En los sistemas UNIX tradicionales los bloques de los ficheros de datos se cargaban en la cach de buffers de bloques de disco. En los sistemas UNIX modernos los bloques de datos de los ficheros de datos tambin se paginan. Por lo ahora existe una cach nica que contiene pginas de ficheros ejecutables y de ficheros de datos.
"Puede el proceso indicar la caducidad de la pgina si conoce que los datos no volvern a ser utilizados? "

Una de las caractersticas de la tcnica de la paginacin, que en algunas ocasiones puede considerarse como una ventaja y en otras como un inconveniente, es que la paginacin es invisible al programador. Un programador desconoce y tampoco necesita conocer a la hora de programar en cules y cuntas pginas se va a descomponer una determinada parte de su programa. A diferencia. por ejemplo, de lo que sucede en la segmentacin. En conclusin no es posible realizar las indicaciones que propone.
"Tambin supongo que varios procesos podrn hacer referencia a una misma pgina de memoria y que, en el caso de que se haga una modificacin del contenido por parte de alguno de los procesos, se utilice el bit de copiar al escribir."

Efectivamente, de hecho as se implementa la creacin de procesos con fork (ver seccin 9.2.2)

S-ar putea să vă placă și