<h1><center> 레벨 0단계 1번 질문 1-2 </center></h1> ###### tags: `iOS interview` ###### date: `2025-01-2517:21:33.284Z` > [color=#724cd1][name=데릭] > [운영체제 3.CPU와 메모리](https://v3.leedo.me/devs/101) ## 레벨 0 1. 컴퓨터 시스템에서 CPU, RAM, 저장 장치의 역할과 이들이 어떻게 상호 작용하는지 설명해주세요. - CPU와 메모리 간의 데이터 교환은 어떻게 이루어지나요? > CPU와 메모리 간의 데이터 교환은 버스(Bus)를 통해 이루어집니다. 버스에는 주소 버스, 데이터 버스, 제어 버스 총 3개로 이루어져 있습니다. CPU에는 산술논리 연산장치, 제어장치, 레지스터로 구성되며, 이것들의 협업으로 작업을 처리함. **레지스터** > 레지스터는 CPU 내부에 있는 아주 작은 용량의 고속 메모리를 말한다. CPU가 데이터를 처리하는 데 필요한 정보(명령어, 주소, 데이터 등)를 임시로 저장하거나 교환하는 역할을 한다. 레지스터는 메모리와 비교했을 때 엄청 작지만, CPU 내부에서 가장 빠르게 데이터를 읽고 쓸 수 있는 저장 장치다. **역할** > CPU가 데이터를 처리하려면 반드시 레지스터를 거쳐야 한다. 1. 명령어 읽기: 메모리에서 명령어를 가져와 레지스터에 저장 2. 명령어 해석 및 실행: 레지스터에 저장된 명령어를 해석한 뒤, 필요한 데이터나 주소를 레지스터를 통해 사용 3. 연산 결과 저장: 연산의 결괏값을 레지스터에 저장한 뒤, 필요에 따라 메모리로 다시 이동 **레지스터의 종류** - 레지스터는 용도에 따라 사용자 가시 레지스터와 사용자 불가시 레지스터로 나뉜다. 1. 사용자 가시 레지스터 > 프로그래머가 직접 사용할 수 있는 레지스터이다. 주로 데이터나 주소와 관련된 정보를 저장한다. - 데이터 레지스터: 데이터를 임시로 저장하는 레지스터이다. CPU가 메모리에서 가져온 데이터나 연산에 사용되는 값을 저장한다. 대부분의 CPU 레지스터가 데이터 레지스터로 작동한다. 예: 두 숫자를 더하는 명령이 있다면, 두 숫자가 데이터 레지스터에 저장됨 - 주소 레지스터: 명령어가 처리해야 할 메모리의 위치(주소)를 저장하는 레지스터이다. 예를 들어, CPU가 메모리에서 특정 데이터를 가져오려면 그 데이터가 저장된 메모리 주소를 알아야 하며, 이 주소는 주소 레지스터에 저장된다. 2. 사용자 불가시 레지스터 > CPU 내부적으로만 사용되며, 프로그래머가 직접적으로 수정하거나 접근할 수 없다. 주로 CPU가 명령어를 실행하거나 제어하는 데 사용된다. - 프로그램 카운터: CPU가 다음에 실행할 명령어의 주소를 저장하는 레지스터이다. 현재 실행 중인 명령어가 끝나면, 프로그램 카운터는 자동으로 다음 명령어의 주소로 업데이트된다. 예: 프로그램에서 1번 명령을 실행한 후, PC는 2번 명령의 주소를 가리키게 된다. - 명령어 레지스터: 현재 실행 중인 명령어를 저장하는 레지스터이다. 메모리에서 가져온 명령어가 여기에 저장되며, 제어장치가 이 내용을 해석하고 실행한다. 예: `LOAD mem(100), register 2;` 명령어에서 LOAD와 관련된 정보를 IR이 저장한다. - 메모리 주소 레지스터: 메모리에서 데이터를 가져오거나 저장할 때 그 위치(주소)를 저장하는 레지스터이다. 예: mem(100)에서 100이라는 메모리 주소가 MAR에 저장된다. - 메모리 버퍼 레지스터: 메모리에서 읽어온 데이터나, 메모리에 저장할 데이터를 임시로 보관하는 레지스터이다. 예: mem(100)에서 데이터를 읽으면 그 값이 MBR에 저장된다. 이후 다른 레지스터로 이동하거나 CPU가 연산을 수행한다. - 프로그램 상태 레지스터: CPU의 연산 상태를 저장한다. 예를 들어, 연산 결과가 양수인지 음수인지, 0인지, 자리 올림이 발생했는지 등의 상태를 기록한다. 예: 조건문 실행 시 PSR의 값에 따라 다음 실행 경로가 결정된다. **버스(Bus)** - 버스(Bus)란 무엇이며, 어떤 종류가 있나요? 버스는 CPU와 메모리, 주변장치 간에 데이터를 주고받을 때 사용하는 것이다. 버스에는 다음 작업을 지시하는 제어신호, 메모리의 위치 정보를 알려주는 주소, 처리할 데이터가 오고 가며 각각 제어 버스, 주소 버스, 데이터 버스에 실린다. ![스크린샷 2025-01-25 17.54.01](https://hackmd.io/_uploads/SkYnIXf_1g.png) **제어 버스** > 제어 버스는 CPU, 메모리, 주변장치 간의 제어 신호를 전달하는 통로이다. - 메모리에서 데이터를 읽을 때 읽기 신호, 데이터를 저장할 때 쓰기 신호 전달 - 주변장치의 명령(예: 하드디스크 저장, 사운드카드 작동)도 제어 버스를 통해 전달 - 오류 발생, 네트워크 데이터 도착 등의 상태 정보도 CPU로 전달 - **양방향**으로 신호가 오고 감 **주소 버스** > 주소 버스는 데이터가 읽히거나 쓰이는 메모리나 주변장치의 위치(주소)를 전달한다. 예를 들어, 메모리의 특정 위치나 하드디스크의 특정 섹터를 지정한다. - 단방향으로 작동하며, CPU에서 메모리나 주변장치로 주소 정보를 보낸다. **데이터 버스** > 데이터를 전달하는 역할을 한다. - 데이터를 CPU에서 메모리나 주변장치로 또는 반대로 이동시킨다. - CPU -> 메모리 or 주변장치 - 메모리 or 주변장치 -> CPU - 위의 설명대로 양방향으로 작동하며, 메모리 버퍼 레지스터와 연결되어 데이터를 처리한다. **CPU 명령어 처리 과정** ``` LOAD mem(100), register 2; LOAD mem(120), register 3; ADD register 5, register 2, register 3; MOVE register 5, mem(160); ``` ![image](https://hackmd.io/_uploads/BkiNrXfO1l.png) **LOAD 첫 번째 단계** - 메모리의 100번지에 저장된 값을 CPU 레지스터 2로 가져온다. - 제어장치가 명령어를 해석하여 데이터 버스를 통해 메모리에서 데이터를 읽어오고 레지스터에 저장한다. **`LOAD mem(100), register 2;` 명령어를 실행할 때의 레지스터 동작과정** 1. 프로그램 카운터: 현재 실행할 명령어(1번 명령어)의 주소를 저장한다. 제어장치는 PC의 값을 사용해 해당 명령어를 메모리에서 가져온다. 2. 명령어 레지스터: 명령어 `LOAD mem(100), register 2;`가 명령어 레지스터에 저장된다. 제어장치는 이 명령어를 해석하여 어떤 작업을 수행할 지 결정한다. 3. 메모리 주소 레지스터: 명령어에 포함된 mem(100)에서 주소 100이 MAR에 저장된다. 이 정보는 메모리 관리자가 메모리의 100번 위치에 접근할 수 있도록 사용된다. 4. 메모리 버퍼 레지스터: 메모리 관리자가 100번 위치에서 데이터를 읽어와 MBR에 저장한다. 여기서 데이터의 값이 2라면 MBR에는 2가 저장되는 것이다. 5. 데이터 레지스터: 제어장치는 MBR에 저장된 값을 데이터 레지스터(예: register 2)로 이동시킨다. 결과적으로 register 2에는 값 2가 저장된다. **LOAD 두 번째 단계** - 메모리의 120번지에 저장된 값을 CPU의 레지스터 3으로 가져온다. - 첫 번째 로드와 동일한 과정으로 데이터를 메모리에서 레지스터에 저장한다. **Add** - 산술논리연산장치(ALU)가 레지스터 2와 레지스터 3에 저장된 값을 더하는 연산을 수행 - 연산 결과를 레지스터 5에 저장한다. - 제어장치가 연산 명령을 내리고 ALU가 해당 작업을 처리한다. **Move** - 레지스터 5에 저장된 값을 메모리의 160번지로 이동시킨다. - 데이터 버스를 통해 레지스터의 데이터를 멤