운영체제 15

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 스마트 포인터

A. 스마트 포인터1. 멀티스레드와 스마트 포인터a. 객체 포함 레퍼런스 카운트 블록💥 일반 포인터를 사용하면 안되는 이유주소값을 진짜 사용해도 되는지 안되는지에 대한 정보가 없어서 포인터를 그냥 들고있으면 생명 주기가 꼬여서 날라가고... 난리남 그래서 레퍼런스 카운트를 사용해 주소값을 관리하게 됨 객체에 포함, 레퍼런스 카운트를 관리하는 블록 2가지로 만들 수 있음 1) 객체에 포함하는 refCount    위 순간 주소값을 기억하는 애가 하나 증가함위와같이 카운팅을 쳐서 관리하는 방법이 있음 (수동 레퍼런스 카운트) 위를 멀티스레드 환경에서 작업할 시 알아야 할것 => 증감연산자 -> 아토믹으로 해결  여기서 아토믹만 붙인다고 끝? -> 스마트 포인터를 사용해야 함  위는 멀티스레드 환경에서만 위..

운영체제 2024.12.05

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 이벤트와 조건 변수

A. 이벤트와 조건 변수1. 이벤트 (승무원부탁)a. 사용하게 되는 이유매니저에 접근할때 락을걸로 작업하면 됨 스레드를 이리저리 배치해서 운영하면 생성, 소모에 따라서 배치를 하게 됨  먼저 mutex 생성일감은 queue에 넣어주기  sleep_for는 얼마만큼 쉬어야 하는지를 나타냄  반대로 producer와 반대로 일함정보가 들어있으면, 꺼내서 출력하기  나중엔 위 방식에서 네트워크 통신을 잡아서 넣어주게 됨 위 방식에서 아쉬운건 락을 걸고 어떤 행위를 하고 있음 데이터가 없어도 스핀락처럼 계속 우회하고 있음 👉 해결방법은 스핀락, 위에서 사용한 sleep_for, 승무원한테 부탁하기 승무원한테 부탁하는건 이벤트를 활용하는 것임 b. 이벤트 :: 커널 오브젝트 🌟 커널 오브젝트 ::  운영체제가..

운영체제 2024.12.04

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 락 기초, 스핀락, 데드락

A. 락 기초 1. 락 기초a. 시작하기전에...1) 아토믹 복습 모든걸 아토믹으로 바꾸면 해결이 될까 원자적으로 묶어주는건 정수 하나! 정도 정말 많이 할 순 없음 2) stl 컨테이너의 앙탈 위를 실행시키면 크래시가 난다이유는 벡터같은 stl 컨테이너들은 멀티스레드로 동시다발적으로 실행하면 무조건 크래시 동적으로 할당한 영역은 heap 에 배치되는데멀티스레드에서는 동시다발적으로 사용하기 때문에 누가 값을 날려버려 크래시가 난다  이사비용을 줄이기위해서  reserve함수를 사용해 미리 확대해놓고 사용한다면 이상한 값이 나옴하나의 주소를 여러명이 사용하고 있기 때문에 (덮어써짐) 그럼 따라서 위와같은 벡터를 사용한다면 락을 잘 사용해야함 b. 락이란?일련의 코드드를 묶어줘서 다른 코드가 접근하지 못하게..

운영체제 2024.12.03

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 공유자원

A. 공유자원1. 공유자원실습a. 공유자원 생성멀티쓰레드를 공부할 떄 항상 배우는 예제가 있음  위 두개의 함수를 스레드의 자원으로 활용한 스레드를 메인에 생성해주고 둘다 조인으로 종료, 결과값은? => 결과값이 작으면 0, 100만번 하면 ??? 여기서 전역변수로 만들어진  sum이라는 변수가 데이터 영역에 들어감 (공유됨)  ++을 의사코드로 작성하면 위와 같이되는데 멀티스레드로 작동되고 있다고 생각하면 이해됨 (흑마법)Sum을 공유하고 있기 때문에 코드가 동시 다발적으로 끼어드니까 이런 문제가 발생됨 또 지역변수인(stack 에 저장) i를 다른코드로 밀어준다면 어떻게 될까? => 밀어짐 b. 아토믹 아토믹으로 실행하면 정상적으로 작동됨아토믹이 되면, 좀 더 복잡해지지만 다른 어셈블리어로 실행해줌 ..

운영체제 2024.12.03

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 캐시와 CPU 파이프라인

A. 캐시와 CPU 파이프라인1. 캐시a. 캐시 기초컴퓨터 구조 원리 : 캐시  레드 : cpu 노란색 : 메모리전기가 아무리 빨라도 물리적으로 좀 멀어보임 (데이터 낭비) 따라서 캐시를 사용함 b. cpu의 캐시관리 레지스터는 cpu의 손발아래 캐시들은 단기기억장치 (서빙할 때 메모장 같은 것)  c. 캐시 철학 물리적으로 모든 데이터를 가져오지 않고잠시 기억해두는것! ==> 이것이 캐시  d. 캐시 실습접근하는 비용이 얼마나 걸렸는지 테스트하기  버퍼를 하나 생성하고 GetTickCount64로 시간을 재고반복문을 사용해 버퍼에 넣어주기 그럼 버퍼에는 캐시가 [a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] 이런식으로 저장되게 되는데  위와 같은 코드지만 추가로 j,i를 ..

