251031

lililllilillll·2025년 10월 31일

개발 일지

목록 보기
341/350

✅ 한 것들


  • 게임 서버 프로그래밍 교과서
  • 백준


📖 게임 서버 프로그래밍 교과서


1장 멀티스레딩

1.1 프로그램과 프로세스

프로그램 : 코드 + 데이터
프로세스

  • 프로그램 실행하면 그 안의 명령어 한 줄씩 실행되면서 활동하는 상태
  • 코드, 데이터, 힙, 스택 영역

1.2 스레드

스레드 : 프로세스처럼 명령어 한 줄씩 실행하는 기본 단위

  • 프로세스 안에 스레드 여러 개
  • 같은 프로세스면 스레드끼리 메모리 공간 공유
  • 스레드마다 스택 가짐. 함수 로컬 변수는 스레드마다 있다는 의미.
  • 스레드 간의 실행 순서는 기본적으로 랜덤
  • 자식 스레드보다 메인 스레드가 먼저 종료되면 자식은 좀비 됨

호출 스택

  • 프로그램은 서브루틴 혹은 함수로 구성됨
  • 함수는 실행 끝나면 호출됐던 지점으로 되돌아가야 함
  • 그 정보가 저장된 곳을 call stack(호출 스택)이라 함
  • 호출 스택 안에는 각 함수 지역 변수도 들어있음
  • 함수, 인자, 메모리까지 다 동일해도 실행 지점은 약간 차이 생길수도 있다
  • 따라서 각 스레드는 각자의 호출 스택을 가진다

std::thread() : 모던 c++의 쓰레드 생성 (운영체제 통일)

1.3 멀티스레드 프로그래밍은 언제 해야 할까?

대표적 상황

  • 오래 걸리는 일 하나와 빨리 끝나는 일 여럿을 같이 해야 할 때
  • 어떤 긴 처리를 진행하는 동안 다른 짧은 일을 처리해야 할 때
    • 디스크 처리 결과 기다릴 때 서버 CPU 놀지 않게 다른 플레이어에게 배분
  • 기기에 있는 CPU를 모두 활용해야 할 때
    • 기본적으로 스레드는 코어를 1개만 씀

1.4 스레드 정체

컨텍스트 스위치

  • 컴퓨터는 여러 프로세스와 그 안의 스레드를 일정 시간마다 번갈아가며 실행
  • 연산량 많음 : 스레드 상태(call stack 등)을 저장 → 과거 실행하던 스레드 중 선택 → 스레드 복원 → 실행 지점 강제 이동
  • 사람이 쾌적하게 느낄만한 타임 슬라이스. 보통 0.5밀리초 안에 스레드 하나 전환.
  • Runnable 스레드 개수가 CPU 개수 이하면 컨텍스트 스위칭 발생 이유 없음
  • 컨텍스트 스위치는 기계어 명령어 단위로 일어남. 한 줄 구문 안에 있는 거 실행하다 컨텍스트 스위칭 가능.


⚔️ 백준


1981 배열에서 이동

void B1981::Solution()
{
	int n;
	cin >> n;
	vvi arr = vvi(n, vi(n));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> arr[i][j];
		}
	}

	vvp cache = vvp(n, vp(n, { -1,201 }));
	queue<vi> q;
	q.push({ 0,0,arr[0][0],arr[0][0] });
	cache[0][0] = { arr[0][0],arr[0][0] };
	int i, j, mx, mn;
	pii dirs[] = {{1,0},{-1,0},{0,-1},{0,1}};
	while (!q.empty())
	{
		vi f = q.front(); q.pop();
		i = f[0], j = f[1], mn = f[2], mx = f[3];
		if (cache[i][j].second - cache[i][j].first < mx - mn) continue;

		for (pii dir : dirs)
		{
			int newi = i + dir.first;
			int newj = j + dir.second;
			if (newi < 0 || n <= newi|| newj < 0 || n <= newj) continue;

			int newmn = min(arr[i][j], mn);
			int newmx = max(arr[i][j], mx);
			if (cache[newi][newj].second - cache[newi][newj].first <= newmx - newmn) continue;

			cache[newi][newj] = { newmn, newmx };
			q.push({ newi,newj,newmn,newmx });
		}
	}
	cout << cache[n - 1][n - 1].second - cache[n-1][n-1].first;
}

1% 틀.
뭔가 문제를 완전히 잘못 생각하고 있는듯? 내일 다시.



profile
너 정말 **핵심**을 찔렀어

0개의 댓글