Home System Structure
Post
Cancel

System Structure

Kocw에서 제공하는 반효경 교수님의 운영체제 강의를 학습하며 작성한 글입니다. 잘못된 내용에 대한 지적이나 피드백은 언제든 환영입니다.

image







1. 인터럽트(Interrupt)


인터럽트를 이해하기 전 현대의 범용 컴퓨터 시스템이 어떻게 구성되는지를 먼저 살펴보겠습니다. 현대 컴퓨터는 하나 이상의 CPU, 메모리(memory), 공통 버스(system bus)를 통해 연결된 여러 장치 컨트롤러(device controller)로 구성됩니다. 장치 컨트롤러는 일부 로컬 버퍼(local buffer)와 특수 목적 레지스터(register) 집합을 유지 관리하며, 이는 제어하는 주변 장치와 로컬 버퍼 저장소 간 데이터를 이동시킵니다.

image

장치 컨트롤러는 CPU와 병렬로 실행되어 메모리 사이클을 놓고 경쟁하는데, 메모리에 접근하기 위해 메모리 컨트롤러(memory controller)가 이를 동기합니다. 또한 USB와 같이 하나의 컨트롤러에 둘 이상의 장치가 연결될 수도 있습니다.









1-1. 개념

인터럽트는 CPU가 특정 기능을 수행하는 도중 다른 일을 처리하는 것을 말하며, 최신 운영체제에서 비동기 이벤트를 처리하기 위해 사용됩니다. 인터럽트가 발생하면 CPU 제어권이 운영체제로 넘어가 요청된 작업을 처리하는데, 이때 CPU는 인터럽트를 당한 시점의 문맥(레지스터, program counter 등)을 저장하고 CPU 제어를 인터럽트 처리 루틴(ISR)에 넘깁니다.

In digital computers, an interrupt (sometimes referred to as a trap) is a request for the processor to interrupt currently executing code (when permitted), so that the event can be processed in a timely manner. If the request is accepted, the processor will suspend its current activities, save its state, and execute a function called an interrupt handler (or an interrupt service routine, ISR) to deal with the event.









운영체제는 인터럽트마다 실행할 코드를 내부에 커널 함수로 정의하고 있으며, 각 요청에 맞는 인터럽트를 처리합니다. CPU는 한 번에 하나의 인터럽트만 처리할 수 있으며, 따라서 인터럽트를 처리 중일 때는 다른 장치로부터 온 명령을 처리하지 않으므로 불규칙한 요청 처리에도 적합합니다.

image

하드웨어는 어느 순간이든 시스템 버스를 통해 인터럽트를 발생시킬 수 있습니다.









컴퓨터가 입/출력 작업을 한다고 가정하고 인터럽트의 과정을 정리해보겠습니다. 여기서 레지스터는 장치와의 통신을 위한 컨트롤러 내부의 작은 메모리 영역입니다. 장치 드라이버는 명령, 데이터, 장치 상태 확인, 데이터 전송을 위한 메모리 주소와 같은 정보를 레지스터를 통해 전달하여 I/O 작업을 지시하고 관리합니다.

  1. 장치 드라이버가 장치 컨트롤러의 적절한 레지스터에 값을 적재합니다.
  2. 장치 컨트롤러는 레지스터의 내용을 보고 수행할 작업을 결정합니다.
  3. 장치 컨트롤러는 장치에서 로컬 버퍼로 데이터를 전송하며, 작업이 완료되면 장치 드라이버에 작업 완료를 알립니다.
  4. 장치 드라이버는 각 작업에 맞는 데이터 또는 데이터에 대한 포인터를 반환하며 운영체제에 넘깁니다.
  5. 운영체제는 작업을 수행합니다.









프로세스나 쓰레드를 동시에 실행하는 다중 작업 환경에서 CPU 스케줄링, I/O 작업 처리, 예외 처리 등 현대의 운영체제는 대부분은 인터럽트 기반으로 동작합니다. 이를 통해 운영체제가 자원을 효율적으로 관리하며 반응성을 높입니다.

  1. It increases the efficiency of CPU.
  2. It decreases the waiting time of CPU.
  3. Stops the wastage of instruction cycle.
  4. Enables multitasking by allowing the CPU to quickly switch between different processes.
  5. Simplifies input/output (I/O) operations by allowing devices to communicate directly with the CPU.









1-2. 발생 및 처리

