DM de LIFO

GUO KAI & ZHANG ZHENGMENG C'est la première part “non préemptif”

library(ggplot2)
library(plyr)
set.seed(3)


lifo_San_Pre <- function(loi, n, lanb, mu) {


    # definition de queue de LIFO

    a <- rexp(n, rate = 1)  #intervalle de temps de service du serveur
    b <- c()  #intervalle de temps de 2 msg arrive suivants
    d <- c()  #tableau enregistant le temps de service pour chaque msg dans le pile
    t_arrv <- c()  #date d'arrivee d'un msg
    t_sort <- c()  #date de sort d'un msg
    wait <- c()  #temps d'attente d'etre servi d'un msg
    waitNum <- 0  #nombre de msg d'attente dans le pile
    pt <- 0  #pointeur de toit de pile d'attente
    pc <- 0  #pointeur de msg courant du toit dans le queue d'attente du pile
    pmct <- 0  #pointeur de msg courant traité par le serveur
    t_reste <- 0  #
    rec <- c()  #le numero de msg dans le pile 
    reo <- c()
    # initialisation de loi observee

    switch(loi, exp = {
        # distribution exponentiel
        b <- rexp(n, rate = lanb)
    }, unif = {
        # distribution uniform
        b <- runif(n, 0, mu)
    }, det = {
        # distribution deterministe
        b <- rep(1, n)
    }, erlang = {
        # distribution erlang
        b <- rgamma(n, shape = lanb, scale = mu)
    })


    # initialisation de variable

    t_arrv[1] <- 0  # initialiser le queue d'attente
    for (i in 2:n) {
        t_arrv[i] <- t_arrv[i - 1] + b[i]
    }
    t_sort[1] <- a[1]  #le premier msg va être complètement servi sans être interrompu


    # l'algo commence..

    pt <- 0
    # pmct<-1
    reo[1] <- 1
    re <- 1
    i <- 2  #compteur de msg d'envisager d'etre servi
    while (i <= n) {

        if (t_arrv[i] <= t_sort[re]) {
            pt <- pt + 1  #si un message arrive avant le sortie du message courant traité, met le dans le pile d'attente,incrémente le pointeur pour qu'il pointe le toit du pile d'attent 
            wait[pt] <- t_sort[re] - t_arrv[i]  #donc la date d'etre servi de ce message égale la date de sortie du message 
            waitNum <- waitNum + 1
            rec[pt] <- i
            i <- i + 1
        } else {
            if (waitNum == 0) {
                # s'il n'y a pas de msg attend dans le pile, ce message sera servi tout de
                # suite
                re <- i
                t_sort[i] <- t_arrv[i] + a[i]  #donc t_sort[i] egale le temps qu'il est arrive plus the temps de traitement au serveur
                i <- i + 1
            } else {
                t_sort[rec[pt]] <- t_sort[re] + a[rec[pt]]
                re <- rec[pt]
                pt <- pt - 1
                waitNum <- waitNum - 1
                # t_reste<-t_arrv[pt]-t_arrv[i] #temps d'attente potentiel optimisme du msg
                # au toit du pile d'etre servi if(t_reste<wait[pt]){ #si pendant la lacune
                # d'attendre d'etre servi du msg au toit du pile d'attente, msg[i] arrive
                # alors # pc<-pt pt<-pt+1 #on met ce msg nouvellement arrivant au toit du
                # pile wait[pt]<-t_sort[re]-t_arrv[i]#donc le temps d'attend potentiellment
                # pour msg[i] egale le t_sort courant plus le temps de service d[pt]<-a[i]
                # #on enregistre le temps de service de ce msg egalement pour le recurrence
                # futur rec[pt]<-i waitNum<-waitNum+1 #puisque chaque msg dans le pile ne
                # sera servi que dans le msg precedant est servi }else{
                # t_sort[pt]<-t_sort[re]+d[pt]#sinon on fait sortir le msg au toit du pile
                # re<-pt ss<-t_sort[pt] # wait[pt]<-ss-t_arrv[i] rec[pt]<-pt # pmct<-pmct+1
                # #on augmente le msg sortie par 1 }
            }

        }
        # chaque loop, on a toujours traite un msg n'import que l'a mis dans le pile
        # ou l'a traite
    }

    # t_sort[rec[pt]]<-t_sort[re]+d[pt] waitNum<-waitNum-1 pt<-pt-1 for(j in
    # 1:waitNum){ t_sort[rec[pt]]<-t_sort[rec[pt+1]]+d[pt] pt<-pt-1 }
    plot(t_arrv, main = paste("LIFO: MSG arrive in rule: ", loi), cex.main = 1, 
        xlab = "time dimension", col = "red")
    plot(t_sort, main = "LIFO: MSG served in rule: exp", cex.main = 1, xlab = "time dimension", 
        col = "green")
}

par(mfrow = c(4, 2), mar = c(4, 4, 2, 2), bg = "black", col.axis = "yellow", 
    col.lab = "yellow", fg = "yellow")

lifo_San_Pre("exp", 100, 1, 1)
lifo_San_Pre("unif", 100, 1, 1)
lifo_San_Pre("det", 100, 1, 1)
lifo_San_Pre("erlang", 100, 1, 1)

