TigerCow.Door

Routing Methodologies

라우팅 알고리즘은 아래와 같이 존재합니다.

Non-adaptive (static) algorithm

Shortest path routing

Flooding: selective flooding

Flow-based routing


Adaptive (dynamic) algorithm

Distance vector routing

Link state routing

Hierarchical routing


+ Dijkstra algorithm


하나씩 알아보도록 하겠습니다.


* Shortest path routing


그래프 이론에서 두 정점 간에 최단 경로를 찾는 그래프 알고리즘을 이용한 라우팅입니다. 출발지로부터 최단 경로를 갖는 점들을 차례대로 찾아가면서 경로를 탐색합니다.



그래프에서는 각 노드가 라우터를 나타내며 그래프의 각 호가 통신회선을 나타냅니다.

Shortest path routing에서는 주어진 라우터 쌍 사이의 경로를 선택하기 위해 그래프에서 가장 짧은 경로를 찾습니다.

이를 풀기위해 다익스트라 알고리즘 등의 알고리즘이 사용됩니다.

다익스트라 알고리즘에 대해서는 제일 아래에서 설명드리겠습니다.


english



* 플러딩(Flooding)


또 다른 정적 알고리즘으로는 플러딩(Flooding)이 이습니다. 플러딩에서는 패킷이 도착되어 있는 곳을 제외한 모든 나가는 라인에 들어오는 모든 패킷들을 전송합니다. 이것은 당연히 엄청난 수의 중복 패킷을 생성하게 됩니다. 실제로는 프로세스를 감쇠시키기 위한 조치가 취해지지 않는 한 무한한 숫자입니다. 플러딩은 대규모 네트워크에서 수정된 라우팅 정보를 모든 노드에 빠르게 배포하는 수단으로써 사용됩니다. 


english



* 선택적 플러딩(Selective flooding)


Selective flooding은 플러딩을 보다 실용적으로 사용하기 위해 변형된 방식입니다. 이 알고리즘에서는 들어오는 모든 패킷들을 모든 라인에 보내지 않고 거의 올바른 방향으로만 가는 라인에만 보냅니다. 


english



* 흐름 기반 라우팅(Flow-based routing)


해당 라우팅에서는 트래픽 흐름을 고려합니다. 핵심으로는, 시간이 지남에 따라 트래픽 흐름의 특성을 고려할 수 있다는 점 입니다. 트래픽 도달 속도 및 패킷 길이등, 네트워크 상태에 대해 많이 알고 있는 경우 사용할 수 있습니다. Flow-based routing은 라우팅 테이블을 찾아 서브넷을 통한 평균 패킷 지연을 최소화합니다.


english



* 거리 벡터 라우팅(Distance vector routing)



먼저 모든 링크의 가중치(cost)는 이미 알려져 있다고 가정합니다. (가중치는 링크에 연결되어 있는 라우터가 측정할 수 있습니다.) 각 라우터는 라우팅 테이블을 가지고 있고, 이 테이블에는 주어진 서브넷의 모든 라우터에 대한 정보를 가집니다. 각 라우터에 대한 정보는 해당 라우터까지의 거리와 그 라우터로 가기 위한 값입니다. 각 라우터는 현재의 라우팅 테이블 정보를 이웃에게 보냅니다.


english



* 링크 상태 라우팅(Link state routing)



각 라우터는 주변의 링크들을 탐색하고 연결된 라우터의 주소를 알아냅니다. 그리고 각 링크의 가중치(cost)를 측정합니다. 이후 각 링크와 가중치에 대한 정보를 담은 패킷을 만듭니다. 이렇게 만들어진 LSP(Link State Packet)를 모든 라우터에게 보냅니다. 마지막으로 다른 라우터로부터 받은 LSP들을 이용하여 각 라우터로의 가장 짧은 경로를 계산합니다.


- 거리 벡터 라우팅을 이용하지 않고 링크 상태 라우팅을 사용하는 이유

1. 거리 벡터 라우팅은 라우터를 선택할 때 회선의 대역폭을 고려하지 않았습니다.

2. Count to Infinity

: A,B,C의 라우터가 존재한다고 가정합니다. 이때 A라우터가 죽었는데, C라우터에서 A라우터로 패킷을 보내려한다면 먼저 B라우터에게 패킷을 보내게 됩니다. 헌데 B라우터에서는 A라우터로 보낼 수 없기 때문에 다시 C라우터로 패킷을 보냅니다. 그리고 이러한 과정이 반복되면서 무한 루프에 빠지게 되고 이것을 Count to Infinity 라고 합니다.


english



* 계층적 라우팅(Hierarchical routing)



계층적 라우팅은 위의 그림에서와 같이, 넓은 네트워크를 몇 개의 네트워크 레벨로 크기를 분할하여 경로를 간소화 하고 계층화 합니다. 이렇게 계층화 된 것들을 각각 Regions이라고 하며 각각의 Regions 안에서 독립적으로 라우팅이 이루어집니다.


english



* 다익스트라 알고리즘(Dijkstra algorithm)


다익스트라 알고리즘은 음수 가중치를 갖지 않는 그래프에서 주어진 출발점과 도착점 사이의 최단 경로문제를 푸는 알고리즘입니다. 다익스트라 알고리즘은 방문한 노드들의 집합, 방문하지 않은 노드들의 집합과 출발점으로 부터 특정 노드까지 계산된 최단 거리를 갖습니다. 각 노드들에 대해서 계산된 최단 거리의 초기값은 무한대로 잡습니다.

아래 예제를 통해 확인해보도록 하겠습니다.

예제는 나무위키에서 참고하였습니다.


english



1. 다익스트라 알고리즘에서 아직 확인되지 않은 거리는 전부 초기값을 무한으로 잡습니다.








먼저 출발지는 A로 가정했을 때, A까지의 거리는 당연히 0입니다. 따라서 d[A]는 0의 값을 갖습니다.

아직 A노드는 방문한 것이 아니고 초기화 하는 과정이기에 방문하지 않은 노드들의 집합 Q에는 A,B,C,D,E,F 의 노드가 기록되어 있으며 방문한 노드들의 집합은 공집합 입니다.

출발지 A노드를 제외한 모든 노드들 또한 아직 방문하지 않았기에 거리 값은 무한으로 기록됩니다.


english



2. 루프를 돌려 이웃 노드를 방문하고 거리를 계산합니다.



항상 루프의 시작은 현재 방문하지 않은 노드들의 집합 Q에서 거리 값이 최소인 노드를 탐색하는 것입니다. A노드를 제외한 나머지 노드들의 거리 값은 무한대이므로 A노드를 기준으로 탐색을 시작합니다. A노드에서 B,C,D에 대한 거리 값을 계산 하여 기록합니다.


english



3. 루프 이후의 그래프의 상태가 업데이트 되는 방식



위의 사진은 두번째 루프를 마치고 난 뒤의 모습입니다.

2번에서 언급한 바와 같이 두번째 루프의 시작 또한 방문하지 않은 노드들의 집합 Q에서 거리 값이 최소인 노드로 시작합니다. 따라서 거리 값이 10으로 최소인 B노드를 기준으로 탐색을 시작합니다. B노드를 방문하였으므로 집합 S에 기록하고 E의 거리값을 계산합니다. 거리 값을 계산할때는 출발지로 부터 탐색노드(기준노드)사이의 거리값과 탐색노드와 이웃노드의 거리값을 더한 값 입니다. 따라서 노드 E의 거리값은 10+20=30으로 기록됩니다.


