요즘 자료도 많아지고 굉장히 개념 자체가 햇갈립니다.
저도 조사하면서 "내가 배운 내용이 맞나?" 싶을 정도로 햇갈리는 내용들이 많아서 이렇게 정리합니다.
3편으로 나눌 생각이고,
동기, 비동기, 블로킹, 논 블로킹, 멀티 프로세스, 멀티 쓰레드, 멀티 플렉싱, select, poll, epoll, IOCP, boost::asio::context
순으로 진행하려고 합니다.
요번 글은 동기, 비동기, 블로킹, 논 블로킹에 대한 내용입니다.
블로킹과 논 블로킹에 대해 예기하기 앞서, 동기와 비동기에 대해 예기해 보겠습니다.
1. 동기와 비동기??
이러한 동기와 비동기에서 블로킹과 논 블로킹 개념이 등장하면서 더욱 머리를 아프게 하죠.
우선 동기부터 살펴보도록 하겠습니다.
1) 동기
프로그램을 실행시키면 cmd 창에서는 사용자의 입력이 완료되기 전까지 멈춰있게 됩니다.
사용자가 정수를 입력하는 순간 밑에 for문이 돌게되죠. 이것이 동기입니다.
2) 비동기
이 예제에서 std::cin>>num;
을 쓰레드 1에게 넘겨주고, for문을 쓰레드 2에게 넘겨주게 된다면
실행했을 때 사용자가 입력을 하지도 않았는데 for문의 실행이 이뤄지고 있을 것입니다.
3) 그럼 무엇을 써야 하는가?
2. 블로킹, 논 블로킹
1) 블로킹
std::cin >>
에서 데이터를 입력 받을 때,socket()
을 열어 listen()
할 때, 데이터를 읽기위해 read()
할 때 등....이것을 블로킹이라고 합니다. 그리고 이런 문제는 클라이언트가 많이 접속될 수 있는(1000명 이상) 서버에선 치명적입니다.
(블로킹 함수로 처리한다면 쓰레드는 1000개 이상이 되니 말이죠.)
그래서 등장한 것이 논 블로킹입니다.
2) 논 블로킹
이를통해 저희는 1:10000, 1:100000 을 처리할 수 있게 됩니다. 그것도 쓰레드 1개로 말이죠.
어떻게??
1. 1만명에 대한 소켓 정보를 운영체제에게 넘긴다.
2. 1만명중 3번과 100번, 2222번에서 데이터가 넘어왔다.
3. 운영체제는 데이터가 넘어온 것을 확인하고 해당 신호가 들어온 녀석들의 소켓정보를 핸들러에게 넘겨준다.
4. 쓰레드는 순차적으로 데이터를 읽어 처리한다.
5. 처리가 끝나면 함수는 종료된다.
5. 끝.....
위 예시를 대략적으로 이해하기 쉽게 썻습니다. 그리고 해당 작업은 epoll이나 IOCP의 내용입니다.
저렇게 처리하는 것이 멀티 플랙싱 방식이고요.
그리고 저렇게 클라이언트가 많아지게 된다면.... 쓰레드 하나로 모든 데이터를 처리하는 것이 힘들 것입니다.
그래서 Thread poll을 만들어 미리 Thread를 만들어 놓고, 작업량들을 분산해서 쓰레드들에게 처리하도록 맡길 수 있습니다.
3) 그럼 누가더 좋은가??
사실 Thread poll을 직접 만들고 한쪽 Thread에 몰린 데이터를 분석한다음 분산시켜주고, 이런 과정들은 상당히 Advanced한 일이고
이 글을 쓰는 저도 만들어보지 못한 것들입니다.
하지만 시대가 흐른만큼 굉장히 좋은 성능을 제공해주는 라이브러리들이 많이 있죠.
Thread poll만 하더라도 C++에선 task나 async내부에서 Thread poll만들어 관리하고,
Thread를 분산처리함에 있어선 openMP가 있습니다.
그러니 저와 같이 초보자 분들은 내용만 이해하고 넘어 갑시다.!!! ㅠ
2편에선 해당 내용과 관련된 멀티 프로세스, 멀티 쓰레드, 멀티 플랙싱에 대해 설명해보도록 하겠습니다.
'프로그래밍 > 컴퓨터 과학(CS)' 카테고리의 다른 글
2편] 멀티 프로세스, 멀티 쓰레드, 멀티 플렉싱에 대해서... (0) | 2020.09.08 |
---|---|
C++ 클래스와 구조체의 데이터 정렬(Data alignment) 왜 데이터 크기가 다르지? (1) | 2020.06.24 |
C++ false sharing이란?(거짓 공유) (9) | 2020.06.22 |
C++ 에서의 OOP의 개념에 대한 설명(Abstraction, Encapsulation, Inheritance, Polymorphism) (0) | 2020.06.21 |
Thread와 Process의 Context Switching (0) | 2020.06.05 |
댓글