1. 커널이 CPU의 점유를 관리하는 최소 단위가 스레드여서
단순한 이유
2. 운영체제에서 제공하는 비동기가 만만하지 않아서.
윈도우 기준으로 네이티브? 하게 제공되는 비동기는 Overlapped IO(스펠링 틀렸을 수 있음)임.
예는 함수를 호출하여 IO작업이 끝났는지, 진행 중인지 확인하는 방법으로 비동기를 제공함.
자 그러면 이 overlapped io를 별도의 스레드 없이 어떻게 GUI 프로그램에서 사용할 수 있냐면
두 가지임.
윈도우 메시지 수신을 폴링하는 방법
// 파일을 Overlapped로 열고 읽기를 위해서 시작
while(true)
{
if(PeekMessage( ... ))
{
DispatchMessage( );
}
else
{
if(GetOverlappedResult() == COMPLETE)
{
// 완료되었을 때의 처리
}
Sleep(0); // Polling 으로 인한 CPU 점유율을 낮춰야 함
}
}
타이머를 이용한 방법
while(GetMessage(...))
{
DispatchMessage(...);
}
LRESULT CALLBACK WndProc(...)
{
switch(msg)
{
case WM_TIMER:
{
if(GetOverlappedResult() == COMPLETE)
{
// 완료되었을 때의 처리
}
}
}
}
이런 식으로 일반적인 고수준 언어에서 제공하는 비동기와는 그 모습이 다름. 이런 경우에는 그냥 스레드를 생성해서 별도로 처리하는 것이 코드 보기가 깔끔함.
공채 면접때 면접관이 이거 물어본거에 개소리 하다 탈락한 기억이 나네요
Winapi 정복에서 배웠었음 - dc App
아하 이제야 명쾌하게 알겠네 ㄱㅅㄱㅅ 1. 비동기는 싱글스레드로 구현할 수 있다. 하지만 환경만 갖추어진다면 그렇게 할 필요가 없다(생각해보면 싱글스레드에서도 동시성 작업을 해왔었으니 불가능할 것도 없다) 2. 여건만 갖춰진다면 멀티스레드로 구현이 훨씬 낫다. 3. 비동기는 원자적?인 개념이 아닌 추상적?인 개념이다 4. 비동기는 멀티스레딩보다 편하게 작업하기 위함이며 스레드를 생성해서 작업하면 스레드를 생성하고 제거하는 오버헤드에 따른 손실이 따른다.
스레드 생성 오버헤드는 비동기랑 관련없고 보통 스레드풀을 만들어서 해결한다
어쨌든 비동기 컨텍스트 스위칭이 스레드풀에서 컨텍스트 스위칭 일어나는것보다 빨라서 잘 조합해서 쓰면됨
아 그럼 스위칭이 자주 일어나지 않고 연산이 지속되는 경우엔 병렬화를 하는게 유리한 거구나
ㅇㅇ 어차피 CPU 연산 빡세게하면 비동기로 짜도 연산끝날때까지 다른 루틴이 실행되지를 못함 그럴바엔 그냥 멀티스레딩으로 병렬처리하는게 더 간단함
해당 댓글은 삭제되었습니다.
윈도우에서 비동기 실행, 태스트 만들어서 실행시키는 거 os가 지원하는 게 뒤지게 많은데 뭔 스레드를 생성해서 어쩌고하고 이상한 소리 퍼트리는지 모르겠네