티스토리 뷰
데이터에 대한 내용 설명이 많이 부족해서, 복습 할 겸 내용설명을 충분하게 곁들이고 다시 정리하고 넘어가기로 한다.
데이터와 속도표현에 대한 설명 말미에는 실무에서 쓸 수 있도록 자바스크립트와 php의 함수 표현과 사용법에 대해
알아보도록 한다! 너무 상세한 깊이있는 전문 지식 대신 기초자료에 근거하여 핵심만 알기쉽게 서술형으로 설명하도록 노력하겠다.^^
데이터에 대해 알아야 할 이유
우리가 쓰는 데이터 단위에는 흔히 컴퓨터에서 사용하는 bit, Byte, KB, MB, GB... 등이 있고
인터넷 속도 단위로는 bps, kbps, Mbps, pps 등 이 있다.
네트워크 관련 작업하는 데에 있어서 용량 표현과 전환에 대한 함수는 반드시 필요하고
그 기반에는 이러한 데이터 수치와 관계에 대한 이해가 밑바탕 되어야 하기 때문에 정리하여 어카이브로 남겨두겠다.
데이터의 ON / OFF와 CPU
[ O / | ] 전자기기의 전원부를 보면 이런 마크가 있다.
이니셜이나 축약어를 좋아하는 우리나에서는 O하나만 보고 On = 켜짐으로 보여질 수 도 있겠지만..^^ 사실은 정반대이다.
우리가 흔히 부르는 프로세서 즉 '반도체'에서는 전류를 흘렸다 끊었다 하면서 정보를 기억하고 나타내는데
흐르면 '1', 끊어지면 '0'을 가지고 제어한다. 따라서 0과 1로 이루어진 전기를 표현하기 위해 매우 적절한 2진수라는 진법으로
숫자를 처리하고 있다.
여기까지의 내용을 대강이라도 이해했다면 아래 내용을 다시 보자.
[ 0 / 1 ]
위에서 알파벳처럼 보였던 O / I 가 숫자로 바뀌어서 보이고 이젠 더 이상 헷갈릴 일이 없다.
1이면 동작, 0이면 정지.
흥미로운 사실을 위해 CPU와 관련된 이야기를 조금 덧붙이자면 CPU는 '트랜지스터'라는 CMOS형 트랜지스터를 사용한다.
실리콘 기판과 소스의 전극을 접지하고 전극에 일정한 전압을 조정하면 채널(하단 그림참조) 이라고 하는 전자의 통로가 만들어진다.
바로 여기에서 전류를 흘리고 끊으며 0과 1에 의한 2진수 연산을 하게 된다는 것이다.
CPU에서 1GHz, 2.7GHz 과 같이 클럭(Clock)이라는 처리 속도를 표현하는데
CPU의 클럭은 바로 이 '0'과 '1'로 이루어진 작업을 처리하는데 있어서 몇 번 꺼지고 켜지는가에 대한 숫자이다.
3GHz 의 경우 초당 30억번 꺼지고 켜진다는 어마어마한 동작 속도이다.
새로운 CPU가 출시 될때마다 흔히 나노공정 이라는 말을 자주 듣는데 트랜지스터가 양이 많아 질 수록 발열도 많이 발생하게 된다.
그렇기 때문에 CPU의 발열을 제어하면서 성능을 더 향상 시키기 위해서 제조공정을 더욱 미세화하여 트랜지스터를 보다
작게 만드는 것이다. 그러면 집적도가 높아져서 사이즈도 작아지고, 소비전력도 낮아지고, 속도도 빨라지고, 같은 면적에 더 많은
기능을 넣을 수 있게된다.
더욱 전문적인 내용과 전류의 상황에 대해서 읽어보고 싶으면 여기( http://www.hwlab.com/printF.php?subcode=8261 )를
참고하도록 한다.
2014년 8월 기준으로 인텔(INTEL)사에서 최초로 14나노미터(nm)공정으로 제작된 마이크로아키텍처를 양산하고 있는데
나노미터는 머리카락의 1/ 1000 굵기, 10억분의 1m 이다.
2진수와 데이터의 첫 단위 bit (비트)
위의 글을 통해서 컴퓨터는 2진수로 0과 1로만 처리함을 충분히 이해했고, 그렇다면 2진수의 표현 방법에 대해서 알아보자
2진수의 계산법은 1,2,4,8,16,32,64 처럼 2씩 곱하여 증가한다.
0 0 1 1(2) 의 경우
2진수 : 0 0 1 1
10진수 : 0 + 0 + 2 + 1 = 3
1 1 1 1(2) 의 경우
2진수 : 1 1 1 1
10진수 : 8 + 4 + 2 + 1 = 15
....쉽다.. 마지막으로 한개만 더해보자
11011(2) 의 경우
2진수 : 1 1 0 1 1
10진수 : 16 + 8 + 0(4) + 2 + 1 = 27
윈도우7 기준으로 아래와 같이 계산기를 실행시키면 프로그래머용 모드에서
Bin(Binary) = 2진수 모드에 11011을 넣고 DEC(Decimal) = 10진수 모드로 바꾸면 27로 바뀐다.
장문의 2진수를 일일이 계산할 필요는 없다는 것이다.
이러한 2진수를 가지고 컴퓨터에는 보통 8bit를 최소 단위로 사용하고 있다.
8비트.. 많이 들어본 것 같다... 바로 우리 어릴적 패밀리 게임기의 처리용량이 바로 이 8비트를 기반으로 한 CPU연산인 것이다.
다음을 진법을 보면 여기에는 익숙한 개념이 등장한다.
8 bit | |
2진수 | 10진수 |
0000 0000 | 0 |
0000 1111 | 15 |
1111 1111 | 255 |
8비트는 0에서 255까지 갯수(Length)로는 256개의 상태를 표현할 수 있다.
바로 DOS용 게임을 할 때 그래픽 카드옵션에서 왜 그토록 256컬러 선택 부분이 많았는지 이해가 갈 것이다.
당시에는 256칼라가 8bit로 표현할 수 있는 최고품질이었던 것이다.
DOS에서 VGA모드를 이용하여 256컬러를 사용한 추억의 게임 페르시안 왕자.
그래픽 카드가 떨어지면 16색 이하나 단색(흑백)으로 표현되는 저 클럭모드를 맛보기도 했다.
기술이 발전하고 시간이 지나면서 비트라는 단위는 다루기에 너무 작고 불편해졌다.
그래서 8개의 비트를 묶어서 1 바이트라고 표현한다.
비트와 바이트의 관계는 다음의 표를 보면 쉽게 이해가 갈 것이다.
Byte | |
8bit | 1Byte |
16bit | 2Byte |
32bit | 4Byte |
64bit | 8Byte |
데이터 용량 단위 | |
8bit | 최소단위 |
1Byte | 8bit |
1KB | 1024Byte |
1MB | 1024KB |
1GB | 1024MB |
1TB | 1024GB |
1PB | 1024TB |
1EB | 1024PB |
1ZB | 1024EB |
1YB | 1024ZB |
* 글을 쓴 2014년 현재, PB(페타바이트) 부터는 아직 저장장치로 공식 출시되지 않았다.
네트워크에서의 전송속도
네트워크 통신 분야에서 전송 속도란 한 지점에서 다른 지점으로 데이터가 이동하는 속도를 의미한다.
이것의 단위는 보통 '1초 동안의 수신하는 데이터양'을 나타낸다.
단위로는 초당 비트수(bps : bit per second)를 가장 많이 사용한다. 필요에 따라 초당 문자수(cps : character per second)등을
쓰기도 한다. 일반적으로 하나의 character는 8bit 를 의미한다.
또한 컴퓨팅에서 표현하는 비트레이트(bitrate)는 특정한 시간 단위(이를테면 초 단위)마다 처리하는 비트의 수 이다.
마찬가지로 비트레이트 또한 초당 비트 수(비트/초 또는 bps)를 사용하여 계산한다. 여기에 킬로,메가,기가,테라와 같은 접두어가 붙는다.
인터넷 전송속도
- 2018.12.27 수정 : 제보 dsffs 님
전송속도인 bps를 B/s 단위로 우리가 알기 쉽게 도출하기 위해
개념과 공식을 일관되게 수정하였습니다.
인터넷 전송 속도를 측정하는 단위로 위에 언급했던 'bps' 를 사용하게 되는데 bps단위는 1024가 아니라 항상 1000 단위이다.
bps | |
1bps | bit per second |
1Kbps | 1,000bps |
1Mbps | 1,000Kbps |
그런데 인터넷 서비스 업체에서는 흔히 '100메가'급 속도 라는 말을 자주 표현하는데 이는 100MB를 뜻하는 것이 아니다.
'100메가 + 비트퍼세컨트' 라고 표현해야한다. 100MB -> 100Mbps
본격적으로 단위를 환산하기 위해서 다음의 개념을 숙지해야한다.
bps를 B/s 단위로 변환하기 위해서는 공통점이 있는데
다음의 예제를 보며 공식을 도출해보자
B/s ??? : 1Byte는 8bit, 1개의 문자인 1 Character와 같고
이는 8bps = 1cps 이며
1Byte/s = 1Byte per seconds = 1B/s 와 같다
1bps = 1/8cps = 0.125cps = 0.125Byte/s = 0.125B/s
1Bps = 8bps = 8/8cps = 1cps = 1Byte/s = 1B/s
10Mps = 10,000,000bps = 10,000,000/8cps = 1,250,000cps = 1,250,000Byte/s
= 1,250KByte/s = 1.25MB/s
공식 : 전송속도인 bps를 B/s 로 변환하기
∴ bps / 8 = B/s
또는∴ bps * 0.125 = B/s
공식을 대입해서 결과를 얻기까지의 과정을 표로 나타내 보았다.
속도를 나타내는 단위 bps에 대한 용량 환산 | |||
1bps | 1/8cps = 0.125cps | 0.125Byte | 0.125B/s |
8bps | 8/8cps = 1cps | 1Byte | 1B/s |
1kbps | 1000/8cps = 125cps | 125Byte | 0.125KB/s |
10Mbps | 10,000,000/8cps = 1,250,000cps | 1,250,000Byte | 1,250 KB/s = 1.25 MB/s |
100Mbps | 100,000,000/8cps = 12,500,000cps | 12,500,000Byte | 12,500 KB/s = 12.5 MB/s |
1Gbps | 1,000,000,000/8cps = 125,000,000cps | 125,000,000Byte | 125,000 KB/s = 125 MB/s = 0.125 GB/s |
위에 언급했던 100메가 인터넷에 대한 속도도 100Mbps/8 = 12.5MB/s가 나오고, 인터넷 다운로드 시 1초당 12MB를 전송한다는 의미.
실제로는 여러가지 요소에 의해서 약 8~9MB 내외로 나온다고 한다. 광고 내용처럼 100% 100Mbps가 나오지 않는다.
(하지만 2014년 현재, 8~9MB정도의 속도가 보장되면 이 정도도 매우 훌륭한 인터넷 속도라 할 수 있다.)
pps : packet per second
보통 네트워크 장비의 성능을 측정할때 많이 사용하는 단위가 바로 pps
의미는 1초에 패킷을 몇개를 보낼수 있냐 하는 측정 단위라고 생각하면 된다.
pps는 초당 패킷이 몇개 통과 하느냐는 얘긴데..
Ethernet 상에서 64Byte~1518Byte의 패킷 크기를 가진것들이 돌아다닙니다.
그럼 pps라는 단위는 용량으로 표현하기 좀 힘들죠..
대부분 인터넷 상에서 돌아 다니는 패킷의 크기는 64~128Byte가 대부분이고
그 중에서도 대부분이 최소 크기인 64Byte 입니다.(예: HTTP 트래픽)
그래서 pps랑 용량간의 관계는 정비례 관계는 아니지만
1packet = 64Byte 라는 공식으로 계산하시면 얼추 맞습니다.
보통 스위치나 라우터를 제조하는 업체에서 pps 계산시 64byte로 하면
더 높은 pps로 표시되기 때문에 대부분이 64Byte로 계산해서 사용합니다.
그러나 사실 2가지로 나눕니다.
최소 바이트의 packet으로 나눈 수 하고
mixed mode라 해서 64Byte~1500Byte까지 섞어서 보내는 모드로 구분합니다.
결론적으로, pps는 대역폭상에서 초당 얼마의 패킷을 처리할 수 있는 지
성능에 초점을 맞춘 단위라고 할 수 있습니다.
함수화
자 이제 마무리 시간이다. 모든 개념들을 우리가 프로그래밍 상에서 쉽고 편하게 쓸 수 있도록
자바스크립트와 서버사이드 언어로 표현 해 보도록 하자.
javascript : Byte에대한 KB, MB.. 단위환산
function fnByteToMB($num, $len) { var byte = $num; var kb = byte / 1024; var mb = kb / 1024; return mb.toFixed($len) + 'MB'; //소수점이하n자리 (n+1에서 반올림됨) } function fnByteToKB($num, $len) { var byte = $num; var kb = byte / 1024; return kb.toFixed($len) + 'KB'; //소수점이하n자리 (n+1에서 반올림됨) } console.log( fnByteToMB(5612823, 2) ); //5.35MB
Byte를 KB로 바꾸기위해서는 1024로 한 번 나누고, MB로 바꾸기 위해서는 1024를 두 번 나누어 주면 되므로
위의 함수와 같은 형태로 사용하면 된다.
혹시나 소수점 표기에 제한이 있을 경우 toFixed메서드를 사용하여 소수점 이하까지만 표시하되
소수점 이하+1 에서 반올림하여 표시한다.
javascript : kbps를 KB/s로
function fnkbpsToKBs($kbps, $len) { var bps = parseInt($kbps, 10) * 1000; var cps = bps / 8; var KBs = (cps / 1000); return KBs.toFixed($len) + 'KB/s'; //소수점이하n자리 (n+1에서 반올림됨) } console.log( fnkbpsToKBs(1, 3) ); //0.125KB/s
8을 나누고 곱하는 공식을 잘 기억하고 있다면 bps -> b/s 로 표시할 때에는 8을 나눠야 한다는 것을 알고 있을 것이다.
인자로 넘어온 $kbps를 1000을 곱하여 bps로 만들어준뒤 8을 나눈다.
다시 1000을 나누어서 KB/s 단위로 표현하고
혹시나 소수점 표기에 제한이 있을 경우 toFixed메서드를 사용하여 소수점 이하까지만 표시하되
소수점 이하+1 에서 반올림하여 표시한다.
javascript : Byte를 kbps로
function fnByteToMB($num, $len) {
var byte = $num;
var kb = byte / 1024;
var mb = kb / 1024;
return mb.toFixed($len) + 'MB'; //소수점이하n자리 (n+1에서 반올림됨)
}
function fnByteToKB($num, $len) {
var byte = $num;
var kb = byte / 1024;
return kb.toFixed($len) + 'KB'; //소수점이하n자리 (n+1에서 반올림됨)
}
console.log( fnByteToMB(5612823, 2) ); //5.35MB
8을 나누고 곱하는 공식을 잘 기억하고 있다면 b/s -> bps 로 표시할 때에는 8을 곱해야 한다는 것을 알고 있을 것이다.
인자로 넘어온 $Byte를 8을 곱하여 bps로 만들어준뒤
다시 1000을 나누어서 kbps로 표현하고
혹시나 소수점 표기에 제한이 있을 경우 toFixed메서드를 사용하여 소수점 이하까지만 표시하되
소수점 이하+1 에서 반올림하여 표시한다.
javascript : bps에 따른 단위 변환 - bps,Kbps,Mbps, Gbps,Tbps
function fnkbps($num, $len) { var bps = $num; if( bps >= 1000 * 1000 * 1000 * 1000){ // T var Tbps = bps / (1000 * 1000 * 1000 * 1000); return Tbps.toFixed($len) + 'Tbps'; }else if( bps >= 1000 * 1000 * 1000){ // G var Gbps = bps / (1000 * 1000 * 1000); return Gbps.toFixed($len) + 'Gbps'; }else if( bps >= 1000 * 1000 ){ // M var Mbps = bps / (1000 * 1000); return Mbps.toFixed($len) + 'Mbps'; }else if( bps >= 1000 ){ //k var kbps = bps / 1000; return kbps.toFixed($len) + 'Kbps'; }else if( bps < 1000 ){ //1000미만 bps return bps + 'bps'; } }
bps를 가지고 각각 bps, Kbps, Mbps, Gbps, Tbps로 단위를 변환시켜주는 함수.(별거없는 노가다 수준이다)
javascript : pps에 따른 단위 변환 - pps,Kpps,Mpps, Gpps,Tpps
function fnpps($num, $len) { var pps = $num; if( pps >= 1000 * 1000 * 1000 * 1000){ // T var Tpps = pps / (1000 * 1000 * 1000 * 1000); return Tpps.toFixed($len) + 'Tpps'; }else if( pps >= 1000 * 1000 * 1000){ // G var Gpps = pps / (1000 * 1000 * 1000); return Gpps.toFixed($len) + 'Gpps'; }else if( pps >= 1000 * 1000 ){ // M var Mpps = pps / (1000 * 1000); return Mpps.toFixed($len) + 'Mpps'; }else if( pps >= 1000 ){ //k var Kpps = pps / 1000; return Kpps.toFixed($len) + 'Kpps'; }else if( pps < 1000 ){ //1000미만 pps return pps + 'pps'; } }
pps를 가지고 각각 pps, Kpps, Mpps, Gpps, Tpps로 단위를 변환시켜주는 함수.(별거없는 노가다 수준이다)
php : 클라이언트가 아니라 서버에서 Byte를 bps로 변환
function fnByteTobps($byte, $len=2){ $byte = (double)$byte; $bps = ($byte * 8) / 60; if( $bps $gt;= 1000 * 1000 * 1000 * 1000 ){ $bps = ( $bps / ( 1000 * 1000 * 1000 * 1000 ) ); $bps = number_format($bps, $len) . ' Tbps'; }else if( $bps $gt;= 1000 * 1000 * 1000 ){ $bps = ( $bps / ( 1000 * 1000 * 1000 ) ); $bps = number_format($bps, $len) . ' Gbps'; }else if( $bps $gt;= 1000 * 1000 ){ $bps = ( $bps / ( 1000 * 1000 ) ); $bps = number_format($bps, $len) . ' Mbps'; }else if( $bps $gt;= 1000 ){ $bps = ( $bps / 1000 ); $bps = number_format($bps, $len) . ' kbps'; }else if( $bps < 1000 ){ $bps = number_format($bps, $len) . ' bps'; } return $bps; } //echo ( fnByteTobps(125) ); //1.00 kbps echo ( fnByteTobps(7592534) );
Byte를 가지고 bps로 만들기 위해서 * 8을 하고 60을 나눈다.
number_format()메서드를 이용하여 소수점을 맞춰준다.
'■ 개발관련 ■ > 산수와 알고리즘' 카테고리의 다른 글
WebSocket에서 클라이언트 버퍼사용하기(작성중) (0) | 2023.11.24 |
---|---|
박스모델 공식, 그리드 정렬공식 (정리와 설명은 나중에) (0) | 2014.11.02 |
포물선 운동과 공 step11:클래스로 만들기 (0) | 2014.08.31 |
포물선 운동과 공 step10:공의 움직임 함수로 만들기 (0) | 2014.08.31 |
포물선 운동과 공 step09:움직임과 위치를 랜덤하게 설정하기 (0) | 2014.08.31 |