• 검색 결과가 없습니다.

참 고 문 헌

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;

}

관련 문서