CPU가 인터럽트 되면 하던 일을 중단하고 즉시 고정된 위치로 실행을 옮깁니다. 이는 일반적으로 인터럽트를 위한 서비스 루틴(interrupt-handler routine)이 위치한 시작 주소를 가지고 있으며, 이를 통해 작업을 실행합니다. 서비스 루틴이 실행되고 나면 CPU는 인터럽트 된 연산을 재개합니다.

image









CPU 하드웨어에는 인터럽트 요청 라인(interrupt request line)이 존재하는데, CPU는 하나의 명령어(instructions) 실행이 완료될 때마다 이 선을 감지합니다. 컨트롤러가 인터럽트 요청 라인에 신호 보낸 것을 감지하면, 인터럽트의 번호를 읽고 이 번호를 인터럽트 벡터 인덱스로 사용해, 인터럽트 핸들러 루틴으로 점프합니다. 이후 인덱스와 관련된 주소에서 실행을 시작합니다.

image

In computer programming, machine code is computer code consisting of machine language instructions, which are used to control a computer’s central processing unit (CPU).









즉 장치 컨트롤러가 CPU에 인터럽트를 요청하면, CPU는 인터럽트 라인을 통해 발생한 인터럽트를 확인합니다. 이후 인터럽트 벡터(interrupt vector)를 통해 인터럽트 핸들러를 알아낸 후 작업을 하는 것입니다.

image









아래는 Intel 프로세서의 인터럽트 벡터입니다. 각 상황에 맞는 벡터 번호를 볼 수 있습니다.

image









인터럽트 처리기에서는 작업 중 변경될 상태를 저장하고 인터럽트 원인을 확인하며, 필요한 처리를 수행 후 상태를 복원합니다. 이는 다음과 같은 순서를 통해 발생됩니다. 이는 장치 컨트롤러가 서비스할 준비가 될 때, 비동기 이벤트에 CPU가 대응할 수 있게 합니다.

image









하지만 현대 운영체제는 복잡한 상황을 처리하기 위해 다음과 같은 더 정교한 인터럽트 처리 기능을 필요로 합니다.

  1. 중요한 처리 중에는 인터럽트 처리를 연기해야 합니다.
  2. 각 장치에 맞게 적절한 인터럽트 핸들러로 빠르게 전달해야 합니다.
  3. 인터럽트의 우선순위나 중요도를 고려해야 합니다.









이러한 요구 사항을 처리하기 위해, 현대 컴퓨터 하드웨어는 CPU와 인터럽트 컨트롤러(interrupt controller)에서 다음과 같은 고급 인터럽트 기능을 제공합니다. 이를 통해 인터럽트의 우선순위를 매겨, 처리를 연기하거나 우선순위가 높은 인터럽트가 CPU를 선점할 수 있도록 해 시스템의 안정성과 효율성을 보장합니다.

  1. Nonmaskable interrupt: 이는 중대한 시스템 오류와 같은 상황에서 사용되며, 이를 무시할 수 없습니다.
  2. Maskable interrupt: 일반적인 이벤트에서 사용하며 인터럽트는 일시적으로 비활성화될 수 있습니다. 이를 통해 중요한 작업이 인터럽트 되는 것을 방지할 수 있습니다.









1-3. 종류

인터럽트는 하드웨어/소프트웨어 인터럽트로 나눌 수 있습니다. 일반적으로 하드웨어가 일으키는 인터럽트를 넓은 의미의 인터럽트라고 하며, 소프트웨어가 발생시키는 인터럽트를 좁은 의미의 인터럽트라고 합니다. 다만 여기에 명확한 합의는 없습니다.

The terms interrupt, trap, exception, fault, and abort are used to distinguish types of interrupts, although “there is no clear consensus as to the exact meaning of these terms”.







1-3-1. 하드웨어 인터럽트(Hardware Interrupt)

CPU 외부의 디스크 컨트롤러나 주변장치로부터 요청되며, 운영체제의 처리를 해야 하는 상황을 알리기 위해 전기적 신호를 사용해 구현됩니다. 여기에는 기계검사 인터럽트, 외부 인터럽트, 입출력 인터럽트, 프로그램검사 인터럽트 등이 있습니다.

image









1-3-2. 소프트웨어 인터럽트(Software Interrupt)

