컴퓨터 구조
폰 노이만 구조
CPU
- 수학적 계산, 산술 연산 + 레지스터
- 메모리에 있던 명령들이 올라와 연산하게 됨
- CPU는 한번에 한가지 동작밖에 하지 못하는 바보이다
- CPU는 대신 엄청나게 빠른 속도로 두 가지 일을 번갈아 한다. 이것을 Context change 라고 부른다.
- CPU는 프로세서라고도 부른다.
Memory
- 컴퓨터의 저장공간
- 크게 커널영역과 유저영역으로 나뉜다.
- 컴퓨터의 메모리를 관리하는 일은 운영체제가 하는 여러 일들 가운데서도 가장 중요한 것들 중 하나 이다.
- 운영체제는 컴퓨터에서 실행되는 여러가지 프로그램들이 동시에, 효율적으로 실행되도록 하기위해서 메모리를 관리한다.
- 프로그램의 모든 데이터를 메모리에 한꺼번에 올릴 수 없기 때문에 일부분이 올라오게 되고, 일부분은 다시 내려가게 된다.
- 컴퓨터에서는 한 개의 프로그램이 아닌, 여러 프로그램이 동시에 실행되기 때문에 어떤 프로그램에 어떤 데이터를 적재시킬지가 관리 대상이 된다. 이것을 메모리 관리 교체 알고리즘이라고 한다.
메모리 구조
사진 출처 - https://hdacker.tistory.com/6
- 유저영역은 다시 스택영역, 힙영역, 데이터영역, 코드영역으로 나뉘며, 유저영역을 제외한 영역을 커널영역이라고 한다.
- 커널 영역에는 커널이 존재하며, 커널은 컴퓨터 운영체제의 핵심이라고 할 수 있다.
메모리의 유저 영역과 커널 영역
- 메모리는 유저영역과 커널 영역으로 나뉜다.
- 이것은 사용자가 OS를 건들여 컴퓨터에 오류나 손상을 가하는 것을 막기 위해서이다.
- 그래서 해커들은 유저 영역 밖의 기능들을 조작하는 것이다.
- 대부분의 OS들은 사용자가 다룰 수 있는 유저 영역과 OS만을 위한 영역인 커널영역을 나눠 컴퓨터를 관리한다.
코드 영역
- 코드영역은 말 그대로 시스템이 알아들을 수 있는 명령어가 저장되는 영역으로 CPU가 코드영역의 데이터를 수행할 때 하나의 명령어만을 수행하는 형태로 되어있다.
데이터 영역
- 데이터영역은 전역 변수(Global Variable)와 정적 변수(Staticariable)가 저장되는 영역이다.
- 데이터영역은 다시 초기화된 데이터영역과 초기화되지 않은 데이터영역으로 나눌 수 있는데 초기화되지 않은 데이터 영역을 BSS(Block Started by Symbol)영역이라고 한다. BSS영역이 데이터영역보다 더 높은 주소에 위치한다.
(위 그림에서는 따로 BSS영역과 데이터영역을 구분하지 않았다.)
힙 영역
- 힙영역은 동적할당된 변수가 저장되는 영역이다.
- 동적할당이란 필요한 크기만큼 만들어 놓는 스택영역과 달리 프로그램이 실행되는 도중에 메모리를 할당하는 것을 말한다. 동적할당 시 포인터가 저장되는 곳은 스택영역이다.
- 동적할당을 하게 되면 메모리 사용 후 동적할당 해제가 필요한데 만약 해제하지 않는다면 메모리가 부족해져 메모리 누수(memory leak)가 발생할 수 있다.
스택 영역
- 스택영역은 함수(프로시져)내에서 지역변수(Local Variable)와 매개변수(parameter)가 저장되는 영역이다.
- 스택영역이 처음 생성될 때(함수가 실행될 때) 필요한 크기만큼 만들어지고, 데이터를 저장해 나간다. (C언어에서 변수 선언 시 변수명앞에 자료형을 써주는 것을 생각한다면 쉽게 이해할 수 있다.)
- 또한 스택영역은 지역변수가 저장되는 영역이기 때문에 함수가 끝나게 되면 스택영역은 소멸된다.
- 스택영역은 다른 영역들과 달리 높은 주소에서 낮은 주소로 자라나는 형태를 가진다.
- 이러한 이유는 스택영역이 운영체제의 핵심인 커널영역을 침범할 수 없기 때문인데 이렇게 된다면 스택영역이 엄청나게 커지더라도 커널영역을 침범하지 않게 된다.
- 다른 이유는 스택영역과(높은 주소에서 낮은 주소로) 힙영역(낮은 주소에서 높은 주소로)이 공간을 공유하면서 사용하게 되면 공간을 효율적으로 사용할 수 있기 때문이다.(위 그림을 보면 쉽게 이해할 수 있을 것이다.)
- 스택영역은 후입선출, LIFO(Last In First Out) 구조를 가지는데 말 그대로 가장 마지막에 들어간 것이 가장 먼저 나오는 것을 의미한다.
예시를 들면 신문을 쌓아놓고 판매하는 곳이 있다면 구입해 가는 사람들은 맨 위에 있는 신문부터 가져가는 것과 같다.
- 스택영역은 PUSH와 POP 명령을 통해 작동하는데 PUSH란 스택영역에 데이터를 집어넣을 때 사용되며, POP은 스택영역에서 데이터를 꺼낼 때 사용된다.
사진 출처 - https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D
DISK
저장소
I/O
입출력 기계
컴퓨터에서 컴퓨터 언어를 통해 생성한 파일이 실행되는 과정
개발자들은 소스나, 툴을 통해서 개발을 하게 되며 컴파일이라는 과정을 통해 실행 파일이 만들어지게 된다.
- 컴퓨터 언어는 컴퓨터가 바로 이해할 수 없기 때문에 실행할 수 있는 파일(바이너리 파일)로 바뀌게 되는데 이 과정을 컴파일이라고 한다.
- 디스크에 저장된 실행 파일의 구성은 코드부와 리소스로 구성이 되어 있다.
- 개발자가 만든 기능들이 바이너리 파일로 만들어질 때 일부는 코드부, 일부는 자원을 담게 된다.
- 바이너리 파일의 코드 중의 일부가 메모리로 올라오게 된다. 그 때 필요한 리소스도 참고하게 된다.
- 명령어들 중에 일부 처리할려고 하는 명령어가 CPU에서 해당하는 명령어를 처리하게 된다.
- 이 때 파일로 저장되있던 프로그램이 메모리로 올라가는 순간을 프로세스라고 한다.
- 컴퓨터에는 수많은 프로세스들이 존재한다.
- 우리가 동시에 실행되고 있다고 느끼는 프로세스들은 사실 동시에 실행되는 것은 아니다.
- 하나의 프로세서는 여러 프로세스들에게 빠른 속도로 돌아가면서 할당된다.
- 여기서 어떤 프로세스에게 먼저 할당될지 순서를 정하는 것을 CPU 스케줄링 이라고 한다.
- 선점형 방식 : 우선 순위가 높은 프로세스부터 할당
운영체제의 역할
- CPU의 스케쥴링, 메모리의 관리, 디스크의 관리를 하는 것이 바로 운영체제(OS)이다.
- 운영체제의 역할은 하드웨어, CPU, 메모리, 디스크를 잘 동작하게 하는 역할
- 여러가지 프로그램들이 동시에 최적의 성능을 낼 수 있게끔 메모리나 CPU를 사용해서 프로그램이 구동될 수 있는 역할을 한다.
<참고>