Durée 2 heures |
Les appendices B et C du cours, éventuellement annotées, sont la seule documentation autorisée.
Dans les solutions, on pourra utiliser les fonctions du moduleMiscdécrites dans l'appendice B.7 en les appelant explicitement avec le préfixeMisc.
On s'efforcera de donner des explications à la fois précises et concises.
Les quatre parties sont indépendantes. Les questions soulignées peuvent être plus difficiles ou plus longues que les autres de la même partie.
execv file argv?
argv
(justifier très brièvement)?
execv file argv?
execv? Quel est l'intérêt de ce choix?
9
fork() (justifier brièvement)?
fork.
ENOENT lorsqu'on leur demande d'accéder à un
chemin qui n'existe pas.mkpath de type string -> int -> unit
telle que l'appel mkpath path perm crée le répertoire path ainsi que
tous les répertoires sur le chemin path qui n'existent pas. Tous les
répertoires créés le seront avec les permissions perm. Le chemin path est
absolu ou relatif.
Si la commande mkpath échoue, on ne cherchera pas à retirer les
répertoires qui auraient déjà pu être créés.
Si un chemin intermédiaire de p existe mais n'est pas un répertoire, on
déclenchera une erreur ENOTDIR comme le ferait la commande mkdir (et la
plupart des commandes qui prennent des chemins en arguments).
./A existe avec les droits 0740 (ie.
rwxr----- en notation symbolique). Décrire une valeur de perm (en
notation octale ou symbolique, ou en français) avec laquelle le
répertoire A/B a été créé mais le répertoire A/B/C n'a pas pu l'être.
A/B/C peut
échouer alors que celle du répertoire A/B a réussi.
mkpath_plus de mkpath réalisant cela.
lseek lève l'exception ESPIPE si le
descripteur auquel il est appliqué n'est pas en accès direct (i.e. ne
supporte pas lseek). seekable de type Unix.file_descr -> bool qui
teste si le descripteur reçu en argument est en accès direct.
unlinkf qui se comporte comme unlink, mais ne lève pas
d'erreur s'il n'est pas possible d'effectuer l'opération.
let rec create_file_descr() = let tmpdir = "/tmp" in let rec open_tmp n = try let name = Filename.concat tmpdir (string_of_int n) in let descr = openfile name [ O_CREAT; O_RDWR; O_EXCL ] 0 in unlinkf name; descr with Unix_error (EEXIST, _, _) -> open_tmp (n+1) in open_tmp (getpid());; |
create_file_descr, un fichier est à
nouveau créé avec le même nom que celui qui a servi à créer descr?
create_file_descr
donne un accès privé dans le sens où ce qui est lu ou écrit dans desc n'a
pu être écrit ou lu que par le processus courant ou un de ses descendants?
prog prend un seul argument qui est un
nom de fichier ou bien zéro argument et dans ce cas utilise l'entrée
standard en supposant qu'elle est en accès direct. wrap_prog de telle façon que wrap_prog se comporte
comme prog, mais fonctionne également lorsque qu'il est appelé sans
argument et que l'entrée standard n'est pas en accès direct. Pour cela, dans
ce cas, il recopie l'entrée standard dans un descripteur auxiliaire en
accès direct et fait ce qu'il faut pour que la commande prog lise dans ce
descripteur.prog se trouve dans le chemin d'exécution
(variable d'environnement PATH). On supposera que le code des trois
premières questions (énoncés ou réponses) a déjà été placé dans un fichier
seek.ml.
select et un seul processus. Dans tout cet
exercice, on suppose que la machine est mono-processeur.select permet d'augmenter l'efficacité du
serveur par rapport au serveur séquentiel.
read ou
write et qu'on écrit les réponses en mode non bloquant et que l'écriture
n'échoue jamais. select. L'appel système
select est un appel système cher et son coût est nettement supérieur au
coût minimal d'un appel système mais reste aussi inférieur à celui d'un
changement de contexte. Pour simplifier on fera l'approximation par excès
que sont coût est celui S d'un changement de contexte, S.select, quelle est la valeur Nc de n pour
laquelle le serveur passe en régime saturé?
ii)
En régime saturé, on note k le nombre de clients qui sont en moyenne en
attente après le serveur. Quel est le temps nécessaire pour traiter ces k
clients?
iii)
En déduire la valeur N'c de n lorsque le serveur passe en situation
critique.
Ce document a été traduit de LATEX par HEVEA