documentación de laboratoriodocencia.ac.upc.edu/.../laboratorios/...2016-2017.pdf · laboratorio...

73
Documentación de laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las clases de laboratorio. Las sesiones incluyen el trabajo previo y el trabajo a realizar durante la sesión Profesores SO-Departamento AC

Upload: others

Post on 10-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

DocumentacióndelaboratorioCursootoño2016-2017Estedocumentocontienelassesionesarealizardurantelasclasesdelaboratorio.LassesionesincluyeneltrabajoprevioyeltrabajoarealizardurantelasesiónProfesoresSO-DepartamentoAC

Page 2: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página2de73

Índicedesesiones

Sesión1:Elintérpretedecomandos:shell..................................................................................3

Sesión2:EllenguajeC................................................................................................................17

Sesión3:Procesos......................................................................................................................26

Sesión4:Comunicacióndeprocesos.........................................................................................33

Sesión5:GestióndeMemoria...................................................................................................40

Sesión6:Análisisderendimiento..............................................................................................46

Sesión7:GestióndeEntrada/Salida..........................................................................................54

Sesión8:GestióndeEntrada/Salida..........................................................................................63

Sesión9:SistemadeFicheros....................................................................................................67

Sesión10:ConcurrenciayParalelismo.......................................................................................71

Page 3: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página3de73

Sesion1:El interpretedecomandos:shellPreparaciónprevia

1. ObjetivosEl objetivo de esta sesión es aprender a desenvolverse en el entorno de trabajo de loslaboratorios. Veremos que algunas operaciones se pueden hacer tanto con comandosinteractivoscomoutilizandoelgestordeventanas.Noscentraremosenlaprácticadealgunoscomandosbásicos y en la utilizacióndelmanual online (man) que encontraréis en todas lasmáquinasLinux.

2. Habilidades• Sercapazdeutilizarlaspáginasdeman.• Ser capaz de utilizar comandos básicos de sistema para modificar/navegar por el

sistemadeficheros:cd,ls,mkdir,cp,rm,rmdir,mv.• Conocerlosdirectoriosespeciales“.”y“..”.• Ser capaz de utilizar comandos básicos de sistema y programas de sistema para

accederaficheros:less,cat,grep,gedit(uotroeditor).• Sercapazdemodificarlospermisosdeaccesodeunfichero.• Sercapazdeconsultar/modificar/definirunavariabledeentorno.• Ser capaz de utilizar algunos caracteres especiales de la Shell (intérprete de

comandos):o &paraejecutarunprogramaensegundoplano(ejecutarenbackground).o >paraguardarlasalidadeunprograma(redireccionarlasalida).

3. ConocimientospreviosEnestasesiónnoserequierenconocimientosprevios.

4. Guíaparaeltrabajoprevio4.1. AccesoalsistemaEnloslaboratoriostenemosinstaladoUbuntu10.04.LTS.Tenemosvariosusuarioscreadosparaquesepuedanhacerpruebasqueinvolucrenavariosusuarios.Losusernamesdelosusuariosson:”alumne”,“so1”,“so2”,“so3”,“so4”y“so5”.Elpasswordes“sistemes”paratodosellos.

Para comenzar, ejecutaremos lo que llamamos una Shell o un intérprete de comandos.UnaShellesunprogramaqueelS.O.nosofreceparapodertrabajarenunmododetextointeractivo.Esteentornopuedeparecermenos intuitivoqueunentornográfico,peroesmuysencilloypotente.

Page 4: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página4de73

Existen varios intérpretes de comandos, en el laboratorio utilizaréis Bash (GNU-BourneShell), pero en general nos referiremos a él como Shell. La mayoría de las cosas queexplicaremos en esta sesión se pueden consultar en el manual de Bash (ejecutando elcomandomanbash).

ParaejecutarunaShellbastaconejecutarlaaplicación“Terminal”.Conestaaplicación,seabreunanuevaventana(similaraladelaimagen)dondeseejecutaunanuevaShell.

Figura1Ventanadelashell

El texto que aparece a la izquierda junto con el cursor que parpadea es lo que seconoce como prompt y sirve para indicar que la Shell está lista para recibir nuevasórdenes o comandos. Nota: en la documentación de laboratorio utilizaremos elcarácter#pararepresentarelprompteindicarqueloquevieneacontinuaciónesunalíneadecomandos(paraprobar la líneaNODEBÉISESCRIBIR#,sóloelcomandoqueapareceacontinuación).

ElcódigodelaShellsepodríaresumirdelasiguientemanera:

Existen dos tipos de comandos: comandos externos y comandos internos. Loscomandosexternossoncualquierprogramainstaladoen lamáquinay loscomandosinternossonfuncionesimplementadasporelintérpretedecomandos(cadaintérpreteimplementalossuyos,loshaycomunesatodosellosyloshaypropios).

4.2. ComandosparaobtenerayudaEnLinux,existendoscomandosquepodemosejecutardeformalocalenlamáquinaparaobtener ayuda interactiva: el comandoman, que nos ofrece ayuda sobre los comandosexternos (como parte de la instalación, se instalan también las páginas delmanual que

while(1){ comando=leer_comando(); ejecutar_comando(comando); }

Page 5: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página5de73

podremosconsultaratravésdelman),yelcomandohelp,quenosofreceayudasobreloscomandosinternos.• Lee la guía sobre cómo utilizar elman de Linux que tienes al final de esta sección

(“Utilización del manual”). A continuación, consulta el man (man nombre_comando) de los siguientes comandos. En concreto, para cada comandodebesleeryentenderperfectamente:laSYNOPSIS,laDESCRIPTIONylasopcionesqueaparecenenlacolumna“Opciones”delatabla.

Para leer con elman

Descripciónbásica Opciones

man Accedealosmanualeson-line ls Muestraelcontenidodeldirectorio -l,-aalias Defineunnombrealternativoauncomando mkdir Creaundirectorio rmdir Eliminaundirectoriovacío mv Cambiaelnombredeunficheroo lomueve

aotrodirectorio-i

cp Copiaficherosydirectorios -irm Borraficherosodirectorios -iecho Visualizauntexto(puedeserunavariablede

entorno)

less Muestraficherosenunformatoaptoparaunterminal.

cat Concatenaficherosylosmuestraensusalidaestándar

grep Buscatexto(opatronesdetexto)enficheros gedit EditordetextoparaGNOME env Ejecuta un comando en un entorno

modificado, si no se le pasa comando,muestraelentorno

chmod Modificalospermisosdeaccesoaunfichero. which Localizauncomando

• Utilizad el comando help para consultar la ayuda sobre los siguientes comandosinternos:

Paraconsultarconelhelp

Descripciónbásica Opciones

help OfreceinformaciónsobrecomandosinternosdelaShell

export Defineunavariabledeentorno cd Cambiaeldirectorio(carpeta)actual alias Defineunnombrealternativoauncomando

• Accedealapáginadelmanparaelbash(ejecutandoelcomandomanbash)ybuscael significado de las variables de entorno PATH,HOME y PWD (nota: el carácter “/”sirve para buscar patrones en las páginas del man. Utilízalo para encontrardirectamenteladescripcióndeestasvariables).

Page 6: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página6de73

Utilizacióndelmanual

Saber utilizar el manual es básico ya que, aunque durante el curso os explicaremosexplícitamente algunos comandos yopciones, el resto (incluido llamadas a sistema) deberásbuscarlotúmismoenelmanual.Elpropiomanesautocontenidoenestesentido,yaqueparavertodassusopcionespuedesejecutar:

#manman

La informacióndelmanualestáorganizadaensecciones. La sección2,porejemplo,es ladellamadasasistema.Lasseccionesquepodemosencontrarson:

1. comandos2. llamadasasistema3. llamadasalibreríasdeusuarioodellenguaje4. etc.

Lainformaciónproporcionadaalejecutarelmanesloqueseconocecomo“páginademan”.Una “página” suele ser el nombre de un comando, llamada a sistema o llamada a función.Todaslaspáginasdemansiguenunformatoparecido,organizadoenunaseriedepartes.EnlaFigura 2 tienes un ejemplo de la salida delmanpara el comando ls (hemos borrado algunalíneaparaquesevean lasprincipalespartes).En laprimerapartepuedesencontrar tantoelnombredelcomandocomoladescripciónyunesquema(SYNOPSIS)desuutilización.Enestaparte puedes observar si el comando acepta opciones, si necesita algún parámetro fijo uopcional,etc.

Figura2manls(simplificado)

La siguiente parte es la descripción (DESCRIPTION) del comando. Esta parte incluye unadescripciónmásdetalladadesuutilizaciónylalistadeopcionesquesoporta.Dependiendodelainstalacióndelaspáginasdemantambiénpuedesencontraraquíloscódigosdefinalización

LS(1)UserCommandsLS(1)NAMEls-listdirectorycontentsSYNOPSISls[OPTION]...[FILE]...DESCRIPTIONListinformationabouttheFILEs(thecurrentdirectorybydefault).Sortentriesalphabeticallyifnoneof-cftuSUXnor--sort.Mandatoryargumentstolongoptionsaremandatoryforshortoptionstoo.-a,--alldonotignoreentriesstartingwith.SEEALSOThefulldocumentationforlsismaintainedasaTexinfomanual.Iftheinfoandlsprogramsareproperlyinstalledatyoursite,thecommand info lsshouldgiveyouaccesstothecompletemanual.ls5.93November2005LS(1)

Page 7: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página7de73

del comando (EXIT STATUS). Finalmente suele haber una serie de partes que incluyen losautores de la ayuda, la forma de reportar errores, ejemplos y comandos relacionados (SEEALSO).

EnlaFigura3tieneselresultadodeejecutar“man2write”,quecorrespondeconlallamadaasistemawrite.Elnúmeroqueponemosantesde lapáginaes la secciónen laquequeremosbuscaryqueincluimosenestecasoyaqueexistemásdeunapáginaconelnombrewriteenotras secciones.Enestecaso laSYNOPSIS incluye los ficherosquehandeser incluidosenelprograma C para poder utilizar la llamada a sistema en concreto (en este caso unistd.h). Sifueranecesario“linkar”tuprogramaconalgunalibreríaconcreta,quenofueranlasqueutilizaelcompiladordeCpordefecto, lonormalesqueaparezcatambiénenestasección.AdemásdelaDESCRIPTION,enlasllamadasafunciónengeneral(seallamadaasistemaoalibreríadellenguaje) podemos encontrar la sección RETURN VALUE (con los valores que devuelve lafunción) y una sección especial, ERRORS, con la lista de errores. Finalmente tambiénencontramos varias secciones donde aquí destacamos también la sección de NOTES(aclaraciones)ySEEALSO(llamadasrelacionadas).

Figura3man2write(simplificado)

Elmanessimplementeunaherramientadelsistemaque interpretaunasmarcasen ficherosdetextoylasmuestraporpantallasiguiendolasinstruccionesdeesasmarcas.Lascuatrocosasbásicasquetienesquesaberson:

WRITE(2) Linux Programmers Manual WRITE(2) NAME write - write to a file descriptor SYNOPSIS #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); DESCRIPTION write() writes up to count bytes to the file referenced by the file descriptor fd from the buffer starting at buf. POSIX requires that a read() which can be proved to occur after a write() has returned returns the new data. Note that not all file systems are POSIX con- forming. RETURN VALUE On success, the number of bytes written are returned (zero indicates nothing was written). On error, -1 is returned, and errno is set appropriately. If count is zero and the file descriptor refers to a regular file, 0 will be returned without causing any other effect. For a special file, the results are not portable. ERRORS EAGAIN Non-blocking I/O has been selected using O_NONBLOCK and the write would block. EBADF fd is not a valid file descriptor or is not open for writing. …. Other errors may occur, depending on the object connected to fd. NOTES A successful return from write() does not make any guarantee that data has been committed to disk. In fact, on some buggy implementations, it does not even guarantee that space has successfully been reserved for the data. The only way to be sure is to call fsync(2) after you are done writing all your data. SEE ALSO close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), read(2), select(2), fwrite(3), writev(3)

Page 8: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página8de73

• Normalmente una página de man ocupa varias pantallas, para ir avanzandosimplementehayqueapretarlabarraespaciadora.

• Parairunapantallahaciaatráspuedesapretarlaletrab(back).• Parabuscaruntextoe irdirectamentepuedesusarelcarácter“/”seguidodeltexto.

Porejemplo“/SEEALSO”osllevadirectoalaprimeraaparicióndeltexto“SEEALSO”.Parairalasiguienteaparicióndelmismotextosimplementeutilizaelcaráctern(next).

• Parasalirdelmanutilizaelcarácterq(quit).

5. BibliografíaLadocumentaciónqueosdamosenestecuadernonormalmenteessuficientepararealizarlassesiones,peroencadasesiónosdaremosalgunareferenciaextra.

• GuíadeBASHshell:o DelaasignaturaASO(encatalán):

http://docencia.ac.upc.edu/FIB/grau/ASO/files/lab/aso-lab-bash-guide.pdf

o Eninglés:http://tldp.org/LDP/abs/html/index.htmlo TutorialdeusodeShell:http://www.ant.org.ar/cursos/curso_intro/c920.html

Ejerciciosarealizarenellaboratorio

Ø LasprácticasserealizaránenunsistemaUbuntu14LTSØ Tienesatudisposiciónunaimagendelsistemaigualaladeloslaboratoriosparapoder

prepararlassesionesdesdecasa.LaimagenesparaVMPlayer:o https://my.vmware.com/web/vmware/free#desktop_end_user_computing/v

mware_player/6_0o Imagen:http://softdocencia.fib.upc.es/software/Ubuntu14.tar.gz

Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

Ø Las líneas del enunciado que empiezan por el carácter “#” indican comandos que

tienesqueprobar.NOtienesqueescribirelcarácter#.Ø Paraentregar:ficherosesion01.tar.gz

#tar zcfv sesion01.tar.gz entrega.txt

Navegarporlosdirectorios(carpetasenentornosgráficos)Podrásobservarque lagranmayoríade loscomandosbásicosenLinuxson2ó3 letrasquesintetizan la operación a realizar (en inglés por supuesto). Por ejemplo, para cambiar dedirectorio (changedirectory) tenemoselcomandocd.Paraverelcontenidodeundirectorio(listdirectory)tenemoselcomandols,etc.

Page 9: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página9de73

En UNIX los directorios están organizados de forma jerárquica. El directorio base es la raíz(representadaporelcarácter/)yapartirdeahícuelganelrestodedirectoriosdelsistema,enel que se sitúan archivos y directorios comunespara todos los usuarios.Además, dentrodeestajerarquía,cadausuariosueletenerasignadoundirectorio(homedirectory),pensadoparaque actúe como base del resto de sus directorios y ficheros. Cuando un usuario inicia unterminal, su directorio actual de trabajo pasa a ser su home directory. Para modificar eldirectorio actual de trabajo puede usar el comando cd, que le permite navegar por toda lajerarquíadeficheros.

A continuación, realiza los siguientes ejercicios utilizando los comandos que consideresmásoportunos:

1. Crealosdirectoriosparalas5primerassesionesdelaasignaturaconlosnombresS1,S2,S3,S4yS5.

PREGUNTA1. ¿QuécomandoshabéisutilizadoparacrearlosdirectoriosS1..S5?

2. SiabreselFileBrowserdelUbuntu,yvasa lamisma“carpeta”en laqueestásen laShell,deberíasveralgosimilaralodeestaimagen:

3. CambiaeldirectorioactualdetrabajoaldirectorioS1.4. Listael contenidodeldirectorio.Aparentementenohaynada.Sinembargo,haydos

“ficherosocultos”. Todos los ficheros que enUNIX empiezanpor el carácter “.” sonficheros ocultos, y suelen ser especiales. Consulta qué opción debes añadir alcomandoparavertodoslosficheros.Losficherosquesevenahorason:

o Ficherode tipodirectorio “.”:Hace referencia almismodirectorio en el queestás en ese momento. Si ejecutas (cd .) verás que sigues en el mismodirectorio.Másadelanteveremosquéutilidadtiene.

o Fichero de tipo directorio “..”: Hace referencia al directorio de nivelinmediatamente superior al que estamos. Si ejecutas (cd ..) verás quecambiasaldirectoriodedondevenías.

o Fíjatequeestos ficherosocultosnoaparecenenelentornográfico:sientrasen la carpeta S1 aparece vacía (en el entorno gráfico, también existe una

Page 10: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página10de73

opciónde configuraciónpara las carpetasquepermite visualizar los ficherosocultos).

PREGUNTA2. ¿Quécomandoutilizasparalistarelcontenidodeundirectorio?¿Quéopciónhayqueañadirparaverlosficherosocultos?

5. Lasopcionesde loscomandosnormalmentesepuedenacumular.Miraenelmanualqué opción hay que incluir para ver información extendida sobre los ficheros ypruébalo.

PREGUNTA3. ¿Qué opción hay que añadir a ls para ver información extendida de losficheros? ¿Qué campos se ven por defecto con esa opción? (si no encuentras lainformaciónenelmanpreguntaatuprofesor)

6. Cuando utilizamos muy a menudo una configuración específica de un comando sesueleusarloqueseconocecomo“alias”.Consisteendefinirunpseudo-comandoquelaShellconoce.Porejemplo,sivemosqueelcomando lssiempre loejecutamosconlasopciones“–la”,podemosredefinir“ls”comounaliasdelasiguientemanera:

#alias ls=’ls –la’ Ejecuta este comando alias y a continuación ejecuta ls sin argumentos. Compruebaquelasalidaesladelcomandolsconlasopciones–la.

7. Podemos ver una información similar a la del comando ls –la en el entorno gráfico.Mira cómomodificar el FileBrowserpara conseguirlo.Deberías ver algo similar a lomostradoenlasiguientefigura:

LascolumnasquesemuestranaquísonlasseleccionadaspordefectoperosepuedencambiarenlaopciónView.

PREGUNTA4. ¿Qué opciones de menú has activado para extender la información quemuestraelFileBrowser?

Page 11: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página11de73

8. Desde la Shell borra algunos de los directorios que has creado, comprueba querealmentenoaparecenyvuelveacrearlos.Miracómosehacelomismoenelentornográfico.

PREGUNTA5. ¿Qué secuencia de comandos has ejecutado para borrar un directorio,comprobarquenoestáyvolveracrearlo?

Comandosbásicosdelsistemaparaaccederaficheros1. Crea un fichero. Para crear un fichero que contenga cualquier texto tenemos varias

opciones,porejemploabrireleditoryescribircualquiercosa:o #gedittest

2. ParapoderejecutarcualquiercomandoverásquetienesqueabrirotraShellporquelaqueteníasestábloqueadaporeleditor(estosucedesóloalabrirelprimerfichero,nosiyatienesabiertoeleditor).EstoesasíporquelaShellpordefectoesperahastaqueelcomandoactualacabeantesdemostrarelpromptyprocesarelsiguientecomando.Para evitar tener una Shell abierta para cada comando que queremos ejecutarsimultáneamente, podemos pedirle al Shell que ejecute los comandos en segundoplano (oenbackground).Cuandousamosestemétodo, la Shelldejaenejecuciónelcomandoeinmediatamentemuestraelpromptypasaaesperarlasiguienteorden(sinesperar hasta que el comando acabe). Para ejecutar un comando en segundoplanoañadimosalfinaldelalíneadelcomandoelcarácterespecial“&”.Porejemplo:

o #gedittest&3. Paraverdeunaformarápidaelcontenidodeunfichero,sinabrirotravezeleditor,

tenemosvarioscomandos.Aquímencionaremos2:catyless.Añadealficherotest3o4páginasdetexto(cualquiercosa).Pruebaloscomandoscatyless.

o Nota:sielficheroquecreasnoeslosuficientementegrandenoverásningunadiferencia.

PREGUNTA6. ¿Quédiferenciahayentreelcomandocatyless?

4. Copiaelficherotestvariasveces(añadiendounnúmerodiferentealfinaldelnombrede cada fichero destino, p.ej. “test2”) ¿Qué pasaría si el fichero origen y destinotuvieran el mismo nombre?Mira en el man la opción “–i “ del comando cp. ¿Quéhace?Creaunaliasdelcomandocp(llámalocp)queincluyalaopción–i.

