function [out] = Free_work(mu, tau, tau_bk, period, t)
%Эта функция вычисляет объем работы, освобожденный во всех буферах на [0, t]

%Подготовка переменных
[m, n]=size(mu);
amount=floor(t/period);
free_period=0;

%Вычисление суммарной обработанной очереди за один период
for i=1:m
    for j=1:n
        free_period=free_period+mu(i, j)*tau_bk(i,j)*period;
    end
end

%Суммарное содержимое, освобожденное за максимальное число периодов,
%включенных в [0, t], и вычисление оставшегося времени (неполный период)
free_period=free_period*amount;
out=free_period;
stayed=t-period*amount;
k=1;

%Вычисление обработанного содержимого, если оставшегося времени хватает на
%запланированное обслуживание следующего пакета
while(stayed>tau(k)*period)
    for i=1:m
        out=out+period*tau_bk(i, k)*mu(i, k);
    end
    stayed=stayed-tau(k)*period;
    k=k+1;
    if(k==n+1)
        break
    end
end

%Вычисление освобожденной работы в ситуации, когда времени не хватает на
%обслуживание пакета
if(k~=n+1)
    for i=1:m
        out=out+min(period*tau_bk(i, k), stayed)*mu(i, k);
    end
end
end