분류 전체보기 187

OS - 메모리 관리 기초

메모리 페이지의 상태 페이지의 상태는 Reserve/Commit/Free가 있음. Commit상태는 하드랑 RAM모두 포함한다. 힙 메모리를 할당받으면 해당 메모리 페이지가 Commit 상태가 되는 것. 처음에는 Free상태였다가 할당받으면 Commit 문제없지? 그러면 Reserve는 왜 필요할까? 그냥 나중에 할지도 모르니까 예약해두는거임. 이러면 다른 요청에 의해서 reserve된 페이지는 할당에서 제외시킴 . 페이지 할당 가상 메모리 시스템은 페이지 관리로 관리되기 때문에 페이지 중간부터 할당을 시작할 수 없고, 페이지 크기의 배수 단위 할당만 가능함. 그러면 메모리 할당 시작 주소는? 페이지 크기일까? => 아님, 그러면 메모리 파편화가 심해질 수 있음 그래서 더 넓은 값을 할당의 경계로 삼는다..

이론/기초 2023.08.13

OS - 쓰레드

컨텍스트 스위칭 프로세스와 마찬가지로 쓰레드도 컨텍스트 스위칭이 존재하는데, 프로세스보다는 훨씬 빠르다. 주된 이유는 캐쉬 메모리때문인데, 프로세스와 달리 쓰레드끼리는 스택영역을 제외한 메모리들을 공유하기 때문에 캐쉬 활용율이 높다. + 프로세스 전환에 비하여 일부 레지스터를 더 공유할 수 있긴 한데 이런 차이는 크지 않을 것. . 커널모드 유저모드 프로세스는 독립된 메모리 공간을 갖는데, 시스템 함수 등의 호출을 위해서 본인에게 할당받은 메모리 공간을 벗어날 필요가 있다. 이런 경우를 지원하기 위해 커널모드가 있으며, 커널이 실행되어야 하는 경우에 프로세스가 커널모드에서 돈다. 커널에 접근할 필요가 없는 경우라면 프로세스는 유저모드에서 돌고, 커널 영역으로의 접근이 차단된다. 그러나, 이런 모드 전환은..

이론/기초 2023.08.06

OS - 프로세스

프로세스 프로세스란? 프로세스는 실행 중인 프로그램을 의미한다. 프로그램을 실행하는 순간, 메모리 할당이 이뤄지고 이 공간으로 바이너리 코드가 올라간다. 이 순간부터 프로그램은 프로세스라고 불린다. . 프로세스의 구성 요소 메모리 프로세스의 메모리는 4가지 영역으로 구성된다. Data영역 : 전역변수나 static변수의 할당을 위해 존재 Stack영역 : 지역변수 할당과 함수 호출시 전달되는 인자들이 저장되는 영역. Heap영역 : 동적 할당을 위해 존재 Code 영역 : 실행파일을 구성하는 명령어들이 올라가는 영역. . 레지스터 셋(register set) 프로그램을 실행하면 CPU의 레지스터들이 해당 프로그램을 위한 데이터로 채워질탠데 이런 데이터 상태 또한 프로세스의 일부로 볼 수 있다. . 프로세..

이론/기초 2023.07.30

아스키코드 & 유니코드

문자의 표현방법 아스키코드는 1바이트임. 알파뱃+확장문자 해도 256개가 넘지 않으니까. 그런데 이러면 다른 영어가 아닌 언어들은 '곤란' 그래서 유니코드는 2바이트를 씀. 이러면 65536개 표현 가능. 문자셋에 대해 알아보자. 문자셋은 약속된 문자의 표현방법을 의미한다. SBCS, MBCS, WBCS로 나눌 수 있다. SBCS(Single Byte Character Set) : 모든 문자를 1바이트로 표현한다. 아스키코드가 대표적 WBCS(Wide Byte Character Set) : 모든 문자를 2바이트로 표현한다. 유니코드가 대표적이다. MBCS(Multi Byte Character Set) : 모든 문자를 '여러 바이트' 즉 어떤 문자는 1바이트로 어떤 문자는 2바이트로 표현하는 식이다. 이 ..

이론/기초 2023.07.23

컴퓨터 구조 기초 - 4

메모리 보통 메모리라고 하면 RAM을 생각하지만 CPU의 레지스터, 캐쉬, 하드디스크, USB등도 메모리라고 할 수 있다. . 메모리 계층 구조 일반적으로 메모리 계층을 레지스터 / L1 캐시 / L2캐시 / RAM / 기타 저장장치(HDD,SDD, 플래시 메모리) 위와 같이 구분할 수 있는데, 당연히 레지스터 접근이 가장 빠르다. 레지스터가 아닌 메모리에서 데이터를 입출력 하기 위해서는 메모리 버스를 거쳐야 한다. 그만큼 느리겠지? 메인메모리를 제외한 L1, L2캐쉬에 필요한 데이터가 존재할 확률은? 무려 90%이상! 물론 세팅마다 다르겠지만 어 그러면 그냥 캐쉬를 1테라 쓰면 안됨? ㅇㅇ 안됨. 너무 비싸고 기술적인 문제도있음 . 캐시 템퍼럴 로컬리티 (Temporal Locality) : 한 번 접..

이론/기초 2023.07.16

컴퓨터 구조 기초 - 3