english



4. 더 빠른 경로를 발견한 경우



동일한 방식으로 세번째 루프에서는 D노드로 시작합니다. 이때 D노드를 기준을 탐색을 하면 C노드에 대한 거리값이 20으로 계산됩니다. 이전에 기록되어 있는 d[C]값인 30보다 더 짧은 최단 경로이므로 새롭게 계산된 값으로 업데이트를 합니다.


english



5. 방문하지 않은 노드들의 집합이 공집합이 될 때 까지 반복합니다.



위의 사진은 네번째 루프를 실행한 결과입니다. 위의 2~4번 과정에서 총 3번의 루프를 설명하였듯이 지속적으로 네번째, 다섯번째, 여섯번째 루프를 반복합니다. 마지막 루프까지 계산을 하면 최종적으로 다음과 같은 값을 가질 것 입니다.

d[A] = 0 / d[B] = 10 / d[C] = 20 / d[D] = 15 / d[E] = 30 / d[F] = 25

최종 목적지가 F 였으므로, 최단 경로의 거리 값은 25이며 그 경로는 A,D,C,F 입니다.


english


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

1. OSI model


OSI(Open Systems Interconnection Reference Model) 모형은 ISO(국제표준화기구)에서 개발한 모델로써, 컴퓨터 네트워크 프로토콜 디자인과 통신 계층으로 나누어 설명한 것입니다. 이를 일반적으로 OSI 7 계층 모형(OSI 7 layer model)이라고 합니다.


그렇다면, 여기서 계층(layer)라는 것은 무엇일까요?

계층은 비슷한 함수, 즉 비슷한 기능을 하는 것들끼리, 모듈끼리, 객체끼리 그룹화 해놓은 것을 말합니다.


영문


OSI 7 layer model은 다음과 같은 7개의 층으로 분류되어 있습니다.




2. Why 7 layer?


왜 이러한 구조를 갖게 된 것일까요? 즉, 이러한 층 분류로 인한 이점은 무엇일까요?


먼저 이점을 말하면 다음과 같습니다.


1. 단순함

- 설계하기 쉽다.

일단 각 층과 그들의 상호작용이 명확하게 정의되면, 계층들은 전반적인 분할 과정을 통해 디자인, 구현, 테스팅이 간단해집니다.


- 유지가 쉽고 간편하다.

즉, 각 계층의 프로토콜은 다른 계층의 프로토콜들과 나뉘어져 설계될 수 있습니다.


- 계층이 없이 하나로 구성된 구조는 비용이 많이들고 유연성이 없으며 금방 구식이 됩니다.


2. 유연성

- 계층 구조는 다른 레이어를 변화 시킬 필요 없이 포함된 프로토콜들과 서비스들을 수정하는데 유연성을 제공합니다.


- 쉬운 수정

즉, 다른 계층의 수정과 별개로 각 층을 수정하고 개발하는 것이 쉽습니다.


- 쉬운 향상

새로운 계층을 더하거나 새로운 기능을 계층에 더하는 변화를 점점 증가시킬 수 있습니다.


단점으로는, 많은 계층들로 인해 유발되는 딜레이로 발생하는 오버헤드가 있습니다.


즉, 계층 구조의 장점으로는 공통된 기능을 하는 계층끼리 묶여있고 다른 기능을 하는 것들 끼리는 나위어져 있으므로 각각에 대해 설계하기 용이하고 유지 보수가 쉽고 간편합니다. 또한 각 층에 대한 수정 및 향상이 필요할 때 다른 계층과 별개로 해당 계층에 대해서만 수정 및 향상을 진행할 수 있기에 유연성이 뛰어납니다.

하지만 많은 계층이 존재할때는, 그들이 딜레이를 유발시켜 오버헤드가 발생할 수 있다는 단점이 있습니다.



영문



3. 물리 계층(physical layer)


물리 계층에서는 오직 communication과 데이터 전송을 합니다. 즉, 물리적인 의사소통만을 담당합니다. 

주로 물리적 전송 매체를 관리하고 지원하는 물리 계층은 기계적, 전기적 및 타이밍 인터페이스를 담당하며 물리 계층 아래에 있는 물리적 전송 매체를 주로 다루고 있습니다. 설계시에는 한쪽이 1비트를 전송했을 때, 다른 쪽이 0비트가 아닌 1비트로 수신되도록 하는 것을 신경써야 합니다.


english



4. 데이터 링크 계층(data link layer)


데이터 링크 계층에서는 주로 4가지의 기능이 있습니다.


먼저, Service to neighbors(Service to neighbor layer)가 있습니다.

이웃한 계층들에게 잘 정의된 서비스 인터페이스를 제공해 주는 것으로써 이웃한 물리 계층과 네트워크 계층에게 제공합니다. 주로 확인되지 않은 비연결형 서비스(Unacknowledged connectionless serviece), 확인된 비연결형 서비스(Acknowledged connectionless service), 확인된 연결형기반 서비스(Acknowledged connection-oriented service), 이 세가지 서비스를 제공합니다.


두번째는 Framing 입니다.

데이터 링크 계층이 네트워크 계층에 서비스를 제공하기 위해서는 물리 계층에서 제공하는 서비스를 이용해야 합니다. 하지만 물리 계층이 제공하는 비트 스트림(bit stream)은 오류가 존재할 수 있습니다. 수신된 비트의 수가 송신된 비트의 수보다 작거나, 같거나 또는 더 클수 있으며 이들은 상이한 값을 가질 수 도있습니다. 따라서 데이터 링크는 이러한 오류를 찾아내고 필요한 경우 수정하는 기능을 해야 합니다. 그렇게 하기 위해서, 데이터 링크는 프레이밍을 실시합니다. 데이터를 프레임(frame)으로 그룹화하여 전송하는 것 입니다. 즉 프레이밍은 물리계층에 의해 제공된 비트 스트림을 분리된 프레임으로 나누는 것 입니다. 그리고 각 프레임에 대해 체크섬(checksum)을 계산합니다. 그리고 프레임이 목적지에 도달하였을 때 그 체크섬은 다시 계산됩니다. 만약 새롭게 계산된 체크섬이 사전에 프레임에 기록되어 있는 프레임과 다르다면 데이터 링크 계층은 오류가 발생함을 알 수 있고 이를 수정하는 과정을 가집니다.


다음으로는 흐름 제어(Flow control) 입니다.

데이터를 보내는 측과 받는 측간의 속도를 확인하여 이를 제어하는 것입니다. 데이터를 보내는 측의 속도가 상대적으로 빠를 때, 전송에 오류가 없다고 하더라도 특정 시점에서 수신하는 측은 프레임이 도착하자마자 처리할 수 있는 능력이 되지 않아서 일부 프레임을 손실하게 됩니다. 따라서 데이터 링크 계층은 데이터를 받는 측이 속도가 느릴때 빠르게 데이터를 전송하는 측에 의해서 막히지 않도록 속도를 규제합니다. 


마지막 네번째는 오류 제어(Error control)입니다.

