CPU와 메모리의 관계

32비트 CPU, 32비트 운영체제의 의미는?

32비트 CPU 또는 운영체제는 메모리 주소를 **32비트(4바이트)**로 표현함.

32비트 시스템이면, 주소를 표현할 때 32자리의 0과 1을 쓸 수 있다.
ex: 
00000000 00000000 00000000 00000000 → 주소 1번
00000000 00000000 00000000 00000001 → 주소 2번
...
11111111 11111111 11111111 11111111 → 마지막 주소
즉 32자리를 0과1로 표현가능한 경우의수 인 2^32개의 주소를 표현가능하다는 것.
컴퓨터의 주소는 메모리의 1바이트 단위이다. 즉 대략 4GB까지만 표현 가능하다는 것
즉, 32비트 컴터라면 4기가 이상의 메모리를 설치해도 별 의미가 없을것.
* 결론: 32비트 시스템은 메모리 주소를 최대 2^32개만 표현 가능하기 때문에 
총 4GB 메모리까지만 직접 접근이 가능하다.

 

CPU의 레지스터들

  • PC(Program Counter) : 다음에 실행할 명령의 메모리 주소 저장
  • IR(Instruction Register) : 현재 실행하기 위해 메모리로부터 읽어온 명령어를 저장
  • SP(Stack Pointer) : 스택의 최상단 메모리 주소를 저장한다.
  • 데이터 레지스터 : 연산에 사용되거나 사용될 데이터들을 저장한다.
  • 상태 레지스터 : CPU의 상태정보나 인터럽트 금지 등의 제어정보를 저장한다.

 

프로그램이 실행되기 위해 운영체제에 의해서 메모리에 할당되는 공간들

코드공간 : 
-컴파일된 프로그램의 기계어 코드(명령어) 저장

데이터공간
- 초기화된 전역 변수, static 변수 저장
- 프로그램 시작 시부터 종료까지 유지됨

힙공간
- new, malloc 등으로 동적 할당된 메모리 저장
- 객체(인스턴스), 배열 등이 저장됨

스택공간
- 함수 호출 시 지역 변수, 매개변수 저장
스택은 메모리의 일부를 스택으로 따로 구축해놓는다.
os는 각 프로그램에 스택 공간을 할당한다.

 

컨텍스트

한 프로그램이 실행중인 일체의 상황 혹은 정보

 

컨텍스트 스위칭 

CPU가 현재 프로그램의 실행을 중지하고 다른 프로그램 OR 쓰레드를 교체하여 실행할때 발생하며
현재 실행중인 프로그램의 컨텍스트(CPU레지스터들의 값)들을 메모리의 PCB라는 구조체에 저장

PCB는 각 프로세스별로 메모리 상에 존재하고, 거기에 **문맥 정보(Context)**를 저장
그 후 다음 프로그램을 실행하고 다시 자신의 차례가 왔을때 저장된 컨텍스트를 CPU에 복귀한다.

 

  멀티코어

코어: 연산을 수행하는 실질적인 두뇌   CPU 하나에 코어가 1개 → 즉, 한 번에 한 작업만 가능
멀티코어 : 하나의 CPU 칩 안에 여러 개의 독립된 코어를 집어넣은 구조

여러 작업을 동시에 실행할 수 있어 속도 향상을 가져온다. 또한
각 프로세스를 별도 코어에 배정함으로써 멀티태스킹에 유리하다.

 

 

  컴퓨터 시스템 계층 구조

 

운영체제가 하드웨어와 소프트웨어의 중계역할을 하는 인터페이스이다.
이런 계층구조를 띔으로써 하드웨어에 대해 구체적인 지식 없이도
응용프로그램 개발이 가능해진다.

 

운영체제는 장치 관련된 모든 작업을 디바이스 드라이버에게 시스템콜을 통하여 요청한다.
또한 프로세스, 메모리, 장치, 파일 시스템 관리등을 한다.

 

✔ 운영체제의 구성

 

- 커널

운영체제의 핵심, 좁은의미의 운영체제

부팅 후 메모리에 상주하는 코드와 데이터
커널 코드는 cpu, memorym, mmu 등 컴퓨터 자원을 직업제어하고 관리하는 코드와 자료구조들의 집합

커널이 제공하는 인터페이스에는 시스템호출인터럽트가 있다.

 

- 도구 소프트웨어(탐색기, 작업 관리자, 제어판 등)와 GUI

 

- 디바이스 드라이버
장치를 직접 제어하고 입출력하는 소프트웨어
장치마다 전담 디바이스 드라이버 존재

 

시스템 호출:
- 커널과 응용프로그램 사이의 인터페이스
- 응용프로그램에서 커널 기능을 사용할 유일한 방법
- ex: open(), close(), read() 등

 

인터럽트:
커널과 하드웨어 장치 사이의 인터페이스
장치들이 입출력완료, 타이머 완료 등을 cpu에게 알리는 방법

 

 

* 응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손이 발생할 수 있음
그렇기에 메모리공간을 사용자 공간(응용프로그램을 위한)과 커널을 위한 커널 공간으로 분리
또한 사용자 공간에서 커널 공간의 코드를 직접 접근하지 못하게 한다. 하고 싶으면 시스템콜을 이용해야 함.

 

근데 운영체제가 사용자 공간에 프로그램마다 2GB씩 할당하고 전체 메모리가 4GB이면 어떻게 동작되는거냐?
물리적으로 공간이 부족한데?

CPU와 OS는 페이지 테이블 (Page Table) 이라는 구조를 통해
가상 주소 ↔ 물리 주소를 매핑함
이걸 관리하는 게 MMU (Memory Management Unit) 라는 하드웨어
실제로 사용 중인 부분만 물리 메모리에 올라가고,
나머지는 디스크(스왑) 등에 있음.

 

응용프로그램들이 000000~7FFFFF 까지의 주소를 각각 똑같이 가지고 있는데 이것은
논리적인 공간, 가상 메모리 라고 한다. 물리메모리에서는 각각 다른 주소값에 할당되어 있음

사용자모드 -> 커널모드로 전환은 시스템호출과 인터럽트 발생만이 있다.
시스템 호출을 실행하는 기계명령은 cpu마다 다르다.
cpu가 이넡럽트를 수신하면 커널모드로 전환 인터럽트 서비스 루틴 끝나면 cpu는 사용자 모드로 자동전환

커널은 스스로 실행되는 프로세스가 아닌 호출되는 함수이다. 
즉, 프로세스도 스레드도 아니다. 시스템호출을 통하여 커널 코드를 실행한다는게 맞는 표현

 

인터럽트

입출력 장치들이 예정되지 않거나 발생시간을 예측할 수 없는 사건을 cpu에게 알리는 행위이다.

 


- 하드웨어 인터럽트
장치들이 어떤 상황발생을 CPU에게 알리는 하드웨어 신호

- 소프트웨어 인터럽트
CPU명령으로 발생시키는 인터럽트

EX: 키보드, 마우스 입력, 컴퓨터 리셋, 하드디스크의 쓰기 종료

<인터럽트 서비스 루틴>
ISR 혹은 인터럽트 핸들러라고 부른다.
보통 디바이스 드라이버나 커널 코드 영역 안에 담겨져 있다.

+ Recent posts