컴퓨터 시스템
하드웨어, 운영체제, 응용프로그램 등으로 구성되며, 이 3개의 요소들은 계층 관계를 형성한다.
이 계층 관계는 중요한 특징을 보인다.
1. 하드웨어들은 전부 운영체제에게 배타적이고 독점적인 지배를 받는다.
2. 사용자는 응용프로그램이나 운영체제가 제공하는 도구 프로그램을 통해 컴퓨터를 활용한다.
3. 사용자와 응용프로그램은 직접 하드웨어에 접근할 수 없고, 반드시 운영체제를 통해서 접근 가능하다.
운영체제의 본질적인 특징
=> 사용자가 하드웨어에 대한 내용을 잘 몰라도 컴퓨터를 사용할 수 있도록 하드웨어를 사용자로부터 숨겨주는 것이다.
컴퓨터 하드웨어
CPU
- 중앙처리 장치로, 메모리에 적재된 프로그램을 실행한다.(하드디스크x 메모리에 적재된 것만o)
메모리
- 실행하려는 여러 프로그램의 코드, 데이터가 적재되고, 프로그램 실행 중 발생하는 데이터들이 임시로 저장된다.
- 프로그램이 실행되기 위해서는 반드시 메모리에 로딩되어야 한다.
캐시 메모리
- 메모리보다 훨씬 빠른 기억장치로, 가격이 비싸기 때문에 메모리보다는 용량이 적다.
- 캐시 메모리가 있는 컴퓨터에서는 프로그램 코드와 데이터가 먼저 메모리에서 캐시메모리로 이동된 후에 CPU가 실행할 수 있다.
버스, 시스템 버스, I/O 버스
- Bus란 컴퓨터 하드웨어들이 상호 정보를 주고받기 위해 0,1로 이뤄진 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어이다.
- 신호의 종류에 따라 주소 버스(address bus), 데이터 버스(data bus), 제어 버스(control bus) 로 나뉜다.
- 여기서 주소란 메모리나 입출력 장치 내 레지스터에 대한 번지이며, CPU는 메모리나 입출력 장치에 값을 읽고 쓰기 위해 주소를 발생시킨다.
- 시스템 버스는 CPU, 메모리 등 핵심 하드웨어 사이에서 빠르게 신호를 전송하기 위한 버스이다.
- I/O 버스는 그에 비해 상대적으로 느린 입출력 장치들의 정보를 싣기 위한 버스이다.
I/O Controllers & system control circuits
- 입출력 장치를 제어하기 위한 하드웨어이다.
CPU와 메모리의 관계
32비트 CPU란?
- 32개의 주소 선과 32개의 데이터 선을 가진 CPU
- 즉 CPU가 액세스 할 수 있는 주소의 범위는 0 ~ 2³²-1번지
- 액세스 할 수 있는 최대 메모리의 크기는 2³²바이트 = 4GB(1 번지 크기 당 1 바이트)
32비트 CPU 컴퓨터가 장착할 수 있는 메모리의 최대 크기는 4GB이다.
- 4GB이상의 메모리를 설치해도 32비트 CPU가 접근할 수 없다.
- 프로그램을 아무리 크게 작성해도 활용할 수 있는 메모리는 4GB를 넘을 수 없다.
- 32비트 운영체제? 32비트 CPU를 장착한 컴퓨터에서 32비트 주소체계로 관리하는 운영체제
명령어(instruction)
CPU가 해석하고 실행할 수 있는 기계 명령어로, CPU(설계 기업)마다 명령어의 개수와 형태가 다르다.
ex)
어셈블리어 | 기계어 코드 | 설명 |
mov ecx, 51; | b9 33 00 00 00 | ecx 레지스터에 51 저장 |
add ax, 8; | 83 c4 08 | ax 레지스터에 8 더하기 |
push ebp; | 55 | ebp 레지스터의 값을 스택에 저장 |
call _printf; | e8 00 00 00 00 | _printf 함수 호출 |
ret 0; | c3 | 이 함수를 호출한 곳으로 리턴(0값과 함께) |
명령어 처리 과정
프로그램은 반드시 메모리(or 캐시메모리)에 올라와야 CPU가 실행 가능하다.
그러므로 CPU가 명령어를 실행하기 위해서는 실행할 명령어를 메모리로부터 가져오는 작업부터 시작한다.
CPU 레지스터 종류
PC(Program Counter) | 다음에 실행할 명령어의 메모리 주소를 저장하는 레지스터, IP라고도 부른다. |
IR(Instruction Register) | 현재 실행하기 위해 메모리부터 읽어온 명령어를 저장하는 레지스터 |
SP(Stack Pointer) | 스택의 top메모리 주소를 저장하는 레지스터 |
Data Registers | 연산에 사용될 데이터들을 저장하는 레지스터들 |
다음 명령을 사례로 들어 명령어가 처리되는 과정을 자세히 알아보자.
mov eax, [300]; //메모리 300번지의 값을 읽어 eax 레지스터에 저장
1. CPU는 현지 PC레지스터가 가리키는 주소(100번지)를 주소 버스에 싣는다.
2. 메모리는 해당 주소의 명령(데이터)을 데이터 버스에 싣는다.
3. CPU는 데이터 버스에 담긴 이진 값들은 IR레지스터에 저장하고, PC는 다음 번지(104번지)로 수정된다.
4. CPU는 명령을 해석하고 필요한 데이터를 읽기위해 데이터의 주소(300번지)를 주소 버스에 싣는다. (만일 명령 속에 데이터가 있다면 데이터를 읽어오는 5, 6 과정은 생략한다.)
5. 메모리는 300번지에 저장된 50을 데이터 버스에 싣는다.
6. CPU는 데이터 버스로부터 50을 임시 데이터 레지스터에 저장한다.
7. 명령을 실행한다. 명령을 실행하면 50을 eax 레지스터에 저장한다.
8. 필요에 따라 명령 실행의 결과 값을 다시 메모리에 저장한다. 이때 메모리 주소를 주소 버스에 싣고 데이터는 데이터 버스에 싣는다.
CPU와 메모리, 스택(Stack)
운영체제는 한 프로그램을 실행시키기 위해 메모리에 4개의 공간을 할당한다.
Code | 프로그램 코드를 위한 공간 |
Data | 프로그램 내 선언된 전역 변수들을 위한 공간 |
Heap | 프로그램 실행 중 발생한 데이터를 저장하기 위해 동적으로 할당해주는 공간 |
Stack | 함수가 호출될 때 매개변수나 지역변수, 리턴 값, 실행 후 돌아갈 주소 등을 저장하기 위한 공간 |
컨텍스트(Context)
- 운영체제에서 컨텍스트(context)란, 어떤 프로그램이 실행중인 일체의 상황을 말한다.
- 그 일체의 상황은 CPU내의 레지스터들, 메모리, 스택에 전부 담겨있다.
- 운영체제가 현재 실행중인 프로그램 A를 중단하고 프로그램B를 실행시키고자 할 때, 운영체제는 프로그램A의 컨텍스트를 다른 곳에 복사해두어야 한다.
- 이때 메모리(스택 포함)는 그대로 있기 때문에 복사할 필요 없고, CPU의 레지스터만 복사하면 된다.
- 컨텍스트 데이터는 운영체제만 접근할 수 있는 메모리 영역(커널 영역)에 저장된다.
컨텍스트 스위칭(context switching) : 운영체제가 현재 실행중인 프로그램의 컨텍스트를 저장하고, 다른 프로그램을 실행시키기 위해 그 프로그램의 저장된 컨텍스트를 CPU로 옮기는 것
멀티 코어 CPU
1개의 CPU 내부에 여러개의 코어(core)를 가지고, 동시에 여러개의 프로그램을 실행할 수 있는 CPU이다.
참고자료
황기태, 「운영체제」, 생능출판사, 2020