모든 프레임이 최종 목적지에 올바른 순서로 전달되었는지 확인하여 전송된 오류를 처리하는 것입니다. 미확인된 비연결형 서비스에서는 오류 제어가 문제되지 않겠지만 확인된 연결지향형 서비스에서는 문제가 될 것입니다. 따라서 오류를 검출하고 수정하는 기능이 필요합니다. 오류 검출 코드는 단지 전송중에 발생한 오류의 존재 여부만을 수신측이 알 수 있도록 하는 코드로써, 패리티검사(Parity check), 검사합(Checksum), 순환중복검사(Cyclic Redundancy Code) 등이 있습니다. 오류 수정 코드는 무엇이 잘못되었는가를 충분히 알 수 있는 여분의 정보를 포함시켜 수신측이 직접 오류를 고칠 수 있게하는 코드로써, 부호어(codeword), 해밍 부호(Hamming code) 등이 있습니다.


english



5. 네트워크 계층(Network layer)


네트워크 계층은 Routing, Congestion control, Internetworking 의 기능을 수행합니다.


먼저 라우팅이란, 어떤 네트워크 안에서 통신 데이터를 보낼 경로를 선택하는 과정을 말합니다.

라우팅 알고리즘으로는 비적응형(Non-adaptive), 정적(static) 알고리즘으로 Shortest Path Routing, Flooding: Selective Flooding, Flow-Based Routing이 있으며 적응형(Adaptive), 동적(dynamic) 알고리즘으로 Distance Vector Routing, Link State Routing, Hierarchical Routing이 있습니다.

 

두번째로 혼잡 제어(Congestion control)이 있습니다.

먼저, 혼잡(Congestion)이란, 현재의 서브넷에 많은 패킷이 들어올 때 수행능력이 감소하는 것을 말합니다. 아래 그림을 보면 트래픽이 너무 많이 증가함에 따라 라우터가 더 이상 이를 대처할 수 없게되며 패킷 손실이 시작됩니다. 이러한 상황은 사태를 점점 더 악화시키는 경향이 있습니다. 매우 높은 트래픽에서 성능은 완전히 붕괴되어 거의 모든 패킷이 전달되지 않습니다.

이러한 혼잡을 제어하는 기능을 혼잡제어라고 합니다. 일반적인 혼잡 제어의 원칙으로는 개방 루프(Open loop)와 폐쇄 루프(Closed loop), 두가지가 있습니다. 개방루프는 본질적으로 좋은 설계를 하여 처음부터 혼잡이 발생하지 않도록 하는 것이며 폐쇄 로프는 피드백 루프의 개념을 기반으로 하는 것입니다. 또한 아래 그림과 같이 많은 계층 혼잡 제어의 원칙이 있습니다. 

또한 혼잡 제어의 알고리즘으로는 다음과 같은 것들이 있습니다.


Choke Packets: 수신측에서 송신측에 전송하는 전송 지연 신호로써, 송신측의 데이터 전송 속도를 조절하는 알고리즘 입니다. 수신측에서 일정한 시간(Choke Packet)을 송신측에 전송할 때마다 송신측은 일정한 시간만큼 데이터 전송 시간을 늦춥니다. 지연 중지 시간(Time Out)에 수신측에서 Choke Packet이 없는 경우 송신측은 다시 원래 속도로 데이터를 전송합니다.


Hop-by-hop choke packets: 고속 또는 장거리에서 Choke Packet을 보내는 것은 반응이 너무 느리기 때문에 제대로 작동하지 않습니다. 이를 막기위한 방법으로는 Packet이 통과하는 모든 hop에서 효과를 발휘하도록 하는 것입니다. 이러한 방식을 통해 더 많은 버퍼 업스트림을 사용하게 되지만 신속하게 문제를 해결할 수 있습니다.


Load Shedding: 위의 방법을 통해 혼잡이 제어되지 않을때 Load Shedding 방법을 사용할 수 있습니다. Load Shedding은 라우터가 처리할 수 없는 패킷으로 범람되고 있을 때 그들을 버려버리는 방법입니다. 


Jitter Control: 일반적으로 지터(Jitter)란 종단간의 전송 지연의 분산을 의미합니다. 네트워크 계층에서는 경로를 따라 각 홉의 예상 통과시간을 계산하여 지터를 제한 할 수 있습니다. 패킷이 라우터에 도착하면 라우터는 패킷이 일정보다 늦거나 빠른지 확인합니다. 이 정보는 패킷에 저장되며 각 홉에서 업데이트 됩니다. 패킷이 일정보다 빠른 경우 일정 시간 동안 패킷을 다시 가져올 수 있도록 하며 일정보다 늦은 경우 해당 패킷을 빨리 꺼냅니다.


하지만 최근 멀티미디어 네트워킹이 성장함에 따라서 위와 같은 임시적인 조치만으로는 충분하지 않습니다. 따라서 어플리케이션 요구에 맞는 서비스 품질을 제공하는 방법에 대해 살펴보겠습니다.

QoS(Quality of Service)는 신뢰성, 지연, 지터 및 대역폭으로 결정됩니다. 


마지막으로 Internetworking 입니다.

문자 그대로 네트워크 간의 교류(통신)하는 개념 혹은 기술 전반을 말합니다. 다시말해 독립적으로 움직이는 개개의 네트워크간의 접속을 의미합니다. 예를 들어, 여러 독립적인 LAN을 WAN을 통해서 연결하는 것입니다.


...학습중...


english



* 7 계층 정리


위에서 학습한 7계층에 대해서 간단히 정리해보면 아래와 같습니다.


1 계층, Physical layer: 물리적 매체를 통해 비트(bit)흐름을 전송하기 위해 요구되는 기능들을 조정합니다. 설계시에 보내는 비트가 0비트 일때 받는 측에서 1비트가 아닌 0비트를 받을 수 있도록 주의해서 설계를 해야합니다. 해당 계층이서는 원시 데이터를 송수신 합니다.(raw data sending and receiving)


2 계층, Data link layer:  services provided to neighbor layers, 이웃된 레이어에게 서비스를 제공합니다. 또한 오류 없이 한 장치에서 다른 장치로 프레임을 전달하는 역할을 합니다. 이를 위해 framing을 진행하며, error management(error detection and correction), flow control 기능을 수행합니다. 또한 하나의 링크를 공유해서 여러 장비가 다중 접속되어 있는 경우 collision(충돌)이 발생할 수 있기에 이를 관리하는 역할을 한다.


3 계층, Network layer: 다중 네트워크 링크에서 패킷(Packet)을 발신지로부터 목적지로 전달하는 책임을 갖습니다. 발신지와 목적지의 경로를 선택하기위해 routing 기능을 수행합니다. 또한 전달시 생기는 혼잡을 제어하는 congestion control 기능을 수행합니다. internetworking 기능을 통해 개개의 네트워크가 서로 접속될 수 있도록 합니다.


4 계층, Transport layer: services provided to neighbor layers, 이웃된 레이어에게 서비스를 제공합니다. 데이터를 끝에서 끝으로 전송하는 역할을 하며 데이터 전송을 책임지는 연결을 관리하는데 이것은 전체 프로토콜 계층 구조의 핵심입니다. 이 작업은 현재 사용중인 실제 네트워크 또는 네트워크와 독립적으로 원본 컴퓨터에서 대상 컴퓨터로 안정적이고 비용이 효율적인 데이터 전송을 제공하는 것 입니다. 대표적인 프로토콜으로는 TCP가 있습니다.