PREGUNTA7. ¿Paraquésirvelaopción-idelcomandocp?¿Cuáleslaordenparahacerunaliasdelcomandocpqueincluyalaopción-i?

5. Pruebaaborraralgunodelosficherosqueacabasdecrearyacambiarleelnombreaotros.Hazunaliasconlaopción–idelcomandorm(llámalorm).Compruebatambiénlaopción–idelcomandomv.

PREGUNTA8. ¿Qué hace la opción -i del comando rm? ¿Y la opción -i delmv? Escribe laordenparahacerunaliasdelcomandormqueincluyalaopción-i.

Page 12: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página12de73

6. Otro comando que es muy útil es el comando grep. El comando grep nos permitebuscarun texto (explícitoomedianteunpatrón)enunoomásarchivos.Añadeunapalabraenunodelosficherosquehascopiadoypruebaelcomandogrepparabuscaresapalabra.Porejemplo,añadimoslapalabra“hola”aunodelosficherosyhacemoslaprueba:

#grep hola test test1 test2 test3 test4

7. Elcomandols–ltambiénpermiteverlospermisosquetieneunfichero.EnUNIX,lospermisosseaplicanatresniveles:elpropietariodelfichero(u),losusuariosdelmismogrupo(g),yelrestodeusuarios(o).Yhacenreferenciaatresoperacionesomodosdeacceso:lectura(r),escritura(w)yejecución(x).Porejemplo,sieneldirectorioactualsólotenemoselficherof1,yesteficherotienepermisode lecturayescrituraparaelpropietariodelfichero,sólolecturaparalosmiembrosdesugrupoysólolecturaparaelrestodeusuariosdelamáquina,laejecucióndelcomandodaríalasiguientesalida:

# ls –la drwxr-xr-x 26 alumne alumne 884 2011-09-15 14:31 . drwxr-xr-x 3 alumne alumne 102 2011-09-15 12:10 .. -rw-r--r-- 1 alumne alumne 300 2011-09-15 12:20 f1 Laprimeracolumnade lasalida indicael tipodeficheroy lospermisosdeacceso.Elprimer carácter codifica el tipo de fichero (el carácter ‘d’ significa directorio y elcarácter‘-‘significaficherodedatos).Yacontinuaciónelprimergrupode3caracteresrepresentan, en este orden, si el propietario tiene permiso de lectura (mediante elcarácter ‘r’) o no lo tiene (y entonces aparece el carácter ‘-‘), si tiene permiso deescritura (carácter ‘w’) o no puede escribir (carácter ‘-‘) y si tiene o no permiso deejecución (carácter ‘x’ o carácter ‘-‘). El segundo grupo de 3 caracteres son lospermisos que tienen losmiembros del grupo de propietario y el último grupo de 3caracteressonlospermisosdeaccesoquetienenelrestodeusuariosdelamáquina.Estospermisossepuedenmodificarmedianteelcomandochmod.Elcomandochmodofrece varias maneras para especificar los permisos de acceso, una manera muysencilla consiste en indicar primero los usuarios que se van a ver afectados por elcambiodepermisos,cómoqueremoscambiaresospermisos(añadir,quitaroasignardirectamente)ylaoperaciónafectada.Porejemploelcomando:

#chmod ugo+x f1 Modificaríalospermisosdef1,activandoelpermisodeejecuciónsobref1paratodoslosusuariosdelamáquina.

Elcomando:

#chmod o-x f1 Modificaríalospermisosdef1quitandoelpermisodeejecuciónparalosusuariosquenosonelpropietarionipertenecenasugrupo.

Yelcomando:

#chmod ug=rwx f1 Haría que los permisos de acceso a f1 fueran exactamente los indicados: lectura,escriturayejecuciónparaelpropietariolosmiembrosdesugrupo.

Page 13: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página13de73

Modificalospermisosdelficherodetestparadejarsolamentelosdeescrituraparaelpropietariodelfichero,sugrupoyelrestodeusuarios,eintentahaceruncat.Vuelveamodificarlospermisosdetestdejandosolamentelosdelecturaparaelpropietariodelfichero,sugrupoyelrestodeusuarioseintentaborrarlo.

PREGUNTA9. ¿Quéopcionesdechmodhasutilizadoparadejarsolamentelospermisosdeescritura?¿Quéresultadohadevuelvocatalintentarverelficherotest?¿Quéopcionesdechmodhasutilizadoparadejarsolamentelospermisosdelectura?¿Hasconseguidoborrarlo?

VariablesdeentornoLosprogramasseejecutanenundeterminadoentornoocontexto:pertenecenaunusuario,aun grupo, a partir de un directorio concreto, con una configuración de sistema en cuanto alímites,etc.Seexplicaránmásdetallessobreelcontextooentornodeunprogramaeneltemadeprocesos.

Enestasesiónintroduciremoslasvariablesdeentorno.Lasvariablesdeentornosonsimilaresalasconstantesquesepuedendefinirenunprograma,peroestándefinidasantesdeempezarelprogramaynormalmentehacen referenciaaaspectosdesistema (directoriospordefectoporejemplo)ymarcanalgunosaspectosimportantesdesuejecución,yaquealgunasdeellasson utilizadas por la Shell para definir su funcionamiento. Se suelen definir enmayúsculas,pero no es obligatorio. Estas variables pueden ser consultadas durante la ejecución de losprogramasmediantefuncionesdelalibreríadeC.ParaconsultarelsignificadodelasvariablesquedefinelaShell,puedesconsultarelmandelaShellqueestésutilizando,enestecasobash(manbash,apartadoShellVariables).

8. Ejecutaelcomando“env”paraverlalistadevariablesdefinidasenelentornoactualysuvalor.

Para indicarle a la Shell que queremos consultar una variable de entorno debemos usar elcarácter$delantedelnombredelavariable,paraquenoloconfundaconunacadenadetextocualquiera.Paraverelvalordeunavariableenconcretoutilizaelcomandoecho:

#echo $USERNAME #echo $PWD

9. Algunas variables las actualiza la Shell dinámicamente, por ejemplo, cambia dedirectorio y vuelve a comprobar el valor de PWD. ¿Qué crees que significa estavariable?

10. CompruebaelvalordelasvariablesPATHyHOME.

PREGUNTA10. ¿CuáleselsignificadodelasvariablesdeentornoPATH,HOMEyPWD?PREGUNTA11. LavariablePATHesunalistadedirectorios,¿Quécarácterhacedeseparador

entreundirectorioyotro?

Page 14: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página14de73

También podemos definir o modificar una variable de entorno utilizando el siguientecomando(paramodificacionesnoseusael$antesdelnombre):

export NOMBRE_VARIABLE=valor (sin espacios). 11. Definedosvariablesnuevasconelvalorquequierasycompruebasuvalor.

PREGUNTA12. ¿Qué comando has usado para definir y consultar el valor de las nuevasvariablesquehasdefinido?

12. Bájate el fichero S1.tar.gz y cópialo en la carpeta S1. Descomprímelo ejecutando elcomando tar xvfz S1.tar.gz para obtener el programa “ls” que vamos a usar acontinuación.

13. SitúateenlacarpetaS1yejecutalossiguientecomandos:

#ls #./ls

Fíjate que con la primera opción, se ejecuta el comando del sistema en lugar delcomando ls que hay en tu directorio. Sin embargo, con la segunda opción hasejecutadoel programa ls que te acabasdebajar en lugar deusar el comando ls delsistema.

14. Añadeeldirectorio“.”alprincipiodelavariablePATHmedianteelcomando(fíjateenelcarácterseparadordedirectorios):

#export PATH=.:$PATH MuestraelnuevovalordelavariablePATHycompruebaque,apartedeldirectorio“.”,aúncontienelosdirectoriosqueteníaoriginalmente(noqueremosperderlos).Ejecutaahoraelcomando:

#ls

PREGUNTA13. ¿Quéversióndellssehaejecutado?:El lsdelsistemaoelqueteacabasdedescargar?Ejecutaelcomando“whichls”paracomprobarlo.

PREGUNTA14. ¿El directorio en el que estás, está definido en la variable PATH? ¿Quéimplicaesto?

15. Modifica la variable PATH para eliminar el directorio “.”. No es posible modificarparcialmentelavariableporloquetienesqueredefinirla.MuestraelcontenidoactualdelavariablePATHyredefínelausandotodoslosdirectoriosqueconteníaexceptoel“.”.

Ejecutaahoraelcomando:

#ls 16. Añadeeldirectorio“.”al finalde lavariablePATH(fíjateenelcarácterseparadorde

directorios):

#export PATH=$PATH:. Compruebaque,apartedeldirectorio“.”,lavariablePATHaúncontienelosdirectoriosqueteníaoriginalmente(noqueremosperderlos).Ejecutaahoraelcomando:

Page 15: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página15de73

#ls

PREGUNTA15. ¿Qué binario ls se ha ejecutado en cada caso de los anteriores:El ls delsistema o el que te acabas de descargar? Ejecuta el comando “which ls” paracomprobarlo.

Mantenemosloscambios:fichero.bashrcLos cambios que hemos hecho durante esta sesión (excepto los que hacen referencia alsistemadeficheros)seperderánalfinalizarlasesión(definicióndealias,cambiosenelPATH,etc).Paraquenosepierdan,hemosdeinsertarestoscomandosenelficherodeconfiguracióndesesiónqueutilizalaShell.ElnombredelficherodependedelaShellqueestemosutilizando.EnelcasodeBashes$HOME/.bashrc.Cadavezqueiniciamosunasesión,laShellseconfiguraejecutandotodosloscomandosqueencuentreenesefichero.

17. Editaelfichero$HOME/.bashrcyañadelamodificacióndelPATHquetehemospedidoenelapartadoanterior.Añadetambiénladefinicióndeunaliasparaquecadavezqueejecutemos el comando ls se haga con la opción –m. Para comprobar que hasmodificadobienel.bashrcejecutalossiguientescomando:

#source $HOME/.bashrc #ls

Ycompruebaque lasalidadel lssecorrespondecon lade laopción–m.Elcomandosourceprovocalaejecucióndetodosloscomandosquehayelficheroquelepasamoscomoparámetro (es unamaneradeno tenerque reiniciar la sesiónparahacer queesoscambiosseanefectivos).

• Nota: en el entorno de trabajo de las aulas de laboratorio, el sistema searrancautilizandoREMBO.Esdecir,secargaunanuevaimagendelsistemaypor lo tanto todos tus ficherossepierdeny los ficherosdeconfiguracióndelsistema se reinicializan mediante una copia remota. Eso significa que sireinicias lasesiónempezarásatrabajarconelfichero.bashrcoriginalynoseconservarántuscambios.

AlgunoscaracteresespecialesútilesdelaShellEnlasecciónanterioryahemosintroducidoelcarácter&,quesirveparaejecutaruncomandoensegundoplano.OtroscaracteresútilesdelaShellqueintroduciremosenestasesiónson:

