참 고 문 헌
ATM Forum technical committee, 1999, Traffic management specification version 4.1, AF-TM-0121.000, ATM Forum.
Hongbo Zhu, Victor S. Frost, 1996, "In-Service Monitoring for Cell Loss Quality of Service Violations in ATM Networks", IEEE/ACM transaction on networking, vol4, no2, pp240-248.
Jan Beran, Robert Sherman, Murad S. Taqqu, 1995, "Long-Range Dependence in Variable-Bit-Rate Video Traffic", IEEE transactions on comunications, vol43, no.2/3/4, pp1566-1579.
Lily Cheng, Herman, D.Hughes, 2000, "An ATM Traffic Model Based on Empirical Traffic Measurements", Int. Jol. of Modeling & Simulation, Vol. 20, No. 3, pp. 200-212.
Marquardt, D.W., 1963, “An Algorithm for Least Squares Estimation of Parameters”, Journal of the Society of Industrial and Applied Mathematics, 11, pp.431-441.
Qiang Ren, G. Ramamurthy, 2000, "A Real-Time Dynamic Connection Admission Controller Based on Traffic Modeling, Measurement, and Fuzzy Logic Control", pp.184-196.
Othmar Kyas, 1997, ATM networks second edition, 흥릉과학출판사.
Raif O. Onvural, 1995, Asynchronous transfer mode networks : Performance Issues second edition, Artech House.
Ricardo Citro, Seong-Soon Joo, Sumit Ghosh, 2001, "An Adaptive, Dynamic Buffer Management(ADBM) Approach for Input Buffers in ATM Networks", IEEE, pp2860-2864.
고성택, 김경연, 김경식, 최영복, 1998, “신경회로망을 이용한 ATM 신호의 동적 대역폭 할당”, 정보통신분야 우수학교 지원사업 연차보고서 1차
고성택, 김경연, 이용학, 안기중, 1999, “ATM망에서 트래픽 제어에 관한 연구”, 정보통신우수시범학교지원사업, 우수98-89.
권택근, http://www.ce.cnu.ac.kr/~tgkwon/
김관웅, 김병곤, 전병실, 2002, “ATM-GFR에서 최소 전송율 보장 및 공평성 향 상을 위한 Leaky Bucket 기반의 버퍼관리 알고리즘”, 전자공학회논문지 제39권 제12호, pp8-16.
김지관, 1996, 표준 ATM, 교보문고.
유영일, 강병탁, 김관웅, 조해성, 정경택, 전병실, “셀 지연과 버퍼 이용률을 개선 한 WRR 셀 스케쥴링 알고리즘”, 한국통신 통신망연구소.
김상철, 고성택, 2000, “ATM 망에서 효율적인 문턱 값 기반 호 수락 제어”, 한국 신호처리․시스템학회 학회, Vol. 1, pp. 33-36.
최태상, 정윤희, http://kidbs.itfind.or.kr:8888/WZIN/jugidong/918/91801.html
부 록
1. 변수 설정 다이알로그
//////////////////////////////////////////////////////////////////////////////////////////////
// 설정된 변수를 받아들이는 함수 (적용단추) void CSetParameterDlg::OnServiceParameterApply() {
//서비스별 CDF 파일로부터 누적확률별 셀 수를 InDataFromPDF[][]에 넣음 if((m_File_CDF = fopen("PDF\\"+strDataFileName,"r+")) == NULL) {
MessageBox("The file for PDF data is not in this directory.");
} else {
fscanf(m_File_CDF, "%d", &pDynamicCACDlg->m_sElement.NoOfDataFromPDF);
for(i = 0; i < pDynamicCACDlg->m_sElement.NoOfDataFromPDF; i++) {
fscanf(m_File_CDF, "%f, %f",
&pDynamicCACDlg->m_sElement.InDataFromPDF[0][i],
&pDynamicCACDlg->m_sElement.InDataFromPDF[1][i]);
} }
fclose(m_File_CDF);
}
2. 시뮬레이션 다이알로그
//////////////////////////////////////////////////////////////////////////////////////////////
// 문턱값과 α변경에 따른 시뮬레이션 시작
void CDynamicCACDlg::StartSimulation(int Threshold, double Alpha) {
m_Index = 0;
m_Threshold = Threshold;
m_Alpha = alpha;
// 문턱값과 α값 변경시 변수 초기화 InitialMemberVariable();
SetTimer(0, m_TimeDiv, NULL);
}
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////////////////////////////
// CDF를 이용하여 랜덤하게 셀 생성 void CDynamicCACDlg::CellGenerator() {
int i, j, n_index;
double rnum, rn, temp;
for(j = 0; j < m_NoOfChannel; j++) {
rn = (float)rand();
rnum = rn/RAND_MAX;
for(i = 0; i < m_sElement.NoOfDataFromPDF; i++) {
if(rnum < m_sElement.InDataFromPDF[1][i]) {
n_index = i-1;
break;
}
else if(rnum < 0.000000001) //random number가 너무 적으면 처음 데이터로 {
n_index = 0;
break;
}
else if(rnum > 0.99999999) //random number가 너무 크면 마지막 데이터로 {
n_index = m_sElement.NoOfDataFromPDF-1;
break;
} }
temp = m_sElement.InDataFromPDF[1][n_index+1] - m_sElement.InDataFromPDF[1][n_index];
if(temp < 1e-30) {
temp = 1e-30;
}
m_sElement.Element[j].GeneratedCell =
(UINT)(m_sElement.InDataFromPDF[0][n_index] + (m_sElement.InDataFromPDF[0][n_index+1]
- m_sElement.InDataFromPDF[0][n_index]) * (rnum - m_sElement.InDataFromPDF[1][n_index])/temp);
}
CalculatorQueue();
}
//////////////////////////////////////////////////////////////////////////////////////////////
// 문턱값에 따른 출력 셀율을 계산 void CDynamicCACDlg::CalculatorQueue() {
int Buffer, DrainRate, overTH = 0, underTH = 0;
for(int Channel = 0; Channel < m_NoOfChannel; Channel++) {
Buffer = m_sElement.Element[Channel].GeneratedCell + m_sElement.Element[Channel].UsedBufferSize;
if(Buffer >= m_Threshold) {
overTH += 1;
}
underTH = m_NoOfChannel - overTH;
}
if(overTH == m_NoOfChannel) {
for(Channel = 0; Channel < m_NoOfChannel; Channel++) {
m_sElement.Element[Channel].LostCell = 0;
Buffer = m_sElement.Element[Channel].GeneratedCell + m_sElement.Element[Channel].UsedBufferSize;
DrainRate = m_Drain;
if(Buffer >= m_BufferSize) {
m_sElement.Element[Channel].LostCell = Buffer - m_BufferSize;
m_sElement.Element[Channel].GeneratedCell_Out = DrainRate;
Buffer -= m_sElement.Element[Channel].LostCell;
Buffer -= DrainRate;
}
else if(Buffer < m_BufferSize) {
if(Buffer <= DrainRate) {
DrainRate = Buffer;
}
m_sElement.Element[Channel].GeneratedCell_Out = DrainRate;
Buffer -= DrainRate;
}
RateCalculatorPerChannel(Buffer, Channel, DrainRate);
} }
else if(underTH == m_NoOfChannel) {
for(Channel = 0; Channel < m_NoOfChannel; Channel++) {
Buffer = m_sElement.Element[Channel].GeneratedCell +m_sElement.Element[Channel].UsedBufferSize;
DrainRate = m_Drain;
if(Buffer <= DrainRate) {
DrainRate = Buffer;
}
m_sElement.Element[Channel].GeneratedCell_Out = DrainRate;
Buffer -= DrainRate;
RateCalculatorPerChannel(Buffer, Channel, DrainRate);
} } else {
for(Channel = 0; Channel < m_NoOfChannel; Channel++) {
m_sElement.Element[Channel].LostCell = 0;
Buffer = m_sElement.Element[Channel].GeneratedCell + m_sElement.Element[Channel].UsedBufferSize;
if(Buffer >= m_Threshold) {
DrainRate = int((m_Drain + (m_PCR - m_ACR)) / underTH);
if(Buffer >= m_BufferSize) {
m_sElement.Element[Channel].LostCell = Buffer - m_BufferSize;
m_sElement.Element[Channel].GeneratedCell_Out = DrainRate;
Buffer -= m_sElement.Element[Channel].LostCell;
Buffer -= DrainRate;
}
else if(Buffer < m_BufferSize ) {
if(Buffer <= DrainRate) {
DrainRate = Buffer;
}
m_sElement.Element[Channel].GeneratedCell_Out = DrainRate;
Buffer -= DrainRate;
} }
else if(Buffer < m_Threshold) {
DrainRate = int((m_Drain + (m_PCR - m_ACR)) / overTH);
if(DrainRate > 0) {
if(Buffer <= DrainRate) {
DrainRate = Buffer;
}
m_sElement.Element[Channel].GeneratedCell_Out = DrainRate;
Buffer -= DrainRate;
}
else if(DrainRate <= 0) {
m_sElement.Element[Channel].GeneratedCell_Out= 0;
} }
RateCalculatorPerChannel(Buffer, Channel, DrainRate);
} }
RateCalculatorPerService(DrainRate);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// 각 채널들의 PCR, ACR, CLR 등을 계산
void CDynamicCACDlg::RateCalculatorPerChannel(int Buffer, int Channel, int Drain) {
m_sElement.Element[Channel].UsedBufferSize = Buffer;
m_sElement.Element[Channel].TotalGeneratedCell +=
m_sElement.Element[Channel].GeneratedCell;
m_sElement.Element[Channel].TotalGeneratedCell_Out +=
m_sElement.Element[Channel].GeneratedCell_Out;
m_sElement.Element[Channel].TotalLostCell += m_sElement.Element[Channel].LostCell;
if(m_sElement.Element[Channel].TotalGeneratedCell_Out == 0) {
m_sElement.Element[Channel].CLR = 0;
} else {
m_sElement.Element[Channel].CLR =
((float)m_sElement.Element[Channel].TotalLostCell / (float)m_sElement.Element[Channel].TotalGeneratedCel l_Out) / ((float)m_TimeDiv / 1000);
}
m_sElement.Element[Channel].ChannelCount ++;
m_sElement.Element[Channel].ACR =
m_sElement.Element[Channel].TotalGeneratedCell_Out / m_sElement.Element[Channel].ChannelCount;
if(m_sElement.Element[Channel].PCR <=
m_sElement.Element[Channel].GeneratedCell_Out) {
m_sElement.Element[Channel].PCR =
m_sElement.Element[Channel].GeneratedCell_Out;
}