5 계층, Session layer: 통신 세션을 구성하는 계층으로, 포트(Port) 연걸이라고도 할 수 있습니다. 통신장치 간의 상호작용을 설정하고 유지하며 동기화 합니다. your machine과 destination machine을 연결하는 역할입니다.


6 계층, Presentation layer: 운영체계의 한 부분으로 입력 또는 출력되는 데이터를 하나의 표현 형태로 변환시키는 역할을 합니다. 필요한 번역을 수행하여 두 장치가 일관되게 전송 데이터를 서로 이해할 수 있도록 합니다.


7 계층, Application layer: 사용자가 네트워크에 접근할 수 있도록 해주는 계층입니다. 응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스인 API(Application Programming Interface)를 제공합니다. 또한 사용자가 어플리케이션을 관리할 수 있도록 Application management 역할을 합니다.


english


각각의 기능들에 대한 설명과 해당 기능이 수행되는 계층은 아래와 같습니다.


1) routing: network = 특정 네트워크 안에서 데이터를 보낼 경로를 선택하는 과정.


2) connection management: transport = 데이터 전송이 보장되도록 연결을 관리하는 것. 이것을 통해 안정적이고 효율적인 데이터 전송이 가능.


3) congestion control: network = 서브넷에 많은 패킷이 들어올 때 수행능력이 감소하는 혼잡 현상이 발생하는데 이를 제어하는 것. 혼잡 제어 알고리즘으로는 Choke packet, hop-by-hop choke packet, load shedding, jitter control 등이 있다.


4) framing: data link = 물리계층에 의해 제공된 비트 스트림을 분리된 프레임으로 나누는 것. 분리된 각 프레임에는 체크섬이 계산되어 저장된다.


5) crash management: data link = 하나의 링크를 공유해서 여러 장비가 다중 접속되어 있는 경우 collision(충돌)이 발생할 수 있기에 이를 관리하는 역할을 한다.


6) internetworking: network = 문자 그대로 네트워크 간의 교류(통신)하는 개념 혹은 기술 전반을 말합니다. 다시말해 독립적으로 움직이는 개개의 네트워크간의 접속을 의미합니다. 예를 들어, 여러 독립적인 LAN을 WAN을 통해서 연결하는 것입니다.


7) error management (error detection and correction) : data link and transport = 모든 프레임이 최종 목적지에 올바른 순서로 전달되었는지 확인하여 전송된 오류를 처리하는 것입니다. 오류 검출 코드는 단지 전송중에 발생한 오류의 존재 여부만을 수신측이 알 수 있도록 하는 코드로써, 패리티검사(Parity check), 검사합(Checksum), 순환중복검사(Cyclic Redundancy Code) 등이 있습니다. 오류 수정 코드는 무엇이 잘못되었는가를 충분히 알 수 있는 여분의 정보를 포함시켜 수신측이 직접 오류를 고칠 수 있게하는 코드로써, 부호어(codeword), 해밍 부호(Hamming code) 등이 있습니다.


* data-link와 transport 유사점 및 차이점

데이터 링크 계층은 노드 대 노드 전송의 프레임에 대한 오류를 제어하나, 전송 계층은 전체 세그먼트 오류(손상, 유실 등) 없이 수신측 전송 계층에 도착하도록 오류 제어 기능을 수행합니다.


8) raw data sending and receiving: physical layer = 원시데이터, 즉 초기데이터를 주고 받는 것을 말하며 이는 물리적 매체를 통해 비트(bit)흐름을 전송하기 위해 요구되는 기능들을 조정하는 물리 계층에서 이루어집니다.


9) application management: application = 어플리케이션을 관리하는 것으로써 사용자가 특정 어플리케이션에 접근하거나 관리할 수 있도록 합니다.


10) application program interface: application = 응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 말합니다. 어플리케이션 계층에서 이를 사용자에게 제공합니다.


11) flow control: data link and transport = 데이터를 보내는 측의 속도가 상대적으로 빠를 때 특정 시점에서 수신하는 측은 프레임이 도착하자마자 처리할 수 있는 능력이 되지 않아서 일부 프레임을 손실수 있기 때문에 데이터를 보내는 측과 받는 측간의 속도를 확인하여 이를 제어하는 것입니다. 


* data-link와 transport 유사점 및 차이점

두 계층에서 속도가 빠른 송신기와 속도가 느린 수신기 사이에서 데이터가 초과되어 버려지지 않도록 각 연결에서 속도를 제어하는 것은 유사하지만, 라우터는 비교적 적은 회선을 갖는 반면 호스트는 많은 연결을 갖는 것이 차이점 입니다.

즉, 데이터 링크에서는 송수신 양단 간에 송신율 및 수신율의 균형을 맞추는 것이고 트랜스포트에서는 단일 데이터 링크간이 아닌, 전송계층 종단-대-종단 간에 흐름제어 기능을 하는 것이다.


12) services provided to neighbor layers: data link: transport = 이웃한 계층들에게 잘 정의된 서비스 인터페이스를 제공해 주는 것으로써 데이터 링크 계층에서는 물리계층과 네트워크 계층 간 이루어지며 전송 계층에서는 네트워크 계층과 세션 계층간 이루어집니다.


english



What is the purpose of the header of each layer? How is it used?

헤더에는 제어 정보를 비롯한 정보들이 들어있다. 데이터를 전송할 때 각각의 층마다 인식할 수 있도록 하는 목적을 가지고 있으며 헤더를 붙이는 과정을 캡슐화라고 한다. 데이터링크계층에서는 오류제어를 위해 데이터의 뒷부분에도 일부 데이터가 추가된다. 또한 수신된 데이터가 각각의 레이어를 따라 올라가면서 헤더가 벗겨지는 과정을 디캡슐레이션이라고 한다.


What does the application layer protocol mean? How does it operate?

응용 계층 프로토콜은 최종 사용자가 직접 사용할 수 있는 여러가지 프로토콜이다. 보통 사용자는 TCP/UDP에 직접 접속하지 않고 응용 계층을 이용하여 통신 서비스를 사용한다.


그 중 인터넷에서 파일을 전송하는 기본 프로토콜은 FTP로써, 파일 전송을 위한 가장 기본적인 프로토콜이다. IP와 TCP가 존재하지 않을 때 개발되었으며 FTP는 대화형으로 클라이언트와 서버가 통신이 가능하다. FTP를 사용하기 위해 먼저 서버에 로그인해야 하며, 사용자는 로그인 이름과 패스워드를 입력하여 클라이언트를 인증한다. FTP의 동작원리로는, FTP 서비스를 제공하는 서버와 여기에 접속하는 클라이언트 사이에 두개의 연결이 생성되는데 하나는 데이터 전송을 제어하기 위한 신호를 주고받는 역할을 하고 다른 하나는 실제 데이터 전송에 사용된다.

이 외에도 웹상에서 웹 서버 및 웹 브라우저 상호간의 메세지 전송을 위한 응용계층 프로토콜로써 HTTP가 존재하며 호스트에 대한 이름 주소 변환을 위한 DNS 등이 있다. 


프로토콜은 접속된 기기에 불러온 서비스와 응용 프로그램간 데이터를 교환하기 위해 일관된 규칙을 설정한다. 프로토콜은 메세지 내부의 데이터가 구조화 되는 방법과 소스와 대상간에 전송되는 메세지 유형을 지정한다.


Explain how the sending process sends its data to the receiving process and how the receiving process receives the data from the sending process. Explain the path of data in detail. Explain how the header of each layer is used. (equivalent to several questions)