• *: La Shell lo substituye por cualquier grupo de caracteres (excepto el “.”). Porejemplo,siejecutamos(#grep prueba t*)veremosquelaShellsubstituyeelpatrónt* por la lista de todos los ficheros que empiezan por la cadena “t”. Los caracteresespecialesdelaShellsepuedenutilizarconcualquiercomando.

• >: La salida de datos de los comandos por defecto está asociada a la pantalla. Siqueremos cambiar esta asociación, y que la salida se dirija a un fichero, podemoshacerlo con el carácter ”>”. A esta acción se le llama “redireccionar la salida”. Porejemplo,ls > salida_ls, guarda la salida de ls en el fichero salida_ls. Prueba aejecutarelcomandoanterior.Acontinuación,pruébaloconotrocomandoperoconelmismoficherodesalidaycompruebaelcontenidodelficherosalida_ls.

Page 16: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página16de73

• >>:Redireccionalasalidadedatosdeuncomandoaunficheroperoenlugardeborrarelcontenidodelficheroseañadealfinaldeloquehubiera.Repiteelejemploanteriorperocon“>>”enlugarde“>”paracomprobarladiferencia.

PREGUNTA16. ¿Quédiferenciahayentreutilizar>y>>?

HacerunacopiadeseguridadparalasiguientesesiónDado que en los laboratorios se carga una nueva imagen cada vez que arrancamos elordenador,esnecesariohacerunacopiadeseguridaddeloscambiosrealizadossiqueremosconservarlosparalasiguientesesión.Paraguardarloscambiospuedesutilizarelcomandotar.Porejemplo,siquieresgenerarun ficheroquecontengatodos los ficherosdeldirectorioS1,ademásdelfichero.bashrc,puedesejecutarelsiguientecomandodesdetudirectorioHOME:

#tar zcvf carpetaS1.tar.gz S1/* .bashrc Finalmentedebes guardar este ficheroenun lugar seguro comopor ejemplounpendriveoenviárteloporcorreoelectrónico.

Page 17: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página17de73

Sesion2:EllenguajeCPreparaciónprevia

ObjetivosEnestasesiónelobjetivoespracticarcontodolorelacionadoconlacreacióndeejecutables.En este curso utilizaremos lenguaje C. Practicaremos la corrección de errores tanto demakefilescomodeficherosCylageneracióndeejecutablesapartirdecero:ficherosfuente,makefileylibrerías.

Habilidades• SercapazdecrearejecutablesdadouncódigoenC:

o Creacióndeejecutablesyutilizacióndemakefilessencillos.

• SercapazdecrearprogramasenCdesdecero:o Definicióndetiposbásicos,tablas,funciones,condicionalesybucles.o Utilizacióndepunteros.o Formateadoenpantalladelosresultadosdelosprogramas.o Programasbienestructurados,claros,robustosybiendocumentados.o Creaciónymodificacióndemakefiles sencillos: añadir reglasnuevasyañadir

dependencias.o AplicacióndesangríasacódigofuenteenC.

Conocimientosprevios• Programaciónbásica:tiposdedatosbásicos,tablas,sprintf.• Programaciónmedia:punterosenC,accesoalosparámetrosdelalíneadecomandos.

Fases del desarrollo de un programa en C: Preprocesador/Compilador/Enlazador (olinkador).

• Usodemakefilessencillos.

Guíaparaeltrabajoprevio• Leerlaspáginasdemandelossiguientescomandos.Estoscomandostienenmúltiples

opciones,leedconespecialdetallelasqueoscomentamosenlacolumna“Opciones”de la siguiente tabla. No es necesario leer las páginas de man completas de cadacomando sino su funcionamiento básico que podéis ampliar a medida que lonecesitéis.

Para leer en elman

Descripciónbásica Opciones

make Utilidad para automatizar el proceso decompilación/linkajedeunprogramaogrupodeprogramas

Page 18: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página18de73

gcc CompiladordeCdeGNU -c,-o, –I (i mayúscula), –L,-l(eleminúscula)

sprint Conversióndeformatoalmacenándolaenunbúffer

atoi Convierteunstringaunnúmeroentero indent Indentacióndeficherosfuente

• ConsultarelresumensobreprogramaciónenCqueestádisponibleen lapáginaweb

delaasignatura:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/EsquemaProgramaC.pdf

• Consultar el resumen sobre la comparación entre C y C++ que está disponible en lapáginawebdelaasignatura:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/Laboratorios/C++vsC.ppsx

• Crealacarpeta$HOME/S2ysitúateenellapararealizarlosejercicios.• Bájate el fichero S2.tar.gz, descomprímelo con tar zxfv S2.tar.gz para obtener los

ficherosdeestasesión.

Duranteelcurso,utilizaremosdirectamentelasllamadasasistemaparaescribirenpantalla.LoqueenC++erauncout,aquíesunacombinacióndesprintf(funcióndelalibreríadeC)+write(llamadaasistemaparaescribir).

LafunciónsprintfdelalibreríaestándardeCseutilizaparaformatearuntextoyalmacenarelresultadoenunbúffer.Elprimerparámetroeselbúffer,detipochar*,elsegundoparámetroesunacadenadecaracteresqueespecificael textoaguardarasícomoel formatoy tipodetodas las variables o constantes que se quieren incluir en la cadena, y a partir de ahí esasvariableso constantes (mirad los ejemplosqueosdamosenel resumendeC). Todo loqueescribamosenlapantalladebeserASCII,porloquepreviamentedeberemosformatearloconsprintf(exceptoenelcasodequeyaseaASCII).

Posteriormentesetienequeutilizarlallamadaalsistemawriteparaescribirestebufferenundispositivo. Durante estas primeras sesiones escribiremos en la “salida estándar”, que pordefecto es la pantalla, o por la “salida estándar de error”, que por defecto también es lapantalla. En UNIX/Linux, los dispositivos se identifican con un número, que se suele llamarcanal.Lasalidaestándareselcanal1ylasalidaestándardeerroreselcanal2.Elnúmerodecanal es el primer parámetro de la llamada a sistemawrite. El resto de parámetros son ladireccióndondeempiezan losdatos(elbufferquehemosgeneradoconsprintf)yelnúmerodebytesquesequierenescribirapartirdeesadirección.Paraconocer la longituddel textoutilizaremosstrlen(funciónlibreríadeC).

Unejemplodeutilizacióndesprintfpodríaser(utilizaelmanparaconsultarcómoespecificardiferentesformatos):

char buffer[256]; sprintf(buffer, “Este es el ejemplo número %d\n”, 1); write(1, buffer, strlen(buffer));

Quemuestraporlasalidaestándar:“Esteeselejemplonúmero1”.

Page 19: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página19de73

Solucionandoproblemasconelmakefile1. Modificaelficheromakefileparaquefuncione.

• El makefile es el fichero que utiliza por defecto la herramienta make. Siejecutas“make”sinparámetros,elficheropordefectoesmakefile.

• Para que el formato de un fichero makefile sea correcto debe seguir unformatocomoeste(TABsignificaquenecesitauntabulador).

Porejemplo:

2. Modifica el makefile para que la regla listaParametros tenga bien definidas sus

dependencias.Losficherosejecutablesdependendelosficherosfuenteapartirdeloscuales se generan (o ficheros objeto si separamos la generación del ejecutable encompilaciónymontaje).

3. Modificaelmakefileparaqueelficherodesalidanoseaa.outsinolistaParametros.4. Creaunacopiadelmakefile,llamándolamakefile_1,paraentregarla.

Solucionandoproblemasdecompilación• Solucionatodosloserroresdecompilaciónqueaparezcan.Siempreesrecomendable

solucionarloserroresenelordenenelqueaparecen.

Elcompiladorsiempredamensajesindicandodondesehaproducidoelerror,enquélíneadecódigo,ycuáleselerror.Enestecasoconcretotenemoselsiguientecódigo:

Yloserroresson(sonerroresmuytípicos,poresoloshemospuesto):

Target:dependecia1dependencia2..dependenciaN[TAB]comogenerarTargetapartirdelasdependencias

P1:P1.c gcc–oP1P1.c

1. voidmain(intargc,char*argv[])2. {3. charbuf[80];4. for(i=0;i<argc;i++){5. sprintf(buf,"Elargumento%des%s\n",i,argv[i]);6. write(1,buf,strlen(buf));7. return0;8. }

Page 20: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página20de73

Elprimeroindicaquehayunavariable(ienestecaso)sindeclararenlalínea4.Lalínea4esdondeseutiliza.Sitefijas,usamoslaienelbucleperonoestádeclarada.Enlaslíneas5y6utilizamosunasfunciones(sprintfystrlen)quenohemosdeclarado.Elcompiladornolasencuentraynopuedasabersisoncorrectas.EstasfuncionesestándefinidasenlalibreríadeCqueseañadealgenerarelbinario,peroelcompiladornecesitalacabeceraparaversiseusacorrectamente.Consultaelmanparaverqueficherosdecabecera(.h)esnecesarioincluir.Lalínea 7 nos indica que tenemosuna función (elmain) que acaba conun return 0 cuando lahabíamos declarado como un void. Lo normal es definir el main como una función quedevuelveunint.Elúltimoerrorsueleaparecercuandohayunerrorquesehapropagado.Enestecaso,faltabacerrarunallave(ladelfor).

• Asegúrate de que el directorio “.” aparece en la variable PATH de forma que seencuentrenlosejecutablesqueesténeneldirectorioactual.

AnalizayentiendeelficherolistaParametros.c.SinosabesprogramarenCleelosdocumentosrecomendadosantesdehacerestosejercicios.

• LaprimerafuncióndeunprogramaescritoenCqueseejecutaeslarutinamain.• Larutinamaintienedosparámetrosquesellamanargcyargv.Elparámetroargc

esunenteroquecontieneelnúmerodeelementosdelarrayargv.Yargvesunarraydestringsquecontienelosparámetrosdeentradaqueelprogramarecibealponerseen ejecución. Existe la convención de tratar el nombre del ejecutable como primerparámetro.Por lo tantosi sesigueesaconvenciónargc siempreserámayoro igualqueunoyelprimerelementodeargvseráelnombredeeseejecutable(laShellsigueesaconvenciónparatodoslosprogramasqueponeenejecución).

• CompilalistaParametros.cparaobtenerelejecutablelistaParametros,yejecútalocondiferentesparámetros(tipoynúmero),porejemplo:

#./listaParametros #./listaParametros a #./listaParametros a b #./listaParametros a b c #./listaParametros 1 2 3 4 5 6 7

listaParametros.c: In function “main”: listaParametros.c:4: error: “i” undeclared (first use in this function) listaParametros.c:4: error: (Each undeclared identifier is reported only once listaParametros.c:4: error: for each function it appears in.) listaParametros.c:5: warning: incompatible implicit declaration of built-in function “sprintf” listaParametros.c:6: warning: incompatible implicit declaration of built-in function “strlen” listaParametros.c:7: warning: “return” with a value, in function returning void listaParametros.c:8: error: syntax error at end of input

Page 21: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página21de73

¿Quévalorescontienenargcyelvectorargvencadaunodelosejemplos?Fíjate,queaunque pasemos números como parámetro, los programas los reciben SIEMPREcomounacadenadecaracteres.

Elsistemaoperativoeselencargadoderellenarambosparámetros(argcyargv)usandolosdatosintroducidosporelusuario(loveremoseneltema2deteoría).

Analizadetenidamenteyentiendeelficheropunteros.c.Elobjetivoesqueasimilesloquesignificadeclararunavariabledetipopuntero.Unpunteroseutilizaparaguardarsimplementeunadireccióndememoria.Yenesadireccióndememoriahayunvalordeltipoindicadoenladeclaracióndelpuntero.Aquítienesunejemploconelcasoconcretodepunterosaenteros.

• Creaunficheronumeros.cyañadeunafunciónquecompruebequeunstring(enCsedefine como un “char *” o como un vector de caracteres, ya que no existe el tipo“string”)1querecibecomoparámetrosólocontienecaracteresASCIIentreel‘0’yel‘9’(además del ‘\0’ al final y potencialmente el ‘-‘ al principio para los negativos). LafunciónhadecomprobarqueelparámetropunteronoseaNULL.Lafuncióndevuelve1sielstringrepresentaunnúmeroytienecomomucho8cifras(defineunaconstanteque llamaremos MAX_SIZE y utilízala), y 0 en cualquier otro caso. La función debetenerelsiguienteprototipo:

o intesNumero(char*str);• Paraprobar la función esNumero, añade la funciónmain al ficheronumeros.c y haz

que ejecute la función esNumero pasándole todos los parámetros que reciba elprograma.Escribeunmensajeparacadaunoindicandosiesunnúmeroono.

• CreaunMakefileparaesteprograma• Utilizaindentparaindentarelficheronumeros.c(#indentnumeros.c).• PARAENTREGAR:previo02.tar.gz

#tarzcfvprevio02.tar.gznumeros.cMakefilelistaParametros.cmakefile_1

1Ladefiniciónyutilizaciónde“strings”esbásica.Sinoentiendescomofuncionaacláraloconelprofesordelaboratorio

char buffer[128]; int A; // Esto es un entero int *PA; // Esto es un puntero a entero (esta sin inicializar, no se

// puede utilizar) PA=&A; // Inicializamos PA con la direccion de A *PA=4; // Ponemos un 4 en la posicion de memoria que apunta PA if (*PA==A) { sprint(buffer,”Este mensaje deberia salir siempre!\n”); }else{ sprint(buffer,”Este mensaje NO deberia salir NUNCA!\n”); } write(1,buffer,strlen(buffer));

Page 22: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página22de73

Bibliografía

• TutorialdeprogramaciónenC:http://www.elrincondelc.com/cursoc/cursoc.html• ResumensobreprogramaciónenC:

http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/EsquemaProgramaC.pdf

• ComparaciónentreCyC++:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/Laboratorios/C++vsC.ppsx

Bibliografíacomplementaria

• ProgramaciónenC:o ProgrammingLanguage.Kernighan,BrianW.;Ritchie,DennisM.PrenticeHallo CursointeractivodeC:http://labsopa.dis.ulpgc.es/cpp/intro_c.

• Makefiles:o http://es.wikipedia.org/wiki/Makeo http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

• GNUCodingStandardso http://www.gnu.org/prep/standards/standards.html, especialmenteel punto:

http://www.gnu.org/prep/standards/standards.html#Writing-C

Ejerciciosarealizarenellaboratorio

Ø Paratodoslosejercicios,seasumequesemodificaráelmakefilecuandoseanecesarioyseprobarántodoslosejerciciosquesepiden.

Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

Ø Paraentregar:sesion02.tar.gz

#tar zcfv sesion02.tar.gz entrega.txt makefile_1 listaParametros.c makefile_4mis_funciones.hmis_funciones.csuma.cpunteros.cmakefile_5words.cmakefile

ComprobandoelnúmerodeparámetrosA partir de este ejercicio, haremos que todos nuestros programas sean robustos y usablescomprobandoqueelnúmerodeparámetrosquerecibenseacorrecto.Encasodequeno losea, los programas (1) imprimiránunmensaje quedescriba cómousarlos, (2) una líneaquedescriba su funcionalidad, y (3)acabarán laejecución.Es loque se conocecomoañadirunafunciónusage().

1. Implementa una función que se encargue de mostrar el mensaje descriptivo de

utilización del programa listaParametros y acabe la ejecución del programa (llama aestafunciónUsage()).ModificaelprogramalistaParametrosparaquecompruebeque

Page 23: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página23de73

por lo menos hay 1 parámetro y en caso contrario invoque a la función Usage().Recuerdaqueelnombredelejecutableseconsideraunparámetromásyasísereflejaenlasvariablesargcyargv.

Ejemplodecomportamientoesperado:

#listaParametros a b El argumento 0 es listaParametros El argumento 1 es a El argumento 2 es b #listaParametros Usage:listaParametros arg1 [arg2..argn] Este programa escribe por su salida la lista de argumentos que recibe

Procesadodeparámetros2. Creaunacopiadenumeros.c(trabajoprevio)llamadasuma.c.3. Añadeotrafunciónalsuma.cqueconviertauncarácteranúmero(1cifra).Lafunción

asumequeelcaráctersecorrespondeconelcarácterdeunnúmero.

unsigned int char2int(char c); 4. Modificasuma.cañadiendounafunciónmi_atoiquerecibacomoparámetrounstring

y devuelva un entero correspondiente al string convertido a número. Esta funciónasume que el string no es un puntero a NULL, pero puede representar un númeronegativo. Si el string no contiene un número correcto el resultado es indefinido. ElcomportamientodeestafuncióneselmismoqueeldelafunciónatoidelalibreríadeC.Utilizalafunciónchar2intdelapartadoanterior.

int mi_atoi(char *s); 5. Modificasuma.cparaquesecomportedelasiguientemanera:Despuésdecomprobar

que todos los parámetros son números, los convierte a int, los suma y escribe elresultado.ModificatambiénelMakefileparaquecreeel ficheroejecutablesuma.Lasiguientefiguramuestraunejemplodelfuncionamientodelprograma:

#suma 100 2 3 4 100 La suma es 209 #suma -1 1 La suma es 0 #suma 100 a Error: el parámetro “a” no es un número

6. Creaunacopiadelmakefile,llamándolamakefile_4,paraentregarla.

UsamoselpreprocesadordeC:Dividimoselcódigo(#include)Queremos separar las funcionesauxiliaresquevamos creandode losprogramasprincipales,de forma que podamos reutilizarlas cuando las necesitemos. En C, cuando queremosencapsularunafunciónounconjuntodefunciones,lonormalescreardostiposdeficheros:

Ejemplodeusocorrecto

Ejemplodeusoincorrecto

Page 24: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página24de73

• Ficheroscabecera(“include”).Sonficherosdetextoconextensión“.h”quecontienenprototiposdefunciones(cabeceras),definicionesdetiposdedatosydefinicionesdeconstantes.Estosficherosson“incluidos”porelpreprocesadormediante ladirectiva#include <fichero.h> en el lugar exacto en que aparece la directiva, por lo que laposición es importante. Añadir un fichero “.h” es equivalente a copiar y pegar elcódigodel ficheroenel lugardondeestá ladirectiva#includeysuúnicoobjetivoesfacilitar la legibilidad ymodularidaddel código. Lo correctoesponer en los ficherosincludeaquellosprototiposde funciones, tiposdedatos y constantesquequeramosusarenmásdeunfichero.

• Ficheros auxiliares, ficheros objeto o librerías. Estos ficheros contienen lasdefinicionesdevariablesglobalesquenecesitenlasfuncionesauxiliares(sinecesitanalguna) y la implementación de estas funciones. Podemos ofrecer el fichero “.c”directamente,elficheroobjetoyacompilado(sinoqueremosofrecerelcódigofuente)o,encasodetenermásdeunficheroobjeto,juntarlostodosenunalibrería(archiveconelcomandoar).

7. Separa las funciones realizadas en los ejercicios anteriores (excepto el main) en unfichero aparte (mis_funciones.c) y crea un fichero de cabeceras (mis_funciones.h),dondedefinas lascabecerasdelasfuncionesqueofreces,e inclúyeloenelprogramasuma.c.Añadeunapequeñadescripcióndecada función juntoalprototipo (añádelocomo comentario). Modifica el makefile añadiendo una nueva regla para crear elficheroobjetoymodificalaregladelprogramasumaparaqueahorasecreeutilizandoesteficheroobjeto.Añadelasdependenciasquecreasnecesarias.

8. Modifica la función Usage de forma que como mínimo el programa suma reciba 2parámetros.

9. Creaunacopiadelmakefile,llamándolamakefile_5,paraentregarla

PREGUNTA17. ¿Qué opción has tenido que añadir al gcc para generar el fichero objecto?¿Quéopciónhas tenidoqueañadir al gccparaqueel compiladorencuentreel ficheromis_funciones.h?

TrabajandoconpunterosenC10. Mira el código del programa punteros.c. Modifica el makefile para compilarlo y

ejecútalo.Analizaelcódigoparaentendertodoloquehace.11. Crea un programa llamadowords.c que acepta un único parámetro. Este programa

cuenta el númerode palabras quehay en el string pasado comoprimer parámetro.Consideraremos que empieza una nueva palabra después de: un espacio, un punto,unacomayunsaltodelínea(\n).Elrestodesignosdepuntuaciónnosetendránencuenta.Unejemplodefuncionamientosería:

#words hola 1 palabras #words “Esta es una frase.” 4 palabras #words “Este parámetro lo trata” “este parámetro no lo trata” 4 palabras

Page 25: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página25de73

12. Modificaelmakefileparacompilarymontarwords.c

Page 26: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página26de73

Sesion3:ProcesosPreparaciónprevia

ObjetivosLos objetivos de esta sesión sonpracticar con las llamadas a sistemabásicas para gestionarprocesos, y los comandos y mecanismos básicos para monitorizar información de kernelasociadosalosprocesosactivosdelsistema.

Habilidades• AniveldeusuarioBÁSICO:

o Sercapazdehacerunprogramaconcurrenteutilizandolasllamadasasistemadegestióndeprocesos:fork,execlp,getpid,exit,waitpid.

o Entenderlaherenciadeprocesosylarelaciónpadre/hijo.• AniveldeadministradorBÁSICO:

o Sercapazdeverlalistadeprocesosdeunusuarioyalgúndetalledesuestadomediantecomandos(ps,top).

o Empezaraobtenerinformaciónatravésdelpseudo-sistemadeficheros/proc.

Guíaparaeltrabajoprevio• Consulta el vídeo sobre creación de procesos que tienes en la página web de la

asignatura:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/EjemploCreacionProcesosVideo.wmv

• Lee las páginas demanual de las llamadas getpid/fork/exit/waitpid/execlp. Entiendelosparámetros,valoresderetornoyfuncionalidadbásicaasociadaalateoríaexplicadaenclase.Fíjatetambiénenlosincludesnecesarios,casosdeerroryvaloresderetorno.Consultaladescripciónylasopcionesindicadasdelcomandopsydelpseudo-sistemadeficheros/proc.

Para leer en elman

Descripciónbásica Parámetros/argumentosprincipales quepracticaremos

getpid RetornaelPIDdelprocesoquelaejecuta

fork Crea un proceso nuevo, hijo del que laejecuta

exit Terminaelprocesoqueejecutalallamada waitpid Esperalafinalizacióndeunprocesohijo

execlp Ejecuta un programa en el contexto delmismoproceso

perror Escribe un mensaje del último error

Page 27: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página27de73

producidops Devuelveinformacióndelosprocesos -a,-u,-oproc Pseudo-file system que ofrece información

dedatosdelkernelcmdline, cwd, environexe,status

• Creaeldirectoriodelentornodedesarrolloparaestasesión($HOME/S3).• Descarga el fichero S3.tar.gz y descomprímelo en el directorio que has creado para

obtenerlosficherosdeestasesión(tarzxvfS3.tar.gz).• Crea un fichero de texto llamado previo.txt y escribe en él la respuesta a todas las

preguntas.• AnalizaelcódigodelosprogramasdeejemployelficheroMakefile.ejemplos

o El fichero Makefile.ejemplos está preparado para compilar todos losprogramasexceptoejemplo_fork7.c

• Compila todos los programas, excepto ejemplo_fork7, usando el ficheroMakefile.ejemplos(verficheroREADME_S3).

• Ejecutaejemplo_fork1o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplica

quéprocesomuestracadauno(padreohijo)yporqué.• Ejecutaejemplo_fork2

o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplicaquéprocesomuestracadauno(padreohijo)yporqué.

• Ejecutaejemplo_fork3o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplica

quéprocesomuestracadauno(padreohijo)yporqué.• Ejecutaejemplo_fork4

o ¿Enquéordenaparecenenpantallalosmensajes?¿Quéprocesoacabaanteslaejecución?

o Modificaelcódigodeesteprogramaparaqueelpadrenoescribaelúltimomensajedesucódigohastaquesuhijohayaacabadolaejecución.

• Ejecutaejemplo_fork5o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplica

quéprocesomuestracadauno(padreohijo)yporqué.o Modificaelcódigodeesteprograma,paraqueelprocesohijomodifiqueel

valordelasvariablesvariable_localyvariable_globalantesdeimprimirsuvalor.Compruebaqueelpadresigueviendoelmismovalorqueteníanlasvariablesantesdehacerelfork.

• Ejecutaejemplo_fork6,redireccionandosusalidaestándaraunficheroo Describeelcontenidodelficherodesalidao ¿Podemosasegurarquesiejecutamosvariasvecesesteprogramael

contenidodelficherosalidaseráexactamenteelmismo?¿Porqué?• ModificaelficheroMakefile.ejemplosparaañadirlacompilacióndeejemplo_fork7.c

yutilízaloparacompilarloahora.

Page 28: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página28de73

o ¿Porquénocompilaelprogramaejemplo_fork7.c?¿Tienealgoqueverconelhecho de crear procesos? ¿Cómo se puede modificar el código para queescribaelvalordela“variable_local”?

• Ejecutaejemplo_exec1o Describeelcomportamientodeesteprograma.¿Quévesenpantalla?

¿Cuántasvecesapareceenpantallaelmensajeconelpiddelproceso?¿Aquésedebe?

• Ejecutaejemplo_exec2o Describeelcomportamientodeestecódigo.¿Quémensajesaparecenen

pantalla?¿Cuántosprocesosseejecutan?

• Consulta en el man a qué sección pertenecen las páginas del man que habéisconsultado. Además, apunta aquí si se ha consultado alguna página adicional delmanualalasquesehanpedidoexplícitamente.

• PARAENTREGAR:previo03.tar.gz

#tar zcfv previo03.tar.gz Makefile.ejemplos ejemplo_fork4.c ejemplo_fork5.cejemplo_fork7.cprevio.txt

Ejerciciosarealizarenellaboratorio

Ø Paratodoslosejercicios,seasumequerealizastodoslospasosinvolucrados.Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecen

en el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

Ø Paraentregar:sesion03.tar.gz

#tar zcfv sesion03.tar.gz entrega.txt makefile myPS_v0.c myPS.c myPS2.c myPS3.cparsExec.c.

Comprobacióndeerroresdelasllamadasasistema 1. A partir de ahora se incluirá siempre, para TODAS las llamadas a sistema, la

comprobación de errores. Utiliza la llamada perror (man 3 perror) para escribir unmensajequedescribaelmotivoquehaproducidoelerror.Además,encasodequeelerrorseacrítico,comoporejemploquefalleunforkounexeclp,tienequeterminarlaejecucióndelprograma.Lagestióndelerrordelasllamadasasistemapuedehacersedeformasimilaralsiguientecódigo:

int main (int argc,char *argv[]) { …

if ((pid=fork())<0) error_y_exit(“Error en fork”,1); … } void error_y_exit(char *msg,int exit_status) { perror(msg);

exit(exit_status); }

Page 29: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página29de73

Creaciónymutacióndeprocesos:myPS.cElobjetivodeestasecciónespracticarconlasllamadasasistemadecreaciónydemutacióndeprocesos.Loscódigosquedesarrollarásenestasesiónteserviráncomobasedeltrabajodelassiguientessecciones.

CreaciónymutacióndeprocesosElobjetivodeestasecciónespracticarconlasllamadasasistemadecreaciónymutacióndeprocesos.Paraellovasacreardoscódigosdiferentes:myPS.cymyPS_v0.c.Estoscódigosnosserviráncomobaseparalosejerciciosdelassiguientessecciones.

2. CreaunprogramallamadomyPS.cquerecibaunparámetro(queseráunnombrede

usuario:root,alumne,etc.)yquecreeunprocesohijo.Elprocesopadreescribiráunmensaje indicando su PID. El proceso hijo escribirá un mensaje con su PID y elparámetro que ha recibido el programa. Después de escribir el mensaje, ambosprocesos ejecutarán un bucle “while(1);” para que no terminen (este bucle loañadimosporqueusaremos este código en la siguiente sección sobre la consulta deinformacióndelosprocesos,yenesasecciónnosinteresaquelosprocesosnoacabenlaejecución).

3. Crea un makefile, que incluya las reglas “all” y “clean”, para compilar y montar elprogramamyPS.c.

PREGUNTA18. ¿Cómo puede saber un proceso el pid de sus hijos? ¿Qué llamada puedenutilizarlosprocesosparaconsultarsupropioPID?

4. Copia el código de myPS.c en una versión myPS_v0.c. Modifica el Makefile paracompilarmyPS_v0.c

5. ModificamyPS.cparaqueelprocesohijo,despuésdeescribirelmensaje,ejecute lafunciónmuta_a_PS.Estafunciónmutaráalprogramaps.Añadetambiénelcódigodelafunciónmuta_a_PS:

PREGUNTA19. ¿Enquécasosseejecutarácualquiercódigoqueaparezcajustodespuésdela

llamadaexeclp(Encualquiercaso/Encasoqueelexeclpseejecutedeformacorrecta/Encasoqueelexclpfalle)?

/* Ejecuta el comando ps –u username mediante la llamada al sistema execlp */ /* Devuelve: el código de error en el caso de que no se haya podido mutar */ void muta_a_PS(char *username) { execlp(“ps”, “ps”, “-u”, username, (char*)NULL); error_y_exit(“Ha fallado la mutación al ps”, 1); }

Page 30: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página30de73

Consultadelainformacióndelosprocesosenejecución:myPS.cElobjetivodeestasecciónaprenderautilizarel/procparaconsultaralgunainformaciónsobrela ejecuciónde losprocesos. Paraelloutilizaremos los códigosmyPS.c ymyPS_v0.cquehasdesarrolladoenlasecciónanterior.

6. ParaesteejerciciovamosautilizardosterminalesdelaShell.EnunaejecutamyPSconun solo username comoparámetro. En la segunda ventana ves al directorio /proc ycompruebaqueaparecenvariosdirectoriosquecoincidenconlosnúmerosdePIDsdelos procesos. Entra en el directorio del padre y de su hijo y mira la informaciónextendida(permisos,propietario,etc.)delosficherosdeldirectorio.

PREGUNTA20. ¿Qué directorios hay dentro de /proc/PID_PADRE? ¿Qué opción de ls hasusado?

PREGUNTA21. Paraelprocesopadre,apuntaelcontenidodelosficherosstatusycmdline.Comparaelcontenidodel ficheroenvironconel resultadodelcomandoenv(fíjateporejemploenlavariablePATHylavariablePWD)¿Quérelaciónhay?Buscaenelcontenidodelficherostatuselestadoenelqueseencuentraelprocesoyapúntaloenelficheroderespuestas. Anota también el tiempo de CPU que ha consumido en modo usuario(búscaloenelficherostatdelproceso).

PREGUNTA22. Enelcasodelprocesohijo,¿aquéficheros“apuntan”losficheroscwdyexe?¿Cuálcreesqueeselsignificadodecwdyexe?

PREGUNTA23. En el caso del proceso hijo, ¿puedes mostrar el contenido de los ficherosenviron,statusycmdlinedelprocesohijo?¿Enquéestadoseencuentra?

7. Repite el experimento utilizando el programa myPS_v0.c en lugar de myPS.c yrespondedenuevoa laspreguntasparaelprocesohijo.Observa lasdiferenciasquehay entre ambas versiones del código. Recuerda que en la v0 el proceso hijo nomutaba.

PREGUNTA24. Enelcasodelprocesohijo,¿aquéficheros“apuntan”losficheroscwdyexe?¿Cuál crees que es el significado de cwd y exe? ¿Qué diferencias hay con la versiónanterior?¿Aquésedeben?

PREGUNTA25. En el caso del proceso hijo, ¿puedes mostrar el contenido de los ficherosenviron, status y cmdline del proceso hijo? ¿En qué estado se encuentra? ¿Quédiferenciashayconlaversiónanterior?¿Aquésedeben?

Ejecuciónsecuencialdeloshijos:myPS2.cEl objetivo de esta sección es practicar con la llamada a sistema waitpid y entender cómoinfluye en la concurrencia de los procesos creados. En particular la vas a utilizar para crearprocesosqueseejecutendemanerasecuencial.

Esta llamadasirveparaqueelprocesopadreespereaquesusprocesoshijosterminen,paraquecompruebesuestadodefinalizaciónyparaqueelkernel libere lasestructurasdedatosquelosrepresentaninternamente(PCBs).Ellugardondeseproducelaesperaesdeterminanteparageneraruncódigosecuencial (todos losprocesoshijossecreanyejecutande1en1)oconcurrente (todos los procesos hijos se crean y se ejecutan de forma potencialmente

Page 31: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página31de73

paralela,dependiendodelaarquitecturaenlaqueloejecutemos).Enestasecciónqueremoshacer un código secuencial. Para ello utilizaremos la llamada al sistema waitpid entre unacreacióndeprocesoy la siguiente,de formaqueaseguramosqueno tendremos2procesoshijosejecutándosealavez.

8. Creauna copiademyPS.c, llamadamyPS2.c, con la que trabajarás en este ejercicio.Modifica,también,elmakefileparapodercompilarymontarmyPS2.c.

9. Modifica myPS2.c para que, en lugar de recibir un parámetro (username), puedarecibirN.Hazqueelprogramaprincipalcreeunprocesoparacadausernameyqueseejecuten de manera secuencial. Puedes eliminar el bucle infinito del final de laejecucióndelprocesopadre.

Ejecuciónconcurrentedeloshijos:myPS3.cEn esta sección se continúa trabajando con la llamada a sistemawaitpid. Ahora la utilizarásparacrearunesquemadeejecuciónconcurrente.

Aprovecharemos también para comprobar los posibles efectos que puede tener laconcurrenciasobreelresultadodelaejecución.

10. CreaunacopiademyPS2.c, llamadamyPS3.c,conlaquetrabajarásenesteejercicio.ModificatambiénelmakefileparapodercompilarymontarmyPS3.

11. ModificaelprogramamyPS3.cparaqueloshijossecreendeformaconcurrente.Parapoderconsultarlainformacióndelosprocesos,hazqueelpadresequedeesperandounatecladespuésdeejecutarelbucledewaitpid.Paraesperarunateclapuedesusarlallamadaasistemaread(read(1,&c,sizeof(char)),dondecesunchar).

//Ejemplo esquema secuencial for (i=0;i<num_hijos;i++){

pid=fork(); if (pid==0) { // código hijo exit(0);// Solo si el hijo no muta y queremos que termine } // Esperamos a que termine antes de crear el siguiente waitpid(…); // los parámetros depende de lo que queramos

}

//Ejemplo esquema concurrente for (i=0;i<num_hijos;i++){

pid=fork(); if (pid==0) { // código hijo exit(0);// Solo si el hijo no muta y queremos que termine }

} // Esperamos a todos los procesos while (waitpid(…)>0); // los parámetros depende de lo que queramos

Page 32: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página32de73

12. EjecutamyPS3convariosusernamesydejaalpadrebloqueadodespuésdelbucledewaitpids.Enotraventanacompruebaqueningúnprocesohijotieneundirectorioen/proc.Compruebatambiénelestadoenelqueseencuentraelprocesopadre.

PREGUNTA26. Comprueba el fichero status de /proc/PID_PADRE. ¿En qué estado está elprocesopadre?

13. Para comprobar el efectode la ejecución concurrente, y ver que la planificacióndelsistemageneraresultadosdiferentes,ejecutavariasveceselcomandomyPS3conlosmismosparámetrosyguardarlasalidaendiferentesficheros.Compruebasielordenen que se ejecutan los ps’s es siempre el mismo. Piensa que es posible que variosresultadosseaniguales.

PREGUNTA27. ¿QuéhashechoparaguardarlasalidadelasejecucionesdemyPS3?

PasodeparámetrosalosejecutablesatravésdelexeclpElobjetivodeestasecciónesentenderlarelaciónentrelosparámetrosrecibidosporelmaindeunejecutabley losparámetrospasadosala llamadaasistemaexeclp.Recordad: larutinamain recibedosparámetros:argc,de tipoentero, yargvde tipoarrayde strings.El sistemaoperativorellenaelparámetroargcconelnúmerodeelementosquetieneargv,yrellenaargvconlosparámetrosqueelusuarioindicaenlallamadaasistemaexeclp(quetienenqueserdetipo string). Para seguir lamisma convención que utiliza la Shell, se tiene que hacer que elprimerparámetroseaelnombredelejecutablealquesevaamutar.

14. ElprogramalistaParametrosquetrabajamosenlasesión2,simplementemuestraporpantalla los parámetros que recibe. Escribe un programa parsExec.c que cree 4procesos hijos. Una vez creados, el proceso padre sólo tiene que esperar hasta quetodos los hijos acaben. Cada proceso hijo sólo tiene que mutar al ejecutablelistaParametros, cada uno pasando unos parámetros diferentes, de manera que, alejecutarparsExec,enlapantallasetienenqueverlossiguientesmensajes(elordendelos mensajes da igual y puede ser diferente para cada ejecución). Cada grupo demensajescorrespondeconlasalidadeunprocesodelosquemutan:

El argumento 0 es listaParametros El argumento 1 es a El argumento 2 es b Usage:listaParametros arg1 [arg2..argn] Este programa escribe por su salida la lista de argumentos que recibe El argumento 0 es listaParametros El argumento 1 es 25 El argumento 2 es 4 El argumento 0 es listaParametros El argumento 1 es 1024 El argumento 2 es hola El argumento 3 es adios

15. Modifica el makefile para poder compilar y montar parsExec.c.

Page 33: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Sesion4:ComunicaciondeprocesosPreparaciónprevia

1. ObjetivosDuranteestasesiónintroduciremoslagestióndeeventosentreprocesoscomomecanismodecomunicación y sincronización entre procesos. También se trabajarán aspectos relacionadosconlaconcurrenciadeprocesos.

2. Habilidades• Sercapazdereprogramar/esperar/enviareventosutilizandolainterfazdeUNIXentre

procesos.Practicaremoscon:sigaction/sigsuspend/alarm/kill.• Sercapazdeenviareventosaprocesosutilizandoelcomandokill.

3. ConocimientospreviosLos signals o eventos pueden ser enviados por otros procesos o enviados por el sistemaautomáticamente, por ejemplo cuando acaba un proceso hijo (SIGCHLD) o acaba eltemporizadordeunaalarma(SIGALRM).

CadaprocesotieneunatablaensuPCBdondesedescribe,paracadasignal,quéacciónhayquerealizar,quepuedeser:Ignorarelevento(notodospuedenignorarse),realizarlaacciónpordefectoquetengaelsistemaprogramadaparaeseevento,oejecutarunafunciónqueelprocesohayadefinidoexplícitamentemediantela llamadaasistemasigaction.Lasfuncionesdetratamientodesignaldebentenerlasiguientecabecera:

Cuandoelprocesorecibeunsignal,el sistemapasaaejecutarel tratamientoasociadoaesesignal para ese proceso. En el caso de que el tratamiento sea una función definida por elusuario,lafunciónrecibecomoparámetroelnúmerodesignalquehaprovocadosuejecución.Estonospermiteasociarunamismafunciónadiferentestiposdesignalyhaceruntratamientodiferenciadodentrodeesafunción.

4. GuíaparaeltrabajoprevioCon unos ejemplos veremos, de forma sencilla, cómo programar un evento, cómo enviarlo,qué sucede con la tabla de programación de signals al hacer un fork, etc. Para esta sesiónrepasalosconceptosexplicadosenclasedeteoríasobreprocesosysignals.Leelaspáginasdelmanrelacionadasconeltemaqueseindicanenlasiguientetabla.

void nombre_funcion( int numero_de_signal_recibido );

Page 34: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página34de73

Paraleerenelman Descripciónbásica Opcionessigaction Reprograma la acción asociada a un evento

concreto

kill (llamada a sistema)

Envíauneventoconcretoaunproceso

sigsuspend Bloqueaelprocesoquelaejecutahastaquerecibeun signal (los signals cuyo tratamiento es serignoradonodesbloqueanelproceso)

sigprocmask Permite modificar la máscara de signalsbloqueadosdelproceso

alarm ProgramaelenvíodeunsignalSIGALRMalcabodeNsegundos

sleep FuncióndelalibreríadeCquebloqueaalprocesoduranteeltiempoqueselepasacomoparámetro

/bin/kill (comando)

Envíauneventoaunproceso -L

ps Muestra información sobre los procesos delsistema

-opid,s,cmd,time

waitpid Esperalafinalizacióndeunproceso WNOHANG

Bájate el fichero S4.tar.gz y descomprímelo (tar zxvf S4.tar.gz). Compila los ficheros yejecútalos. En el fichero README que encontrarás hay una pequeña descripción de lo quehacen y cómo compilarlos. Intenta entenderlos y comprender cómo se usan las llamadas asistemaquepracticaremosantesdeirallaboratorio.Losficherosestáncomentadosdeformaqueentiendasloqueseestáhaciendo.

Los signals queprincipalmente vamos a usar son SIGALRM (alarma, temporizador), SIGCHLD(fin de un proceso hijo), o SIGUSR1/SIGUSR2 (sin significado predefinido, para que elprogramador pueda usarlos con el significado que le convenga). Mírate las acciones pordefectodeestossignals.

Realizalassiguientespruebasantesdeirallaboratorio.Creaunficherollamadoentrega.txtyescribeenéllasrespuestasalassiguientespreguntas(indicandosunúmero).

Sobre alarm1: recepción de diferentes tipos de signals y envío de eventosdesdelaconsola

1. Ejecutaalarm1enunaconsolayobservasucomportamiento.¿Quéocurrecuandopasan5segundos?

2. Ejecutadenuevoalarm1yantesdequeacabeel temporizadorenvíaleunsignaldetipoSIGKILL.Paraello,enotroterminalejecutaelcomandopsparaobtenerelpiddelprocesoy a continuación utiliza el comando kill con la opción “–KILL” para enviar al proceso elsignal SIGKILL. ¿El comportamiento es elmismo que si esperas que llegue el SIGALRM?¿Recibesunmensajediferenteenelterminal?

Recuerda que el Shell es el encargado de crear el proceso que ejecuta los comandos queintroducesyrecogerelestadodefinalizacióndeeseproceso.Elpseudo-códigodelShellparaejecutaruncomandoenprimerplanoeselsiguiente:

Page 35: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página35de73

3. ¿Quéprocesoseencargademostrarlosmensajesqueaparecenenpantallacuandomuereelprocesoalarm1?¿Conquéllamadaasistemaelshellrecogeelestadodefinalizacióndelprocesoqueejecutaalarm1cuandoéstetermina?

4. ¿Esnecesarioelexitquehayenelcódigodealarm1?¿Seejecutaenalgúncaso?

Sobrealarm2:cualquiersignalsepuedeenviardesdeelShell.

1. Ejecutaalarm2enun terminal.Abreotro, averiguaelpiddelprocesoalarm2yutilizaelcomando kill para enviarle el signal “–ALRM” varias veces. ¿Qué comportamientoobservas?¿Elcontroldetiempohafuncionadocomopretendíaelcódigo?

2. ¿Sepuedemodificareltratamientoasociadoacualquiersignal?

3. Mira en elman (man alarm) el valor de retornode la llamada a sistemaalarmy piensacómopodríamosarreglarelcódigoparadetectarcuándounSIGALRMnos llegasinestarrelacionadoconeltemporizador.

Sobrealarm3:latabladeprogramacióndesignalssehereda.

1. ¿Quién recibe los SIGALRM: el padre, el hijo o los dos? ¿Cómo lo has comprobado?Modifica la función “funcion_alarma” para que en el mensaje que se escribe aparezcatambiénelpiddelproceso,deformaquepodamosverfácilmentequéprocesorecibelossignals.

Sobrealarm4:losSIGALRMsonrecibidosúnicamenteporelprocesoqueloshagenerado

1. ¿CuántosSIGALRMSprogramacadaproceso?¿Quiénrecibecadaalarma:Elpadre,elhijo,losdos?¿Quélepasaalpadre?¿Cómolohascomprobado?Modificaelcódigodeformaquelaprimeraalarmalaprogrameelpadreantesdefork(yelhijono),yobservacómoelhijosequedaesperandoenlallamadasigsuspend.

Sobreejemplo_waitpid:envíodesignalsmediantellamadaasistema,gestióndelestadodefinalizacióndeloshijosydesactivacióndeltemporizador.

1. Analiza el código de este programa y ejecútalo. Observa que dentro del código de losprocesoshijosseutilizauntemporizadorparafijarsutiempodeejecuciónaunsegundo.

2. Modifica el código para que el proceso padre al salir del waitpid muestre en salidaestándarunmensajedescribiendolacausadelamuertedelhijo(haacabadoconunexitohamuertoporqueharecibidounsignal).

3. Completa el programa para limitar el tiempomáximo de espera en el waitpid en cadaiteracióndelbucle:sialcabode2segundosningúnhijohaacabadolaejecución,elpadre

while (1) { comando = leer_comando(); pid_h = fork(); if (pid_h == 0) execlp(comando,….); } waitpid (pid_h, &status, 0); }

Page 36: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página36de73

deberá enviarle un SIGKILL a todos sus hijos vivos. En caso de que algún hijo acabe atiempo, el padre desactivará el temporizador y mostrará un mensaje indicando cuántotiempofaltabaparaqueseenviaraelSIGALRM.Paradesactivareltemporizadorsepuedeutilizarlallamadaasistemaalarmpasándolecomoparámetroun0.NOTA:tenencuentaque para hacer esto es necesario guardar todos los pids de los hijos creados e irregistrandoloshijosqueyahanmuerto.

PARAENTREGAR:previo04.tar.gz #tarczfvprevio04.tar.gzentrega.txt

5. Bibliografía • TransparenciasdelTema2(Procesos)deSO-grau.• Capítulo21(Linux)deA.Silberschatz,P.GalvinyG.Gagne.OperatingSystem

Concepts,8thed,JohnWiley&Sons,Inc.2009.

Ejerciciosarealizarenellaboratorio

Ø Paratodoslosejercicios,seasumequeseprobarántodoslosejerciciosquesepidenysemodificaráelmakefileparaquesepuedancompilarymontarlosejecutables.

Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

Ø Paraentregar:sesion04.tar.gz

#tar zcfv sesion04.tar.gz entrega.txt makefile ejemplo_alarm2.c ejemplo_alarm3.cejemplo_signal.cejemplo_signal2.ceventos.ceventos2.csignal_perdido2.c

Sobrealarm2:Detectamosquésignalhallegado1. Reprograma el signal SIGUSR1 y haz que esté asociado a la misma función que la

alarma.Modificalafunción“funcion_alarma”deformaqueactualicelossegundosencaso que llegue un signal SIGALRM y que escriba un mensaje en caso que llegueSIGUSR1. Deberás modificar también la máscara de signals que pasas a la funciónsigsuspend. Comprueba que funciona enviando signals SIGUSR1 desde la consolautilizandoelcomandokill.

NOTA: Recuerda que la función de atención al signal recibe como parámetro elnúmerodesignalrecibido.Eneltrabajopreviotenéismásdetalles.

Sobrealarm3:Signalsycreación/mutacióndeprocesosEstos ejercicios estánorientados aqueobservéis loquehemosexplicadoen clasede teoríarelacionadoconlagestióndesignalsylacreación/mutacióndeprocesos:Alcrearunproceso

Page 37: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página37de73

elhijoHEREDAlatabladesignalsdesupadre.Almutarunproceso,sutabladesignalsseponepordefecto.

2. ModificaelcódigoparaquelareprogramacióndelsignalSIGALRM(llamadaasistemasignal) sólo la haga el hijo.OBSERVA cómo antes de estamodificación, tanto padrecomo hijo (por medio de la herencia) tenían capturado el SIGALRM. Después delcambio, la modificación del hijo es privada, por lo que el padre tiene asociado aSIGALRMlaacciónpordefecto.

PREGUNTA28. ¿QuélepasaalpadreahoracuandolellegaeleventoSIGALRM?

3. Modifica el código para que después de programar el temporizador el proceso hijomuteparaejecutarotroprograma.Esteprogramatienequedurarmásde10segundosparaquerecibaelsignalSIGALRMantesdeacabar(porejemplo,puedesimplementarun programa que sólo ejecute un bucle infinito).OBSERVA cómo almutar la acciónasociadaaSIGALRMseponepordefecto,yaquelatabladesignalsseresetea.

PREGUNTA29. ¿Quépasa con la tabla de tratamientos de signals si hacemosun execlp (ycambiamos el código)? ¿Se mantiene la reprogramación de signals? ¿Se pone pordefecto?

Sobre ejemplo_waitpid: Esperamos que acaben los hijos. Impacto de laimplementacióndelossignalsPREGUNTA30. Elprogramaejemplo_waitpid,¿Essecuencialoconcurrente?

La llamadaasistemawaitpidnormalmenteseutilizadeformabloqueante.Elprocesoque laejecutanocontinuahastaquealgúnprocesohijotermina.Sideseamoscontrolarlafinalizacióndelosprocesoshijossinbloquearalpadre,podemoscapturarelsignalSIGCHLDyesperarquevaya llegando. Eneste caso, al serun casounpoco forzado,deberemos realizarunaesperaactivaenelprocesopadreyaquedeotraformaterminarásuejecuciónantesdequeterminenlosprocesoshijos.

4. Crea una copia de este programa llamada ejemplo_signal.c.Modifica este programaparaqueelprocesopadrenosebloqueeenelmainalaesperadeloshijos,sinoqueejecute la llamadawaitpiden la funcióndeatenciónalSIGCHLD(notificacióndequeun hijo ha acabado). Esto le permite continuar con su ejecución normalmente.Recuerdaqueenestecasodebeshacerqueelpadrerealiceunaesperaactivaparanoacabar suejecución. Lonormal seríautilizar estaopciónen casoqueelpadre tengaalgoparaejecutar.Puedesutilizarunavariableglobalquetedigasiaúnquedanhijosvivos.

CUIDADO!:Mientras se está ejecutando el tratamiento de un signal, el sistema pordefecto bloquea la notificación de nuevos signals del mismo tipo, y el proceso losrecibiráalsalirdelarutina(estecomportamientosepuedemodificarconunflagdelaestructura sigaction). Pero, el sistema operativo sólo es capaz de recordar un signalpendientedecadatipo.Esdecir,simientrasseestáejecutandoeltratamientodeun

Page 38: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página38de73

signalelprocesorecibemás,alsalirdelarutinasólosetrataráunodecadatipoyelrestoseperderán.Porestemotivo,larutinadetratamientodeSIGCHLDdebeasegurarque al salir de ella se ha esperado a todos los hijos que hayan muerto durante eltratamiento del signal pero sin bloquearte (recuerda que dentro de una rutina detratamiento de signal jamás debes bloquearte). Mira el significado de la opciónWNOHANGdelallamadaasistemawaitpid(manwaitpid)yutilízalaparaquewaitpidseanobloqueante.

5. Crea una copia de ejemplo_signal.c con el nombre ejemplo_signal2.c.Modifica esteprograma para que el padre, una vez creados todos los procesos hijos, les envíe atodosellosel signalSIGUSR1 (cuyaacciónpordefectoes terminar)y luegocontinúeincrementandolavariablecontador.Además,despuésdeejecutarlallamadawaitpid,elpadremostraráelPIDdelhijomáselmotivoporel cualesteprocesohaacabado(macros WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG). ¿Qué valor definalizaciónpresentacadaprocesohijo?

• PISTA: Ten en cuenta que la llamada sigsuspend() bloquea al proceso hasta quellegueunsignalqueelprocesotengacapturado,perosielsignalllegaantesdequeelprocesoejecuteelsigsuspend(),elprocesopodríabloquearseindefinidamente.Deberás modificar la máscara de signals del sigsuspend para que capture elSIGUSR1ybloquearlarecepcióndeesesignalfueradelsigsuspend.

• Creaunafunciónque,utilizandolasmacrosanteriores,escribaelPIDdelprocesoquehaterminadoyunmensajeindicandosihaterminadoporunexitounsignalyencadacasoelexit_statusosignal_code.TenéisunejemplodecómousarestasmacrosenlastransparenciasdelT2.

PROTECCIÓNENTREPROCESOSLosprocesosnopuedenenviarsignalsaprocesosdeotrosusuarios.Enelsistemahayvariosusuarioscreados(so1,so2,so3,so4yso5)elpassworddetodoses“sistemes”.

6. Ejecuta el programa alarm2 en un terminal y comprueba su PID. Abre una nuevasesiónycambiaalusuarioso1(ejecuta#suso1).Intentaenviarsignalsalprocesoqueestáejecutandoalarm2desdelasesióniniciadaconelusuarioso1.

PREGUNTA31. ¿El usuario so1 puede enviar al signals al proceso lanzado por el usuarioalumne?,¿quéerrorda?

GESTIÓNDESIGNALSElobjetivodeestasecciónesqueseascapazdeimplementarporcompletounprogramaquegestionevariostiposdesignalsutilizandountratamientodiferentealdepordefecto.

7. Haz un programa, llamado eventos.c, que ejecute un bucle infinito y que tenga unavariable global para almacenar el tiempo que lleva el proceso ejecutándose (ensegundos).Estavariablesegestionamediantesignalsdelasiguientemanera:

• Cadasegundoseincrementa• SielprocesorecibeunSIGUSR1lavariablesepondráacero

Page 39: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página39de73

• Si el proceso recibe un SIGUSR2 escribirá por pantalla el valor actual delcontador

Hazquetodoslossignalsdelprogramaseanatendidosporlamismafunción.Envíalossignalsdesdelalíneadecomandosycompruebaquefuncionacorrectamente.

COMPORTAMIENTOPORDEFECTOLa reprogramación de un signal en Linux por defecto semantiene durante toda la vida delproceso. Por esta razón, a veces, es necesario forzar el comportamiento por defecto de lossignalsenelcasodequenonosintereseprocesarmáseventos.

8. Crea una copia de eventos.c con el nombre eventos2.c. Modifica el código deeventos2.c para que la segunda vez que reciba el mismo signal se ejecute elcomportamientopordefectodeesesignal.PISTA:consultaenlapáginadelmanualdelsigactionlaconstanteSA_RESETHAND.

PREGUNTA32. ¿Quémensajemuestra el Shell cuando se envía por segunda vez elmismosignal?

RIESGOSDELACONCURRENCIACuandoseprogramanaplicacionesconvariosprocesosconcurrentesnosepuedeasumirnadasobre el orden de ejecución de las instrucciones de los diferentes procesos. Esto tambiénaplicaalenvíoyrecepcióndesignals:nopodemosasumirqueunprocesorecibiráunsignalenunmomentodeterminado.Estohayquetenerloencuentaalutilizarlallamadasigsuspend.

El programa signal_perdido.c muestra esta problemática de forma artificial. Este programacreaunprocesoquepretendeesperarenunallamadasigsuspendlarecepcióndeunsignal.Elprocesopadreeselencargadodeenviarleestesignal.Elmomentoenelqueseenvíaelsignaldependedel parámetrodel programa: sehace inmediatamente (valor deparámetro0) o seretardauntiempo(valordeparámetro1).

9. Ejecutaelprogramasignal_perdidopasándolecomoparámetro1.Anotaenelficheroentrega.txt qué resultado observas. A continuación ejecuta de nuevo el programapasándole como parámetro 0. Anota de nuevo en respuestas.txt el resultado queobservas.

PREGUNTA33. Explicaaquésedebeelresultadodelasejecucionesdesignal_perdidoconparámetro1yconparámetro0

10. Modifica el programa signal_perdido (llámalo signal_perdido2.c) para que, antes derealizar la espera, bloquee provisionalmente la recepción del signal utilizando lallamada sigprocmask, de manera que se evite la pérdida del signal. Recuerdadesbloquearelsignaldespuésdelaespera.

Page 40: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Sesion5:GestiondeMemoriaPreparaciónprevia

Objetivos• Comprenderlarelaciónentreelcódigogeneradoporelusuario,elespaciológicodel

proceso que ejecutará ese programa y el espacio dememoria física ocupado por elproceso.

• Entenderladiferenciaentreenlazarunejecutableconlibreríasestáticasodinámicas.• Entender el funcionamiento de algunos comandos básicos que permiten analizar el

usodelamemoriaquehacenlosprocesos.• Entenderelcomportamientodefuncionesdela libreríadeCydellamadasasistema

simples que permitenmodificar el espacio de direcciones lógico de los procesos entiempodeejecución(memoriadinámica).

Habilidades• Sercapazde relacionarpartesdeunbinarioconsuespaciodedirecciones lógicoen

memoria.• Saber distinguir las diferentes regiones de memoria y en qué región se ubica cada

elementodeunproceso.• Entenderelefectodemalloc/free/sbrksobreelespaciodedirecciones,enparticular

sobreelheap.• Sabercómoreservaryliberarmemoriadinámicaysusimplicacionesenelsistema.• Sercapacesdedetectarycorregirerroresenelusodememoriadeuncódigo.

Conocimientosprevios• Entenderelformatobásicodeunejecutable.• ProgramaciónenC:usodepunteros.• Saberinterpretaryconsultarlainformacióndisponiblesobreelsistemaylosprocesos

eneldirectorio/proc.

Guíaparaeltrabajoprevio• Antes de la sesión, consultad el man (man nombre_comando) de los siguientes

comandos.Enconcreto,paracadacomandodebéisleeryentenderperfectamente:laSYNOPSIS, la DESCRIPTION y las opciones que os comentamos en la columna“Opciones”delatabla.

Paraleerenelman

Descripciónbásica Opcionesaconsultar

gcc CompiladordeC -staticnm Comando que muestra la tabla de símbolos del

programa(variableglobalesyfunciones)

Page 41: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página41de73

objdump Comando que muestra información sobre elficheroobjeto

-d

/proc Contiene información sobre el sistema y losprocesosenejecución

/proc/[pid]/maps

malloc FuncióndelalibreríadeCquevalidaunaregióndememorialógica

free FuncióndelalibreríadeCqueliberaunaregióndememorialógica

sbrk Llamada a sistema que modifica el tamaño de laseccióndedatos

• En lapáginawebde laasignatura (http://docencia.ac.upc.edu/FIB/grau/SO) tenéiselficheroS5.tar.gzquecontienetodoslosficherosfuentequeutilizaréisenestasesión.Créateundirectorioentumáquina,copiaenélelficheroS5.tar.gzydesempaquétalo(tarzxfvS5.tar.gz).

• Creaunficherodetextollamadoprevio.txtycontestaenélalassiguientespreguntas.• Practica el uso de nm y objdump con los siguientes ejercicios aplicados al siguiente

código(quepuedesencontrarenelficheromem1_previo.c):

• Utiliza el comando nm sobre el ejecutable y apunta en el fichero “previo.txt” ladirección asignada a cada una de las variables del programa. Busca en el man (yapunta en previo.txt) los tipos de símbolos que nos muestra nm. Por ejemplo, lossímbolosetiquetadosconuna“D”significaqueestánenlaseccióndedatos(variablesglobales).¿Esposiblesaberladireccióndelasvariables“i”y“j”conelcomandonm?¿Por qué? ¿En qué zona de memoria están reservadas estas variables? Buscatambiénladirecciónasignadaalafunción“suma”.

#include<stdio.h> #include<stdlib.h> #include<string.h> char buff[100]; void suma (int op1, int op2, int *res){ *res = op1 + op2; } int j; main(int argc, char *argv[]){ int i; int s; i=atoi(argv[1]); j=atoi(argv[2]); suma(i,j,&s); sprintf(buff,”suma de %d y %d es %d\n”,i,j,s); write(1,buff, strlen(buff)); }

Page 42: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página42de73

• Modificaelprogramaanterior (llámalomem1_previo_v2.c)paraque lavariable “s”estédefinidaenelprogramaprincipalcomopunteroaentero (int*s)yasígnaleunadirecciónválidaantesdellamaralafunción“suma”.Paraelloutilizalafunciónmallocpara reservar suficienteespacioparaalmacenarunenteroy asígnale ladireccióndeesa región a la variable. Adapta el resto del código a este cambio para que sigafuncionando.

• Utiliza el comando gcc para compilar el fichero mem1_previo.c enlazándolo conlibreríasestáticas.Indicaenelfichero“previo.txt”quécomandohasutilizado.

• El programamem2_previo lee de teclado el número de elementos de un vector deenteros, inicializaelvectorconesenúmerodeelementosyacontinuación lossuma.Modifica este programa (llámalo mem2_previo_v2.c) para que en lugar de usar unvectorestático,usememoriadinámica.Paraellodeclaralavariable“vector”comounpuntero a entero. Después de leer por teclado el número de elementos que debetenerelvector,elprogramadebeutilizarlallamadaasistemasbrkparareservarunaregión dememoria en la que quepan esos elementos y asignar la dirección de estaregiónalavariablevector.

• Compila de forma estática tantomem2_previo comomem2_previo_v2. Para ambosprogramas haz lo siguiente: ejecuta el programa y antes de pulsar Return para queacabe, desde otro terminal, accede al directorio del /proc/PID_del_proceso quecontiene la información sobre el proceso y observa el fichero maps. Este ficherocontieneuna líneaparacada regióndememoria reservada. Laprimeracolumnanosindica la dirección inicial y final de la región (en hexadecimal). La diferencia entreambosvaloresnosdaeltamañodelaregión.Buscaenlapáginadelmanparaprocelformatodelasalidadelficheromapsyelsignificadodelrestodecampos.Anotaenelfichero previo.txt el tamaño total de la region de heap y datos para los siguientesnúmeros de elementos del vector: 10 y 40000. La región del heap esta etiquetadacomo[heap]perolaregióndedatosestáetiquetadaconelnombredelejecutable.Deberás deducir cual es (hay varias) por los permisos de la región. ¿Existe algunadiferenciaentrelosdistintosvaloresdelasejecucionesdeambosprogramas?

• El fichero mem3_previo.c contiene un código que tiene un error en el uso de unpuntero.Ejecutaelprogramaycompruebaquéerroraparece.Modificaelcódigo(enel ficheromem3_previo_v2.c)paraque cuandoelprogramagenereel signalde tipoSIGSEGV (segmentation fault), la rutinadeatenciónal signalmuestreunmensajedeerrorporpantallayacabelaejecucióndelprograma.

• PARAENTREGAR:previo05.tar.gzo #tar zcfv previo05.tar.gz previo.txt mem1_previo_v2.c mem2_previo_v2.c

mem3_previo_v2.c

Bibliografía• Capítulo8(MainMemory)deA.Silberschatz,P.GalvinyG.Gagne.OperatingSystem

Concepts,8thed,JohnWiley&Sons,Inc.2009.

Ejerciciosarealizarenellaboratorio

Ø Para cada pregunta que se crea un nuevo fichero de código se tiene que modificar elMakefileparaquelocompileymonteelejecutable.

Page 43: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página43de73

Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueapareceneneldocumento,indicandoparacadapreguntasunúmeroyturespuesta.Estedocumentosedebeentregara travésdelRacó.Laspreguntasestánresaltadasennegritaenmediodeltextoymarcadasconelsímbolo:

Ø PARAENTREGAR:sesion05.tar.gzo #tar zcfv sesion05.tar.gz entrega.txt Makefile mem1_v2.c mem1_v3.c

mem2_v2.c

Espaciodedireccionesdeunprocesoycompilaciónestáticaydinámica

Elobjetivodeestasecciónesdoble:porun lado,entendercómoseorganizan losdatosyelcódigodeunprogramaenelespaciodedireccionesdelproceso;porotrolado,entendercómoinfluye tanto en el ejecutable como en el espacio de direcciones el tipo de compilaciónutilizado (estática o dinámica). Para ello, usaremos comandos que permiten analizar losejecutables y observaremos la información sobre el espacio de direcciones guardada en el/proc.

Elficheromem1.ccontieneunprogramaquereservamemoriadurantelaejecución.Analizasucontenidoantesderesponderalassiguientespreguntas.

1. Compila el programa enlazando con las librerías dinámicas del sistema (compilaciónpor defecto) y guarda el ejecutable con el nombre mem1_dynamic. Ejecuta elcomandonmsobreelejecutable.

PREGUNTA34. ¿Qué variables aparecen en la salida del nm de mem1_dynamic? ¿Quédirecciónocupa cadauna? Indicaaque regiónpertenece cadavariable según la salidadelnmyeltipodevariable(localoglobal).

2. Compilaahoraelprograma,enlazandoconlaslibreríasestáticasdelsistema,yguardael ejecutable con el nombre mem1_static. Compara ahora los ejecutablesmem1_dynamicymem1_staticdelasiguientemanera:

a. Utilizando el comando nm para ver los símbolos definidos dentro de cadaejecutable.

b. Utilizandoelcomandoobjdumpconlaopción–dparaverelcódigotraducido.c. Comparandolostamañosdelosejecutablesresultantes.

PREGUNTA35. Paralosdosejecutables,compiladoestáticoydinámico,observasutamaño,lasalidadeloscomandosnmyobjdump¿Enquésediferencianlosdosejecutables?

3. Ejecutaenbackground(ensegundoplano)lasdosversionesdelejecutableycomparaelcontenidodelficheromapsdel/procparacadaunodelosprocesos.

PREGUNTA36. Observaelcontenidodelficheromapsdel/procparacadaprocesoyapuntaparacadaregiónladireccióninicial,direcciónfinalyetiquetaasociada.¿Quédiferenciahayentreelmapsdecadaproceso?

Page 44: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página44de73

PREGUNTA37. ¿A qué región de las descritas en el maps pertenece cada variable y cadazonareservadaconmalloc?Apuntaladireccióninicial,direcciónfinalyelnombredelaregión.

Memoriadinámica

Elobjetivodeestasecciónesentendercómoafectaalespaciodedireccionesdeunprocesolamemoria dinámica reservada en tiempo de ejecución, dependiendo del interfaz que se use:sbrk o malloc. Recuerda que sbrk es la llamada a sistema, y que simplemente aumenta oreduceeltamañodelheapenXbytes(loquepidaelusuario).Malloc/freesonlasfuncionesdela libreríadeC,queofrecenunagestiónmuchomás sofisticadade lamemoriadinámica. LalibreríadeCreservaunazonagrandedeheapylautilizaparairgestionandolaspeticionesdelusuario sin tener que modificar el tamaño del heap. Para ello, utiliza estructuras de datos(también almacenadas enel heap) que sirvenpara anotar que trozos estánocupados y quetrozosestánlibres.

4. Ejecutaenbackgroundelprogramamem1pasándolelosparámetros3,5y100(son3ejecuciones). Observa el maps del /proc para comparar el tamaño de las zonas dememoria en función del número de regiones reservadas con malloc. Analiza losresultadosenfuncióndeloexplicadoenclasesobreelfuncionamientodemalloc.

PREGUNTA38. Paracadaejecuciónapuntaelnúmerodemallocshechosyladireccióninicialy final del heap quemuestra el ficheromaps del /proc. ¿Cambia el tamaño según elparámetrodeentrada?¿Porqué?

5. Creaunacopiadelficheromem1.cllamadamem1_v2.c.6. Añade un free al final de cada iteración del bucle de reserva de regiones en

mem1_v2.cyvuelveaejecutarenbackground(conelparámetro100),observandoelficheromapsdel/procyeltamañodelazonaquealbergalasregionesreservadasconmalloc.

PREGUNTA39. ¿Cuáleseltamañodelheapenestecaso?Explicalosresultados.

7. Crea una copia de mem1.c llamada mem1_v3.c. Modifica el código de mem1_v3.csubstituyendolallamadaalafunciónmallocporlallamadaasistemasbrkyejecútaloen background, usando los mismos parámetros que en el apartado 4 (3, 5 y 100).Observa el fichero maps del /proc y el tamaño del heap que alberga las regionesreservadasconsbrk.

PREGUNTA40. Paracadaejecuciónapuntaelnúmerodemallocshechosyladireccióninicialy final del heap que se muestra en el maps del /proc. ¿Cambia el tamaño del heaprespectoalobservadoenlapregunta6?¿Porqué?

8. Modificaelcódigoanteriorparaqueimplemente(ademásdelareserva)laliberacióndememoriautilizandosbrk(llamadaasistema)envezdemalloc(libreríadeC).

AccesosincorrectosElficheromem2.ccontieneuncódigoquetieneunerrorenelusodeunpuntero(diferentedelerrorquehabíaenelficheromem3_previo.cvistoenelestudioprevio).Ejecutaelprogramaycompruebaquerealmentenofunciona.

Page 45: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página45de73

9. Modificaelcódigo(llámalomem2_v2.c)paraquecuandoelprocesorecibaelsignaldetipoSIGSEGVseimprimaenlasalidaestándarunmensajeindicando:

a. Ladireccióndelavariablep.b. Elvalordelavariable(direcciónalaqueapuntaelpuntero).c. Ladireccióndóndefinalizaelheapdelproceso(estadirecciónyanoesválida).

NOTA:Imprimesólolos3valoresqueospedimos,sicopiasdirectamenteelwritedelcódigopuedesestarrepitiendoelmismoerrorqueprovocaelsignal.

PREGUNTA41. ¿Quéerrorcontieneelcódigodelprograma?¿Porquéelprogramanofallaen las primeras iteraciones? Propón una alternativa a este código que evite que segenerelaexcepción,detectando,antesdequepase,quevamosahacerunaccesofueradelespaciodedirecciones.

Page 46: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página46de73

Sesion6:AnalisisderendimientoPreparaciónprevia

1. ObjetivosLosobjetivosdeestasesiónson:1)entenderlasimplicacionesdelagestióndeprocesosydememoriaenelrendimientodeunsistemamultiusuario,y2)medireltiempodeejecucióndeunprogramasegúnlacargadelsistemayelcambioenlasprioridadesdelosprocesos.

2. Habilidades• Entender cómo influyen las distintas políticas de planificación y prioridades en los

programasdeusuario.• Entender cómo influye la carga del sistema en el tiempo de ejecución de los

programas.• Relacionarelrendimientodelsistemaconelusodememoriaquehacenlosprocesos.• Sercapazdeobtenerinformaciónsobrelosprocesosenejecuciónatravésdel/proc.• Sercapazdever la listade losprocesosdetodos losusuariosparadetectarposibles

problemasenelsistema.

3. GuíaparaeltrabajoprevioAntesdelasesión,consultadelman(man nombre_comando)delossiguientescomandos.En concreto, para cada comando debéis leer y entender perfectamente la SYNOPSIS y laDESCRIPTION, y poner especial atención a las opciones que aparecen en la columna“Opciones”delasiguientetabla.

Para leer en elman

Descripciónbásica Opciones

nice Ejecutaunprogramamodificándole laprioridaddeplanificación

uptime Muestracuánto tiempo llevaencendidoel sistemaylacargamedia

w Muestraquienestáconectadoyqueestáhaciendo /proc Pseudo-filesystemqueofreceinformacióndedatos

delkernelcpuinfo,/proc/[pid]/stat

time Ejecutaunprogramaymideeltiempoquetardaenejecutarse

vmstat Muestraestadísticassobreelusodelamemoria delay

top Muestra información sobre el sistema y losprocesosenejecución

comando interactivo:f

EnLinuxlapolíticadeplanificacióndeprocesosestábasadaenRoundRobinconprioridades.Esdecir, lacoladeReadyestáordenadaen funciónde laprioridadquesehaasignadoa los

Page 47: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página47de73

procesos. Losusuariospuedenbajar laprioridadde susprocesosejecutándolosmedianteelcomandonice(sólorootpuedesubirlaprioridaddecualquierproceso).Laprioridadsedefinemedianteunnúmero.Valoresnuméricosbajosde laprioridadimplicaqueelprocesoesmásprioritario.

Los comandos top, uptimeyw nosmuestran información del sistema. Estos comandos sonútilesdecaraahaceruncontrolsencillodelacargadelsistema.

• El comando top nosmuestra todos los procesos del sistema y detalles como el%CPU que consumen, la prioridad que tienen, el usuario, etc. Además, nosmuestra información global del sistema como la carga media. Este valor no espuntualsinoqueeslamediadelosúltimos1,5y15minutos.

• El comando w nos muestra información muy resumida sobre quién estáconectado.

• Elcomandouptimeofreceinformaciónestadísticadelsistema.

Figura4Ejemplodesalidadelcomandotop

Laimagenanteriornosmuestraunejemplodelasalidadelcomandotop.Enlapartesuperiorhayelresumendelsistemayluegolalistadetareas.Enestecasohemosremarcadolacargadel sistema y los dos procesos que estábamos ejecutando. La columna PR nos muestra laprioridad de los procesos. En Linux un valor alto de la prioridad indica menos prioridad.PodemosvercomoelprocesoconPR=25recibemás%CPU(66.9)queelprocesoconPR=35(32.0).

Page 48: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página48de73

Alahoradeinterpretarlainformaciónquenosdatopyuptimeesnecesariotenerencuentaelnúmerodeunidadesdecomputación(CPU’s,cores,etc.)quetenemosenlamáquina,yaqueesodeterminaelnúmerodeprogramasquepodemostenerenejecuciónalmismotiempo.Porejemplo, si tenemos 2 cores podría pasar que 2 procesos al mismo tiempo estuvieranconsumiendoun 80%de cpu. El fichero /proc/cpuinfo contiene información sobre las cpu’squetenemosennuestramáquina.

1. Consultaelmandelproc(manproc)eindica,enelfichero“previo.txt”,enquéficherodel /proc, y en qué campo del fichero, se muestra el número de fallos de páginatotalesdelproceso(minorpagefaults+majorpagefaultsenLinux).

a. NOTA: En Linux, es posible que un fallo de página no implique un acceso adisco gracias a alguna de las optimizaciones de memoria. En este caso seconsidera un fallo de página “soft” o minor page fault, ya que es menoscostosoqueaquellosqueimplicaniraldisco.

2. Ejecutaelcomandovmstatdemaneraque lasalidasemuestrecadasegundo.¿Quéopciónhasutilizado?¿Enquécolumnassemuestralacantidaddeswap-inyswap-out?Contestaalaspreguntasenelfichero“previo.txt”.

a. NOTA: Swap-in y swap-out es la cantidad de memoria que se hatraído/enviadodesde/haciadisco.

3. Consulta la página del manual del comando time (man time). El comando/usr/bin/timesirveparaejecutarunprogramamidiendosutiempodeejecución.Esteprograma muestra por defecto 3 valores de tiempo: tiempo empleado en modousuario (user), tiempoempleadoenmodosistema (system)y tiempototal (elapsed).Durantelasesiónusaremoseltiempototaldeejecución.

a. NOTA:elintérpretedecomandosBashtieneuncomandointernoquetambiénse llama time y es el que se ejecutará por defecto si no ponemos el pathcompletodenuestrocomando.

4. Familiarízate con el entorno que usarás en la sesión: bájate el fichero S6.tar.gz ydescomprímelo (tar zxvf S6.tar.gz). En esta sesión te proporcionamos varios scriptspara facilitar la ejecución de los programas. Un script no esmás que un fichero detexto que contiene un conjunto de comandos que pueden ser interpretados por laShell. La primera línea de un script debe indicar la Shell que se quiere utilizar parainterpretarelcontenidodelfichero.Estoesimportanteporqueademásdecomandosenlosscriptssepuedenutilizarestructurasdecontrol(condicionales,bucles,…)ycadaShell define su propia sintaxis para estas estructuras. Los scripts se pueden ejecutarcomocualquierotroprograma,perocomoson ficherosde textoypordefectoestosficheros se crean sin permiso de ejecución, es necesario comprobar si tienen esepermisoactivadoysinolotienendebemosactivarlomedianteelcomandochmod(versesión2).

5. En el paquete S6.tar.gz tienes el fichero fibonacci.c que contiene un programa decálculoyque loutilizáremosparaverel impactoquetiene lacargadel sistemay lasprioridadesenlaejecucióndelprograma.Utilizaelmakefileparacompilarelprogramayejecútalocondiferentesparámetrosparavercómofunciona.

6. Utiliza el comando /usr/bin/time para medir el tiempo que tarda en ejecutarFibonaccisiselepasanlosparámetros10,20,30,40y50yapuntaesetiempoenelficheroprevio.txt.

Page 49: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página49de73

7. En el paquete tienes también dos scripts para automatizar la ejecución de variasinstancias de Fibonacci. El script FIB recibe como parámetro cuántos programasFibonacci queremos lanzar y los ejecuta de forma concurrente (en background),midiendoel tiempoque tarda cadaunoenacabar. El scriptBAJA_PRIO_FIB tambiénejecuta concurrentementeel númerodeprogramas Fibonacci que lepasamos comoparámetroymidesutiempodeejecución,peroenestecasoutilizaelcomandoniceparaejecutarlosconmenosprioridad.Porejemplo,siejecutamoselcomando:

#./FIB2

Esequivalenteaejecutarlossiguientescomandosdeformaconsecutiva:

#/usr/bin/time./fib45&#/usr/bin/time./fib45&

Anotaenelficheroprevio.txtconquévalordeniceseejecutafibonaccidesdeelscriptBAJA_PRIO_FIB.Paraaveriguarlo,consultaenlapáginadelmanualelcomportamientodenice.

Finalmente,tambiénosdamoselficheroRendimientoProcesos.odsqueesunahojadecálculodeOpenOfficequeiréisrellenandodurantelasesión.

• PARAENTREGAR:previo06.tar.gz#tarzcfvprevio06.tar.gzprevio.txt

4. Bibliografía • TransparenciasdelTema2y3(ProcesosyMemoria)deSO-grau• Capítulo5,8y9(Scheduling,MainMemoryyVirtualMemory)deA.Silberschatz,P.

GalvinyG.Gagne.OperatingSystemConcepts,8thed,JohnWiley&Sons,Inc.2009.

Ejerciciosarealizarenellaboratorio

Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

Ø Paraentregar:sesion06.tar.gz

#tarzcfvsesion06.tar.gzentrega.txtRendimientoProcesos.ods

RENDIMIENTODELAGESTIÓNDEPROCESOS

¿CuántasCPU’socorestengo?Accedealfichero/proc/cpuinfoparaaveriguarcuantasCPU’socorestienesenlamáquinaen la que trabajas. Esta información te ayudará a interpretar los resultados sobre elconsumodeCPUdelosprocesos.

Page 50: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página50de73

PREGUNTA42. Apuntaenel ficheroentrega.txtelnúmerodeunidadesdecálculo (coresoCPUS)quetienesenlamáquina.

Ejecuciónde1aplicación“sola”.Medimoseltiempo.• Paraesteejercicioutilizaremos2terminales.Enunodeellosejecutaelcomandotopy

enelotroejecuta5vecessecuencialmenteelsiguientecomando(cuandoacabaunolanzael siguiente).Recuerdaquecomo losprocesosseejecutanenbackground,hayqueesperarquesalganlosmensajes,noessuficienteconesperaravolveralprompt:

o #./FIB1• Compruebaenlasalidadelcomandotopquecadaejecuciónrecibeaproximadamente

toda laCPU.Calcula el tiempomedio, elmáximoy elmínimo (tiempo real) de las 5ejecuciones.

PREGUNTA43. Apuntaeltiempomedio,máximoymínimoparaunainstanciaenlaTabla1delahojadecálculoadjunta.

Impactodeentornomultiproceso.Cargadelsistema, tiempodeejecuciónyprioridades.

• Repite elmismoexperimentoprimeropara 2 instancias concurrentes (ejecutandoelcomando./FIB2)yluegopara5instancias(ejecutandoelcomando./FIB5).

• Observa con el comando top cómo se reparte la CPU en cada uno de los casos.Observacómose intentahacerunreparto“justo”ycomoel tiempodeejecucióndetodos los procesos es incrementado en lamisma proporción. Para interpretar estosresultadostenencuentaelnúmerodeCPUsquetienesenlamáquina.

• Compruebaquelasprioridadesdelosprocesossonlasmismas.

PREGUNTA44. Anota para cada experimento los tiemposmedio, máximo ymínimo en laTabla1delahojadecálculoadjunta.

Impactodeentornomultiprocesoymultiusuario• Los experimentos anteriores se han hecho con el mismo usuario. En este ejercicio

veremoscómoafectaloquehaceunusuarioalresto.• Paraesteexperimentoutilizaremos3terminales.Manténenejecuciónelcomandotop

enunterminal.Abreunnuevoterminalyutilizaelcomando“su”paracambiaraunnuevousuario(so1porejemplo):

o #suso1

Page 51: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página51de73

• Ahoraejecutacomoelusuario“so1”elcomando./FIB5paragenerarunacargaalta.Yalmismotiempo,enotroterminalyconelusuarioinicial(“alumne”),ejecuta5vecesdeformasecuencialelcomando./FIB1.

PREGUNTA45. ¿Cómoseveafectadoeltiempodeejecucióndelproceso?

PREGUNTA46. ¿Qué%CPUhaasignadoelsistemaacadaproceso?

PREGUNTA47. Laasignación,¿hasidoporprocesooporusuario?¿Creesqueesposibleque1usuariosatureelsistemaconestecriterio?

ImpactodelaprioridadeneltiempodeejecuciónEl comando nice permite bajar la prioridad a los procesos de un usuario de forma que seasignemástiempodeCPUalosmásprioritarios.VamosacomprobarcómoinfluyelaprioridadenelrepartodelaCPU.

• Manténlaejecucióndelcomandotopenunterminalyejecutadeformasimultánea,conelmismousuario, loscomandos ./FIB1yBAJA_PRIO_FIB1.Mide lostiemposdeejecucióndecadafibonacci.Repiteelexperimento5vecesyanotaenlaTabla2(delahojadecálculo)eltiempodeejecuciónmedioparaFIByBAJA_PRIO_FIBen lafila“2instancias”.

• Comprueba,medianteelcomandotop,comosehanasignadodiferentesprioridadesacada uno y como se observa un reparto de%CPU similar al de la figura del trabajoprevio.

• Repiteelexperimentoanterior,lanzandosimultáneamente./FIB1yBAJA_PRIO_FIB5.Anotalostiemposdeejecuciónenlafila“5instancias”,paraestosexperimentos.

PREGUNTA48. ¿Cómoseveafectadoel tiempodeejecucióndeFIBrespectoalnúmerodeinstanciasdeBAJA_PRIO_FIB?

PREGUNTA49. ¿Qué%CPUha asignado el sistema a cada proceso con 2 y 5 instancias deBAJA_PRIO_FIB?

Sin embargo, las prioridades sólo afectan a la compartición de la CPU si los procesos quecompiten por ella tienen diferente prioridad. Para comprobarlo, ejecuta en un terminal elcomando top y en otro lanza el comando BAJA_PRIO_FIB 5. Mide el tiempo medio deejecuciónycompruebaqueestetiempoessimilarentreellos.AhoraejecutaelcomandoFIB5variasvecesycompruebaqueaunqueseejecutanconmayorprioridadqueenelcasoanterior,

Page 52: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página52de73

eltiempodeejecucióndecadaunotambiénessimilaralqueteníancuandoloshasejecutadoconbajaprioridad.

RENDIMIENTODELAGESTIÓNDEMEMORIA

EláreadeswapAnalizaelcódigoquecontieneelficheromem1.cycompílalo.Hazlossiguientesejercicios:

1. Mediante el comando free consulta la cantidad de memoria física, en bytes, de lamáquina(supongamosqueelvaloresFbytes,usaremosFparareferirnosaestevaloren el resto del documento). Consulta en el man la opción necesaria para que elcomandofreenosdelainformaciónenbytes.

PREGUNTA50. ¿Cuántamemoriafísicatieneelsistema(F)enbytes?

2. Ejecuciónconunsóloproceso:Utilizadosshellsdiferentes.Enunalanzaelcomandovmstat para que se ejecute periódicamente (por ejemplo, cada segundo) y en otralanzaelprogramamem1con losparámetrosquese indicanen lasiguientetabla(lasejecuciones tienenque ser secuenciales, esdecir no lancesel siguientemem1hastaquehayaseliminadoelanterior):

Ejecución TamañoRegión NúmeroProcesos NúmeroIteracionesEjecución1 F/4 1 1Ejecución2 F/4 1 4

Paracadaejecuciónobservaeltiempodeejecucióndecadabucledeaccesoyelnúmero de swap-in y swap-out que va reportando el vmstat. Cuando acabe elbucle que cuenta recorridos sobre el vector (justo antes de entrar en el bucleinfinito),consultaparaeseprocesoelnúmerodefallosdepáginatotalesquehaprovocado su ejecución (minor page faults + major page faults), accediendo alfichero statde sudirectorio correspondienteenel /proc.Observa comoconunúnicoprocesonoseponeenmarchaelmecanismodeswapdelsistema.

PREGUNTA51. RellenalasiguientetablayañádelaalficheroRendimientoProcesos.ods.¿Enla Ejecución 2 por qué crees que cambia el tiempo de acceso según el número deiteración?

Ejecución Fallosdepágina

Mínimotiempodebucledeacceso

Máximotiempodebucledeacceso

Ejecución1 Ejecución2

3. Ejecución con varios procesos: Utiliza de nuevo dos shells diferentes. En una Shellejecutaelcomandotop,quedebesconfigurarparaquemuestrealmenoslasiguienteinformación para cada proceso: pid, comando,memoria virtual,memoria residente,

Page 53: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página53de73

memoria de swap y número de fallos de página. Para configurarlo, cuando estésejecutandotopaprietalatecla“h”ytesaldráunmenúconlasdiferentesopcionesdetopquetepermitiránordenarlascolumnas,elegirdeterminadascolumnas,etc.Enlaotra Shell ejecuta el programa mem1 utilizando los siguientes parámetros (lasejecuciones tienenque ser secuenciales, esdecir no lancesel siguientemem1hastaquehayaseliminadoelanterior):Ejecución TamañoRegión NúmeroProcesos NúmeroIteraciones

Ejecución3 F/4 4 1Ejecución4 F/4 6 1Ejecución5 F/4 4 4

No hace falta que esperes a que acabe la Ejecución 5. Una vez obtenido el mensaje de laprimeraiteraciónparatodoslosprocesospuedesinterrumpirlaejecución.

PREGUNTA52. Rellena la siguiente tabla y añádela al fichero RendimientoProcesos.ods(sumalosfallosdepáginadetodoslosprocesosdeunamismaejecución):

Ejecución SumadeFallosdepáginaEjecución3 Ejecución4 Ejecución5

Page 54: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página54de73

Sesion7:GestiondeEntrada/SalidaPreparaciónprevia

Objetivos• Entendercómofuncionaundevicedriver• Entenderlavinculaciónentredispositivológicoyoperacionesespecíficas• Entenderelconceptodeindependenciadedispositivos• Entender losmecanismos que ofrece la shell para la redirección y comunicación de

procesos

Habilidades• Sercapazdecrearyeliminarnuevosdispositivoslógicos• Sercapazdecargarydescargarmódulosdelkernel• Sercapazdeentenderlaimplementaciónespecíficadelasoperacionesreadywrite• Sercapazdeaplicarlasventajasdelaindependenciadedispositivos• Saberredireccionarlaentradaylasalidadeunprocesodesdelashell• Sabercomunicardoscomandosatravésdepipessinnombredesdelashell

Guíaparaeltrabajoprevio• Antes de la sesión, consultad el man (man nombre_comando) de los siguientes

comandos.Enconcreto,paracadacomandodebéisleeryentenderperfectamente:laSYNOPSIS, la DESCRIPTION y las opciones que os comentamos en la columna“Opciones”delatabla.

Para leer en elman

Descripciónbásica Opcionesaconsultar

mknod Comandoquecreaunficheroespecial c,p

insmod Comandoqueinsertaunmóduloenelkernel

rmmod Comandoquedescargaunmódulodelkernel

lsmod Comandoquemuestraelestadode losmóduloscargadosenelkernel

sudo Comando que permite ejecutar un comandocomoroot

open Abreunficheroodispositivo

write Llamadaasistemaparaescribirenundispositivovirtual

read Llamada a sistema para leer de un dispositivovirtual

Page 55: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página55de73

grep Comandoquebuscapatronesenunficherooensuentradaestándarsinoselepasaficherocomoparámetro

-c

ps Comando que muestra información sobre losprocesosenejecución

-e,-o

strace Lista las llamadas a sistema ejecutadas por unproceso

-e,-c

• En lapáginawebde laasignatura (http://docencia.ac.upc.edu/FIB/grau/SO) tenéiselficheroS7.tar.gzquecontienetodoslosficherosfuentequeutilizaréisenestasesión.Créateundirectorioentumáquina,copiaenélelficheroS7.tar.gzydesempaquétalo.

• Contestaalassiguientespreguntasenelfichero“previo.txt”.

Redireccióndeentrada/salida,usodelosdispositivoslógicoterminalypipe

El fichero es1.c contiene un programa que lee de la entrada estándar carácter a carácter yescribeloleídoenlasalidaestándar.Elprocesoacabacuandolalecturaindicaquenoquedandatos para leer. Compila el programa y, a continuación, ejecútalo de las siguientesmanerasparavercómosecomportaenfuncióndelosdispositivosasociadosaloscanalesestándardelproceso:

1. Introducedatosportecladoparavercómosecopianenpantalla.Paraindicarquenoquedan datos pulsa ^D (Control+D), que es el equivalente a final de fichero en lalecturadeteclado.¿Quévalordevuelvelallamadareaddespuésdepulsarel^D?

2. Creaunficheroconuneditordetextocualquieraylanzaelprograma./es1asociandomediante la shell su entrada estándar a ese fichero. Recuerda (ver Sesión 1) que esposible redireccionar la entrada (o la salida) estándar de un comando a un ficheroutilizando el carácter especial de la shell < (o > para la salida).Apunta el comandoutilizadoenelfichero“previo.txt”.

Los Shell de Linux permiten que dos comandos intercambien datos utilizando una pipe sinnombre (representadaporel carácter ‘|’en la shell). La secuenciadecomandosconectadosmediantepipessellamapipeline.Porejemplo,laejecucióndelpipeline:

#comando1|comando2

hacequeelShellcreedosprocesos(queejecutancomando1ycomando2respectivamente)ylos conectemediante unapipe sin nombre. Este pipeline redirecciona la salida estándar delproceso que ejecuta el comando1, asociándola con el extremo de escritura de esa pipe, yredirecciona la entrada estándar del proceso que ejecuta el comando 2, asociándola con elextremo de lectura de la misma pipe. De esta manera, todo lo que el proceso comando1escribaensusalidaestándarserárecibidoporelprocesocomando2cuandoleadesuentradaestándar.

Por ejemplo, en el directorio donde has descomprimido el fichero de la sesión, ejecuta elpipeline:

Page 56: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página56de73

#ls–l|grepes

¿Cuáleselresultado?¿Quéoperaciónrealizaelcomando‘grepes’?

Enlazarlosdoscomandosmediantelapipeessimilararealizarlacombinaciónsiguiente: #ls–l>salida_ls #grepes<salida_ls #rmsalida_ls

3. EjecutaunpipelinequemuestreenlasalidaestándarelPID,elusuarioyelnombredetodos los procesos bash que se están ejecutando en el sistema. Para ello utiliza loscomandos ps y grep combinados con una pipe. Anota el comando en el fichero“previo.txt”.

Formatodesalida

En Linux, el interfaz de entrada/salida está diseñado para el intercambio de bytes sininterpretarelcontenidodelainformación.

Esdecir,elsistemaoperativoselimitaatransferirelnúmerodebytesqueseleindicaapartirde la dirección de memoria que se le indica, y es responsabilidad del programador elinterpretar correctamente esos bytes, almacenándolos en las estructuras de datos que leintereseencadamomento.Alahoraderecuperarundatoquesehaguardadoenunfichero,elprogramadordeberátenerencuentaelformatoenelquesehaguardado.

Porejemplo,siqueremosleerunnúmerodelaconsola(queesundispositivoquesoloaceptaASCII, tanto de entrada como de salida), primero habrá que leer los caracteres y luegoconvertirloanúmero.AquítenéisunejemplosuponiendoqueelusuarioescribeelnúmeroyluegoaprietaCtrl-D.

Por ejemplo, si queremos escribir el entero 10562 usando su representación interna en lamáquina,estaremosescribiendoelnúmerodebytesqueocupaunentero(4bytessiusamoseltipointenunamáquinade32bits).

Pararecuperarloeinterpretarcorrectamentesuvalordeberemosleeresemismonúmerodebytesyguardarloenunavariabledetipoentero.

charbuffer[64];intnum,i=0;//CuandoelusuarioaprieteCtrlDelreaddevolverá0//Comonoconocemoscuantascifrastieneelnúmero,hayqueleerloconunbuclewhile(read(0,&buffer[i],1)>0)i++;buffer[i]=’\0’;num=atoi(buffer);

intnum=10562;write(1,&num,sizeof(int));//Sielcanal1eslaconsola,veremosbasura,yaquesoloaceptaascii.

Page 57: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página57de73

Siporel contrarioqueremosescribirelmismonúmerocomounacadenadecaracteres (porejemplo para mostrarlo por pantalla), el primer paso es convertirlo a una cadena decaracteres,en laquecadacarácter representaundígito.Esto implicaqueestaremosusandotantosbytescomodígitostengaelnúmero(enesteejemplo,5bytes).

4. El fichero es7.c contiene un programa que escribe en la salida estándar un enterousando la representación interna de la máquina. Compílalo y ejecútaloredireccionandosusalidaestándaraunfichero:

#./es7>foo.txt

Escribeunprogramaes7_lector.cquealejecutarlodelasiguientemanera:

#./es7_lector<foo.txt

seacapazdeleereinterpretarcorrectamenteelcontenidodeestefichero.

5. Enelcasodeldispositivológicoterminal(oconsola),eldevicedriverquelogestionainterpretatodoslosbytesquesequierenescribircomocódigosASCII,mostrandoelcaráctercorrespondiente.Elficheroes8.ccontieneunprogramaqueescribedosvecesunnúmeroporsalidaestándar:unausandolarepresentacióninternadelamáquinayotraconvirtiendoanteselnúmeroastring.Compílaloyejecútalo.¿Cuántosbytesseescribenencadacaso?¿Quédiferenciasobservasenloqueapareceenpantalla?

Asociacióndedispositivológicoydispositivofísico

6. El subdirectorio “deviceDrivers” contiene el código de dos device drivers simples:myDriver1.c y myDriver2.c. Estos device drivers sólo implementan su código deinicialización y de finalización, y la función específica de lectura del dispositivo.Además tienesunmakefilequecompilaambosdevicedrivers (utilizandoelmakefilequevieneconladistribucióndeLinux)ydosscriptsqueseencargande instalarydedesinstalarlosdevicedrivers.Analiza el fichero fuente de los dos device drivers y contesta a las siguientespreguntas:

//Ejemplo de lectura (sin control de errores), suponiendo que en el fichero datos.txt hay enterosharíamos…intfd,num;fd=open(“datos.txt”,O_RDONLY);read(fd,&num,sizeof(int));//Enestecasoelnúmerodebytesaleeresfijo

charbuff[64];intnum=10562;sprintf(buff,”%d”,num);write(1,buff,strlen(buff));

Page 58: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página58de73

a) ¿Qué función sirve para implementar el read específico del dispositivogestionadoporcadadevicedriver?

b) ¿Qué son el major y el minor? ¿Para qué sirven? ¿Quémajor y minorutilizanlosdosdevicedrivers?

PARAENTREGAR:previo07.tar.gzi. #tarzcfvprevio07.tar.gzes7_lector.cprevio.txt

Bibliografía• TransparenciasdelTema4(Entrada/Salida)deSO-grau• Capítulo13 (I/OSystems)deA.Silberschatz,P.GalvinyG.Gagne.OperatingSystem

Concepts,8thed,JohnWiley&Sons,Inc.2009.• A. Rubini y J. Corbet. Linux device drivers, 2nd ed, O'Reilly & Associates, Inc., 2001

(http://www.xml.com/ldd/chapter/book/).

Ejerciciosarealizarenellaboratorio

Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueapareceneneldocumento,indicandoparacadapreguntasunúmeroyturespuesta.Estedocumentosedebeentregara travésdelRacó.Laspreguntasestánresaltadasennegritaenmediodeltextoymarcadasconelsímbolo:

Ø PARAENTREGAR:sesion07.tar.gzo #tarzcfvsesion07.tar.gzentrega.txtes1_v2.ces6_v2.c

RedireccionamientoybufferingEn este primer ejercicio vamos a trabajar con el fichero es1 visto en el trabajo previo.Como ya se ha comentado, este fichero contiene un programa que lee de la entradaestándarcarácteracarácteryescribeloleídoenlasalidaestándar.Acontinuación,realizalossiguientesejercicios:1. Ejecutael comandopsdesdeun terminal. LacolumnaTTYde la salidadelps tedirá

qué fichero dentro del directorio /dev representa al terminal asociado al shell quetienes en ejecución. Abre un nuevo terminal y ejecuta de nuevo el comando ps.Observaahoraqueelficheroquerepresentaalterminalesdiferente.

2. Ejecuta, desde el segundo terminal, el programa es1 redireccionando su salidaestándar para asociarla con el fichero que representa al primer terminal. Observacomoloqueseescribeenelsegundoterminalapareceenelprimero.

3. EscribeuncomandoenlaShellquelancedosprocesosqueejecutenelprogramaes1yque estén conectados mediante una pipe sin nombre. Introduce unos cuantoscaracteresmedianteeltecladoypulsa^Dparafinalizarlaejecucióndelosprocesos.

4. Crea una copia del programa es1.c llamándola es1_v2.c. Modifica el programaes1_v2.c para que, en vez de leer y escribir los caracteres de uno en uno, lo hagautilizandounbúfer(charbuffer[256]).

Page 59: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página59de73

5. El comando strace ejecuta el programa que se le pasa como parámetro y muestrainformaciónsobrelasecuenciadellamadasasistemaquerealiza.Conlaopción–esele especifica que muestre información sobre una única llamada a sistema y con laopción–oseleespecificaqueguardeestainformaciónenunfichero.

Queremos comparar el número de llamadas a sistema read que ejecutan las dosversionesdelprograma(es1yes1_v2).Paraelloejecutalossiguientescomandos:

#strace–osalida_v2–eread./es1_v2<es2.c

#strace–osalida_v1–eread./es1<es2.c

PREGUNTA53. Apunta en el fichero “entrega.txt” los comandos que has utilizado en cadaapartado. Además entrega el fichero “es1_v2.c” ¿Qué diferencias observas en las dosejecuciones de strace? ¿Cuántas llamadas a sistema read ejecuta cada versión? ¿Quéinfluenciapuedetenersobreelrendimientodeambasversionesdecódigo?¿Porqué?

FormatodesalidaAnalizaendetalleelcódigodelosficheroses2.c,es3.cyes4.cyaseguratedeentenderloquehacenantesdecontinuar.Acontinuación,compílalosutilizandoelcomandomake.

1. Ejecutadosveceselprogramaes2,primeroponiendoelprimerparámetroa0yluegoa1 (utilizaelvalorquequierasparaelsegundoparámetro).Redireccionatambién lasalida estándar del proceso para asociarla a dos ficheros diferentes. Observa elcontenidodelosdosficherosgenerados.

PREGUNTA54. Explicalasdiferenciasobservadasenlasalidadelprogramacuandoelprimerparámetrovale0o1.¿Paraquécreesquesirveesteparámetro?

2. Ejecuta dos veces el programa es3 redireccionando su entrada estándar en cadaejecuciónparaasociarlaacadaunodelosficherosgeneradosenelapartadoanterior.

PREGUNTA55. Explica el motivo de los resultados observados dependiendo del formatoficherodeentrada.

3. Ejecuta ahora dos veces el programa es4 de lamismamanera que has ejecutado elprogramaes3enelapartadoanterior.

PREGUNTA56. Explicalasdiferenciasobservadasentrelasalidadelprogramaes3yes4.¿Porquélasalidaesinteligibleparaunodelosficherosdeentradaynoparaelotro?

CiclodevidaAnalizaelcontenidodelosficheroses5.cyes1.c,yasegúratedeentendersufuncionamiento.

1. Compila los dos programas y ejecuta cada uno de ellos en un shell diferente. Acontinuaciónejecutaelsiguientecomando:

Page 60: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página60de73

#./showCpuTime.sh./es5./es1

showCpuTime.shesunscriptquemuestraeltiempodeconsumodeCPUdecadaunodelosprogramaspasadoscomoparámetrocadaciertotiempo(cada2segundos).

2. Cuandoacabeelscript,matalos2procesoses5yes1.

PREGUNTA57. EscribelosvaloresquehamostradoelscriptshowCpuTime.shparacadaunode losprocesosycomenta lasdiferenciasentreellosencuantoalconsumodecpu.¿Aquésedeben?Identificalaslíneasdecódigodemarcanladiferenciaentreellos

Modificamos lagestiónde signalsporpartedelkerneldesactivandoel flagSA_RESTART

En las sesiones anteriores, habíamos activado siempre el flag SA_RESTART en la llamadasigaction.Deestaforma,cuandounprocesoestábloqueadoenunaentrada/salidayserecibeunsignal,elprocesosedesbloquea,segestionaelsignaly,siesnecesario,secontinúaconlaoperación de entrada/salida de forma transparente al usuario. Sin embargo, ese no es elfuncionamientoestándardeUNIX,dondelaentrada/salidanocontinúaautomáticamente.

Crea una copia del fichero es6.c llamándola es6_v2.c. Modifica el programa es6_v2.c parareprogramar la gestión del signal SIGINT y que muestre un mensaje por salida estándarinformando de que se ha recibido el signal. Utiliza la llamada a sistema sigaction sin el flagSA_RESTARTpara que la gestión sea comoenUNIX. En este caso, el read devuelve error alrecibir este signal.Modificael programaprincipal paraquedespuésdel read semuestreunmensaje en salida estándar indicando el resultado de la operación: read correcto, read conerror(diferentedeinterrupciónporsignal),oreadinterrumpidoporsignal.Consultaenelmanlosdiferentesvaloresdeerrnoparaestoscasos.

Haz la siguiente secuencia de ejecuciones para comprobar el buen funcionamiento de tucódigo:

a) Ejecutaelprogramaypulsareturnparadesbloquearelread.b) Acontinuaciónejecutaelprogramaperomientrasestáesperandoenelread

envíaleelsignalSIGINTpulsando^C.

PREGUNTA58. Anotaenelficheroentrega.txtelresultadodeambasejecuciones.Entregaelcódigoprogramadoenelficheroes6_v2.c

PREGUNTA59. ¿Qué pasaría si usáramos el flag SA_RESTART en el sigaction? Repite lasejecucionesanterioresactivandoel flagSA_RESTARTyanotael resultadoenel ficheroentrega.txt.

EjerciciosobreDeviceDriversEl objetivo de este ejercicio es que comprobéis cómo mantiene Linux la asociación entredispositivo lógicoydispositivo físico.Esdecir, cómoescapazde traducir la funcióngenéricadelinterfazdeacceso,enelcódigoespecíficoimplementadoporlosdevicedrivers.

ParaellovamosautilizarlosdevicedriversquehabéisanalizadoeneltrabajoprevioyqueseencuentraneneldirectoriodeviceDrivers.

Page 61: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página61de73

1. En el caso de los dos device drivers, el major y el minor están fijos en el código.Dependiendodelsistemapodríaserqueestosnúmerosenconcretoyaestuviesenenusoyporlotantoeldrivernosepudierainstalar.Siocurreesto,substituyeelmajorenelcódigoporunoquenoestéenuso.Debestenerencuentaademásquelosmajorsde estos dos drivers también tienen que ser diferentes ya que ambos van a estarinstaladosalmismotiempo.Paraverlalistadedriversdelsistemaylosmajorsusadospuedesverelcontenidodelfichero/proc/devices(sondispositivosdetipocaracter).

PREGUNTA60. ¿Estaba ya en uso el major especificado en el código? En caso afirmativo,¿quédriverloestabautilizando?

2. Ejecutaelsiguientescript:

#./installDrivers.sh

Estescriptcompilaycargaenmemorialosdosdevicedrivers(myDriver1ymyDriver2).Paraello,usaelcomandomake,obteniendolosmóduloscompilados(myDriver1.koymyDriver2.ko) correspondientes al primer y segundodriver. A continuaciónutiliza elcomandoinsmodparainstalarmyDriver1ymyDriver2(nota:parainstalar/desinstalarundispositivoesnecesarioserroot,poresoseutilizaelcomandosudo).

3. Utiliza el comando lsmod para comprobar que los módulos se han cargado

correctamente.

PREGUNTA61. Apunta la línea de la salida de lsmod correspondiente a myDriver1 ymyDriver2.

4. Utilizaelcomandomknodparacrearundispositivonuevo,llamadomyDevice,detipocarácter(opciónc)entudirectorioactualdetrabajoconelmajoryelminordefinidospormyDriver1.Paracrearundispositivoesnecesarioserroot(vercomandosudo).

PREGUNTA62. Apuntalalíneadecomandosquehasutilizadoparacreareldispositivo.

5. Ejecutaelsiguientecomando:

#./es1<myDevice

PREGUNTA63. Anota en el fichero “entrega.txt” el resultado de la ejecución y explica elresultadoobtenido.

6. AhoraborramyDevicey vuelvea crearundispositivode tipo carácter conelmismonombre,peroasociándoleelmajor y elminordefinidospormyDriver2.c. Ejecutadenuevoelcomandodelapartado5.

PREGUNTA64. Anota el resultado de la ejecución. Explica el motivo de las diferenciasobservadascomparandolasalidadeesteejercicioconladelaapartado5.

7. EliminamyDeviceyejecutaelsiguientescript:

Page 62: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página62de73

#./uninstallDrivers.sh

EstescriptdesinstalamyDriver1ymyDriver2.

Page 63: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página63de73

Sesion8:GestiondeEntrada/SalidaPreparaciónprevia

Objetivos• Entenderlasdiferenciasentrepipessinnombre,connombreysockets.• EntenderelfuncionamientodelinterfazdeaccesoadispositivosdeUNIX.

Habilidades• Sercapacesdecomunicarprocesosutilizandopipessinnombre.• Sercapacesdecomunicarprocesosutilizandopipesconnombre.• Sercapacesdecomunicarprocesosutilizandosocketslocales.Enestecasoelobjetivo

essaberenviar/recibirdatosconunacomunicaciónpreviamentecreada.

Conocimientosprevios• Llamadasasistemadegestióndeprocesos

Guíaparaeltrabajoprevio• Antes de la sesión, consultad el man (man nombre_comando) de los siguientes

comandos.Enconcreto,paracadacomandodebéisleeryentenderperfectamente:laSYNOPSIS, la DESCRIPTION y las opciones que os comentamos en la columna“Opciones”delatabla.

Paraleerenelman Descripciónbásica Opcionesaconsultar

mknod Comandoquecreaunficheroespecial Pmknod(llamadaalsistema)

Llamada al sistema que crea un ficheroespecial

pipe Llamada a sistema para crear una pipe sinnombre

open Abreunficheroodispositivo O_NONBLOCK,ENXIO

close Cierraundescriptordefichero

dup/dup2 Duplicaundescriptordefichero

socket Creaunsocket AF_UNIX,SOCK_STREAMbind Asignaunnombreodirecciónaunsocket listen Esperaconexionesaunsocket accept Aceptaunaconexiónenunsocket connect Iniciaunaconexiónaunsocket

• Crea una pipe con nombre mediante el comando mknod. A continuación lanza un

procesoqueejecuteelprograma‘cat’redireccionandosusalidaestándarhacialapipequeacabasdecrear.Enunashelldiferentelanzaotroprocesoqueejecutetambiénel

Page 64: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página64de73

programa ‘cat’, pero ahora redireccionando su entrada estándar hacia la pipe queacabas de crear. Introduce datos por teclado, en la primera Shell, y pulsa ^D paraindicarelfin.Anotaenelfichero“previo.txt”loscomandosquehasejecutado.

• ¿Esposiblecomunicarlosdoscomandos‘cat’desdedosterminalesdiferentesatravésde una pipe sin nombre (por ejemplo, utilizando un pipeline de la shell visto en lasesión anterior)? ¿y desde el mismo terminal? Razona la respuesta en el fichero“previo.txt”.

• Escribeenelfichero“previo.txt”elfragmentodecódigoquedeberíamosañadiraunprograma cualquiera para redireccionar su entrada estándar al extremode escrituradeunapipesinnombreutilizandolasllamadasalsistemacloseydup.Imaginaqueeldescriptordeficheroasociadoalextremodeescrituradelapipeesel4.

• En lapáginawebde laasignatura (http://docencia.ac.upc.edu/FIB/grau/SO) tenéiselficheroS8.tar.gzquecontienetodoslosficherosfuentequeutilizaréisenestasesión.Créateundirectorioentumáquina,copiaenélelficheroS8.tar.gzydesempaquétalo(tarzxfvS8.tar.gz).

• El fichero “socketMng.c” contiene unas funciones de gestión básica de sockets(creación, solicitud de conexión, aceptación de conexión y cierre de dispositivosvirtuales).

o Analizaendetalleelcódigode la funcióncreateSocketyserverConnection,ybuscaenelmanelsignificadodelas llamadasasistemasocket,bind, listenyaccept.

o Explicaenelfichero“previo.txt”pasoapasoloquehacenestasdosfunciones.

• PARAENTREGAR:previo8.tar.gzo #tarzcfvprevio8.tar.gzprevio.txt

Bibliografía• TransparenciasdelTema4(Entrada/Salida)deSO-grau.• Capítulo13 (I/OSystems)deA.Silberschatz,P.GalvinyG.Gagne.OperatingSystem

Concepts,8thed,JohnWiley&Sons,Inc.2009.

Ejerciciosarealizarenellaboratorio

Ø Amedidaquevayasrealizando losejercicios,modificaelMakefileparapodercompilarymontarlosnuevosprogramasquesepiden.

Ø Todaslaspreguntasqueseoshaganlastendréisquecontestarenundocumentodetextoaparte,llamadoentrega.txt,enelcualindicareis,paracadapregunta,sunúmeroyvuestrarespuesta. Este documento se debe entregar a través del Racó. Las preguntas estánresaltadasennegritaenmediodeltextoymarcadasconelsímbolo:

Ø PARAENTREGAR:sesion8.tar.gzo #tarzcfvsesion8.tar.gzentrega.txtsin_nombre.c lector.cescritor.cescritor_v2.c

lector_socket.cescritor_socket.cMakefile

Page 65: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página65de73

PipessinnombreEscribe un programa en el fichero “sin_nombre.c” que cree una pipe sin nombre y acontinuación un proceso hijo, cuyo canal de entrada estándar deberá estar asociado alextremode lecturade lapipe.Parahacer laredirecciónutiliza las llamadasasistemacloseydup.Elprocesohijodeberámutarsuimagenparapasaraejecutarelcomando‘cat’vistoeneltrabajoprevio.Porsuparte,elprocesopadreenviaráatravésdelapipeelmensajedetexto“Inicio”asuhijo,cerraráelcanaldeescrituradelapipeysequedaráalaesperadequeelhijoacabe.Cuandoesosuceda,elpadremostraráelmensaje“Fin”porlasalidaestándaryacabarálaejecución.

1. EjecutaelprogramaanteriorhaciendoqueelShellredireccionelasalidaestándardelpadreaunfichero.

PREGUNTA65. ¿Quécontieneelficheroalfinaldelaejecución?¿Contienelasalidadelpadreydelhijo,osóloladelpadre?¿Cómoseexplicaesecontenido?

2. Cambia el código del padre para que no cierre el extremo de escritura de la pipedespuésdeenviarelmensaje.

PREGUNTA66. ¿Acabaelprogramapadre?¿yelhijo?¿Porqué?

PipesconnombreEscribe dos programas que se comuniquen a través de una pipe con nombre. Uno de ellos(lector.c)leerádelapipehastaquelalecturaleindiquequenoquedanmásdatosparaleerymostraráensalidaestándartodoloquevayaleyendo.Elotroproceso(escritor.c) leerádelaentradaestándarhastaque la lectura le indiquequenoquedandatos yescribiráen lapipetodo loquevaya leyendo.Cuandonoquedenmásdatospara leer losdosprogramasdebenacabar.

PREGUNTA67. Si quisiéramos que el lector también pudiera enviar unmensaje al escritor¿podríamos utilizar la misma pipe con nombre o deberíamos crear otra? Razona larespuesta.

Escribeotraversióndelprogramaescritorenlapipe, llamadaescritor_v2.c.Esteprogramaalintentar abrir la pipe, si no hay ningún lector de la pipe,mostrará unmensaje por la salidaestándarque indiquequeseestáesperandoaun lectoryacontinuaciónsebloquearáenelopendelapipehastaqueunlectorabralapipeparaleer.ConsultaelerrorENXIOenelmandeopen(man2open)paravercómoimplementarestecomportamiento.

SocketsModificaelcódigode“lector.c”y“escritor.c”realizadosenelapartado2paraque,envezdeutilizarpipesconnombre,lacomunicaciónserealiceutilizandosocketslocales(tipoAF_UNIX).Elescritordeberealizarelpapeldecliente,mientrasqueel lectorharáelpapeldeservidor.Llamaalosnuevosficheros“lector_socket.c”y“escritor_socket.c”.

Page 66: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página66de73

PararealizarelcódigodebesutilizarlasfuncionesproporcionadasenelficherosocketMng.cyaprovechar el código que consideres oportuno de los ficheros exServerSocket.c yexClientSocket.c. El fichero exServerSocket.c contiene un programa que actúa como unservidorsimplecreandounsocket (conelnombrequerecibecomoparámetro)yesperandopeticiones de conexión por parte de algún cliente. El fichero exClientSocket.c contiene unprograma que actúa como un cliente simple que solicita una conexión al socket que recibecomo parámetro. No es necesario modificar el código que establece la conexión, solointroducirlacomunicacióndedatos.

Page 67: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página67de73

Sesion9:SistemadeFicherosPreparaciónprevia

Objetivos• Durante esta práctica realizaremos una serie de ejercicios del tema de Sistema de

Ficheros, con la finalidad de poner en práctica los conocimientos adquiridos en lasclasesdeteoría.

Habilidades• SercapazdeutilizarcomandosyllamadasalsistemabásicasparatrabajarconelSF.• Sercapazdemodificarelpunterodelectura/escrituraconlallamadalseek.

Conocimientosprevios• Llamadasalsistemadeentrada/salidaysistemadeficheros.• Llamadasalsistemadegestióndeprocesos.

Guíaparaeltrabajoprevio• Repasad los apuntes de la clase de teoría, especialmente los relacionados con el

sistemadeficherosbasadoenI-nodos.• Consultad el man (man nombre_comando) de los siguientes comandos. En

concreto,paracadacomandodebéis leeryentenderperfectamente: laSYNOPSIS, laDESCRIPTIONylasopcionesqueoscomentamosenlacolumna“Opciones”delatabla.

Para leer en elman Descripciónbásica Opcionesaconsultar

open/creat Abre/creaunficheroodispositivo O_CREAT,O_TRUNC,“Permisos”

dfDevuelve información sobre el sistema deficheros

-T,–h,–I,-i

ln Creaenlaces(links)aficheros -s

nameiProcesa una ruta de un fichero hastaencontrarelpuntofinal

readlink Leeelcontenidodeunlinksimbólico

statMuestra información de control de unfichero

-Z,-f

lseek Modifica la posición de lectura/escritura deunfichero

SEEK_SET,SEEK_CUR,SEEK_END

1. Contestalassiguientespreguntasenelfichero“previo.txt”:

Page 68: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página68de73

• ¿Cómopodéis saber los sistemasde ficherosmontadosenvuestrosistemaydequétiposon?Indica,además,enquédirectoriosestánmontados.

• ¿Cómosepuedesaberelnúmerodeinodoslibresdeunsistemadeficheros?¿Quécomandohasutilizadoyconquéopciones?

• ¿Cómo se puede saber el espacio libre de un sistema de ficheros? ¿Quécomandohasutilizadoyconquéopciones?

2. Ejecuta lossiguientescomandosy respondeenel ficheroprevio.txta lassiguientespreguntas:

#echo“estoesunaprueba”>pr.txt#ln–spr.txtsl_pr#lnpr.txthl_pr

• ¿Dequétipoescadaunodelinkscreados,sl_pryhl_pr?Ejecutaelcomandostat sobre pr.txt, sobre sl_pr y sobre hl_pr. Busca en la salida de stat lainformaciónsobreelinodo,eltipodeficheroyelnúmerodelinksyanótalaenelficheroprevio.txt.¿Cuáleselnúmerodelinksquetienecadafichero?¿Quésignificaesevalor?¿Quéinodotienecadafichero?¿Algunodeloslinks,sl_prohl_pr,tieneelmismoinodoquepr.txt?¿Siesasí,quésignificaeso?

• Ejecutaloscomandoscat,nameiyreadlinksobresl_prysobrehl_pr:o Apuntaelresultadoenelficheroprevio.txt.o ¿Observas alguna diferencia en el resultado de alguno de los

comandoscuandoseejecutansobresl_prycuandoseejecutansobrehl_pr?Sihayalgunadiferencia,explicaelmotivo.

• Elimina ahora el fichero pr.txt y vuelve a ejecutar los comandos stat, cat,nameiyreadlinktantosobresl_prcomohl_pr.

o Apuntalosresultadosenelficheroprevio.txto ¿Observas alguna diferencia en el resultado de alguno de los

comandoscuandoseejecutansobresl_prycuandoseejecutansobrehl_pr?Sihayalgunadiferencia,explicaelmotivo.

o ¿Observas alguna diferencia respecto a la ejecución de estoscomandos antes y después de borrar el fichero pr.txt? Si hay algunadiferencia,explicaelmotivo.

3. Escribeunprograma“crea_fichero.c”queutilizando la llamadaalsistemacreatcree

unficherollamado“salida.txt”conelcontenido“ABCD”.Sielficheroyaexistíasedebesobrescribir. El fichero creado debe tener permiso de lectura y escritura para elpropietarioyelrestodeusuariosnopodránhacerningunaoperación.

4. Escribeunprograma“insertarx.c”queinserteenelficheroanterior(salida.txt)laletraXentreelúltimoyelpenúltimocarácter.Elresultadodebeser“ABCXD”.Elprogramautiliza el fichero salida.txt a modo de ejemplo pero debe ser genérico,independientementedeltamañodelficherodeentradasiempreescribiráunaX“entreelúltimoyelpenúltimocarácter”.

Page 69: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página69de73

• PARAENTREGAR:previo9.tar.gzo #tarzcfvprevio9.tar.gzprevio.txtcrea_fichero.cinsertax.c

Bibliografía• TransparenciasdelTema4deSO-grau• Capítulos 10 y 11 (File-System Interface & File-System Implementation) de A.

Silberschatz, P. Galvin y G. Gagne. Operating System Concepts, 8th ed, John Wiley&Sons,Inc.2009.

Ejerciciosarealizarenellaboratorio

Ø Todaslaspreguntasqueseoshaganlastendréisquecontestarenundocumentodetextoaparte,llamadoentrega.txt,enelcualindicareis,paracadapregunta,sunúmeroyvuestrarespuesta. Este documento se debe entregar a través del Racó. Las preguntas estánresaltadasennegritaenmediodeltextoymarcadasconelsímbolo:

Ø PARAENTREGAR:sesion9.tar.gz#tarzcfvsesion9.tar.gzentrega.txtappend.cinvirtiendo_fichero.cinsertarx2.c

HardlinksySoftlinks.Crea un directorio llamado “A” dentro de tu directorio home ($HOME). A continuación,entraeneldirectorio“A”utilizandoelcomandocdyejecutalossiguientescomandos,quecreansoftyhardlinksadiferentesficheros:

$echo“estoyeneldirectorioA”>D$ln-s$HOME/A$HOME/A/E$ln-sD$HOME/A/F$ln$HOME/A$HOME/A/H$lnD$HOME/A/G

PREGUNTA68. Contestaalassiguientespreguntasenelfichero“entrega.txt”

• ¿Cual/es de los comandos anteriores han dado error al intentar ejecutarlos?Explicaporqué.

• Explicaelresultadodeejecutarelcomando“stat”utilizandocomoparámetrocadaunodelosnombressimbólicosquehascreadoanteriormente.

• ¿Cuál seríael contenidode los ficherosD,E,FyG?Comenta lasdiferenciasqueobservasalutilizarloscomandos“more”o“cat”paraverelcontenidodelficheroyelresultadodeutilizarelcomando“readlink”.

• Escribe en papel los accesos que se realizan cuando se accede a los ficheros:“$HOME/A/F”,“$HOME/A/E”y“$HOME/A/G”.Ahoracompáralosconelresultadoqueobtienescuandoejecutasel comando“namei” concadaunode los ficherosanteriores. ¿Si ejecutas “readlink $HOME/A/F” se realizan los mismos accesos?

Page 70: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página70de73

¿Cómoinfluyeelhechodequeenunoscasosseaunarutaabsolutaaunficheroyenotrosunarutarelativa?

• Creaunsoftlinkdeunficheroasimismo(unficheroquenoexistapreviamente).Comentaelresultadodemirarsucontenidoutilizandoelcomando“cat”.Observacomocontrolaelsistemalaexistenciadeciclosenelsistemadeficheros.Ejecutaelcomando“namei”ycomentasuresultado.

Controldeltamañodelosficheros• Creaunfichero“file”cuyocontenidoes“12345”.• Ahoraimplementaunprograma,llamadoappend.c,queañadaalfinaldelfichero

“file”elcontenidodelpropiofichero.Utilizamoselficherofileamododeejemplopero el programa tiene que ser genérico: para cualquier fichero de entrada,despuésdeejecutarelprogramaappend.cel ficherotendráelcontenidooriginalduplicado.Pista:sicuandopruebesesteprogramatardamásdeunossegundosenacabar,mataalprocesoycompruebaeltamañodelfichero.Siesetamañoesmásqueeldobledeltamañooriginalrevisaenelcódigolacondicióndefinquelehaspuestoalbucledelecturadelfichero.

PREGUNTA69. Entregaelficheroappend.c.

OperacionesconlseekCreaunprogramaquellamaremos“invirtiendo_fichero”queharáunacopiadeunficheroque recibe como parámetro pero con el contenido invertido. El nombre del ficheroresultanteseráeldelficherooriginalconlaextensión“.inv”.

PREGUNTA70. Entregaelficheroinvirtiendo_fichero.c.

Crea un fichero de datos cuyo contenido sea “123456”. Ahora implementa un código(insertarx2.c) que inserte el carácter “X” entre el “3” y el “4”, de tal manera que elcontenido final del fichero sea “123X456”. Haz esta prueba amodo de ejemplo pero elprogramahadesergenérico:Dadaunaposiciónconcretadelficheroseinsertaelcarácter“X”.

PREGUNTA71. Entregaelficheroinsertarx2.c.

Page 71: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Sesion10:ConcurrenciayParalelismoPreparaciónprevia

Objetivos• Entenderlasdiferenciasentreprocesosythreads• Entenderlasproblemáticasasociadasalusodememoriacompartida

Habilidades• Sercapazdeidentificarlasdiferenciasentreprocesosythreads.• Sercapazdeutilizarcomandosyllamadasalsistemabásicasparatrabajarconthreads.• Sercapazdeidentificarysolucionarcondicionesdecarrera.

Conocimientosprevios• Llamadasalsistemadegestióndeprocesos.

Guíaparaeltrabajoprevio• Consultad el man (man nombre_comando) de los siguientes comandos. En

concreto,paracadacomandodebéisleeryentenderperfectamente:laSYNOPSISylaDESCRIPTION.

Paraleerenelman Descripciónbásicapthread_create creaunnuevopthread

pthread_joinespera a que finalice el pthread indicadocomoparámetro

pthread_mutex_initinicializa una variable para controlar elaccesoaunaregióncrítica

pthread_mutex_lock controlalaentradaaunaregióncríticapthread_mutex_unlock controlalasalidadeunaregióncríticapthread_exit finalizaelpthreadactual

Elficherofork2pthread.ccontieneunprogramaquecreaunprocesohijomediantelallamadaa sistema fork. Copia este fichero sobre el fichero fork2pthread_v2.c y haz todas lasmodificacionesnecesariasparaqueutilicepthreadsenlugardeprocesostradicionales.

• PARAENTREGAR:previo10.tar.gzo #tarzcfvprevio10.tar.gzfork2pthread_v2.c

Page 72: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página72de73

Bibliografía• TransparenciasdelTema5(ConcurrenciayParalelismo)deSO-grau• Capítulos 10 y 11 (File-System Interface & File-System Implementation) de A.

Silberschatz, P. Galvin y G. Gagne. Operating System Concepts, 8th ed, John Wiley&Sons,Inc.2009.

Ejerciciosarealizarenellaboratorio

Ø Todaslaspreguntasqueseoshaganlastendréisquecontestarenundocumentodetextoaparte,llamadoentrega.txt,enelcualindicareis,paracadapregunta,sunúmeroyvuestrarespuesta. Este documento se debe entregar a través del Racó. Las preguntas estánresaltadasennegritaenmediodeltextoymarcadasconelsímbolo:

Ø PARAENTREGAR:sesion10.tar.gz#tarzcfvsesion10.tar.gzentrega.txtthreads_racecondition_v2.csumavector.c

Diferenciasentrepthreadsyprocesos1. Tiempo de creación. Los ficheros createProcesses.c y createThreads.c son dos

versiones diferentes delmismo código: el primero utiliza procesos tradicionales y elsegundopthreads.

a. Analiza el código de los dos programas y asegúrate de que entiendes elinterfaz.

b. Compila y ejecuta ambos programas y anota en el fichero entrega.txt eltiempodeejecucióndecadauno.

PREGUNTA72. ¿Qué diferencia observas en el tiempo de ejecución de cada uno de losprogramas?¿Aquésedebe?

2. Compartición del espacio de direcciones. Los ficheros fork_compartMem.c ythread_compartMem.csondosversionesdiferentesdelmismocódigo.

a. Analiza el código de los dos programas y asegúrate de que entiendes sufuncionalidad.

b. Compilayejecutaambosprogramas.

PREGUNTA73. En el programa fork_compartMem.c, ¿qué valor ve el proceso hijo alprincipiode su ejecuciónen las variables a ypidPadre? ¿Y al final? ¿qué valores ve elprocesopadrealfinaldesuejecución?¿Cómoexplicasestecomportamiento?

PREGUNTA74. En el programa thread_compartMem.c, ¿qué valor ve el pthread hijo alprincipiode su ejecuciónen las variables a ypidPadre? ¿Y al final? ¿qué valores ve elprocesopadrealfinaldesuejecución?¿Cómoexplicasestecomportamiento?

3. Enelficherothread_compartMem2.chayunerrordecompilación.

PREGUNTA75. ¿Aquésedebeesteerror?

Page 73: Documentación de laboratoriodocencia.ac.upc.edu/.../Laboratorios/...2016-2017.pdf · laboratorio Curso otoño 2016-2017 Este documento contiene las sesiones a realizar durante las

Página73de73

a. Elimina la línea que provoca el error, recompílalo y ejecuta con parámetroesperaa1.

PREGUNTA76. En la líneamarcadacomo“PUNTO1”¿enquéposicióndememoriaseestáguardandoelvalor1111?¿Quévariableocupaesaposicióndememoria?¿Quémensajesmuestran el padre y el pthread? ¿Sería posible que un pthread acceda a las variableslocalesdeotropthread?¿Enquécondiciones?

b. Ejecutadenuevoelprogramaahoraconparámetroesperaa0

PREGUNTA77. ¿Quémensajesmuestranahoraelpadreyelpthread?¿Aquésedebeestadiferenciaenelcomportamiento?

Condicióndecarrera

El fichero threads_racecondition.c contiene un programa que crea varios pthreads y cuyaejecución sufre una condiciónde carrera. El resultadoesperadode este código es que cadapthreadincrementeenlamismacantidadlavariableData.Elprocesoprincipalimprimealfinaldelaejecuciónelvalordeesavariable.

4. Analizaelcódigoyasegúratedeentendersufuncionamiento5. Compilaelcódigoyejecútalo10veces.

PREGUNTA78. ¿Elprocesoprincipalimprimesiempreelmismovalor?¿Aquéesdebido?PREGUNTA79. Anotaenelficheroentrega.txtquélíneasdecódigoformanlaregióncrítica

queprovocalacondicióndecarrera.

6. Copiaelficherosobreelficherothreads_racecondition_v2.cymodifícaloconelcódigonecesario para proteger la región crítica que has detectado. Para ello utiliza lasfuncionesqueofrecelalibreríadepthreads.

Paralelización

Enelficherosumavector.ctienesunprogramaquesumaloselementosdeunvector.Modificaeste código para que esta suma se haga concurrentemente dividiendo el trabajo entrepthreads.

Laestructuradedatosdetipoinfojobcontieneloscamposparadescribireltrabajoarealizarporcadapthread(laposicióninicialdelvectorenlaqueempezarasumarylaposiciónfinal)yparaalmacenarelresultadoparcialdelasumaalfinaldelaejecucióndelpthread.Elprocesoprincipal deberá inicializar estas estructuras, crear los pthreads pasando los parámetrosadecuados,esperaraquelospthreadsacabenycalcularlasumatotalapartirdelosresultadosparcialesdelospthreads.