메모리
- RAM
- 컴퓨터를 종료하면 데이터가 날아가는 휘발성 메모리
- 하드 디스크나 CD와는 달리 속도가 매우 빠르다.(데이터에 랜덤하게 접근할 수 있음)
- 컴퓨터는 대부분의 데이터들은 메모리에 보관해 놓고 작업을 한다. 틈틈이 하드디스크에 저장!
- ROM
- 컴퓨터를 종료해도 데이터가 날아가지 않는 비휘발성 메모리
- ex) CD-ROM, DVD-ROM, 하드디스크 => (데이터에 순차적으로 접근한다)
컴퓨터의 한 개의 메모리 소자는 0 혹은 1의 값을 보관할 수 있다. 이 이진수 한 자리를 가리켜 비트(Bit)라고 한다. 따라서, 1개의 비트는 0 또는 1의 값을 보관할 수 있다. 8bit = 1byte
8bit(1byte)로 나타낼 수 있는 최대의 수는 0 ~ 0xFF. 0부터 255로 총 256개의 수를 나타내게 된다.
컴퓨터에서 연산을 담당하는 CPU에는 레지스터(register)라는 작은 메모리 공간이 있는데 이곳에다가 값을 불러다 놓고 연산을 수행하게 된다. 예를 들어 a+b를 하기 위해서는 a와 b의 값을 어디다 적어놓아야지, a+b를 할 수 있는 것처럼 CPU에서 연산을 수행하기 위해 잠시 써놓는 부분을 레지스터라고 한다.
이러한 레지스터의 크기는 컴퓨터 상에서 연산이 실행되는 최소 단위라고 볼 수 있고, 이 크기를 워드라고 부른다.
1워드는 64비트, 즉 8바이트가 된다.
프로세스(Process)
1. 프로세스란?
- 프로세스(Process)란 실행중에 있는 프로그램(Program)을 말한다.
- 스케쥴링의 대상이 되는 작업(task)와 같은 의미로 쓰인다.
- 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드단위로 스케쥴링을 한다.
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 되는데 이 순간부터 프로세스라 불린다.
- 모든 프로세스는 각각 4G의 가상 주소공간(메모리공간X)을 부여받는다.
- 운영체제 약 2G, 나머지 약 2G 응용프로그램의 고유 영역
- 개발자는 이 가상주소공간 4G가 진짜 메모리인것 처럼 사용한다.
- 가상주소공간(virtual addres space) != 가상 메모리(virtual memory)
2. 가상주소공간
가상주소공간의 구조
- Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라간다.
- Data 영역 : 전역변수, static 변수의 할당
- Heap 영역 : 프로그래머의 동적할당을 위한 메모리 영역
- C언어 => malloc & free
- C++ => new & delete
- JAVA => new & Garbage Collector
- Stack 영역 : 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역
- page : 가상주소공간 4G를 4096byte(4K) 단위로 나눈 하나의 메모리 블록을 page라고 한다.
- 연산을 할 때는 값을 stack으로부터 레지스터로 가져오고 ALU로 넘겨서 연산을 수행한다. 연산 결과 값은 레지스터에 먼저 저장하고, stack영역에 재전달 한다.
- 레지스터의 스택포인터(SP)는 stack 프레임을 위해서 미리 공간을 확보한다.
virtual machine
- register based machine(연산결과를 레지스터에 저장)
- virtual stack machine(연산결과를 stack에 저장하고 이를 다시 heap으로 반환)
- 연산결과를 임시로 젖아하는 공간을 operand stack이라고 부른다.
- 인터프린터 언어는 heap에 데이터를 저장하고 연산은 레지스터 ALU에서 실행 후 실행 결과를 stack에 저장. 해당값을 heap에 전달하려면 다시 레지스터를 거쳐야 한다.
stack vs heap
- 가상주소공간 중 stack은 빠르고 heap은 상대적으로 느리다.
- stack은 그냥 데이터를 쌓지만 heap은 도중에 del등을 통해서 지울 수 있다. 빈공간이 생기면 그 곳에 새로운 데이터가 추가 된다.(spacial locality 보장이 어렵다)
- 또한, heap은 메타데이터 정보를 함께 저장한다. 따라서 더 많은 용량을 사용하며 할당시 매번 metadata에게 여분 공간이 있는지 묻기 때문에 상대적으로 느리다.
- heap의 최대장점
- 할당시점과 지우는 시점을 마음대로 저장할 수 있다.
- 프로세스 도중에 용량을 변경할 수 있다.(stack의 경우 프로세스 실행 전에만 변경 가능하다. 용랑이 넘치는 경우 stack overflow가 발생한다.)
3. 가상메모리
- 가상메모리 : 물리적인 RAM + 하드디스크
- page frame : 가상메모리(물리메모리 = RAM+페이징파일)를 4096byte(4K) 단위로 나눈 후, 그 한단위를 페이지 프레임이라 한다.
- 페이지 테이블 : 가상주소공간과 가상메모리를 매핑한다. 프로세스 별로 각각 하나씩 존재한다.
- RAM의 프레임이 모두 차있을 때, 추가 요청이 들어오면 RAM에서는 교체 알고리즘에 따라서 프레임 하나를
페이징파일
로 내리고, 새롭게 요청된 페이지에 비워진 프레임을 할당한다. - 가상메모리 운영방식 : LRU(least, recently, uses - 최근 최소 사용). 필요한것만 RAM으로 가져오고 안쓰는건 하드디스크에 내려놓는다.
4. 프로세스 스케쥴링
CPU는 하나인데 동시에 실행되어야 할 프로세스가 여러개??
=> CPU가 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다.
스케쥴링(Scheduling)
- CPU 할당 순서 및 방법을 결정하는 일.(어떤 프로세스를 running으로 보낼까?)
- 일정한 기준 : 스케쥴링 알고리즘을 통해서.
대부분의 OS에서는 우선순위(Priority algorithm) 알고리즘과 라운드 로빈(Round Robin) 알고리즘을 혼합해서 스케쥴링
5. 프로세스 상태변화
프로세스의 상태는 ready(준비), blocked(대기), running(실행) 상태가 있다.
생성(new) -> 준비(ready)
=> new 상태에서 프로세스가 생성되게 되면 OS 커널에 존재하는 Ready Queue에 올라가게 된다.
준비(ready) -> 실행(running)
=> Ready Queue에 있는 프로세스들을 OS가 위에서 말한 프로세스 스케쥴링 알고리즘에 의해서 Running 상태로 가야할 프로세스를 CPU로 할당하게 된다. 그러면 프로세스는 실행(Running)상태가 된다.
실행(running) -> 준비(ready)
=> 현재 running 상태에 있는 프로세스A보다 Ready Queue에서 대기하고 있는 프로세스 B 우선순위가 높으면, preemptive schedule(선점형)인 경우 프로세스A는 ready상태로 오게되고 프로세스B가 running상태로 가서 CPU를 할당받는다.
실행(running) -> 대기(blocked)
=> 현재 running 상태에 있는 프로세스A에서 입출력(I/O) 이벤트가 발생했을 때 프로세스A가 blocked상태로 가게된다.
대기(blocked) -> 준비(ready)
=> 입출력(I/O) 이벤트가 종료된 프로세스는 다시 Ready상태로 오게된다.
실행(running) -> terminate(종료)
=> 프로세스 종료
ready, blocked 상태에는 여러 프로세스가 존재할 수 있다.
하지만, 싱글코어CPU에서, running상태의 프로세스는 단 하나만 존재한다.
'임베디드 > [ Embedded ]' 카테고리의 다른 글
[ Embedded ] 05. Sampling Rate와 나이퀴스트이론 (0) | 2020.08.12 |
---|---|
[ Embedded ] 04. 화질과 해상도, 채널에 관하여 (0) | 2020.08.12 |
[ Embedded ] 03. 오디오코덱의 이해와 역사 (0) | 2020.08.12 |
[ Embedded ] 02. WDT(워치독 타이머)란? (0) | 2020.08.12 |
[ Embedded ] 00. 임베디드의 이해(LINUX 기반) (3) | 2020.08.12 |