프로세스가 운영 체제의 서비스를 요청하기 위해 커널의 함수 호출하는 경우 발생하는 인터럽트를 말합니다. 즉 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출(System call)하는 것인데, 시스템 호출은 특별한 시스템 호출 예외를 사용해 구현되어 있으며, 이는 트랩(trap)이라고도 부릅니다. 예를 들어 파일을 읽거나 쓰기 위해 시스템 콜을 사용하게 됩니다.

image

C, C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없으므로 API를 통해 시스템 호출에 접근합니다.









보안, 동시성 문제 등의 이유로 하드웨어 제어를 하는 모든 권한은 커널에서 가지고 있기 때문에 사용자 프로그램, 파일 시스템 등 응용 프로그램에서 이를 직접 제어할 수 없습니다. 따라서 응용 프로그램에서 하드웨어의 데이터를 가져오거나 쓰기 위해서는 커널의 장치 드라이버와 연동되어 실행되어야 합니다. 즉 응용 프로그램이 파일 시스템을 이용하려면 커널의 파일 시스템 드라이버로 넘어가 실행되어야 하므로 시스템 호출을 하게 되는 것입니다.

image









사용자 프로그램이 입출력 작업을 하기 위해서는 시스템콜을 통해 운영체제에 요청하고 운영체제가 이를 대신 수행합니다. 운영체제는 입출력 요청이 올바른 요청인지 확인한 후 입출력을 실행하기 때문에, 파일에 대한 보안을 유지할 수 있습니다. 입/출력의 수행은 아래와 같은 과정을 거치게 됩니다.

  1. 시스템 콜(System call): 사용자 프로그램은 운영체제에게 I/O요청
  2. trap을 사용해 인터럽트 벡터의 특정 위치로 이동
  3. 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
  4. 올바른 I/O 요청인지 확인 후 I/O 수행(커널이 장치컨트롤러에 데이터 요청, 현재 작업중인 프로세스 비활성화)
  5. 장치 컨트롤러는 데이터를 메모리로 전송한 후 CPU에 인터럽트
  6. I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김









exception(0으로나 눈다거나 사용자 프로그램이 범위를 초과한 요청)이 발생하면 강제로 프로그램을 종료시키며, 이때 타이머가 인터럽트(타이머 인터럽트)를 걸 수도 있습니다.

이 외에도 실행할 수 없는 명령어, 명령어 실행 오류, 사용 권한 위배, 하드웨어 고장, 전원이 나간 경우 등과 같은 상황도 포함됩니다. 윈도우에서는 장치 관리자를 통해 인터럽트를 확인할 수 있습니다.









2. 동기(Synchronous) / 비동기(Asynchronous) 입/출력


동기/비동기 입/출력에 대해 살펴보겠습니다. 두 경우 모두 I/O의 완료는 I/O디바이스 컨트롤러가 인터럽트를 통해 알려줍니다.

image









2-1. 동기식 입출력(Synchronous I/O)

I/O 작업이 끝난 후 이를 받아야 다음 작업을 할 수 있습니다. 따라서 I/O가 발생하는 동안 값을 기다립니다. I/O 요청 후 입출력 작업이 완료돼야 다음 작업을 할 수 있는데, I/O는 커널을 통해서만 일할 수 있으며 I/O의 완료는 I/O디바이스 컨트롤러가 인터럽트를 통해 알려준 후 제어가 사용자 프로그램에 넘어갑니다.

image









