CS 지식(7)
-
프로세스, 스레드, 동기화
프로세스 실행 중인 프로그램을 프로세스라고 한다. 메모리 관점에서의 프로세스: 코드-데이터-힙-스택 영역과 레지스터 상태. 프로세스 상태 변화 new> ready: 프로세스 생성 ready> running: 스케줄러가 해당 프로세스를 Run 시킴 running > ready : 스케줄링 우선순위에서 밀렸거나 작업 완료 run > waiting: 프로세스가 I/O 진행 등의 이유로 블락됨. waiting> ready : I/O 종료 등의 이유로 블락이 해제됨. waiting> terminated : 프로세스 종료 컨텍스트 스위칭 실행 중인 프로세스 변경 시, 작동하는 절차를 컨텍스트 스위칭이라고 한다. 구체적으로, 현재 프로세스의 context(register set 등)를 PCB에 저장 실행될 프로세스의..
2023.05.10 -
캐시 메모리
캐시 메모리 캐시 메모리는 RAM의 느린 속도를 극복하기 위해서 등장한 메모리로, CPU 내부에 존재한다. 일반적으로 데이터를 로드할 때 캐시 메모리에 저장하는데, 이 때 그 데이터 뿐만 아니라 인접한 데이터도 같이 로드하게 된다. (64 바이트의 크기를 가지는 캐시 라인 단위로) 이는 어떤 데이터에 접근할 때 인접한 데이터 또한 접근할 확률이 높기 때문이다. 데이터 로드 시점에, 캐시 메모리에 이미 해당 데이터가 저장돼있어서 캐시에서 데이터를 로드한다면 이를 캐시 히트라고 하고, 아까와 같이 캐시 메모리에 저장되어있지 않아 메모리에서 로드하는 상황을 캐시 미스라고 한다. 캐시 히트 확률이 높다면, 로드하는 시간이 그만큼 줄어들기에 성능이 좋아진다. 그럼 캐시 히트를 자주 발생시키려면 어떻게 해야할까? ..
2021.11.08 -
메모리
가상 메모리 32비트 기준, 실제 메모리(RAM)와 가상 메모리의 공간은 4GB(2^32)이고, 이 중 절반인 2GB는 커널이 차지한다. 가상 메모리 속 커널 영역은 모든 프로세스가 공동으로 소유하고, 프로그래머가 접근할 수 없다. 프로그래머가 직접 제어하는 메모리는 RAM이 아니라, 프로세스마다 가지고 있는 가상 메모리이다. 가상 주소와 가상 메모리를 사용함으로써 프로세스마다 4GB의 메모리를 할당해줄 수 있다. (만약 4GB를 하드 디스크에 저장하고 현재 동작하는 프로세스의 메모리를 RAM에 올린다면, 4GB 선 할당해야하는 부담이 있을 것이고, 속도도 매우 느릴 것이다.) 아래의 그림은 앞으로 설명할 page, page table, TLB, MMU의 동작을 설명한다. Paging 가상 메모리와 물리..
2021.11.08 -
호출 규약
호출 규약이란 함수를 호출하는 방식에 대한 약속이다. 즉 함수를 호출하는 곳과 호출 당하는 곳, 이 둘이 함수 처리를 동일하게 하기 위해서 만들어진 것이다. 이것은 혼자 프로그래밍할때는 크게 중요하지 않지만, 콜백함수를 쓰는등 외부 API / 라이브러리를 사용할 때 알아두어야 한다. 여러가지 호출 규약들이 있는데, 이들은 인자 전달 방법(매체), 인자 전달 순서, Stack frame 정리 방법 에 따라 나뉜다. 인자 전달 방법은 함수를 호출할 때 어떤 공간으로 인자를 넘길 것인지를 말한다. stack 메모리에 저장하여 넘길 수도 있고, 레지스터 메모리에 넣어 전달하는 방법도 있다. 인자 전달 순서는 말 그대로 오른쪽에 있는 인자부터 전달할건지 왼쪽에 있는 인자부터 전달할건지를 말한다. 대부분 RTL (..
2021.10.25 -
endianness (엔디안)
메모리와 같은 1차원의 공간에 여러개의 연속된 대상을 배열하는 방법. 빅 엔디안 큰 단위가 앞에 옴. -> 최상위 바이트(MSB)부터 저장 리틀 엔디안 작은 단위가 앞에 옴. -> 최하위 바이트(LSB)부터 저장 x86 아키텍쳐를 쓰는 대부분의 PC들에서는 리틀 엔디안을 사용한다. 리틀 엔디안은 단순히 거꾸로 배열하는 것이 아닌, 데이터의 단위가 거꾸로 배열되는 것이다. 메모리에 저장된 값의 하위 바이트들만 사용할 때(int에서 16비트, 8비트 등을 가져올 때) 앞의 바이트를 빼서 활용할 수 있기 때문에 별도의 계산이 필요하지 않다는 장점이 있다. ex) 500이라는 값을 가진 int형 변수를 16비트로 변환하고 싶을 때, 그냥 변수 주소부터 두 바이트를 가져오면 됨. 하지만 빅 엔디안이라면 두 바이트..
2021.10.23 -
코드, 데이터, 힙, 스택 영역
프로그램이 실행되면 운영체제는 메모리에 공간을 할당해준다. 이 메모리 공간은 크게 4개의 영역(segment)으로 나누어진다. 위쪽 영역일수록 메모리 주소의 값이 작다. 코드 영역 데이터 영역 힙 영역 스택 영역 코드 영역 프로세스가 실행할 코드와 매크로 상수가 기계어로 번역돼서(컴파일돼서) 저장된 공간이다. 컴파일 타임에 결정되고, 중간에 코드를 바꿀 수 없기 때문에 ro (read-only) 공간이다. 레지스터 eip를 통해 읽으며 프로그램이 실행된다. 데이터 영역 전역 변수 또는 static 변수 등이 저장된 공간. 데이터 영역은 data segment, bss, rodata로 공간이 나누어진다. rodata 읽기 전용으로 초기화되는 영역 (const), 시스템 문자열 등 .bss (Block St..
2021.10.23