운영체제 2024.12.03

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 쓰레드

A. 쓰레드1. 쓰레드 실습a. 기초 쓰레드 생성쓰레드를 만들어서 사용하는 연습하기않이 겁나 열심히 만들어서 쓰고있었는데 갑자기 다 날라갔다 새로운 쓰레드를 만들어보자   메인에서 std::thread t(HelloThread) 실행위 코드를 실행하면 스레드를 하나 더 만들 수 있음Hellothread()인자가 있어야 실행됨 💥 위 코드를 실행하면 오류가 발생된다이유는 메인 스레드가 원래 존재하는데,새로운 쓰레드가 생성되고 종료되기도 전에 메인이 종료되어서 그럼따라서 아래와 같이 작성  t.join(); 을 사용하면 종료된 쓰레드를 모아주는 역할을 한다 (끝난지 확인? 정도)joinable()을 사용해서 이중체크를 해도 되는데 안해도됨    ✨ 근데 여기서 알아둬야할게 있음스레드를 이렇게 임의로 생성해..

운영체제 2024.12.02

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 멀티쓰레드 입문 (116강)

A. 멀티쓰레드 입문1. 쓰레드a. 쓰레드란?🌟 스레드 : 직원같은 개념 정확하게 알려면 운영체제를 깊게 공부해야함  쓰레드를 설명하는 그림인데, 영혼을 로봇에 주입해서 운영한다고 하면 됨영혼을 아주 빠르게 로봇들한테 영혼을 주입시킨다 b. 프로세스와 스레드의 차이프로세스는 프로그램 그 자체를 말함 알아서 동작하는게 아니고 하나의 껍질이라고 보면 됨 👉 쓰레드가 프로그램을 실행시키는 주체라고 볼 수있음  c. cpu 운영 옛날에는 코어가 하나밖에 없어서 영혼이 한개밖에 없었음그 영혼을 관리하는게 운영체제 Cpu에서는 이렇게 하나씩 쓰레드에 먹이를 먹여가면서 실행하게 된다 d. cpu의 코어가 여러개면?멀티코어 프로세서라고 함 / 다수의 스레드를 실행시킴  Cpu 의 성능이 좋아지는데  물리적인 한계가..

운영체제 2024.11.18

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 서버 (115강)

A. 서버 OT1. 서버a. 서버란 무엇일까?🌟 다른컴퓨터에서 연결이 가능하도록 상시 대기(실행) 중인 프로그램  마치 식당과 같다 실제로 (서버 C / 컴퓨터 / 프로그램) 3가지를 말할 수 있는데 게임 프로그래머는 프로그램을 서버라고 말함 2. 게임 서버의 종류a. 웹 서버 질의/응답 형태 (테이크아웃 식당) 드물게 정보를 요청/갱신하는 경우실시간 상호작용이 필요없는 경우손님이 요청하는 경우에만 일을 실행한다= 상태가 없기때문에  stateless서버라고도 하기도 함 처음부터 게임으로 만들어진게 아님 (홈페이지용 서버임)프레임워크 하나를 골라서 사용 (자바 - 스프링, 자바스크립트 등) b. 게임 서버 실시간 상호작용 (일반 식당) 언제라도 직원이 손님한테 접근이 가능해야 함Stateful서버 처음..

운영체제 2024.11.18

[게임 프로그래머 입문 올인원] Windows API 입문 : 리소스 매니저 (93강)

B. 리소스 매니저 1. 리소스 매니저 만들기 a. 리소스 파일 만들기 b. LineMesh 생성하기 📁 04.Resources > 📁 Game > 📄 LineMesh.cpp c. ResourceMan ager 생성하기 무언가를 들고있을 용도로 사용하는거라 update는 필요없음 d. Game.cpp 코드에 Resource 추가하기 이 코드까지 실행하면 ResourceManager가 mesh코드를 잘 받아오는 걸 알 수 있음 e. Player가 ResourceManager을 사용할 수 있게 하기 출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%..

[게임 프로그래머 입문 올인원] Windows API 입문 : 리소스(92강)

A. 리소스 1. 리소스 실습하기 플레이어가 원모양이고 너무 지루하니 소스를 가져와서 넣어보자 맵툴은 나중에 I'm GY를 사용할것임 a. EditScene 생성하기 그림을 그리는 툴인 EditScene을 생성 b.EditScene 테스트하기 위에서 생성한 EditScene을 테스트하기 위해 개발환경을 바꿔준다 위에서 생성한 툴을 가지고 비행기를 만들어서 리소스로 넣어줄 것임 c. 파일 입출력 실습하기 : fstream 다양한 파일 입출력 기능이 있지만 이번엔 을 사용해 실습 1) 저장 2) 로드 위와같이 저장할 떄 기준점을 어디다가 맞춰야 하는지 문제가 생기는데 대부분 플레이어의 발을 기준으로 맞추게 됨 여기서는 가장 큰 값과 작은값의 중간을 맞춰서 해볼예정 3) 기준점 좌표 만들기 a) 저장 b) 로..