스택 프레임 함수 내 선언된 변수는 스택에 할당됨. 함수 호출 과정에서 할당되는 메모리 블록(지역변수 선언 등으로 할당되는)을 가리켜 스택 프레임이라 한다. 스택프레임은 함수에 종속된다. 함수가 종료되면 스택프레임이 반환된다. . sp 레지스터 스택을 쌓기 위해서는 현재까지 저장한 데이터의 위치를 알아야겠지? 이를 기억하기 위해 CPU내에 sp(stack pointer)레지스터가 존재함. 스택 프레임이 반환되면 sp레지스터를 움직여야 하는데, 문제는 얼마나 움직여야 하는지를 모른다. 그래서 또 이를 기억하기 위해 프레임 포인터(FP)가 존재한다. . 프레임 포인터 스택프레임이 반환되면 sp를 fp위치로 맞추면 그만임. 그럼 fp값들은 어디에 보관? 함수가 호출되면 그때 스택에 fp값을 저장함. 반환될 때..

이론/기초 2023.07.09

컴퓨터 구조 기초 - 2

레지스터 크기와 명령어 16비트 컴퓨터가 있다고 가정하자. 그러면 레지스터 사이즈도 16비트인 게 좋을 것이다. 그리고 16비트의 레지스터 r0~r7이 있다고 하자. 명령어 역시 레지스터 크기와 같아야 좋으니까 16비트라고 하자. 자 그럼 16비트로 어떻게 명령어를 구성할 것인가? 명령어의 종류가 8개인 컴퓨터라고 가정하자. 명령어가 8개이니까 이 모든 명령어를 식별하기 위해서는 3비트가 필요하다. 사칙연산 만들어보기 사칙 연산을 예로 들어 보자. A = B+C 를 의미하는 명령어를 구현하고 싶다. 어떻게 해야 할까? 우선 '덧셈'이라는 명령에 해당하는 id가 있을 것이다(3비트) 그리고 B+C의 값을 저장할 레지스터가 필요하다. 대충 레지스터도 r0~r7까지 8개가 있다고 하자. 레지스터의 주소를 구분..

이론/기초 2023.07.01

컴퓨터 구조 기초 - 1

CPU ALU, 레지스터, 컨트롤 유닛, 버스인터페이스 로 구성. ALU는 산술연산+AND/OR 논리연산을 수행 컨트롤 유닛은 CPU가 처리해야 할 명령어를 해석하고 적절한 신호를 CPU의 다른 블록에 준다. 레지스터 셋은 CPU가 연산을 하는데 필요한 데이터를 임시적으로 저장할 메모리 공간. 버스인터페이스는 하드웨어 장치끼리 데이터를 주고밭는 매개체가 I/O 버스. 이런 버스의 프로토콜을 이해하는 것이 이 인터페이스. 클럭 펄스(Clock Pulse) : CPU는 이 클럭신호에 맞춰서 일을 함. 왜? 동기화 하려고. 프로그램의 실행 과정 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행 전처리기 : #define같이 #으로 시작하는 지시자의 지시에 따라 소스코드를 변경한다. 컴파일러 : 소스코..

이론/기초 2023.06.25

N번째 난수 값 얻어오기

문제 어떤 난수생성기가 있다고 가정하자. 이 난수 생성기로부터 N번째에 있는 난수를 얻고 싶다. 어떻게 해야 할까? 아니 애초에 위와 같은 상황은 무엇일까? 당신이 랜덤한 스테이지 A,B,C,D를 만든다고 가정하자. 한 스테이지는 1000개의 난수 시퀀스를 필요로 한다. 어떤 난수 생성기가 생성한 1001~2000번째의 난수를 이용해 A스테이지를 만들었다. 그리고 2001에서 3000까지의 난수를 이용해 B스테이지를 만들었다. 이때 B스테이지에 있던 유저가 다시 A스테이지로 돌아갔다고 하자. 아니면 4001에서 5000번째까지의 난수를 필요로 하는 D스테이지로 곧바로 들어간다면? 과거에 생성했던 난수 시퀀스를 어딘가에 저장해 둔다거나 혹은 0번째부터 다시 Next()를 호출하며 목표로 하는 시퀀스까지 도..

이론/일반 2023.06.18

(협업) Unity Accelerator - 임포트 시간 단축

에셋 임포팅 에셋 데이터는 CPU GPU등의 하드웨어에서 즉시 쓰일 수 있는 포맷일 필요가 있다. 그러나 대부분의 파일 포맷은 저장공간을 최소화하도록 되어있다.(압축) 따라서 유니티는 저장공간에 있는 데이터를 에셋 데이터로 컨버전 한다. 그리고 이렇게 변환된 에셋 데이터는 라이브러리 폴더에 캐싱된다. 이 과정을 에셋 임포팅이라 한다. 문제는? 근데 에셋 임포팅은 오래 걸림. 변경이 많으면 많을수록 더 오래걸린다. 만약 아예 모든 에셋을 임포트 해야 하는 상황이거나 플랫폼을 바꿔야 하는 경우라면 더욱 더 오래걸린다. 그러면 이걸 어떻게 해결할까? 임포트된 에셋 데이터는 라이브러리에 캐싱된다. 따라서 팀내에서 라이브러리 폴더를 공유할 수 있다. 플랫폼 스위칭 같은 경우를 대비하여 플랫폼별로 라이브러리 폴더를..