아래 코드는 input.txt로 부터 파일을 읽어와 writer에 순차적으로 쓰는 I/O 작업을 합니다. 모든 작업이 한 줄 씩, 동기적으로 진행되기 때문에 각 작업이 끝나지 않으면 다음 작업을 진행할 수 없습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {

    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {

            String line;
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                writer.newLine();
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}









2-2. 비 동기식 입출력(Asynchronous I/O)

I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 사용자 프로그램에 제어권이 즉시 넘어갑니다. 이때 I/O의 컨트롤 디바이스가 인터럽트를 걸어 작업의 완료를 알려줍니다. I/O 작업은 느리고 CPU는 연산 속도는 빠르기 때문에, CPU를 효율적으로 활용할 수 있도록 이를 사용합니다. 예를 들어 화면에 어떤 단어를 출력하라고 명령을 보낸 다음 개발자는 별도의 작업을 할 필요 없이 다음 작업을 할 수 있습니다.

Asynchrony, in computer programming, refers to the occurrence of events independent of the main program flow and ways to deal with such events.









아래 코드는 java.nio.file의 AsynchronousFileChannel을 통해 비동기식 입출력 작업을 하는 예시 입니다. 파일 작업을 하는 동안 기다리지 않고 다음 작업을 수행하는 것을 볼 수 있습니다. I/O 작업이 백그라운드에서 진행되며, 해당 작업이 완료되면 콜백 메서드가 호출되는 것입니다. 이를 통해 메인 쓰레드나 다른 쓰레드들이 I/O 작업의 완료를 기다리지 않고 다른 작업을 계속 수행할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Main {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        Path path = Paths.get("input.txt");

        try (AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(
            path,
            StandardOpenOption.READ)
        ) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            fileChannel.read(buffer, 0, buffer, new CompletionHandler<>() {
                @Override
                public void completed(Integer result, ByteBuffer attachment) {
                    attachment.flip();
                    byte[] data = new byte[attachment.limit()];
                    attachment.get(data);
                    System.out.println(new String(data));
                }

                @Override
                public void failed(Throwable exc, ByteBuffer attachment) {
                    System.out.println("File read failed: " + exc.getMessage());
                }
            });

            print();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void print() throws InterruptedException {
        System.out.println("HELLO_WORLD");
        Thread.sleep(100);
    }
}









3. DMA(Direct Memory Access)


DMA는 특정 하드웨어 서브시스템이 중앙처리장치(CPU)와 독립적으로 메인 시스템 메모리에 액세스할 수 있도록 하는 컴퓨터 시스템 입니다. CPU의 인터럽트 라인이 호출을 많이 당하면 효율성이 떨어지기 때문에 DMA 컨트롤러를 추가로 두고 메모리에 접근할 수 있도록 합니다.

Direct memory access (DMA) is a feature of computer systems that allows certain hardware subsystems to access main system memory independently of the central processing unit (CPU).









DMA를 사용하지 않을 경우 하나의 작업이 끝나면 인터럽트를 걸어 CPU를 호출합니다. CPU는 현재 문맥을 저장한 후, 인터럽트가 걸린 작업을 처리하고 다시 기존 문맥을 불러오는데, 이런 과정이 반복해서 일어나면 CPU를 효율적으로 사용할 수 없습니다. 반면, DMA를 사용한다면 매번 인터럽트를 걸지 않습니다. 작업해야 할 내용을 메모리에 올려두고, 모든 세팅이 완료되면 CPU를 한 번만 호출합니다. 이는 특히 NVS I/O와 같은 대량 데이터 이동에 유리합니다.

image

이때 바이트(byte) 단위가 아닌 block 단위로 인터럽트가 발생합니다. CPU의 중재 없이 Device Controller가 Device의 Buffer Storage의 내용을 메모리에 Block 단위로 직접 전송합니다.









메모리에는 CPU, DMA Controller가 모두 접근할 수 있으며, 동시성 문제가 발생할 수 있기 때문에 메모리 컨트롤러를 통해 조율합니다. DMA는 로컬버퍼(local buffer) 데이터를 복사하며, 블록, Page 등의 데이터가 일정량 쌓이면 CPU를 호출합니다.

image









로컬 버퍼는 장치의 컨트롤러에 있는 작은 메모리 공간입니다. 여기에는 장치에서 읽어온 데이터가 임시로 저장되며, 이는 이후 메인 메모리로 전송됩니다.

In computer science, a data buffer (or just buffer) is a region of a memory used to temporarily store data while it is being moved from one place to another.









4. 서로 다른 입출력 명령어


인스트럭션은 I/O 디바이스에 접근하는 인스트럭션(Speical Instruction)과 메모리에 접근하는 인스트럭션(Memory-Mapped I/O)으로 구성됩니다. 오른쪽 그림은 Memory Mapped I/O로 I/O장치도 메모리주소의 연장선으로 봅니다. 반면 왼쪽 그림은 I/O 작업 호출을 별도의 공간에 두고, 오른쪽 메모리에 주소를 넣어 호출을 합니다. 이는 일반적으로는 메모리에 접근하는 주소와 디바이스 주소가 다릅니다.

image









Special Instruction 방식은 특별한 명령어를 사용해 I/O 장치를 제어합니다. 이는 CPU가 I/O 포트 주소를 가진 특별한 레지스터로 데이터를 전송하거나 받아오는 방식으로 작동합니다. 반면 Memory-Mapped I/O 방식은 I/O 디바이스를 메모리 주소에 매핑하여 일반 메모리 접근 명령어로 접근합니다. 이를 통해 특별한 I/O 명령어 없이도 디바이스와 통신할 수 있게 됩니다. 즉 CPU가 I/O 장치와 통신할 때 일반 메모리 접근 명령을 사용할 수 있는 것인데, 해당 메모리 주소는 실제 RAM이 아닌 I/O 장치에 매핑되어 있습니다. 따라서 CPU가 데이터를 I/O 장치에 직접 읽거나 쓸 수 있습니다.

Memory-mapped I/O (MMIO) and port-mapped I/O (PMIO) are two complementary methods of performing input/output (I/O) between the central processing unit (CPU) and peripheral devices in a computer (often mediating access via chipset). An alternative approach is using dedicated I/O processors, commonly known as channels on mainframe computers, which execute their own instructions.









5. 저장 장치 구조


컴퓨터 시스템의 저장 장치는 여러 종류의 메모리와 저장 매체가 계층적으로 구성되어 있습니다. 이 계층 구조는 속도, 용량, 비용 등의 특성에 따라 다르게 구성됩니다. CPU가 직접 접근할 수 있는 메모리 저장 매체를 Primary(Executable)라고 하며, 직접 접근하지 못하는 매체는 Secondary라고 부릅니다. CPU가 Secondary에 접근하지 못하는 이유는 CPU는 byte 또는 워드(word) 단위로 메모리에 접근할 수 있지만, 하드디스크는 섹터(sector) 단위로 데이터를 읽고 쓰기 때문입니다. Secondary에서 Primary로 갈수록 작업 처리 속도는 빨라지지만 그만큼 처리 비용이 비싸며, 한 번에 처리할 수 있는 데이터의 양이 적어집니다.

image

메인 메모리는 모든 필요한 프로그램과 데이터를 영구 저장하기는 용량이 적으며, 전원이 공급되지 않으면 그 내용을 잃어버리기 때문입니다. 따라서 이를 보완하기 위해 보조저장장치와 같은 다른 장치를 함께 사용합니다.









각 저장장치의 특징은 다음과 같습니다. 캐시메모리, 레지스터는 Primary와 Secondary의 속도 차이를 완화하기 위한 중간계층으로 사용됩니다. 이는 CPU는 1클럭 당 한 개의인 스트럭션을 처리하지만, Memory는 이를 처리하기 위해 대략 10-100클럭이 걸리기 때문입니다.

  • 레지스터 (Register)
    • CPU 내부에 존재하며, 가장 빠른 데이터 접근 속도를 가집니다.
    • 현재 실행 중인 연산에 필요한 데이터나 주소를 저장하는데 사용됩니다.
  • 캐시 메모리 (Cache Memory)
    • CPU와 메인 메모리 사이에 존재하며, 레지스터보다는 상대적으로 느리지만 큰 용량을 가집니다.
    • 자주 사용하는 데이터나 명령어를 임시로 저장하여 CPU의 데이터 접근 시간을 줄입니다.
  • 주 메모리 (Main Memory, RAM)
    • 꽤 큰 용량의 데이터 저장이 가능하지만, 캐시나 레지스터보다는 접근 속도가 느립니다.
    • 우리가 흔히 부르는 메모리를 가리키며, 이는 전원이 꺼지면 데이터가 휘발됩니다.
    • 실행 중인 프로그램과 데이터를 저장하며, CPU가 직접 접근할 수 있습니다.
  • 보조 저장 장치 (Secondary Storage)
    • HDD: 메인 메모리보다 훨씬 큰 용량을 가지며, 데이터가 자기 방식으로 저장됩니다.
    • SSD: 전자식 메모리 셀에 데이터를 저장하며, 전원이 꺼져도 데이터가 휘발되지 않습니다.
    • CD, DVD(옵티컬 디스크): 레이저를 이용해 데이터를 읽고 쓰는 저장 장치입니다.
    • Magnetic Tape: 백업 목적으로 주로 사용되며, 순차 접근 저장 장치입니다.

클럭(clock)CPU나 다른 디지털 회로에서 동작의 타이밍을 제어하는 펄스나 신호로, 신호의 주기를 나타내기도 합니다. 클럭 속도는 일반적으로 헤르츠(Hz) 단위로 측정됩니다.









또한 이를 1차, 2차, 3차 저장 장치로 나누기도 합니다.

  • 1차 저장 장치(Primary Storage)
    • 레지스터, 캐시 메모리, RAM과 같이 CPU가 직접 접근 가능한 저장 장치들로, 상대적으로 빠른 속도를 가집니다.
    • 빠르지만 용량이 작습니다. RAM은 이들보다는 용량이 크지만 상대적으로 느린 속도를 가집니다.
    • 한정적 공간에서 새로운 데이터를 저장하기 위해 기존 캐시를 제거하는데, 이때 캐시 제거 알고리즘을 사용합니다.
  • 2차 저장 장치(Secondary Storage)
    • HDD, SDD와 같이 RAM 보다 큰 용량을 가지며, 전원이 꺼져도 휘발되지 않습니다. HDD는 기계적 회전 부품을, SSD는 전자식 메모리 셀을 사용하여 데이터를 저장합니다.
    • 데이터 접근 속도는 1차 저장 장치보다 느리지만 용량 당 비용은 저렴합니다.
  • 3차 저장 장치(Tertiary Storage)
    • Optical Disk(CD, DVD), Magnetic Tape, 외부 드라이버 등 대량의 데이터를 장기적으로 보관하기 위한 저장 장치입니다.
    • 접근 속도는 느리지만 큰 용량을 가지며, 용량 당 비용이 저렴합니다.
    • 대체로 순차적인 데이터 접근을 위해 설계되었으며, 주로 데이터 저장, 백업, 아카이브 등의 용도로 사용됩니다.


백업은 주로 데이터의 손실을 예방하고 예기치 않은 상황에서 데이터를 복구하기 위해 사용됩니다. 이는 일반적으로 일정한 주기로 수행되며, 새 백업 데이터가 들어오면 이전의 백업 데이터는 덮어쓰거나 삭제될 수 있습니다. 반면에 아카이브는 데이터의 장기적인 보존을 목적으로 합니다. 잘 사용하지 않는 데이터나 특정 시점의 데이터를 참조, 재사용할 필요가 있을 때 아카이브에 보관하게 됩니다. 데이터는 자주 수정되거나 갱신되지 않으며, 오랜 기간 안전하게 보관됩니다.







일반적으로 휘발성 저장장치는 메모리, 비휘발성 저장장치는 NVS라고 지칭합니다. 대부분의 경우 NVS는 보조저장장치를 가리키며, 프로그램과 데이터 모두를 위한 저장소를 제공합니다. 이는 전원이 꺼졌을 때 내용을 유지합니다. 여기에는 다음과 같은 두 가지 유형으로 분류할 수 있습니다.

  1. 기계적: HDD, 광 디스크, 홀로그램 저장 장치 및 자기 테이프와 같이 특정 유형의 기계식 저장장치를 말합니다.
  2. 저닉적: 플래시 메모리, FRAM, NRAM, SSD와 같이 전기적 저장장치를 말하며, NVM으로 불립니다.









6. 프로그램의 실행


프로그램은 실행파일 형태로 하드디스크에 저장되어 있으며, 이를 실행하는 순간 메모리에서 프로세스가 되어 프로그램이 실행됩니다. 프로그램을 실행시키면 주소공간이 형성되는데, 이는 프로그램마다 독자적 공간을 가지며 Code, Data, Stack으로 구성되어 있습니다. 운영체제는 함수구조로 코드가 짜졌기 때문에 함수를 호출/리턴할때 스택 영역을 사용합니다. Code에는 실질적으로 수행할 코드가 담겨 있으며 Data에는 프로그램의 전역(Global) 변수와 정적(Static) 변수 등이 저장됩니다.

image









커널은 항상 메인 메모리에 있지만, 사용자 프로그램은 실행 시 메인 메모리로 로드됩니다. 이때 바로 메인 메모리로 가는 것이 아니라 가상 메모리를 거쳐 로드되며, 각 프로세스는 독립된 주소 공간을 가집니다. 프로세스 실행 중 필요한 코드만 메인 메모리에 있고, 나머지는 디스크의 스왑 영역(Swap Area)에 저장됩니다.

image









주소 변환은 가상 주소를 물리적 주소로 바꾸는 과정으로, 페이지 테이블을 통해 이루어집니다. 프로그램은 가상 주소만 생성하고, 실제 메모리 위치는 운영체제와 하드웨어가 관리합니다.

image









7. 사용자 프로그램이 사용하는 함수


CPU가 인스트럭션을 실행하는 도중 메모리의 주소를 바꿀 수도 있습니다. 이는 코드의 주소를 논리적으로 건너뛰어 실행하는 것으로 메인 메모리상에서는 가능하지만, 커널 코드로 이동하지는 못합니다. 커널의 함수를 호출하기 위해서는 인터럽트 라인을 세팅하고 시스템 콜을 통해 CPU 제어권이 운영체제로 넘어가게 만들어야 합니다.

image









함수 호출은 CPU가 메모리의 특정 주소로 점프하여 인스트럭션을 실행하는 것이며, 스택에 리턴 주소와 일부 정보가 저장됩니다. 반면, 인터럽트는 사용자 프로그램이 I/O 작업을 요청할 때 발생하며, 이때 CPU 제어권은 사용자 프로그램에서 운영체제의 인터럽트 핸들러로 넘어갑니다. 인터럽트 처리가 끝나면 제어권은 원래의 프로그램으로 돌아옵니다.

image









8. 기타


이번 장에서는 많은 개념이 나왔는데, 위에서 다루지 못 한 내용에 대해 조금 더 살펴보겠습니다.





8-1. 클럭(Clock)

클럭(clock)은 CPU나 다른 디지털 회로에서 동작의 타이밍을 제어하는 펄스나 신호로, 신호의 주기를 나타내기도 합니다. 클럭 속도는 일반적으로 헤르츠(Hz) 단위로 측정됩니다.

In computing, the clock rate or clock speed typically refers to the frequency at which the clock generator of a processor can generate pulses, which are used to synchronize the operations of its components, and is used as an indicator of the processor’s speed. It is measured in the SI unit of frequency hertz (Hz).


  1. Hz: 1초에 1 사이클
  2. kHz: 1초에 1,000 사이클
  3. MHz: 1초에 1,000,000 사이클
  4. GHz: 1초에 1,000,000,000 사이클
  5. THz: 1초에 1,000,000,000,000 사이클







이는 CPU의 성능을 측정할 때 하나의 척도로 사용되는데, 클럭 속도는 CPU가 얼마나 빨리 명령어를 처리할 수 있는지, 즉 명령어가 얼마나 빨리 실행될 수 있는지를 나타내는 지표이기 때문입니다. CPU의 데이터 전송 능력을 계산하기 위해서는 데이터 버스의 너비, 클럭 사이클 당 전송 횟수가 필요한데, 클럭속도 x 데이터 버스의 너비로 이를 측정하기 때문입니다. 예를 들어, 2.30GHz인 CPU의 경우 1초에 전송할 수 있는 데이터는 이론 상 최대 2.30 x 10^9 Hz x 64 bits = 147.2 x 10^9 bits = 147.2Gb(18.4 GB) 입니다.

데이터 버스 너비는 CPU가 한 번에 전송할 수 있는 데이터의 비트 수(32/64)를 나타냅니다. 데이터 전송 속도는 메모리 대역폭, I/O 버스 속도 등 다른 지표들로 측정됩니다.







클럭 사이클 당 전송 횟수는 아키텍처마다 다른데, DDR(Double Data Rate) Memory의 경우 이름에서 알 수 있듯, 데이터 전송 속도가 기본 클럭 속도의 두 배 입니다. 즉 클럭 사이클 당 여러 번의 데이터 전송도 가능하며, 예를 들어, 100MHz의 클럭 속도로 동작한다면, 실제 데이터 전송 속도는 초당 200 백만 번의 데이터 전송을 수행하는 것입니다.

Double Data Rate Synchronous Dynamic Random-Access Memory (DDR SDRAM) is a double data rate (DDR) synchronous dynamic random-access memory (SDRAM) class of memory integrated circuits used in computers.







참고로 맥(Intel) 기준 아래 명령어를 통해 현재 내 컴퓨터의 CPU 스펙을 알 수 있습니다.

1
2
$ sysctl -n machdep.cpu.brand_string
Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz









8-2. System Bus

A system bus is a single computer bus that connects the major components of a computer system, combining the functions of a data bus to carry information, an address bus to determine where it should be sent or read from, and a control bus to determine its operation.

image










This post is licensed under CC BY 4.0 by the author.