plot of chunk unnamed-chunk-1

C'est la deuxière part “préemptif”

lifo_Pre <- function(loi, n, lanb, mu) {

    df = data.frame
    # definition de queue de LIFO

    a <- rexp(n, rate = 1)  #intervalle de temps de service du serveur
    b <- c()  #intervalle de temps de 2 msg arrive suivants
    d <- c()  #tableau enregistant le temps de service pour chaque msg dans le pile
    t_arrv <- c()  #date d'arrivee d'un msg
    t_sort <- c()  #date de sort d'un msg
    wait <- c()  #temps d'attente d'etre servi d'un msg
    waitNum <- 0  #nombre de msg d'attente dans le pile
    pt <- 0  #pointeur de toit de pile d'attente
    pc <- 0  #pointeur de msg courant du toit dans le queue d'attente du pile
    pmct <- 0  #pointeur de msg courant traité par le serveur
    t_reste <- 0  #
    rec <- c()  #le numero de msg dans le pile 
    t_remain <- c()  #temps servi d'1 msg i
    re <- 0  # l'indice de msg traité en cours
    # initialisation de loi observee

    switch(loi, exp = {
        # distribution exponentiel
        b <- rexp(n, rate = lanb)
    }, unif = {
        # distribution uniform
        b <- runif(n, 0, mu)
    }, det = {
        # distribution deterministe
        b <- rep(1, n)
    }, erlang = {
        # distribution erlang
        b <- rgamma(n, shape = lanb, scale = mu)
    })


    # initialisation de variable

    t_arrv[1] <- 0  # initialiser le queue d'attente
    for (i in 2:n) {
        t_arrv[i] <- t_arrv[i - 1] + b[i]
    }
    t_sort[1] <- a[1]  #le premier msg va être complètement servi sans être interrompu

    plot(t_arrv, main = paste("LIFO:Message arrive in rule: ", loi), cex = 0.3, 
        xlab = "time dimension", ylab = "Message", col = "dark red", col.main = "red", 
        type = "h")

    # l'algo commence..

    pt <- 0  # a l'inititiation, le pile d'attente est vide
    re <- 1  # le pointeur de msg traité en cours pointe à le premier msg
    i <- 2  #compteur de msg d'envisager d'etre servi
    while (i <= n) {
        if (t_arrv[i] <= t_sort[re]) {
            # un message arrive avant que le msg traité en cours se termine, il sera
            # servi.
            t_sort[i] <- t_arrv[i] + a[i]  # ce msg va être servi tout de suite n'import quoi
            pt <- pt + 1  #mettre le msg traité en cours dans le pile d'attente 
            t_remain[pt] <- t_sort[re] - t_arrv[i]  #note le temps restant de service pour qu'on le reprendra après 
            t_arrv[re] <- t_sort[i]  #en théorie la date que ce msg sera repris débutera dès que le nouveau msg sort du serveur 
            waitNum <- waitNum + 1
            rec[pt] = re  #noter le numéro de ce msg empilé
            re <- i  #modifie le pointeur du msg traité en cours à celui nouvellement arrivant
            i <- i + 1  # on traite le msg suivant
        } else {
            if (waitNum == 0) {
                t_sort[i] <- t_arrv[i] + a[i]  # dès qu'un message arrive, il sera servi. 
                re <- i  #s'il n'y a pas de msg attend dans le pile, ce message sera servi et aucun message sera interrompu
                i <- i + 1  #on traite le msg suivant
            } else {
                # sinon, c'est-à-dire qu'il y a eu des message en pile sortant d'être servi
                # si la lacune entre le temps d'arriver le msg i et le msg servé tout à
                # l'heure est > le temps restant d'être servi de msg au toit du pile
                if (t_arrv[i] - t_sort[re] > t_remain[pt]) {
                  t_sort[rec[pt]] <- t_sort[re] + t_remain[pt]  #alors on empile le msg au toit du pile et le traite
                  re <- rec[pt]  #on modifie le pointeur courant traité à le msg empilé toute à l'heure
                  pt <- pt - 1  #modifier le pointeur du toit du pile
                  waitNum <- waitNum - 1  #le nombre de msg d'attendre est réduit par 1 
                  # remarque qu'on ne incrémente pas le compteur de message arrivant, afin de
                  # prendre en compte le traitement du pile
                } else {
                  t_sort[i] <- t_sort[re] + a[i]  #si cette lacune n'est pas suffisant pour traité le msg au toit du pile, on traite le msg nouvellement arrivant
                  re <- i
                  i <- i + 1
                }
            }

        }
    }


    plot(t_sort, main = "LIFO: Message served: exp", xlab = "time dimension", 
        col = "blue", col.main = "red", type = "h")
}

par(mfrow = c(4, 2), mar = c(4, 4, 2, 2), bg = "black", col.axis = "yellow", 
    col.lab = "yellow", fg = "yellow")

lifo_Pre("exp", 100, 1, 1)
lifo_Pre("unif", 100, 1, 1)
lifo_Pre("det", 100, 1, 1)
lifo_Pre("erlang", 100, 1, 1)

plot of chunk unnamed-chunk-2