register caddr_t chan

Transcription

register caddr_t chan
ANNEXE B
/*
* Wake up all processes sleeping on chan.
*/
wakeup(chan)
register caddr_t chan;
{
register struct proc *p;
register c, i ;
c = chan;
p = &proc[0];
i = NPROC;
do {
if(p->p_wchan == c) {
setrun(p);
}
p++;
} while(--i);
}
6
struct
{
proc
short
p_addr;
/* address of swappable image */
short
p_size;
/* size of swappable image (pages) */
int
p_flag;
/* process flags */
char
p_stat;
/* process state */
char
p_pri;
/* priority, negative is high */
char
p_slptime; /* Seconds since last sleep */
char
p_nice;
/* nice for scheduling */
long
p_sig;
/* signal number sent to this process */
short
p_uid;
/* real user id, used to direct tty signals */
short
p_suid;
/* set (effective) user id */
short
p_time;
/* resident time for scheduling */
int
p_cpu;
/* cpu usage for scheduling */
short
*p_ttyp;
/* controlling tty */
short
p_pid;
/* unique process id */
short
p_ppid;
/* process id of parent */
caddr_t p_wchan;
/* event process is awaiting */
struct text *p_textp; /* pointer to text structure */
short
p_tsize;
/* size of text */
short
p_ssize;
/* size of stack */
short
p_clktim; /* time to alarm clock signal */
short
p_swaddr; /* disk address when swapped */
short
p_swsize; /* number if clicks already swapped */
} proc[NPROC];
5
Code Noyau (Extrait des TD)
ANNEXE A
/*
* Structure of the super-block
*/
struct filsys
{
unsigned short s_isize; /* size in blocks of i-list */
daddr_t s_fsize;
/* size in blocks of entire volume */
short
s_nfree;
/* number of addresses in s_free */
daddr_t s_free[NICFREE];/* free block list */
short
s_ninode;
/* number of i-nodes in s_inode */
ino_t
s_inode[NICINOD];/* free i-node list */
char
s_flock;
/* lock during free list manipulation */
char
s_ilock;
/* lock during i-list manipulation */
char
s_fmod;
/* super block modified flag */
char
s_ronly;
/* mounted read-only flag */
time_t s_time;
/* last super block update */
daddr_t s_tfree;
/* total free blocks*/
ino_t
s_tinode;
/* total free inodes */
short
s_m;
/* interleave factor */
short
s_n;
/* " " */
char
s_fname[6];
/* file system name */
char
s_fpack[6];
/* file system pack name */
ino_t
/* stuff for inode hashing */
s_lasti;
/* start place for circular search */
ino_t
s_nbehind;
/* est # free inodes before s_last */
};
#define NICFREE 50
#define NICINOD 100
4
Exercice 2 : Etude du noyau (12 points)
2.1 De manière générale, quels sont les processus réveillés lors d’un wakeup ?
2.2 Pourquoi, souvent, la stratégie de réveil de wakeup est peu performante ?
2.3 Modifier le code de wakeup présenté en annexe B pour une fonction
wakeup_one qui ne réveille qu’un seul processus.
2.4 Soit la portion de code suivante illustrant une synchronisation "classique" :
...
while(flags & MYLOCK) {
sleep(&event, MYPRIO);
}
flags |= MYLOCK;
Traitement();
flags &= ~MYLOCK;
wakeup(&event);
...
Commentez ce code puis modifiez le pour utiliser désormais wakeup_one.
2.5 Existe-t-il un problème de famine ? Si oui, indiquez un scénario illustrant ce
problème ; si non justifiez.
Modifiez si nécessaire votre code pour résoudre ce problème.
2.6 Modifiez wakeup_one pour prendre en compte le priorité des processus en
réveillant le processus le plus prioritaire.
3
Soit la configuration de superbloc suivante :
Pour la partition part1 :
s_nfree = 1
s_free[] 130
SuperBloc
sn_free = NICFREE
s_free[] 543 345 ...
Bloc 130
801 401
Pour la partition part2:
SuperBloc
s_nfree = 1
s_free[] 100
sn_free = NICFREE
s_free[] 443 956 ...
Bloc 100
801 601
Le programme exécute maintenant :
8
9
10
11
lseek(fd1,
lseek(fd2,
write(fd1,
write(fd2,
O, SEEK_END);
O, SEEK_END);
1500, buf);
500, buf);
Quels sont les numéros des blocs alloués aux fichiers 1 et 2. Refaites un schéma
des superblocs après l’allocation.
1.4 Enfin le programme réalise:
12
13
close(fd1);
close(fd2);
Quel est le nombre minumum d’entrées/sorties engendrée par ces deux instructions ?
2
Maîtrise d’Informatique - Examen d’UNIX - Septembre 1999
Partie 2 : Mécanisme Internes
(P. Sens)
1 heure 30 - Tous documents autorisés
Exercice 1 : Etude des structures de données (8 points)
1.1 Brièvement quel est le rôle de la table des inodes en mémoire ?
1.2
On considère deux partitions distinctes "/part1" (device numéro 1) et "/part2"
(device numéro 2). Le fichier f1 a un numéro d’inode égal à 1234 et f2 4321. Les
blocs disque ont une taille de 1024. La table des inodes en mémoire contient déjà
l’entrée <1,1234> (<device, i_number>).
Soit le programme suivant :
1
2
3
4
5
6
main() {
int fd1, fd2;
char buf[4096];
fd1 = open("/part1/f1", O_RDWR);
fd2 = open("/part2/f2", O_RDWR);
...
}
Faites un schéma des structures de données concernant les fichiers à la fin de cette portion de code.
Quel est le nombre minimum d’entrées/sorties qu’il a fallu effectuer ?
1.2 Le programme exécute ensuite cette portion de code :
6
7
read(fd1, buf, 1024);
read(fd2, buf, 1024);
Refaites un schéma des structures.
Quel est le nombre minimum d’entrées/sorties qu’il a fallu effectuer.
1.3 Quels sont les rôles principaux des superblocs ?
On considère la structure de superbloc présenté dans l’annexe A (même structure
qu’en TD).
1

Documents pareils