간단하게 이야기한다면, 일반 사용자는 OSI 7계층 맨 위에 있는 응용 계층을 통해 데이터 송수신을 요청한다. 이 요청은 하위 계층으로 순차적으로 전달되어 맨 아래 있는 물리 계층을 통해 상대 호스트에 전송된다. 그리고 요청이 각 계층으로 전달되는 과정에서 계층별로 담당하는 기능을 수행하여 데이터를 안전하게 송수신한다. 데이터를 수신한 호스트에서는 송신 호스트와 반대 과정을 거치게 된다. 물리 계층으로 들어온 데이터는 순차적인 상향 전달 과정을 거쳐 응용 계층으로 올라간다. 그리고 처리가 완료된 결과를 회신할 때는 반대과정을 순차적으로 거쳐서 송신 호스토로 되돌아가게 된다. 따라서 데이터를 송수신하는 최종 주체는 송수신 호스트 양쪽에 위치한 응용 계층이며, 아래의 계층은 데이터 전송에 필요한 기능만 나누어 처리하게 된다.


Explain the TCP/IP model. 

TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP(Internet Protocol)와 전송 조절 프로토콜인 TCP(Transmission Control Protocol)로 이루어져 있는 것이다. IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있고 TCP는 IP위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 어플리케이션 프로토콜들이 IP위에서 동작하기 때문에 묶어서 TCP/IP로 부르기도 한다.

TCP/IP 모델은 4개의 계층 구조를 가진 개념적인 모델로써 매핑되어 있다. 각 계층은, 어플리케이션, 트랜스포트, 인터넷, 네트워크 인터페이스이다. 인터넷에서 전송되는 정보나 파일들이 일정한 크기의 패킷들로 나뉘어 네트워크상 수많은 노드들의 조합으로 생성되는 경로들을 거쳐 분산적으로 전송되고, 수신지에 도착한 패킷들이 원래의 정보나 파일로 재조립되록 한다.


What it the difference between the TCP/IP model and the ISO OSI seven layer computer communication model? Explain. 

TCP / IP는 데이터 통신에 대한 두 가지 접근법 중 오래된 것이고 전 세계적으로 잘 알려져 있습니다. 그러나 OSI 모델은 다른 모든 데이터 통신 프로토콜에 사용되는 입증 된 개념입니다. 다른 모든 통신 응용 프로그램의 지침으로 계속 사용될 것입니다.


What layer does Token ring and Ethernet belong to?

토큰링은 근거리 통신망 프로토콜으로써 데이터 링크 계층에 속해있으며 이더넷이 개발되면서 잘 쓰이지 않는다. 이더넷은 컴퓨터 네트워크 기술의 하나로, 전세계의 사무실이나 가정에서 일반적으로 사용되는 LAN에서 가장 많이 활용되는 기술 규격이며 물리 계층에서는 신호와 배선, 데이터 링크 계층에서는 MAC 패킷과 프로토콜의 형식을 정의한다.


What layer does Domain Name Service (DNS) belong to?

DNS는 Domain Name System 으로써 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 개발되었고 Application layer에 속해 있다.


What layer does World Wide Web (WWW) belong to? 

WWW 은 World Wide Web 으로써 인터넷에 연결된 컴퓨터들을 통해 사람들이 정보를 공유할 수 있는 전 세계적인 정보공간을 말하며 어플리케이션 레이어에 속해있다.


What cookies belong to?

Cookies 는 웹 서버가 로컬 컴퓨터의 하드디스크에 저장하는 작은 텍스트 파일로써 사이트의 방문자에 대한 정보를 가지고 있으며 어플리케이션 레이어에 속해 있다.


english


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

CriticalSection에 대해서 공부하다가 의문점이 들어 알아보았습니다.


만약 1,2,3,4 라는 4개의 스레드가 존재했을 때, 1의 스레드에서 EnterCriticalSection을 두번 호출하고 LeaveCriticalSection을 한번 호출하면 2의 스레드에서 EnterCriticalSection을 호출하면 어떻게 되고 그 이유는 무엇일까요?


먼저 결과적으로는 2의 스레드에서 EnterCriticalSection을 호출하면 block처리가 됩니다.

이유를 한번 알아보겠습니다.

먼저 microsoft 공식문서에 업데이트된 Displaying a Critical Section을 통해 CriticalSection의 내부 구조를 살펴보면, lockCount와 OwningThread 멤버가 있는 것을 확인할 수 있습니다.

(출처: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/displaying-a-critical-section)


즉, Critical Section은 자신이 어떤 스레드에 의해 소유되어져 있고, 해당 스레드에 의해 몇번 lock이 되었는지 알고 있는 것입니다.

따라서 Critical Section을 소유한 스레드가 EnterCriticalSection을 호출하면 개체 내부적으로 lockCount가 하나 증가합니다.

다시말해, EnterCriticalSection을 호출한 회수 만큼 LeaveCriticalSection을 호출해야지만 lockCount가 0이되어 CriticalSection이 Signaled 상태로 돌아오게 됩니다.


예를 들어, EnterCriticalSection을 두번 호출하고 LeaveCriticalSection을 한번만 호출한다면 lockCount는 1이됨으로써 결국 EnterCriticalSection만 한번 호출한것과 같은 상태가 되는 것 입니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


이번에는 상호잠금 함수인 InterlockedIncrement에 대해서 알아보겠습니다.

먼저 msdn에서 해당 함수를 살펴보면 아래와 같습니다.


LONG __cdecl InterlockedIncrement(

_Inout_ LONG volatile *Addend);


이를 살펴보면 해당함수는 LONG형(32bit) 포인터 변수를 인자로 받는다는 것을 알 수 있습니다.

따라서 여러 스레드에서 공유되는 데이터의 값을 하나 씩 증가시킬때는,

해당 데이터를 LONG형으로 선언하고 아래와 같이 사용하면 됩니다.


InterlockedIncrement(&(LONG형 변수));


추가적으로, 위와 같은 함수를 위에서 언급하였듯이 상호잠금 함수라고 합니다.

값을 1씩 증가시켜주는 InterlockedIncrement() 함수 뿐 아니라,

값을 1씩 감소시켜주는 InterlockedDecrement() 함수도 존재합니다.


이때 주의할 점이 있습니다.

만약 값을 2만큼 증가시키기 위해서는 InterlockedIncrement() 함수를 2번 호출해서는 안됩니다.

그 두번의 호출 사이에 다른 스레드가 실행될 가능성이 있기 때문입니다.

이런 상황에서는 InterlockedExchangeAdd() 함수를 이용하면 됩니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc



안녕하세요. 문범우입니다.

지난 포스팅에서 프로세스 및 스레드에 대한 개념을 정리해보았습니다.

이번에는 스레드를 직접적으로 만들어서 확인해보도록 하겠습니다.

실습은 C언어로 진행합니다.


1. 싱글 스레드(Single-Thread)

먼저 싱글 스레드를 만들어서 확인해보도록 하죠.

코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
DWORD WINAPI ThreadFunc(LPVOID);
// DWORD는 더블워드 = long
// WINAPI : Windows의 API
// LPVOID : ms에서 사용하는 void* 
 
int global = 1;
 
