1️⃣ 운영체제 (Operating System)
1) 운영체제의 개념
'운영체제(OP : Operating System)' 란 컴퓨터의 하드웨어 바로 위에 설치되어 사용자와 다른 소프트웨어, 하드웨어를 연결하는 소프트웨어 계층을 말한다.
- GUI (Graphical User Interface) : 사용자가 전자장치와 상호 작용할 수 있도록 하는 사용자 인터페이스의 한 종류. 프롬프트와 같은 단순 명령어 창이 아닌 아이콘을 마우스로 클릭하는 등의 동작으로 컴퓨터와 상호 작용할 수 있다.
- System call : 운영체제가 커널에 접근하기 위한 인터페이스. 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용된다.
- Kernel : 운영체제의 핵심 부분이자 시스템콜 인터페이스를 제공. 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O 요청 관리 등 운영체제의 중추적인 역할을 한다.
- Driver : 하드웨어를 제어하기 위한 소프트웨어.
2) 운영체제의 목적
1. 컴퓨터 시스템 자원 관리
운영체제의 가장 큰 목적은 컴퓨터 시스템의 자원을 효율적으로 관리하는데에 있다. 프로세서, 기억장치, I/O 장치 등을 효율적으로 관리하여 사용자간의 형평성 있는 자원 분배를 지원한다.(효율성 + 형평성) 이는 하드웨어 자원이며, 뿐만 아니라 프로세스, 파일, 메시지 등 소프트웨어 자원도 관리하여 주어진 자원으로 최대한의 성능을 내도록 도와준다.
2. 컴퓨터 시스템의 편리한 사용 환경 제공
운영체제는 동시 사용자와 프로그램들이 각각 독자적으로 컴퓨터에서 수행되는 것처럼 보이게 한다. 예들 들어 컴퓨터 한 대가 서로 다른 여러 프로그램들을 실행할 때 하드웨어 자원을 적절히 분배 및 관리하게 된다. 여러 프로그램들이 실행될 때 CPU 스케줄링 등을 통해 각각의 프로그램을 빠른 속도로 번갈아 실행하면 사용자 입장에선 동시에 실행된다고 느낄 수 있다.
3) 운영체제의 분류
[1] 동시 작업 가능 여부
- 단일 작업 (Single Tasking) : 말 그대로 한 번에 하나의 작업만 처리할 수 있는 운영체제이다. 마이크로소프트사의 'MS-DOS'는 프롬프트 상에서 하나의 명령에 대한 작업을 끝내기 전에 다른 명령을 수행시킬 수 없다.
- 다중 작업 (Multi Tasking) : 동시에 두 개 이상의 작업을 처리할 수 있는 운영체제이다. 현재 사용하고 있는 대부분의 운영체제는 다중 작업을 지원한다. UNIX, MS Windows 등에서는 하나의 명령에 대한 작업이 끝나기 전에 다른 명령이나 프로그램을 수행할 수 있다.
[2] 사용자의 수
한 대의 컴퓨터에 대해 여러 사용자가 동시에 접속하여 사용할 수 있는지를 기준으로 분류한 것이다. 단일 작업만 지원하는 컴퓨터는 당연히 단일 사용자만 접근할 수 있을 것이다.
- 단일 사용자 (Single User) : 한 번에 한 명의 사용자만 접속할 수 있다. MS-DOS, MS Windows 등.
- 다중 사용자 (Multi User) : 한 번에 여러 명의 사용자가 접속할 수 있다. 예를 들어 서버 컴퓨터의 경우 여러 사용자가 각각의 계정을 통해 동시에 접근할 수 있다. UNIX, NT server 등.
[3] 처리 방식
- 일괄 처리 (Batch Processing) : 어떠한 작업이 주어졌을 때 바로 처리하는 것이 아니라 일정량의 작업 요청을 모아서 한 번에 일괄적으로 처리하는 방식이다. 실제로 현대에선 거의 사용하지 않는 방식이며, 작업이 완전히 종료될 때까지 기다려야한다는 단점이 있다. 초기 Punch Card 처리 시스템 등이 일괄 처리 방식의 운영체제에 속한다.
- 시분할 (Time Sharing) : 대부분의 현대 운영체제에서 사용하는 방식이다. 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정 시간 단위로 나눠 사용한다. 일괄 처리 시스템에 비해 응답시간이 짧다는 장점이 있다. 각 사용자가 컴퓨터로부터 서비스를 제공 받는 시간을 숫자로 표시한다. 시분할의 목적은 사용자가 빠른 속도를 느끼게 하며, 동시에 주어진 자원을 최대한 활용하는데에 있다.
- 실시간 (Realtime OS) : 실시간 시스템은 시분할 방식과는 달리 정해진 시간 안에 특정 작업이 반드시 종료됨이 보장되어야 하는 실시간 시스템을 위한 운영체제이다. 원자로/공장 제어, 미사일 제어, 반도체 장비, 로봇 제어 등에 활용된다.
4) 운영체제의 역할
- CPU 스케줄링, 프로세스 관리 : CPU 소유권을 어떤 프로세스에 할당할지, 프로세스의 생성과 삭제, 자원 할당 및 반환을 관리.
- 메모리 관리 : 한정된 메모리를 어떤 프로세스에 얼만큼 할당해야 하는지 관리.
- 디스크 파일 관리 : 디스크 파일을 어떠한 방법으로 보관할지 관리.
- I/O 디바이스 관리 : 마우스, 키보드와 같은 I/O 디바이스들간 데이터를 주고받는 것을 관리.
2️⃣ 컴퓨터 시스템 구조 (Computer System Structure)
1) CPU (Central Processing Unit)
CPU는 산술논리연산장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치. 인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석하여 실행하는 역할 수행. 예를 들어 운영체제의 커널이 프로그램을 메모리에 올려 프로세스를 만들면 CPU가 이를 처리한다.
* 인터럽트 (Interrupt) : CPU가 프로그램을 실행하고 있을 때 입출력 장치 등에 예외사항이 발생하여 처리가 필요한 경우, 마이크로프로세서에게 알려 처리할 수 있도록 하는 것. 또는 어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키는 것이다. I/O 디바이스로 인한 인터럽트, 0으로 숫자를 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생한다. 현대의 운영체제는 인터럽트에 의해 구동된다.
- 하드웨어 인터럽트 : 키보드나 마우스에 연결하는 작업 등 I/O 디바이스에서 발생하는 인터럽트를 말한다. 이때 인터럽트 라인이 설계된 이후 순차적인 인터럽트 실행을 중지한 뒤, 운영체제에 시스템콜을 요청하여 원하는 디바이스를 향해 해당 디바이스의 로컬 버퍼에 접근하여 작업을 수행한다.
- 소프트웨어 인터럽트 : '트랩(trap)'이라고도 하며, 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동한다.
[1] 제어장치 (CU : Control Unit)
제어장치는 프로세스 조작을 지시하는 CPU의 일부이다. 입출력 장치간 통신을 제어하고, 명령어들을 읽고 해석하여 데이터 처리를 위한 순서를 결정한다.
[2] 레지스터 (Register)
레지스터는 CPU 안에 있는 임시기억장치이다. CPU와 직접 연결되어 있어 연산 속도가 메모리보다 수십~수백 배 더 빠르다. CPU는 자체적으로 데이터를 저장할 방법이 없기 때문에 레지스터를 거쳐 데이터를 전달한다.
[3] Mode bit
시스템콜이 작동될 때 mode bit를 참고하여 '유저 모드' 와 '커널 모드(모니터 모드, 시스템 모드)' 를 구분한다. 즉, CPU에서 기계어를 실행할 때 사용자가 실행하는 것인지, 운영체제가 실행하는 것인지 구분한다. mode bit은 1 또는 0의 값을 가지는 플래그 변수이며, 1은 유저 모드, 0은 커널 모드이다.
- 유저 모드 (1) : mode bit이 1일 때이다. 이 때 시스템콜을 못하게 막아서 한정된 일만 가능하게 한다. 유저가 접근할 수 있는 영역을 제한적으로 두며 컴퓨터 자원에 함부로 침범하지 못하는 모드이다.
- 커널 모드 (0) : mode bit이 0일 때이다. 모든 컴퓨터 자원에 접근할 수 있는 모드이며, 운영체제가 CPU를 사용하는 상태이다.
가령 I/O 디바이스를 다루는 프로그램을 실행할 때 다음과 같은 로직을 거치게 된다.
[4] 산술논리연산장치 (ALU : Arithmetic Logic Unit)
산술논리연산장치는 덧셈, 뺄셈과 같은 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리 연산을 계산하는 디지털 회로이다. CPU의 연산 처리 과정을 아래와 같다.
- 제어장치가 메모리에 계산할 값을 로드한다. 또한 레지스터에도 로드한다.
- 제어장치가 산술논리연산장치에게 레지스터에 있는 값을 계산하라고 명령한다.
- 제어장치가 다시 레지스터에서 메모리로 계산한 값을 저장한다.
해당 내용은 다른 글에서 조금 더 깊이 있게 다뤄보도록 하겠다.
2) DMA Controller
DMA 컨트롤러는 I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치이다. 만약 CPU에만 너무 많은 인터럽트 요청이 들어온다면 과부하가 발생할 것이다. 따라서 이를 막기 위해 CPU의 일을 일부 부담하여 보조한다. 또한 하나의 작업을 CPU와 DMA 컨트롤러가 동시에 하는 것을 방지한다.
3) Timer
타이머는 몇 초안에는 작업이 끝나야 한다는 것을 정하고, 특정 프로그램에 시간 제한을 설정하는 역할을 한다. 많은 시간이 걸리는 프로그램이 작동할 때 제한을 걸기 위해 존재한다. 사용자 프로그램이 CPU를 무리하게 사용하고 있을 때 운영체제가 이를 뺏어오도록 도와주는 하드웨어로, CPU에 대한 독점을 막을 수 있다. 또한 CPU를 짧은 시간 간격으로 나눠쓸 수 있게 하며 Time Sharing을 위해서도 사용한다.
4) Device Controller
디바이스 컨트롤러는 컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU를 말한다. 이는 기계어를 연산하며, 예를 들어 Disk를 관리하는 작은 CPU를 'Disk Controller'라고 한다.
3️⃣ 메모리
1) 메모리 계층
* 용어
- Resisters (레지스터) : CPU 안에 있는 작은 메모리이다. 휘발성이며 속도가 가장 빠르다. 하지만 기억 용량이 가장 적다.
- Cache Memory (캐시 메모리) : L1, L2 캐시를 말한다. 휘발성이며 속도가 빠르지만 기억 용량이 적다. 여기서 캐싱은 재사용을 목적으로 한다.
- Primary Memory (주기억장치) : 컴퓨터 내부에서 CPU가 현재 처리하고 있는 내용을 저장하는 기억장치. CPU에서 직접적인 접근이 가능하며, 비교적 처리 속도가 빠르며 휘발성의 특성을 가진다. 대표적으로 RAM, ROM이 있다. DRAM같은 경우 CPU에서 byte단위로 접근하여 실행 가능하기 때문에 'Executable'이라고도 불리는 것이다. 휘발성이며 속도와 기억 용량 모두 보통이다.
- Secondary Memory (보조기억장치) : 물리적인 디스크가 연결되어 있는 기억장치이다. 주기억장치보다는 느리지만 컴퓨터 전원을 끄더라도 저장된 데이터가 사라지지 않고 영구적으로 남아있다. 대표적으로 HDD, SSD가 있다. 비휘발성이며 속도가 느리지만 기억 용량이 많다.
- Speed : 메모리 연산 속도를 말한다. 캐싱을 사용하면 연산 속도를 높일 수 있다.
- Cost : 단위공간당 가격을 말한다. 비교적 가격이 높은 주기억장치는 용량이 적지만, 보조기억장치는 용량이 크다.
- Volatility : 휘발성 매체는 컴퓨터의 전원이 나가면 데이터가 사라지지만, 비휘발성 매체는 전원이 나가도 데이터가 사라지지 않는다.
* 캐시 (Cache)
캐시는 데이터를 미리 복사해 놓는 임시 저장소이다. 빠른 장치와 느린 장치의 속도 차이로 인해 발행하는 병목 현상을 줄이기 위해 사용된다. 이를 통해 데이터 접근 시간을 단축할 수 있고, 계산 속도를 높일 수 있다. 실제로 메모리와 CPU 사이의 속도 차이가 크기 때문에 중간에 레지스터 계층을 둬서 해결한다. 이렇게 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 캐싱 계층이라고 한다.
웹 브라우저에서 사용하는 캐시로는 쿠키, 로컬 스토리지, 세션 스토리지 등이 있고, 데이터베이서에서는 'redis' 를 캐싱 계층으로 두어 성능을 향상시키기도 한다.
- 캐시히트 : 캐시에서 원하는 데이터를 찾은 것
- 캐시미스 : 캐시에서 원하는 데이터를 찾지 못해 주 메모리에서 데이터를 찾아오는 것
2) 프로그램 실행의 흐름
프로그램은 보통 실행 파일의 형태로 하드디스크와 같은 '파일 시스템(File System)'에 저장 된다. 이를 실행시키면 0번지부터 시작하는 각 프로그램의 독자적인 메모리 주소 공간이 생긴다. 이러한 주소 공간은 code, data, stack 영역으로 이루어져 있으며, '가상 메모리(Virtual memory)'라고 한다.
- code : CPU에서 실행할 기계어 코드를 담고 있다.
- data : 변수, 전역변수 등 프로그램이 사용하는 자료구조를 담고 있다.
- stack : 코드가 함수 구조로 되어있기 때문에 함수를 호출하거나 반환할 때 데이터를 쌓고 꺼내는 역할을 한다.
이러한 독자적인 주소 공간을 '물리적 메모리(Physical memory)'에 올려 실행을 시킨다. 이 때 커널 영역은 컴퓨터를 켜면 메모리에 항상 올라가있지만, 사용자 프로그램은 실행을 할 때 주소 공간이 생겼다가 프로그램을 종료하면 사라진다. 또한 모든 주소 공간을 물리적 메모리에 올리는 것이 아니라 필요한 부분만 올려 메모리 낭비를 방지한다. 경우에 따라 보관해야 하는 주소 공간 중 당장 필요한 것은 물리적 메모리에 올려놓고, 그렇지 않은 것은 'Swap area'에 내려놓는다. 가상 메모리의 stack, data, code는 각각 분리되어 용도에 맞게 메모리에 올라간다.
[1] 가상 메모리 (Virtual memory)
가상 메모리는 메모리 관리 기법중 하나로, 컴퓨터가 실제 이용 가능한 메모리 자원을 추상화하는 방법이다. 이때 가상적으로 주어진 주소를 '가상 주소' 혹은 '논리 주소(logical address)'라고 하며, 실제 메모리상에 있는 주소를 '실제 주소' 혹은 '물리 주소(physical address)'라고 한다. 가상 주소는 메모리관리장치인 'MMU(Memory Management Unit)'에 의해 실제 주소로 변환된다.
만약 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생한다. 이를 방지하기 위해 당장 사용하지 않는 영역을 하드디스크로 옮겨 필요할 때 RAM으로 불러와 올리고, 사용하지 않으면 다시 하드디스크로 내림을 반복하여 RAM을 효과적으로 관리하는 것은 '스와핑(swapping)'이라고 한다.
[2] 커널 주소 공간의 내용
1. code
운영체제는 인터럽트가 들어올 때 CPU를 얻게 된다. 이때 어떻게 처리할지에 대한 내용이 함수의 형태로 커널 코드에 구현되어 있을 것이다. 즉, 시스템콜이나 인터럽트 처리를 위한 코드가 포함되어 있다. 또한 운영체제의 목적인 자원을 효율적으로 관리하기 위한 코드, 사용자에게 편리한 서비스를 제공하기 위한 코드가 존재한다.
2. data
운영체제가 사용하는 여러 자료구조가 정의되어 있다. 운영체제는 CPU, Memory, Disk 등을 관리하는데, 이를 관리하는 자료구조가 있을 것이다. 또한 운영체제는 여러 프로세스를 관리하는데, 각 프로그램들의 독자적인 주소 공간을 통해 프로그램을 관리하기 위한 자료구조가 정의되어 있다. 이를 'PCB(Process Controller Block)'이라고 하며, 시스템 안의 프로그램을 관리하는 역할을 한다. 프로세스별로 PCB가 하나씩 만들어진다.
3. stack
운영체제의 코드는 여러 프로그램들의 요청에 따라 사용될 수 있다. 각각의 프로세스별로 커널 스택이 따로 있는데, 운영체제의 코드는 함수 구조로 되어있기 때문에 요청에 맞는 함수를 호출하고 반환하는 역할을 한다.
* 함수 (Function)
- 사용자 정의 함수 : 자신의 프로그램에서 정의한 함수
- 라이브러리 함수 : 자신의 프로그램에서 정의하지 않고 다른 곳에서 가져다 쓴 함수. 프로그램의 실행 파일에 포함
- 커널 함수 : 운영체제 프로그램의 함수. 커널 함수의 호출 = 시스템 콜.
[3] 프로그램의 실행
참고 자료
면접을 위한 CS 전공지식 노트 (주홍철 저)