주어진 출발점에서 목표지점까지 가는 최단 경로를 찾아내는 그래프 탐색 알고리즘 중 하나이다.
최단 경로를 찾는다는 공통점을 가지지만, A*는 데이크스트라에 휴리스틱(Heuristic)이라는 개념을 추가하여 효율성을 높인 알고리즘이다. 본래 A 알고리즘이라고 불렸지만 적절한 휴리스틱에 따라서 최적의 알고리즘이 되기 때문에 A* 알고리즘이라 불린다.
데이크스트라와 관계
A*알고리즘은 데이크스트라 알고리즘의 확장 버전이라고 볼 수 있다. 데이크스트라에서 사용하는 시작점으로부터의 실제 거리 g(n)에 목표점까지의 예상 거리 h(n)라는 휴리스틱을 더한 값을 우선순위 기준으로 사용한다.
f(n) = g(n) + h(n)
g(n) : 시작점에서 현재 노드 n까지의 실제 비용
h(n) : 현재 노드 n에서 목표 노드 goal까지의 휴리스틱 비용(예상 비용)
f(n) : 시작점에서 n을 거쳐 goal까지 가는 총 예상 비용
휴리스틱 h(n)이 핵심 역할을 하며, 이 값이 얼마나 목표에 가깝게 추정하느냐에 따라서 A*의 효율성이 결정된다.
휴리스틱
가장 대표적으로 사용되는 두 가지 방법으로 맨해튼 거리(Manhattan Distance)와 유클리드 거리(Euclidean Distance)가 있다.
두 가지 방법 모두 특히 격자 기반의 길 찾기 문제나 2D/3D 공간에서의 최단 경로 탐색에 자주 활용된다.
맨해튼 거리(Manhattan Distance)
격자에서 한 점에서 다른 점까지 가로 또는 세로로만 이동할 수 있을 때의 최단 거리를 의미한다. 마치 도시의 블록을 따라 이동하는 것과 같다고 하여 맨해튼 거리 또는 택시 거리라고 불린다.
계산은 두 점 (x1, y1) , (x2, y2)가 있을 때 두 점 사이의 맨해튼 거리는 |x1 - x2| + |y1 - y2|이다.
이동이 수직(상하) 또는 수평(좌우)으로만 가능한 경우와 각 이동에 대한 비용이 모두 동일할 때 적합하다. (미로, 체스, 격자 등)
유클리드 거리(Euclidean Distance)
가장 일반적인 직선거리 개념으로 두 점을 잇는 가장 짧은 선의 길이이다.
두 점 (x1, y1) , (x2, y2) 사이의 유클리드 거리는 피타고라스의 정리를 사용하여 계산된다.
√ (x1 - x2)^2 + (y1 - y2)^2
대각선 이동이 가능한 경우, 이동 비용이 거리에 비례하는 경우에 사용하기 적합하다.
허용성
A* 알고리즘에서 휴리스틱 함수가 가져야 할 중요한 속성으로, 최단 경로를 정확하게 찾을 수 있는 여부를 보장하는 기준, 즉 A* 알고리즘의 정확성을 보장하는 핵심 조건이다.
허용 가능한 휴리스틱 함수는 어떤 노드에서 목표 노드까지의 예상비용이 실제 최단 거리보다 절대로 크지 않아야 한다.
h(n) ≤ 실제 최단 거리
h(n) : 현재 노드 n에서 목표 노드까지의 휴리스틱 비용
실제 최단 거리 : 현재 노드 n에서 목표 노드까지의 실제 최단 거리
A* 알고리즘이 최단 경로를 항상 찾을 수 있도록 보장하기 때문에 허용 가능한 휴리스틱을 사용하는 것이 중요하다.
최단 경로 보장
만약 휴리스틱이 실제 거리보다 과대평가한다면, 때때로 실제 최단 경로가 아닌 다른 경로를 최단 경로로 착각하여 탐색을 조기에 종료할 수 있다. 하지만 허용 가능한 휴리스틱은 항상 실제보다 같거나 작은 값을 예측하므로 항상 실제 최단 경로를 놓치지 않고 탐색하기 된다.
효율성과 균형
허용성은 정확성을 보장하지만, 너무 보수적인 휴리스틱은 A*가 데이크스트라처럼 넓은 영역을 탐색하게 만들어 효율성이 떨어질 수 있다. 따라서 이성적인 휴리스틱은 허용 가능하면서도 실제 최단 거리에 최대한 가까운 값을 예측하여, 최단 경로를 보장하면서도 탐색 효율성을 극대화하는 것이다.
예) 격자에서 가로/세로 이동만 가능하다고 가정할 때, 맨해튼 거리는 두 점 사이의 실제 최단 거리와 동일하거나 더 짧다. 장애물이 없는 최단 경로는 항상 맨해튼 거리보다 길거나 같을 수 없기 때문에 허용 가능한 휴리스틱이다.
예) 두 점 사이의 가장 짧은 직선거리는 유클리드 거리이다. 실제 경로가 장애물 때문에 직선으로 갈 수 없다면, 실제 경로는 유클리드 거리보다 길어질 수밖에 없으며 유클리드 걸리도 실제 최단 거리보다 과대평가하지 않으므로 허용 가능한 휴리스틱이다.
데이크스트라 알고리즘의 초기 형태는 우선순위 큐를 사용하지 않고, 일반적인 배열 또는 리스트를 사용하여 구현되었다. 이 방식은 매 단계마다 방문하지 않은 노드 중에서 시작점으로부터의 거리가 가장 짧은 노드를 선형 탐색하여 찾아낸다.
시간 복잡도
- 그래프에 V개의 노드가 있을 때, 매번 가장 짧은 노드를 찾기 위해 O(V) 시간이 소요된다.
- 가장 짧은 노드 선택과정을 총 V번 반복하기 때문에, 전체 시간 복잡도는 O(V * V) = O(V^2)이 된다.
플로우(일반 배열/리스트 사용)
기본 형태에서는 일반 배열/리스트를 사용하여 구현했는데 이 경우 그래프의 모든 노드를 방문하면서 각 노드를 방문할 때마다 짧은 거리를 찾는 과정이 필요한데 이때 V개의 노드가 있다면 모든 노드를 순회하는 작업이 O(V)의 시간이 걸리고 여기서 매 반복마다 O(V)의 시간이 소요되는 '가장 짧은 거리 노드 선택' 과정이 총 V번 반복되기 때문에 전체 시간 복잡도는 O(V^2)이 된다.
플로우
dist[] : 각 노드까지의 최단 거리를 저장, infinity 초기화
visited[] : 각 노드를 방문했는지 여부, false 초기화
start_node ( dist = 0 )
아직 탐색하지 않은 자식 노드를 추적하고 모든 노드를 탐색하기 위해서 일반적으로 FIFO 방식인 큐를 사용한다.
탐색을 시작할 때 먼저 루트 노드를 큐에 넣는다. 큐에서 가장 앞에 있는 노드를 먼저 탐색하고 그 자식 노드를 모두 큐에 넣는다. 그리고 큐에서 제거를 하면 가장 먼저 넣었던 노드가 빠지게 된다. 그리고 다시 큐의 가장 앞에 있는 노드를 탐색하고 자식을 큐에 넣고 가장 앞의 노드를 제거하는 과정을 큐가 빌 때까지 반복하면 최종적으로 모든 노드를 방문할 수 있게 된다.
이 방법을 확장하면 사이클 유무, 방향성, 가중치 유무 등에 상관없이 모든 형태를 포함할 수 있는 자유로운 구조로 노드와 간선으로 구성된 구조인 일반 그래프에도 적용할 수 있게 된다. 이때는 부모-자식 관계가 확실한 트리에서와는 달리 중복해서 탐색하는 것을 방지하는 작업이 추가로 필요하다.
시각적으로 확인하기 쉬운 이차원 그리드에서 이를 응용하면 특정 셀을 루트 노드로 간주하고 그 인접한 각 셀들을 자식 노드로 치환할 수 있다. 이때 셀들은 중복해서 인접하기 때문에 이를 체크하여 순차적으로 탐색을 이어가면 모든 셀을 중복 없이 탐색할 수 있다.
여기서 시작 셀 이외에 또 다른 셀을 도착 지점으로 지정하고 이 셀을 만날 때까지 탐색을 진행하고 각 셀들이 어떤 셀로부터 이어져 온 것인지에 대한 정보를 저장한다면 도착한 셀에서 이전 셀을 타고 올라가면 시작 셀에서부터 도착 셀까지 이어지는 경로를 알 수 있게 된다. 이 과정이 BFS를 응용한 길 찾기 알고리즘이다.
BFS Pathfinding
DFS
Depth-First Search, 깊이 우선 탐색
트리 자료구조의 순회 방법으로 한 방향으로 최대한 깊이 탐색한 후, 더 이상 갈 곳이 없으면 이전 노드로 돌아가서 다른 방향을 탐색하는 방식으로 진행한다.
https://en.wikipedia.org/wiki/Depth-first_search
아직 탐색하지 않은 경로를 추적하고 모든 노드를 탐색하기 위해서 일반적으로 LIFO 방식인 스택을 사용하거나 재귀 함수를 활용한다. 탐색을 시작하면 루트 노드부터 시작해서 자식이 없는 리프 노드가 나올 때까지 스택에 노드를 저장하면서 탐색을 진행한다. 리프노드에 도착하면 스택에서 제거하면서 다시 역으로 거슬러 올라가는 백트래킹 과정을 진행한다. 해당 노드에 아직 탐색하지 않은 다른 자식이 있는지 확인 후 있으면 다시 깊이 탐색을 진행하고 리프에서 다시 역으로 올라가는 작업을 스택이 빌 때까지 반복한다.
BFS나 DFS는 트리 구조에 따라서 다르겠지만 BFS는 같은 계층의 모든 노드를 저장하기 때문에 깊이난 얕지만 계층이 넓은 경우 메모리상 불리하고 DFS는 계층이 얇지만 트리가 깊다면 또 불리하기 때문에 구조에 따라 방법을 선택해야 한다.
DFS 또한 길 찾기에 적용시킬 수 있는데 BFS는 가장 인접한 노드를 탐색하기 때문에 자연스럽게 최단 경로를 찾게 되는 것과 달리 DFS의 경우에는 최단 경로는 보장하지 않지만 경로 존재 여부나 모든 경로 탐색 등의 경우에 유리하다.
네트워크는 Mirror를 사용하였고 존 서버를 게임 서버에 띄워서 테스트를 진행하고 있었다.
에디터에서 Host로 실행했을 때 문제없이 API 통신이 성공하였지만 존 서버와 연결을 한 후에 통신을 한 경우 요청이 처리되지 않는 상황이 발생했다.
에러는 curl error 28 connection time out으로 요청이 시간 내에 처리되지 못해서 실패한 경우이다.
먼저 게임 서버와 통신을 다시 테스트하기 위해서 IP를 확인하고 방화벽의 Port 상태를 확인했지만 문제가 없었기 때문에 더욱 혼란스러웠다. 다행히 테스트용 URL를 만들고 브라우저에서 호출을 해서 API에는 문제가 없다는 것을 확인한 후에 혹시나 하는 생각에 게임 서버에 원격으로 접속하여 URL을 호출하여 테스트해 보니 time out 에러가 발생하는 것을 확인할 수 있었다.
즉 외부에서 서버의 Public IP로 접근하는 것은 허용이 되지만 내부에서 Public IP로의 접근은 막혀 있었고 LocalHost와 Private IP는 또 잘 동작했기에 이 부분에 대해서 좀 알아보기로 했다.
동작이 실패하는 과정은 다음으로 추정한다.
1. 내부에서 Public IP로 요청
2. 라우터/방화벽에 도달, NAT 설정은 내부에서 내부로 가능 경로를 인식하지 못함
3. 패킷이 처리되지 못하고 실패하게 됨
이러한 상황을 해결해 주는 방법이 Loopback NAT이다.
Loopback NAT
또는 Hairpin NAT으로도 부른다.
위 상황이 장황했지만 간단하게 말하면 내부 네트워크의 장치가 같은 네트워크의 다른 장치에 접근할 때 직접 내부 IP를 사용하는 경우 Loopback NAT이 없다면 내부 사용자는 외부로 나갔다가 다시 들어오는 비효율적인 경로를 통해 접근하거나 이 접근조차 완전히 차단되는 상황이 발생한다.
Loopback NAT은 내부 네트워크의 클라이언트가 공개 IP 주소를 통해 요청을 보낼 때, 라우터나 방화벽이 이 요청이 내부로 향하는 것을 인식하고 적절히 내부 IP로 변환하여 처리한다.
1. 라우터/ 방화벽에 내부에서 Public IP로 향하는 요청 감지
2. 해당 요청을 자동으로 내부 Private IP로 변환하여 처리
3. 응답 패킷을 처리하여 클라이언트 반환
이렇게 되면 내부 및 외부 사용자가 동일한 URL을 사용할 수 있고 내부 트래픽이 불필요하게 외부로 나가지 않고 효율적으로 라우팅이 된다. 또한 동일한 서비스에 대해서 내부용과 외부용 DNS 설정을 별도로 유지할 필요가 없어진다.
문제도 해결하고 새로운 사실도 알게 되었다. 일단은 내부에서 Private IP를 사용하도록 처리하고 다음 회의에서 Loopback에 대해서 언급을 하기로 한다.
NAT
여기서 NAT이란 무엇인지에 대해서 사고가 확장된다.
NAT은 Network Address Translation으로 "사설 IP와 공인 IP" 간의 주소를 변환하는 기술이다.
여러 대의 컴퓨터가 하나의 공인 IP로 인터넷을 공유, IPv4 주소 부족 문제를 해결, 외부에서 직접 내부 네트워크로 접근하기 어렵도록 보안의 목적 등으로 사용된다.
예를 들어 집에서 인터넷을 쓰는 경우 보통 핸드폰에서는 192.168.0.10과 같은 사설 IP를 사용하는데 외부 인터넷에 요청을 보내게 되면 NAT 장비가 그 요청을 중간에서 공인 IP로 바꿔서 보내고 응답이 오면 다시 원래의 사설 IP로 돌아오게 된다.
즉 여러 개의 장비로 인터넷을 나누어 쓰더라도 각각의 내부 IP는 다르지만 외부로 나가는 요청에서는 NAT 장비를 통해 동일한 공인 IP로 식별되게 된다.
네트워크를 간단히 설명하자면, 우리가 일상적으로 인터넷에 접속하여 SNS, 뉴스, 동영상 등의 서비스를 사용하는 것과 같은 막연한 것들만 떠오르는데요. 간단하게 네트워크의 개념에 대해서 설명하자면 그물처럼 서로 연결된 노드들의 집합으로 정보와 자원을 공유하며 데이터를 교환하는 것입니다.
먼저 네트워크란 개념이 어떻게 시작되었는지 과거로 돌아가봅니다.
1960년대 컴퓨터의 성능은 어느정도 발전을 이루었지만 여전히 비싼 가격대로 아무나 사용할 수 없는 장치였습니다. 이 당시 하나의 컴퓨터를 여러 사용자가 공유할 수 있는 시스템이 제안됩니다. 이때 제안된 게 시분할 시스템(TSS, Time Sharing System)으로 한 명의 사람의 입력만 받고 처리하기에는 컴퓨터에게는 너무나 쉬운 작업이었기 때문에 이를 활용하여 여러 사람의 입력을 받고 처리하도록 최대한 컴퓨터의 능력을 활용하기 위해서 제안되었습니다. 여기서 각 사용자들에게 컴퓨터 자원을 시간적으로 분할하고 사용하게 하며 대화식 인터페이스를 통해서 출력이 사용자에게 표시되고 키보드를 통해 입력된 정보를 처리합니다. 그러나 이 아이디어는 시연까지는 되었지만 구축이 어렵고 비용이 많이 들었기 때문에 보편화되지 못했으나 아이디어를 활용해서 현재의 컴퓨터에서 동작하는 여러 가지의 시스템이 이러한 방식을 따르고 있습니다.
시분할 시스템 (TSS, Time Share System)
TSS는 보급에는 실패했지만 현대에서도 사용되는 중요한 개념들을 정립하는 계기가 되었습니다.
- 자원공유 : 하나의 컴퓨터에 여러 사용자가 작업 할 수 있도록 하드웨어 자원의 효율적 사용
- 동시접근 : 여러 사용자가 동시에 컴퓨터에 접근 하고 데이터를 교환하는 상호작용할 수 있는 환경
- 분산처리 : 데이터와 처리 작업을 여러 컴퓨터 사이에서 나누어 처리
- 통신 프로토콜 : 여러 터미널과 중앙 컴퓨터 간의 효율적인 데이터 전송을 위한 규칙
이러한 개념들은 네트워크의 초석이 되기도했습니다.
ARPANET(Advanced Research Projects Agency Network)
알파넷은 냉전 시대의 군사적 요구와 과학 연구의 필요성에 의해 만들어졌습니다.
개발 당시 미국 정부는 소련과의 기술 경쟁에서 우위를 점하기 위해 정보 기술의 발전을 꾀했으며 여러 연구 기관 간의 효율적인 정보 교류가 필요했습니다. 이 알파넷의 주요 혁신 기술은 패킷 스위칭 기술입니다. 이는 대용량 데이터를 작은 패킷으로 나누어 각각을 다른 경로로 전송하고 목적지에서 재조립하는 방식입니다. 이 기술은 데이터 전송의 신뢰성과 효율성을 크게 향상하게 되었습니다.
알파넷은 처음에는 UCLA, 스탠퍼드 연구소(SRI), UC 샌타바버라, 유타 대학교 네 개의 노드를 연결하여 운영을 시작했습니다. 이 초기 네트워크는 매우 기본적인 구조로 컴퓨터 과학자들에게 네트워킹 기술을 실험하고 개발할 수 있는 플랫폼을 제공하는 역할을 했습니다.
그리고 네트워크 통신의 기본인 TCP/IP 프로토콜이 처음 개발되기도 했습니다. 이는 이후 인터넷 표준 프로토콜로 채택되어 현재까지도 전 세계적으로 사용되고 있습니다. 이 프로토콜은 복잡한 네트워크 구조를 상호 간의 연결을 가능하게 하는 기본적인 규칙에 대한 정의입니다.
이외에도 최초의 전자 메일 시스템의 도입과 같은 다양한 혁신을 가져왔습니다. 네트워크를 통한 정보의 자유로운 교환은 학문적 공동체와 연구의 방식을 변화시켰고 현대의 인터넷 문화와 디지털 통신의 기반이 되는 등 ARPANET 그 자체로 사회적, 기술적으로 막대한 변화를 촉진하는데 기여하였습니다.
Telenet
텔레넷은 알파넷의 주요 설계자 중 한 명인 Lawrence Roberts가 창립한 것으로 1970년대에 설립된 미국 최초의 상업적 패킷 스위칭 네트워크입니다. 알파넷이 군사적인 용도로 개발되었다면 텔레넷은 알파넷의 기술을 기반으로 하여 개발되었으며 일반 기업 및 개인 사용자들에게 네트워크 서비스를 상업적으로 제공하는 것을 목표로 하였습니다.
텔레넷에서도 패킷 스위칭 기술이 사용되었으며 당시 사용되는 여러 프로토콜들을 계층구조의 개념을 도입하여 체계화시킨 x.25 표준을 도입하여 다양한 네트워크와의 호환성을 보장했습니다.
특히 금융기관, 대학, 그리고 대기업들 사이에서 인기를 끌었으며 사용자들에게 원격으로 데이터베이스에 접근하고 파일을 전송하며 다른 네트워크 서비스를 이용할 수 있는 기능을 제공했습니다. 이 서비스는 정보의 접근성을 크게 향상하고 데이터 통신 비용을 줄이는데 크게 기여하기도 했습니다.
텔레넷은 상업적인 패킷 스위칭 네트워크로서의 성공이 증명되었으며 이후 다른 많은 상업 네트워크들의 등장에 큰 영향을 미쳤으며 기술적인 혁신뿐만 아니라 군사적 용도가 아닌 일반 사업 및 개인용으로도 널리 활용될 수 있음을 보여주면서 비즈니스 모델에서도 중요한 전환점을 제공하여 인터넷이 전 세계적으로 확산되기 이전에 디지털 통신의 가능성을 넓히는 데 중요한 역할을 했습니다.
Ethernet
이더넷은 로컬 에리어 네트워크(LAN) 기술의 한 형태로 오늘날 가장 널리 사용되는 네트워킹 기술 중 하나입니다. 이더넷은 1973년에 제록스 PARC(Xerox Palo Alto Research Center)의 로버트 메트칼프(Robert Metcalfe)와 그의 동료들에 의해 처음 개발되었으며 이 기술은 컴퓨터들이 데이터 패킷을 공유 미디어를 통해 서로 전송할 수 있도록 하는 데 초점을 맞추었습니다.
1970년대 초 제록스 PARC에서는 Alto라는 개인용 컴퓨터의 네트워킹 필요성을 인식하고 이를 해결하기 위한 방안으로 이더넷을 개발하기 시작했습니다. 메트칼프는 하와이 대학교의 ALOHAnet 무선 패킷 네트워크에서 영감을 받아 유선 환경에 적합한 네트워크를 설계하게 되었습니다.
PARC - Xerox Alto
제록스 알토는 데스크톱 메타포와 그래픽 사용자 인터페이스를 이용한 최초의 컴퓨터로 상업적인 프로젝트는 아니었지만 수십 년에 걸쳐 개인용 컴퓨터 특히 매킨토시와 썬 워크스테이션의 설계에 큰 영향을 주었습니다.
이더넷 기술은 계속해서 발전하여 초기 10 Mbps에서 기가비트 오늘날에는 10 기가비트 이상의 속도로 데이터를 전송할 수 있는 기술로 발전하였으며 또한 트위스티드 페어 케이블과 광섬유 케이블(Fiber-optic cable) 같은 다양한 전송 매체가 도입되기도 했습니다.
Twisted pair cableFiber-optic cable
현대에서 이더넷은 표준화와 호환성이 높아 다양한 네트워크 장비와 시스템에서 손쉽게 구현할 수 있어 광범위한 기업 환경은 물론 가정과 학교 등 다양한 곳에서 LAN을 구축할 때 기본적으로 사용되는 기술입니다. 간단한 개념과 구현의 용이성으로 인해 수십 년 동안 기술의 중심에 있었으며 네트워킹의 가장 기본적이고 중요한 기술 중 하나로 자리 잡게 되었습니다.
네트워크 케이블
이러한 네트워크의 연결을 위해서는 정보를 주고받을 수 있도록 물리적인 장치가 필요합니다.
FLAG (Fiber-Optic Link Around the Globe) = FEA(Fiber-Optic Europe-Asia)
1990년대 후반 FLAG 해저 케이블 시스템은 아시아, 중동을 연결하는 글로벌 통신망 프로젝트로 1997년에 완공되었습니다. 이 케이블 시스템은 주로 대륙 간 데이터 통신 수요를 충족시키기 위해 설계되었으며 여러 국가와 대륙을 연결하는 역할을 합니다. 이 중 한국 또한 이 케이블 시스템의 주요 노드 중 하나가 되었습니다.
약 28,000 킬로미터에 달하는 광섬유 케이블로 구성되어 있으며 영국에서 출발하여 유럽, 중동, 아시아를 거쳐 일본까지 이어지는 것으로 북아메리카와 아시아를 연결하는 주요 노선 중 하나입니다. 주요 연결 지점(Node)으로는 영국, 프랑스, 이탈리아, 이집트, 사우디아라비아, 아랍에미리트, 인도, 태국, 말레이시아, 싱가포르, 홍콩, 대만, 한국, 일본 등의 해안 도시들과 연결되어 있습니다.
현재는 FEA로 초기 FLAG 시스템이 더 많은 국가와 지역을 포괄하였지만 경제적 중요성에 따라서유럽과 아시아 지역 간의 특정 연결성의 강화에 의해서 FEA로 변경되기도 했습니다.
이외에도 아시아 태평양 지역의 여러 국가들을 연결하는 APCN(Asia Pacific Cable Network) 등 필요와 기술의 발전에 따라서 추가로 케이블들이 설치되기도 했습니다.
통신망은 규모에 따라 다양하게 분류됩니다.
LAN(Local Area Network)
근거리 통신망으로 가까운 거리에 있는 단말 간의 네트워크를 말합니다. 한정된 공간 내에 분산 설치되어 있는 단말을 통신회선 연결을 통해 상호작용 가능하게 한 네트워크로 단일 구성은 거리적으로 한정되지만 복수의 근거리 통신망을 설치하여 대형 네트워크를 형성하게 됩니다. 이때 다른 종류의 LAN은 게이트워이라는 통로를 통해서 연결되어 사용하게 됩니다.
MAN(Metropolitan Area Network)
도시권 통신망으로 근거리 통신망이 1개 기업의 범위 또는 빌딩 전체를 연결하는 네트워크라면 도시권 통신망은 이를 확장하여 하나의 도시 내로 확장한 네트워크입니다. 초기 통신망이 구축되었을 때는 존재하지 않았지만 휴대전화의 보급으로 인해서 각 도시마다 네트워크를 구축할 필요가 생기게 되어서 기지국이 생기게 되었는데 이 기지국을 칭하는 개념으로 생겨나게 되었습니다. 도시권 통신망은 다른 도시권 통신망과 직접적으로 연결되어 있습니다.
WAN(Wide Area Network)
광역 통신망으로 도시 간 또는 국가 간 등을 연결하는 통신망입니다. 대부분 통신사가 전국에 회선을 깔아서 구축한 통신망으로 가장 최상위 규모의 통신망입니다. 일반적으로 개인이 네트워크에 연결될 때는 대부분 LAN을 통해 이루어집니다. 그리고 연결하고자 하는 네트워크의 범위에 따라서 MAN을 거치거나 WAN을 거쳐 목적지에 도착하게 되는데 이때 ISP를 거치게 됩니다. 우리가 특정 사이트를 방문하다 보면 연결이 차단되기도 하는데 이것은 ISP에 의해서 관리를 받기 때문입니다.
이외에도 기업에서 통신사로부터 회선을 임대받아 광역 통신망 간의 직접 연결한 경우도 있으며 대표적으로 인트라넷이 이러한 경우입니다.
ISP(Internet Service Provider)
인터넷 서비스 제공자로 개인, 기업, 정부 등 고객을 대상으로 인터넷 접속 서비스를 제공하는 회사나 조직을 말합니다. 대한민국의 경우 KT, SKT, LG 등의 통신사들의 인터넷 서비스를 ISP라고 볼 수 있습니다.
운영체제는 컴퓨터 시스템의 CPU, 메모리, 입출력 장치, 저장 장치 등의 자원을 효율적으로 관리하고 다른 소프트웨어나 사용자가 이용할 수 있도록 관리하는 인터페이스 역할을 하는 소프트웨어를 말한다.
Resource Management
자원관리, 운영체제는 컴퓨터의 자원을 효율적으로 관리하고 할당하는 역할을 한다.
대표적인 자원으로는 CPU, 메모리, 저장장치, 입출력 장치가 있다.
CPU
프로세스 스케줄링을 통해 CPU 자원을 할당하고 여러 프로세스 간의 경쟁 상황을 해결한다.
CPU를 효율적으로 사용하기 위해 실행 중인 여러 프로세스들 사이에서 CPU의 사용권을 어떻게 배분할지 결정하여 CPU의 사용률을 높이고 응답 시간을 최소화하며 프로세스의 우선순위를 지정하여 경쟁 상황 해결 및 효율적인 시스템 동작을 유지한다.
스케줄링 알고리즘에는 FCFS, SJF, Priority Scheduling, Round-Robin Scheduling 등이 있다.
FCFS, First Come First Served
프로세스 스케줄링의 가장 간단한 형태 중 하나이다.
준비 큐에 도착한 순서대로 프로세스를 처리하는 방식으로 매우 직관적이기 때문에 구현이 간단하지만 실행 시간이 긴 프로세스가 먼저 도착하면 그 이후에 도착한 짧은 실행 시간을 가진 프로세스들이 대기 시간이 길어지기 때문에 평균 대기 시간과 평균 반환 시간이 크게 증가할 수 있는 문제가 있다.
* Average Waiting Time : 평균 대기 시간, 프로세스가 대기하는 시간의 평균값
* Average Turnaround Time : 평균 반환 시간, 프로세스가 큐에서 대기하고 CPU를 사용하는 시간의 합의 평균값
* 일반적으로 두 지표가 작을수록 좋은 스케줄링 알고리즘으로 판단한다.
먼저 도착한 프로세스가 먼저 실행되기 때문에 CPU를 먼저 사용하는 프로세스는 대기 시간이 짧고, 나중에 사용하는 프로세스는 대기 시간이 길어진다. 따라서 평균 대기 시간과 평균 반환 시간은 프로세스 도착 순서에 따라 크게 달라진다. 또한 FCFS는 선점형 스케줄링이 아니기 때문에 한 번 시작된 프로세스는 CPU를 반환하기 전까지 계속 실행된다. 따라서 이 알고리즘은 대화형 시스템과 같이 응답 시간이 중요한 시스템에서는 적합하지 않다.
SJF, Shortest Job First
다음에 실행할 프로세스를 선택할 때 CPU Burst Time이 가장 짧은 프로세스를 선택하는 알고리즘이다.
CPU 버스트 시간이 짧은 작업이 먼저 실행되면 해당 작업이 빠르게 완료되면 자원을 빨리 반환할 수 있고 다른 작업도 빠르게 실행될 수 있기 때문에 때문에 평균 대기 시간을 줄일 수 있다는 장점이 있다.
Priority Scheduling
FCFS와 SJF 알고리즘은 일괄적으로 대결에서 작업을 처리하기 때문에 일부 작업이 너무 오래 실행되거나 대기하는 경우 다른 작업들은 계속해서 대기열에 쌓이게 되는 문제가 있다. 이렇게 필요한 만큼의 CPU 자원을 할당받지 못하고 대기하게 되는 상태를 Starvation라고 한다.
이 문제는 대기 시간이 긴 프로세스에게 우선순위를 부여하여 대기 시간이 길어질수록 우선순위가 높아지게 하는 방법을 통해 해결할 수 있다. 그중 Aging 기법은 SJF 알고리즘에서 버스트 타임이 높은 작업을 우선순위로 두어 문제를 해결하는 기법이다.
우선순위 스케줄링은 자원이나 시간이 많이 필요한 작업을 우선 순위로 두고 먼저 처리시켜 다음 작업을 진행할 때 자원이나 시간이 부족하여 대기 상태에 빠지지 않도록 한다. 이때 동일한 우선순위의 경우 해당 알고리즘을 통해서 처리하여 기아 상황에서도 공정한 작업 스케줄링이 가능하게 한다.
Round-Robin Scheduling
CPU 스케줄링에서 가장 일반적으로 사용되는 알고리즘이다.
시분할 시스템에서 사용되며 각 프로세스가 동일한 시간 할당량(Quantum)을 갖는다는 특징이 있으며 할당된 시간 이내에 작업이 끝나지 않으면 다른 프로세스에게 CPU를 양보하고 대기열의 끝으로 이동하는 과정을 반복한다.
* 시분할 시스템 : CPU 시간을 작은 단위로 분할하여 다수의 사용자가 동시에 컴퓨터를 사용할 수 있도록하는 기술이다.
주로 대화식 시스템에서 사용되는 것이 일반적이며 사용자가 프로세스를 시작하면 해당 프로세스는 대기열에 추가되는데 CPU는 대기열에서 가장 앞에 있는 프로세스에게 할당되고 일정한 시간 후에 다른 프로세스로 넘어가고 이 과정을 대기열이 비어 있을 때까지 반복한다.
FCFS와 마찬가지로 간단하며 쉽게 구현이 가능하지만 모든 프로세스에게 동일한 기회를 부여하기 때문에 더 공정한 스케줄링이 가능하다. 다만 할당된 시간이 작은 경우에는 자주 Context Switch이 발생하기 때문에 오버헤드 문제가 있을 수 있다. 또한 할당된 시간이 큰 경우에는 대기열에 있는 다른 프로세스들이 오랫동안 기다려야 하기 때문에 적절한 시간 할당량을 결정하는 것이 중요하다.
* Context Swtich : 문맥 교환, CPU가 현재 실행 중인 프로세스에서 다음으로 실행할 프로세스로 제어를 양도하는 과정
Memory
프로세스가 사용할 메모리 공간을 할당하고 메모리 공간을 관리한다.
운영체제에서 메모리 공간은 일반적으로 세 가지 방식으로 할당 및 관리된다.
Single Fixed Partition Allocation
단일 고정 분할 할당
메모리를 고정 크기의 분할로 나누고 각 분할을 프로세스에 할당한다.
분할 크기는 운영체제가 미리 정해놓은 것으로 프로세스의 크기가 이것보다 작아야한다.
단순한 방식이지만 메모리 이용률이 낮다는 단점이 있다.
Paing 기어
Variable Partition Allocation
가변 분할 할당
메모리를 동적으로 분할하며 프로세스에 할당하는 방식이다.
프로세스의 크기에 맞춰서 할당되기 때문에 메모리 이용률이 향상된다. 프로세스의 크기가 불규칙적이고 할당과 해제에 따른 Memory Fragment 문제가 발생할 수 있다.
Memory Fragment
메모리 단편화
메모리에서 사용 가능한 공간이 작은 조각으로 나뉘어 큰 용량의 프로세스가 할당되지 못하고 남는 작은 조각들이 늘어나는 문제를 말한다. 메모리를 효율적으로 사용하지 못하게 만들어 시스템 성능을 저하시키게 된다.
메모리 단편화는 Internal Fragment와 External Fragment 두 종류가 있다.
Internal Fragment
내부 단편화, 메모리 할당 시 요청한 프로세스크기보다 더 큰 메모리 공간을 할당하게 되어 할당된 메모리 공간 중 일부가 사용되지 않는 문제
External Fragment
외부 단편화, 메모리에서 사용 가능한 공간이 작은 조각으로 나뉘어 큰 용량의 프로세스가 할당되지 못하는 문제
이러한 메모리 단편화 문제를 해결하기 위해서 Paing과 Segmentation 기법이 사용된다.
Paging : 물리적인 메모리를 고정 크기의 블록으로 분할하여 가상 주소와 물리 주소를 매핑한다.
Segmentation : 프로그램을 논리적인 단위인 세그먼트로 분할하여 가상 주소와 물리 주소를 매핑한다. 페이징 보다 프로그램의 논리적 구조를 반영하기 쉽다.
Virtual Memory
가상 메모리
물리적인 메모리보다 큰 용량의 가상 메모리 공간을 프로세스에게 할당하여 사용하는 방식이다.
프로세스가 필요로 하는 부분만 메모리에 올려서 실행하고 나머지 부분은 디스크에 저장한다. 이 방식은 물리적인 메모리보다 큰 용량의 프로그램을 실행할 수 있게 되며 프로세스 간의 메모리 공유도 가능하다.
Storage
하드디스크 등의 저장장치를 관리하고 File System을 통해 파일을 관리한다.
* File System : 운영체제에서 파일과 디렉터리를 저장하고 검색할 수 있는 구조
파일이나 디렉토리를 저장하기 위한 블록의 할당, 디스크 공간 관리, 파일 접근 권한 관리, 파일 백업 및 복구 등의 역할을 수행하는데 일반적으로 파일 시스템은 파일과 디렉토리를 계층 구조로 구성하며 각 파일과 디렉터리는 고유한 이름을 가지고 있다.
디렉터리와 파일을 구분하는 특별한 기능을 수행하기 위한 파일을 사용하기도 하는데 이 파일은 파일 시스템의 일부이지만 일반 파일과 다른 속성을 가지고 있다. 예를 들어 리눅스에는 /dev 디렉터리에 하드웨어와 상호 작용하기 위한 특별한 파일들이 존재하는데 이러한 파일들은 일반 파일과는 달리 디바이스 파일로서 하드웨어 디바이스에 대한 인터페이스 역할을 한다. Windows에는 레지스트리 파일이 이러한 파일로 분류되며 운영체제 설정 정보를 포함하고 운영체제 및 애플리케이션의 구성을 제어하는 데 사용된다.
Input/Output
키보드, 마우스, 모니터, 프린터 등의 입출력 장치의 관리, 디바이스 드라이버를 통해 입출력을 처리한다.
Device Driver Management
장치 드라이버 관리
각각의 입출력 장치에 대해 운영체제는 해당 장치와 상호작용할 수 있는 드라이버를 관리한다. 이 드라이버는 해당 장치와 통신할 수 있는 인터페이스를 제공하며 운영체제와 프로그램 간의 데이터 전송을 담당한다.
I/O Request Management
프로그램이 입출력을 요청하면 운영체제는 이를 관리하며 각각의 입출력 요청에 대해 우선순위를 결정하여 처리한다. 이를 위해서 운영체제는 입출력 요청 큐를 유지하고 요청에 따라 적절한 장치를 할당하여 요청을 처리한다.
I/O Buffering
입출력 장치의 속도는 프로그램의 실행 속도와 차이가 있기 때문에 입출력 요청에 대한 응답을 기다리는 동안에는 다른 작업을 수행할 수 있도록 버퍼링을 수행한다. 이를 위해 운영체제는 입출력 데이터를 임시로 저장할 수 있는 입출력 버퍼를 유지한다.
Interrupt Process
입출력 작업 중에는 다양한 상황에서 인터럽트가 발생할 수 있는데 이를 위해 운영체제는 인터럽트 처리 루틴을 유지하여 각각의 인터럽트에 대해 적절한 처리를 수행한다.
I/O Protection
입출력 장치를 공유하는 다양한 프로그램이 동시에 실행될 경우 장치 접근에 대한 충돌이 발생할 수 있는데 이를 방지하기 위해 운영체제는 입출력 보호 기능을 수행하여 각각의 프로그램이 입출력 장치를 안전하게 사용할 수 있도록 보장한다.
입출력 보호 기능은 장치에 대한 접근 권한을 제어하는 기능으로 보안과 안정성을 유지한다. 사용자 프로세스가 입출력 장치를 임의로 사용하지 못하도록 하고 운영체제가 입출력 장치에 대한 접근 권한을 부여하고 사용자 프로세스는 해당 권한을 가지지 못한 상태에서는 장치에 접근할 수 없도록 한다.
하드웨어와 소프트웨어의 구성 요소, 기능, 상호작용 등을 설계하고 구성하는 방식이나 규칙으로 컴퓨터 시스템 전반에 대한 설계와 구조를 의미한다.
Von Neumann Architecture
폰 노이만 아키텍처
1940년대 말에 알렌 튜링과 존 폰 노이만 등이 제안한 아키텍처로 컴퓨터 시스템의 아키텍처 중 가장 널리 사용되는 구조 중 하나이다. 현대 컴퓨터 시스템의 대부분이 이 아키텍처를 기반으로 설계되었다.
Von Neumann 아키텍처는 메모리, CPU, 입/출력 장치, 버스 등의 하드웨어 요소로 구성되며 이 중에서 CPU가 가장 핵심적인 구성 요소이다. CPU는 명령어를 순차적으로 처리하며, 프로그램의 명령어를 주기억장치에서 읽어와서 해석하고 실행한다. 따라서 명령어와 데이터를 모두 주기억장치에 저장하고 명령어와 데이터를 순차적으로 읽어오는 방식을 사용한다. 이를 '프로그램과 데이터의 저장공간이 동일하다'라는 의미에서 '단일 저장 장치(Single Memory)'라고 한다.
명령어와 데이터를 같은 메모리 공간에 저장하기 때문에 명령어와 데이터의 접근 시간이 동일하다는 것으로 명령어와 데이터를 주기억장치에서 읽어오는 시간이 줄어들어 전체적인 성능을 향상시킬 수 있다. 또한 프로그램의 수정이나 변형이 용이하다는 장점을 가진다. 하지만 주기억장치와 CPU 사이의 데이터 전송이 병목현상을 유발할 수 있으며 이를 해결하기 위해 캐시 메모리 등의 보조 기억장치를 사용하는 등의 방법이 고안되었다.
Havard Architecture
하버드 대학에서 개발되었다는 것에서 이름이 유래되었다.
Von Neumann 아키텍처와 달리 프로그램과 데이터가 동일한 메모리 공간에 저장되지 않고 각각 다른 메모리 공간에 저장한다. 이러한 구조를 가지는 컴퓨터 시스템은 두 개의 메모리 버스를 사용한다. 하나는 프로그램을 저장하는 코드 메모리 버스이고, 다른 하나는 데이터를 저장하는 데이터 메모리 버스이다. 이 두 개의 버스는 병렬로 동작하여 CPU가 동시에 코드와 데
이터를 읽을 수 있도록 한다.
이 아키텍처의 장점은 프로그램과 데이터가 각각 다른 메모리 공간에 저장되기 때문에 프로그램과 데이터를 동시에 읽을 수 있다. 따라서 프로그램 실행 시간이 더욱 빨라진다. 그리고 프로그램과 데이터를 분리하여 저장하기 때문에 데이터의 비인가된 접근을 막을 수 있어 보안성이 Von Neumann 아키텍처보다 높다. 하지만 각각 다른 메모리 공간에 저장되어 있기 때문에 프로그램 수정 시 코드 메모리와 데이터 메모리를 모두 수정해야하기 때문에 프로그램의 수정이나 변형이 불편하며 이러한 구조를 가지는 컴퓨터 시스템은 하드웨어 구조가 복잡하다.
Von Neumann 아키텍처와 Harvard 아키텍처 두 아키텍처의 차이는 명령어와 데이터를 메모리에서 어떻게 처리하느냐에 따라 달라지며, 이는 컴퓨터 아키텍처의 성능과 기능을 결정한다.
Instruction Set Architecture(ISA)
명령어 세트 아키텍처
컴퓨터에서 실행되는 명령어 집합과 해당 명령어의 동작을 정의하는 인터페이스 즉, 소프트웨어 개발자와 하드웨어 엔지니어 사이의 인터페이스 역할을 한다.
명령어 세트 아키텍처는 프로그래밍 언어와 컴퓨터 아키텍처 사이의 중개자 역할을 하며, 어떤 프로그래밍 언어를 사용하더라도 ISA에서 정의된 명령어 집합을 사용하여 작성된 프로그램은 모든 ISA 호환 컴퓨터에서 실행될 수 있다. 또한 ISA는 명령어의 크기, 명령어의 수행 방법, 레지스터의 개수와 종류, 주소 지정 방식 등과 같은 하드웨어 구성 요소를 규정하여, 하드웨어 제조업체들이 ISA를 준수하여 호환성을 보장할 수 있도록 한다.
RISC
Reduced instruction Set Computing
명령어의 수를 줄이고 명령어 실행 시간을 일정하게 유지하는 것에 초점을 두고 설계된 아키텍처이다.
CISC
Complex Instruction Set Computing
복잡한 명령어 집합과 다양한 주소 지정 방식 등을 지원하여 프로그래머가 작성한 코드의 길이를 줄이고 복잡한 작업을 더 쉽게 처리할 수 있도록 설계되었다.
Microarchitecture
ISA에서 정의된 명령어 세트를 하드웨어로 구현하는 방법에 대한 아키텍처이다. 마이크로 아키텍처는 ISA와 하드웨어 구현 사이의 중간 계층으로 ISA에 정의된 명령어 세트를 하드웨어에서 처리하기 위한 방법과 기술적인 세부 사항을 다룬다.
마이크로 아키텍처는 CPU의 내부 동작 방식을 설명하며 ALU, 레지스터, 캐시 등과 같은 하드웨어 요소들이 어떻게 조합되어 명령어를 실행하는지를 나타낸다. 이는 프로세서의 처리 속도와 성능에 직접적인 영향을 미친다.
예를 들어 Intel의 x86 아키텍처는 하나의 ISA를 여러 가지 버전의 마이크로 아키텍처를 통해 구현하는 방법이 다르며 이러한 버전에는 Pentium, Core, Atom 등이 있다.
ISA와 달리 마이크로 아키텍처는 하드웨어에 종속적이며 같은 ISA를 가진 두 개의 CPU라 하더라도 각각의 마이크로 아키텍처에 따라서 성능과 기능이 달라진다. 이러한 이유로 마이크로 아키텍처는 하드웨어 설계자들이 CPU를 개발할 때 매우 중요한 역할을 한다.
VLIW
Very Long Instruction Word Architecture
하나의 명령어로 여러 개의 연산 명령어들을 패킹하여 동시에 처리하는 방식을 사용하는 마이크로 아키텍처이다.
각 연산 명령어의 종류와 크기는 사전에 고정되어 있어야 하며 이렇게 하나의 명령어에 여러 개의 연산 명령어를 패킹하면 하나의 명령어를 실행하는데 필요한 클럭 사이클 수를 줄 일 수 있어 실행 효율성이 높아진다.
하지만 이러한 패킹 작업이 복잡하고 명령어에 들어갈 연산 명령어의 종류와 크기를 고정해야 하기 때문에 하드웨어 구현이 복잡해지고 설계 및 프로그래밍이 어렵다.
EPIC
Explicitly Parallel Instruction Computing
인텔에서 개발한 아키텍처로 VLIW의 한 종류이다. 명령어와 함께 해당 명령어를 실행하기 위한 하드웨어 리소스를 명시적으로 지정하여 병렬 처리를 구현한다. 이를 위해 명령어를 여러 개 묶어 하나의 Attention Point로 지정하고 해당 포인트에서 동시에 실행 가능한 명령어를 실행하는 방식을 사용한다. 이를 통해 프로그램 내의 병렬 처리 가능한 부분을 미리 식별하여 처리할 수 있기 때문에 성능 향상을 기대할 수 있다.
대표적인 예시로 인텔의 Itanium 프로세서가 있다. 명령어 세트가 복잡하고 처리 방식이 복잡하기 때문에 초기에는 호환성 문제 등으로 실패했지만 대용량 데이터 처리 등에서 높은 성능을 발휘하였다. 그러나 x86 아키텍처에 비해 생태계가 덜 발달하고 소프트웨어 호환성 문제도 있어 현재는 사용되지 않고 있다.
SIMD
Single Instruction Multiple Data
여러 개의 데이터가 동시에 처리하기 때문에 대규모 데이터 병렬 처리에 유리하다.
벡터 프로세싱이라고도 불리며 벡터 레지스터라는 별도의 레지스터를 사용하여 데이터를 저장하고 벡터 명령어를 사용하여 데이터를 처리한다.
예를 들어 4개의 데이터를 더하는 연산을 할때 일반적으로 4번의 덧셈 연산을 수행해야 하지만 SIMD 아키텍처에서는 한 번의 명령어로 4개의 데이털르 한꺼번에 연산할 수 있다. 따라서 SIMD 아키텍처는 더 빠르고 효율적인 데이터 처리가 가능하기 때문에 그래픽 카드나 디지털 신호 처리 등의 분야에서 많이 사용된다.
Intel의 MMX, SSE, AVX, ARM의 NEON 등이 이 아키텍처를 기반으로 한다.
프로세서 내에서 데이터가 이동하고 처리되는 구성 요소들과 이들 간의 연결을 말하며 데이터 경로는 컴퓨터가 명령어를 실행하는 과정에서 필요한 연산을 수행하고, 결과를 저장하는 데 사용된다. 레지스터, ALU, 다양한 버스 등으로 구성되어있으며 데이터 경로의 구성 요소와 연결 방식은 프로세서의 성능과 효율에 큰 영향을 미친다.
1. 레지스터
데이터 경로 내에서 데이터를 임시로 저장하는 작은 메모리이다.
레지스터는 데이터를 빠르게 처리할 수 있도록 돕고 ALU와 같은 다른 구성 요소들과 데이터를 교환한다.
2. 산술 논리 연산 장치(ALU, Arithmetic Logic Unit)
ALU는 데이터 경로에서 가장 중요한 연산을 수행하는 구성 요소이다. 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈 등) 및 논리 연산(AND, OR, NOT, XOR 등)을 처리한다.
3. 버스(Bus)
버스는 프로세서 내에서 레지스터, ALU, 메모리 등의 구성 요소들 간에 데이터를 전송하는 통로이다. 버스는 주로 데이터 버스, 주소 버스, 제어 버스로 구분된다.
Data Path
데이터 경로 동작
1. 명령어 가져오기(Fetch)
프로그램 카운터가 가리키는 메모리 위치에서 명령어를 가져온다.
2. 명령어 디코딩(Decode)
제어 유닛이 가져온 명령어를 분석하여 해당 연산을 수행하는 데 필요한 제어 신호를 생성한다.
3. 피연산자 가져오기(Operand Fetch)
디코딩된 명령어에 따라 필요한 피연산자를 레지스터 또는 메모리에서 가져온다.
4. 연산 수행(Execute)
ALU가 피연산자를 사용하여 명령어에서 지정한 연산을 수행한다.
5. 결과 저장(Store)
연산 결과를 레지스터 또는 메모리에 저장한다.
데이터 경로의 구성과 동작 방식은 프로세서의 성능과 효율성에 결정적인 영향을 미치기 때문에 효율적인 데이터 경로 설계를 통해 프로세서의 처리 속도를 높이고 전력 소모를 줄일 수 있다.
#파이프라이닝 #슈퍼스칼라 #VLIW(Very Long Instruction Word)
제어 유닛(Control Unit)
CPU 내에 위치하며 명령어를 해석하고 필요한 연산을 수행하기 위해 필요한 제어 신호를 생성하는 역할을 한다.
명령어 실행 과정에서 데이터 경로의 구성 요소들을 제어함으로써 프로세서의 전체 동작을 조율한다.
동작은 데이터 경로와 비슷한 단계를 거친다.
1. 명령어 가져오기(Fetch)
2. 명령어 디코딩(Decode)
3. 제어 신호 생성(Control Signal Generation)
디코딩된 명령어를 기반으로 데이터 경로 내 구성 요소들을 제어하기 위한 신호를 생성한다. 이 신호들은 레지스터, ALU, 메모리 등과 같은 구성 요소들을 제어하여 명령어를 실행하는 데 필요한 동작을 수행하도록 한다.
제어 유닛은 명령어 집합 구조(ISA)를 기반으로 작동하며 ISA에 따라 다양한 연산들을 처리할 수 있다. 일반적으로 제어 유닛은 하드웨어 또는 마이크로프로그램 방식으로 구현된다.
하드웨어 제어 유닛
디코딩 논리 회로를 사용하여 명령어를 직접 해석하고 제어 신호를 생성하는 방식이다.
이 방식은 빠른 처리 속도를 가지지만 회로 복잡성이 높고 유연성이 떨어진다.
마이크로프로그램 제어 유닛
명령어를 해석하고 제어 신호를 생성하기 위해 내부적으로 사용하는 작은 프로그램인 마이크로코드를 실행하는 방식이다. 회로 설계가 단순하고 유연하지만 처리 속도가 하드웨어 제어 유닛에 비해 상대적으로 느리다.