int main()
{
    HANDLE hThrd; //스레드를 접근하기 위한 손잡이 개념
    DWORD threadId; 
    int i;
    // for 루프문
    for (i=0; i<5; i++)
    {
        ThreadFunc( (LPVOID) i); // single thread
    }
    // Wait for the threads to complete.
    Sleep(3000);
 
    return EXIT_SUCCESS;
}
 
DWORD WINAPI ThreadFunc(LPVOID n)
{
    int i;
    for (i=0;i<100;i++){
        printf("%d%d%d%d%d%d%d%d global = %d\n",n,n,n,n,n,n,n,n,global++);
    }
    return 0;
}
cs


11번 라인은 추후 멀티 스레드에서 확인하기 위한 변수입니다.

21번 라인을 보시면 ThreadFunc 함수를 호출 하도록 되어 있습니다.

그리고 해당 함수에 대해서는 코드 하단에 나와 있습니다.

24번 라인은 결과를 끝까지 확인하기 위해 일시적으로 추가한 코드입니다.


해당 코드에서는 스레드를 추가적으로 만들지 않습니다.

따라서 프로세스에는 Primary thread 하나만 존재함으로써 단일 스레드를 유지합니다.

코드에 대한 결과는 어떻게 될까요?

싱글스레드 실행결과 중간


싱글스레드 실행결과 끝


위의 실행결과를 확인하면 코드에서 for문에 의해서 ThreadFunc 함수가 5번 호출되는 것을 알 수 있습니다.

처음에 ThreadFunc함수가 호출되고 100번 반복될때 까지 다음 코드를 실행하지 않고 함수가 리턴될때 까지 기다립니다.

이것은 출력되는 결과를 보면 알 수 있죠.

함수가 for문의 i를 인자로 받아서 이를 출력하기 때문에 몇번째로 호출된 함수인지를 확인할 수 있습니다.


2. 멀티 스레드(Multi-Thread)

그럼 해당 코드를 약간 바꿔서 단일스레드가 아닌 멀티스레드로 확인해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
DWORD WINAPI ThreadFunc(LPVOID);
// DWORD는 더블워드 = long
// WINAPI : Windows의 API
// LPVOID : ms에서 사용하는 void* 
 
int global = 1;
 
int main()
{
    HANDLE hThrd; //스레드를 접근하기 위한 손잡이 개념
    DWORD threadId; 
    int i;
    // for 루프문
    for (i=0; i<5; i++)
    {
        //ThreadFunc( (LPVOID) i); // single thread 
        //CreateThread함수를 5번 호출
        hThrd = CreateThread(NULL,
            0
            ThreadFunc, //함수포인터: 함수가 시작하는 메모리 주소
                        //아래에서 함수 확인!
            (LPVOID)i, //
            0,
            &threadId ); //
        if (hThrd)
        {
            printf("Thread launched %d\n", i);
            CloseHandle(hThrd);
        }
    }
    // Wait for the threads to complete.
    Sleep(1000);
 
    return EXIT_SUCCESS;
}
 
DWORD WINAPI ThreadFunc(LPVOID n)
{
    int i;
    for (i=0;i<100;i++){
        printf("%d%d%d%d%d%d%d%d global = %d\n",n,n,n,n,n,n,n,n,global++);
    }
    return 0;
}
 
cs


해당 코드를 보면 단순히 ThreadFunc 함수를 호출하는 것이 아니고,

CreateThread 함수를 통해 스레드를 만들고 해당 스레드가 ThreadFunc 함수를 호출하게 합니다.

그럼 그 결과가 어떻게 바뀔까요?


멀티스레드 실행결과 중간


멀티스레드 실행결과 끝


좀 전에 확인한 싱글스레드와의 차이가 보이시나요?

각각의 스레드가 각자 실행되면서 global 변수의 값을 증가시키고 있습니다.


3. 싱글 스레드와 멀티 스레드 시간 차이

이러한 차이가 어떤 결과를 보여줄까요?

각각의 코드에 시간측정함수를 더해 확인해보도록 하겠습니다.

먼저 싱글 스레드의 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define MAXTHREAD 5
 
DWORD WINAPI ThreadFunc(LPVOID n);
int main () {
    clock_t start, finish;
    double duration;
    DWORD threadId; 
    HANDLE hThrd[MAXTHREAD];
 
    int i;
    start = clock();//현재 시간 반환
 
    for (i=0; i<MAXTHREAD; i++){
        ThreadFunc((LPVOID)i);
    }
    WaitForMultipleObjects(MAXTHREAD, hThrd, TRUE, INFINITE);
    for (i=0; i<MAXTHREAD; i++){
        CloseHandle(hThrd[i]);
    }
    //종료
    finish = clock();
    duration = (double) (finish-start) / CLOCKS_PER_SEC;
    printf("%f 초입니다\n", duration);
    return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
    for (int i = 0; i<1000000000; i++){
        3+5+8*24;
    }
    return 0;
}
cs


위의 코드를 보면 18번 for문을 통해 ThreadFunc 함수가 총 5번 실행됩니다.

ThreadFunc에서는 단일 연산을 1억번 수행하게됩니다.

그러므로, 해당 싱글스레드에서는 단일 연산을 총 5억번 수행합니다.

21번 라인은 멀티스레드가 종료할때까지 기다려라 라는 함수인데 이에 대한 것은 추후에 설명드리도록 하겠습니다.

해당 코드에 대한 결과는 아래와 같습니다.



대략적으로 12초가 걸렸습니다.

그럼 멀티스레드에서는 어떨까요? 먼저 코드를 확인해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define MAXTHREAD 5
 
DWORD WINAPI ThreadFunc(LPVOID n);
int main () {
    clock_t start, finish;
    double duration;
    DWORD threadId; 
    HANDLE hThrd[MAXTHREAD];
 
    int i;
    start = clock();//현재 시간 반환
 
    for (i=0; i<MAXTHREAD; i++){
        hThrd[i] = CreateThread(NULL
            0,        
            ThreadFunc, 
            (LPVOID)i, 
            0,            
            &threadId    
            ); 
    }
    WaitForMultipleObjects(MAXTHREAD, hThrd, TRUE, INFINITE);
    for (i=0; i<MAXTHREAD; i++){
        CloseHandle(hThrd[i]);
    }
    //종료
    finish = clock();
    duration = (double) (finish-start) / CLOCKS_PER_SEC;
    printf("%f 초입니다\n", duration);
    return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
    for (int i = 0; i<1000000000; i++){
        3+5+8*24;
    }
    return 0;
}
cs


19번~25번 라인을 통해 각각 스레드를 만듭니다.

각각의 스레드가 1억번 단일연산을 수행하므로 위와 동일하게 총 5억번의 연산을 수행합니다.

이러한 멀티스레딩에서의 시간 결과는 어떻게 나올까요?



싱글스레드에서는 약 12초가 소요되었던 5억번의 단일연산이 멀티스레드에서는 3.6초로 줄어들었습니다.

물론 개인 컴퓨터 사양에 따라 시간은 변동될 수 있지만, 그런 점들을 감안해도

싱글스레드와 멀티스레드에 대한 시간효율 차이는 너무나 명백하게 확인할 수 있습니다.




블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


안녕하세요. 문범우입니다.

이번 포스팅에서는 스레드(Thread) 와 프로세스(Process) 에 대해서 알아보겠습니다.

스레드에 대해 좀 더 명확히 이해하기 위해서는 먼저 프로세스에 대한 개념이 필요합니다.

