Winsock c++ example
: 멀티 유저의 대응이 가능한 소켓 서버
- 기존 예제는 단순히 소켓의 연결 및 데이터 전달을 보여주기 위한 목적
- 곧바로 종료되기 때문에 상용서버로 응용하기 어렵다.
-> 기존 예제 클라이언트와 연동이 가능한 소켓 서버 구현
-> 스레드를 활용하여 어 개의 클라이언트와 동시 접속 가능
CPU 코어
CPU는 한 프로그램을 쭉 실행X
운영체제 스케쥴러가 프로그램 스위치하며 실행
프로세스 vs 스레드(Thread)
프로세스: 프로그램이 OS에 의해 메모리를 할당받아 실행중인 것
스레드: 프로세스 내에서 실제로 작업을 수행하는 주체
프로세스: 데이터+메모리+스레드
한글 실행 파일 => 프로그램(정적인 파일)
여러 개 실행 => 각각 프로세스(실행 중인 동적인 파일)
가장 큰 차이점은 프로세스는 서로 메모리 공유 X
같은 프로세스 내 쓰레드는 서로 메모리 공유
작업 관리자
프로세스는 여러 개의 스레드로 이루어질 수 있다!
왜 멀티 스레드??
문맥 교환때문
문맥 교환시간동안 Idle(유휴 시간)이 많음
멀티 프로세스 | 멀티 스레드 |
문맥교환 시간 때문에 Idle 시간 존재 -> 프로세스는 서로 메모리 공유 X |
문맥 교환 시간 X -> 스레드는 서로 메모리 공유 단, 동기화 문제 발생! |
병렬 작업이 가능한 경우 멀티스레드가 유리
멀티 스레드 동기화 문제
어떤 스레드가 먼저 작업을 종료할지 모름
피보나치의 n번째 항 Fn = Fn-1과 Fn-2이다
F3을 구하기 위해서는 F1과 F2를, F4를 구하기 위해서는 F3과 F2를 알아야 한다.
예를 들어서 F3을 쓰레드1, F4를 쓰레드2에서 계산한다고 생각해보자.
쓰레드2가 값을 계산하기 위해서는 F3의 값이 필요하다.
그런데 F3은 쓰레드 1에서 계산되고 있으므로, 쓰레드 1의 연산이 끝날 때까지 쓰레드 2가 기다려야 한다.
따라서 최종 실행 속도는 쓰레드 1에서 F3과 F4 모두를 계산하는 것과 차이가 없다.
스레드 중요 함수 목록(C++)
#include <trhead>
- 스레드 생성
std::thread t1; //t1 스레드 생성
std:: thread(...) //할 일 부여, 람다 사용 가능
ex) std::thread t1 = std::thread(func, 123,456)
ex) thread t1(func)
- join함수
t1.join //메인 스레드가 t1이 끝날 때까지 기다려줌
멀티 스레드
1~100000까지 더하는 일을 스레드 3개가
- 전역변수 x
- 스레드 안 쓰고 1~100000까지 구하는 시간과,
- 멀티 스레드로 1~100000까지 구하는 시간도 출력
실행할 때마다 결과 값이 다를 수 있음!
Race condition(경쟁 상태) ==> Mutext를 사용해서 해결!
Mutex = mutual exculsion(상호 배제) / 독점!!
ex) 화장실 잠금장치
std::mutex
쓰레드는 lock 호출이 성공한 시점부터 unlock을 호출 할 때까지 mutex를 소유
mutex의 문제! deadlock (교착 상태)
데드락이 꼭 발생하는 것은 X
하지만 발생한다면 엄청난 문제!
mutex의 문제! 어떻게 해결할까?
누군가에게 우선순위를 준다!
누군가는 계속 기다리기만 하는 문제가 생길 수 있다!
===> 기아 상태(starvation)
생산자- 소비자 문제
어떻게 스레드를 동기화 할 것인가에 대한 고전적인 문제
Buffer: 생산자, 소비자가 함께 공유
생산자 : 버퍼가 비어있으면 데이터 생성 후 버퍼에 넣음
소비자: 데이터가 있으면 버퍼에서 가져옴
식사하는 철학자 문제
5명의 철학자가 원탁에 앉아서 식사를 한다. 이들이 할 수 있는 건 명상, 그리고 식사다.
철학자 앞에는 스파게티와 양 옆 포크가 있다. 서로 이야기를 할 수 없다.
철학자는 양 옆 포크를 들었을 때만 식사를 할 수 있다.
이 때, 모두가 동시에 왼쪽의 포크를 든다면 아무도 스파게티를 멋지 못한 채 굶어죽는다.
서로를 무한정 기다리는 DEADLOCK
(어떤 경우는 식사를 못 하는 기아상태나, 어떤 철학자가 다른 철학자보다 먹는 횟수가 적을 수 있다)
1. 최대 4명의 철학자만이 동시에 식사를 할 수 있다.
2. 철학자가 두 포크를 모두 집지 못했을 경우 하나를 내려놓는다.
3. 비대칭 해결안(홀수 번호 철학자는 왼쪽 포크 먼저, 짝수는 반대로)
'학교 수업 > 컴퓨터네트워크' 카테고리의 다른 글
C#멀티 스레드 (0) | 2024.10.13 |
---|---|
스레드를 이용한 소켓 서버 (0) | 2024.10.13 |
네트워크 통신의 기초 (0) | 2024.10.09 |
네트수행평가 D-4 채팅 서버 기능 추가하기 (0) | 2024.10.09 |
유니티 클라이언트를 이용한 온라인게임 제작 (0) | 2024.10.07 |