따라서 프로세스, 스레드, 멀티 프로세싱, 멀티 프로그래밍, 멀티 태스킹, 멀티스레딩, 프로세스와 스레드 차이 순으로 알아보도록 하겠습니다.



1. 프로세스(Process)

프로세스에 대한 설명을 먼저 위키백과에서 어떻게 하고 있는지 확인해볼게요.


프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다. 프로세스 관리는 운영 체제의 중요한 부분이 되었다.

(출처: 위키백과)


위의 설명처럼 프로세스란, 실행되고 있는, 실행중인 프로그램을 말합니다.

프로그램은 실행이 되기 전의 명령어와 데이터의 묶음인데, 이러한 정적인 요소인 프로그램이 실행 중에 있을때 그것들을 우리는 프로세스라고 말합니다.

다시 말해서, 하드디스크에 저장되어 있는 명령어와 데이터의 묶음 자체는 프로그램이며

프로세스는 그러한 프로그램을 구동하여(실행하여), 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업단위를 말합니다.

예를 들어서, 컴퓨터에 A라는 프로그램이 존재합니다. A라는 것을 실행시키기 전에는 단순히 프로그램으로써 존재합니다. 헌데 A를 실행시켜서, 현재 실행되고 있는 A를 프로세스라고 합니다.


일반적으로 CPU는 한번에 하나의 프로세스만 관리할 수 있습니다.

그런데 우리는 한번에 여러개의 프로그램을 실행하고 있죠? 즉, 우리는 한번에 여러개의 프로세스를 사용하고 있습니다.

CPU는 하나의 프로세스만 관리가 가능한데, 이점을 극복하고 우리가 사용하듯이 여러개의 프로세스가 동시에 실행되도록 하는 것이 멀티태스킹입니다.

이에 대한 자세한 설명은 밑에서 드리겠지만 간략히 말씀드리면, 멀티태스킹은 엄밀히 말해 한번에 다수의 프로세스를 실행하고 있는 것이 아니고 사용자로 하여금 다수의 프로세스가 동시에 실행되는 것 '처럼' 보이게 만드는 것입니다.

즉, CPU가 빠른 시간동안 각각의 프로세스를 순차적으로 실행하는 것 입니다.

예를 들어 A 프로세스를 몇 초간, 그리고 B 프로세스를 몇 초간, 다시 A 프로세스, 다시 B 프로세스, ... 이렇게 반복해가며 다수의 프로세스를 관리하기 때문에 사용자는 한번에 다수의 프로세스가 실행되고 있는 것 처럼 보이는 것입니다.



1-1. 프로세스 제어 블록(PCB: Process Control Block)

CPU는 한번에 하나의 프로세스만 실행이 가능합니다.

운영체제가 CPU에게 실행중인 프로세스 A에서 넘어가 B라는 프로세스를 관리하라고 할때 실행중이던 프로세스 A의 정보를 PCB, 프로세스 제어 블록에 저장합니다. 그리고 이후 A가 CPU 제어권을 다시 받게되면 PCB에 있던 정보를 불러와서 프로세스가 실행됩니다.

PCB에는 주로 다음과 같은 정보가 저장되어 있습니다.


프로세스 식별자(Process ID): 각각의 프로세스를 식별하기 위한 고유 ID입니다.

프로세스의 상태(State): 생성, 실행, 준비, 대기, 종료 상태로 나누어져 있으며 각각에 대해서는 밑에서 설명드리겠습니다.

프로그램 계수기(Program Counter): 해당 프로세스가 다음에 실행할 명령어의 주소를 가지고 있습니다.

프로세스의 우선순위 (Priority): 해당 프로세스의 우선순위 정보를 표현합니다.

을 비롯한 메모리 관리 정보, 프로세스 계정 정보 등 다양한 정보를 가집니다.


PCB는 프로세스의 중요한 정보를 포함하고 있습니다. 때문에 일반적인 사용자가 접근하지 못하도록 되어 있습니다.



1-2. 프로세스의 상태 (Process state)

일반적으로 프로세스의 상태는 커널에 의해 관리됩니다.

프로세스의 상태가 PCB에 저장되어 있는데 위에서 말한 것과 같이 PCB는 일반적인 사용자가 접근하지 못하는 영역에 저장되어 있습니다. 이때 커널 스택 영역은 편리하면서도 보호받는 위치이기 때문에 주로 이용됩니다.


프로세스의 상태로는 생성(create), 실행(running), 준비(ready), 대기(waiting), 종료(terminated) 상태가 있습니다.

그림과 설명을 통해 프로세스의 상태에 대해 좀 더 알아볼게요.

그림에서 다섯개의 파란색 동그라미가 각각 프로세스의 상태입니다. (new는 생성, create와 같은 의미입니다.)

생성(create or new) 상태란, 프로세스 자체는 생성되었지만 아직 프로그램이 메모리에 적재되지 않은 상태를 말합니다.

준비(ready) 상태란, 실행된 프로세스가 메모리에 적재되고 CPU를 할당 받기 위해서 준비중인 상태입니다.

실행(running) 상태란, 프로세스가 CPU를 할당받아서 명령어를 실행하고 있는 상태입니다.

대기(waiting or Block) 상태란, 실행상태에 있던 프로세스가 급작스런 이벤트에 의해 실행을 일시적으로 멈춘 상태를 말합니다.

종료(terminated) 상태란, 프로세스의 실행이 모두 정상적으로 끝나서 종료된 상태를 말합니다.


위의 그림에서 볼 수 있듯이 각각의 상태는 특정 이벤트에 의해 변화됩니다.

우리는 이러한 것을 프로세스의 상태 전이라고 말합니다.

각각의 프로세스의 상태 전이에 대한 설명은 아래와 같습니다.


admitted: 생성된 프로세스가 승인을 받아서 실행이 됩니다.

scheduler dispatch: 보통 dispatch라고도 말하며, 준비상태에 있던 프로세스가 CPU를 할당받아서 실행되는 것입니다.

interrupt: 실행 중이던 프로세스가 특정 이벤트에 의해서 다시 준비상태로 넘어가는 것입니다. 프로세스가 할당된 시간에 모든 명령을 실행하지 못하여 넘어가는 Time out 등이 있습니다.

I/O or event wait: CPU가 프로세스를 실행 중에 있을 때 급작스런 이벤트에 의해서 CPU가 다른 프로세스를 할당하게 될때 현재 실행중인 프로세스는 대기상태로 넘어가는데 이러한 상태전이를 말합니다.

I/O or event completion: 급작스런 이벤트에 의한 CPU할당을 받는 프로세스의 실행이 끝나면 대기상태에 있던 프로세스는 다시 준비상태로 넘어가게 됩니다. 이러한 상태 전이를 말합니다.

exit: 프로세스의 모든 명령이 실행되고 종료되는 상황을 말합니다.



2. 스레드(Thread)

스레드가 무엇일까요?

위키백과에는 아래와 같은 설명으로 나와있습니다.


스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고한다. (출처: 위키백과)


위에서 우리는 프로세스에 대해서 알아보았습니다.

실행 중인 프로그램을 프로세스라고 했는데, 스레드는 그러한 프로세스 내부에서 실행되는 흐름의 단위 입니다.

즉 프로세스의 내부에 있는 개체를 말합니다. 하나의 프로세스에는 최소 하나이상의 스레드가 존재합니다.

하나의 스레드가 있을 때는 단일 스레드라고 말하며 두개 이상의 스레드가 존재하면 멀티스레드, 다중스레드라고 말합니다.

이에 대해서는 밑에서 다시 설명드리겠습니다.


스레드는 왜 사용될까요?

프로세스에 대한 설명을 드리면서 멀티태스킹에 대해 간략히 설명을 드렸습니다. 멀티태스킹에서는 다수의 프로세스가 만들어져서 순차적으로 실행됩니다.

헌데 만약 A라는 프로세스와 B라는 프로세스가 대규모의 동일한 데이터를 필요로 한다면 어떨까요?

이러한 프로세스들은 단순히 동일한 데이터를 공유하기 위해서 운영체제에서의 복잡한 메커니즘을 사용하게 됩니다.

여기서 프로그래머들은 생각합니다. 프로세스가 생성되는 초기부터 데이터를 공유하도록 해준다면 어떨까? 이러한 발상이 스레드의 시작이 됩니다.

그리고 멀티스레드를 통해 메모리를 효율적으로 사용할 수 있게 됩니다.


때문에 다수의 프로세스가 독립적으로 실행되며 별개의 메모리를 차지하는 것보다 효율적으로 메모리를 사용하게 됩니다.

또한 프로세스간의 전환 속도보다 스레드간의 전환 속도가 빠르게 됩니다.

하지만 스레드를 사용하면 동일한 데이터를 전역 변수로 이용하므로 다양한 문제가 발생될 수 있다는 단점이 있습니다.


3. 멀티 ~ (Multi ~ )

멀티프로세싱, 멀티프로그래밍, 멀티테스킹, 멀티스레드

이러한 개념들은 각각 무엇을 말하는 걸까요? 하나씩 간단히 나마 알아보도록 하겠습니다.


3-1. 멀티 프로세싱(Multi-processing)

멀티 프로세싱은 한마디로 말해서 '두개 이상, 다수의 프로세서가 협력적으로 작업을 동시에 처리하는 것' 입니다.

위에서 설명한 '프로세스'가 아닌 '프로세서'를 말하는 것에 혼동되면 안됩니다.

프로세서는 대략적으로 CPU라고 생각하시면 됩니다.

아래 사진을 보면 더 이해하기 쉬울 것 입니다.



각각의 프로세서가 하나의 작업만을 처리하는 것이 아니라 다수의 작업을 처리하며,

하나의 작업은 하나의 프로세서에 의해 처리되는 것이 아니라 다수의 프로세서에 의해 처리됩니다.

멀티 프로세싱을 하는 장점으로는 여러가지가 있습니다.

여러개의 프로세스가 처리되어야 할때 동일한 데이터를 사용한다면 이러한 데이터를 하나의 디스크에 두고 모든 프로세서가 이를 공유하도록 한다면 비용적으로 저렴합니다.

또한, 만약 하나의 프로세서가 하나의 작업만을 처리한다면 특정 프로세서가 고장이 났을 때 해당 작업은 정지됩니다. 하지만 멀티 프로세싱을 사용한다면 작업은 정지되지 않습니다. 단지 속도가 느려지는 정도의 손해만 발생하겠죠.


3-2. 멀티 프로그래밍(Multi-programming)

멀티 프로그래밍의 개념은 위에서 잠깐 언급한 멀티테스킹과 혼동될 수 있으니 잘 구분하길 바랍니다.

멀티 프로그래밍이란, 특정 프로세스 A에 대해서 프로세서가 작업을 처리할때 낭비되는 시간동안 다른 프로세스를 처리하도록 하는 것 입니다.

예를 들어 A라는 프로세스를 처리중에 있을때 입출력 이벤트가 발생했는데 프로세서가 입출력 이벤트에 대한 응답을 위해 무작정 대기하고 있다면 프로세서의 자원을 낭비하는 결과를 초래합니다. 프로세서, CPU는 한번에 하나의 프로세스만 처리하도록 되어있기 때문에 A 프로세스에 대한 입출력 이벤트에 대한 응답을 대기하는 동안 아무일도 하지 않기 때문이죠.

멀티 프로그래밍은 이렇게 낭비되는 시간동안 프로세서가 다른 프로세스를 수행할 수 있도록 하는 것 입니다.


3-3. 멀티 테스킹(Multi-tasking)

멀티 테스킹이란 다수의 Task(프로세스보다 보다 확장된 개념이라고 생각하시면 됩니다.)를 운영체제의 스케줄링에 의해 번갈아 가면서 수행하는 것 입니다.

프로세서가 각각의 Task를 조금씩 자주 번갈아가면서 처리하기 때문에 사용자는 마치 동시에 여러 Task가 수행되는 것처럼 보게 됩니다.


위에서 말한 멀티프로그래밍과의 차이점으로는,

멀티프로그래밍은 프로세서의 자원이 낭비되는 것을 최소화하기 위한 것이며

멀티테스킹은 일정하게 정해진 시간동안 번갈아가면서 각각의 Task를 처리하는 것입니다.


3-4. 멀티 스레딩(Multi-threading)

위에서 프로세스와 스레드의 개념을 잘 이해하셨다면 멀티스레딩 또한 쉽게 이해하실 수 있습니다.

하나의 프로세스내에는 여러개의 스레드가 존재하게 됩니다.

또한 이런 다수의 스레드는 하나의 데이터 자원을 공유 합니다. 때문에 메모리에 대한 효율성을 가질 수 있습니다.


멀티 스레딩과 멀티 프로세싱의 차이에 대해서도 혼동될 수 있습니다.

멀티 스레딩은 하나의 프로그램 안에서 병렬 처리의 이점을 보는 것이며

멀티 프로세싱은 여러 개의 프로그램들을 병렬로 처리할 수 있는 것 입니다.

위키백과에 나와있는 것에 의하면,

멀리 프로세싱 시스템이 여러 개의 완전한 처리 장치들을 포함하는 반면

멀티 스레딩은 스레드 수준뿐 아니라 명령어 수준의 병렬 처리에까지 신경을 쓰면서 하나의 코어에 대한 이용성을 증가하는 것에 초점을 두고 있습니다.

멀티 스레딩의 장점으로는 자원을 공유하여 메모리에 대한 효율성을 가져올 수 있는 것과 이로 인해 경제성 또한 증가하는 것 등이 있습니다.



4. 프로세스와 스레드의 차이점

위에서 프로세스와 스레드에 대해서 이해하셨다면 그 차이점에 대해서도 어느정도 느낌이 오셨을 겁니다.

프로세스가 실행될때 운영체제로 부터 어떤 것들을 할당받을까요?

프로세스는 자신을 실행할 프로세서를 할당받으며 필요한 메모리공간과 데이터등을 할당받습니다.

그리고 스레드란 이러한 프로세스 안에서 실행되는 흐름의 단위로써, 프로세스 안에서의 주소나 데이터를 스레드 간에 공유하면서 실행됩니다.

스레드가 존재함으로써 데이터와 같은 자원을 메모리에 할당하는 동작이 줄어들어서 자원을 효율적으로 관리하고 운영할 수 있습니다.

해당 내용에 대해 아래 링크를 참고하시면 보다 쉽게 이해가 가능합니다.

https://brunch.co.kr/@kd4/3


추가적으로 궁금한 점이나 내용에 대한 피드백은

댓글 및 이메일(doorbw@outlook.com)을 이용해주세요 :)

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc