01. 소프트웨어 이해
소프트웨어는 하드웨어와 함께 컴퓨터를 구성하는 주요 요소 중 하나입니다. 컴퓨터 내 일 처리 순서와 방법을 지시하는 명령어의 집합인 프로그램과 프로그램 수행에 필요한 절차, 규칙, 관련 문서 등을 총칭하는 용어입니다.
소프트웨어는 크게 "시스템 소프트웨어"와 "응용 소프트웨어"로 나뉘며, 그 외에 "펌웨어"와 "미들웨어"가 있습니다.
- 펌웨어: 하드웨어를 제어하는 역할을 하는 작은 규모의 소프트웨어
- 미들웨어: 시스템 소프트웨어와 응용 소프트웨어 사이, 다른 종류의 응용 프로그램 사이에서 중개 역할을 하는 프로그램
1) 시스템 소프트웨어
시스템 소프트웨어는 컴퓨터를 관리하기 위한 소프트웨어입니다. 컴퓨터 사용에 꼭 필요한 프로그램들을 의미합니다. 일반적으로 운영체제와 시스템을 관리하는 유틸리티를 합친 형태입니다.
시스템 소프트웨어 종류에는 "운영체제", "언어 처리기", "라이브러리", "장치 드라이버", "유틸리티" 가 있습니다.
2) 응용 소프트웨어
응용 소프트웨어는 특정 분야에서 사용하기 위해 제작된 소프트웨어입니다. 용도에 따라 종류가 매우 다양하며, 몇몇 응용 소프트웨어는 컴퓨터 기종이 다르면 사용할 수 없기도 합니다. 응용 소프트웨어의 예시로는 "엑셀", "워드", "포토샵", "리그오브레전드 게임" 등이 있습니다.
3) 소프트웨어 공학
소프트웨어 공학은 소프트웨어 개발 계획부터 운용, 유지 보수, 폐기까지의 전 과정에 필요한 이론과 기술을 다루는 학문입니다. 프로그램 코딩 단계는 소프트웨어 제작 과정 중 10~20% 정도를 차지하지만, 더 나은 소프트웨어를 만들기 위해서는 이 외의 작업도 함께 수용해야 합니다.
(1) 소프트웨어 개발 주기
소프트웨어 개발 주기란 소프트웨어를 개발하는 시점부터 사용이 완전히 끝나 폐기될 때까지의 전 과정을 단계별로 나눈 것이다. 일반적으로 "요구 분석", "설계", "구현", "테스트", "유지 보수"의 5단계를 거치게 됩니다.
(2) 소프트웨어 개발 방법론
소프트웨어 개발 방법론 모델은 여러 가지가 있는데, 가장 전통적인 방법으로는 "폭포수 모델", 개발 범위를 조금씩 넓혀가는 "점진적 모델", 사용자의 의견을 중요하게 여기는 "프로토타입 모델"이 있다.
- 폭포수 모델: 폭포수가 위에서 아래로 떨어지듯이 개발 단계가 순차적으로 진행된다. 이 방법은 요구사항이 모두 명확하게 맞춰졌을 때 가장 적합하다.
- 점진적 모델: 크고 복잡한 소프트웨어를 개발할 때 한꺼번에 모든 걸 개발하지 않고, 간단한 시스템을 먼저 개발한 후 목표에 맞게 나머지 부분을 개발해 나가는 방법이다.
- 프로토타입 모델: 사용자의 요구를 정확하게 파악하기 위해 프로토타입을 만들어 최종 결과물을 예측하는 모델이다. 요구 분석 단계에서 많이 사용되며, 제품 수정이 쉽고 최종 결과물이 나오기 전에 결과물의 일부 또는 모형을 볼 수 있다는 장점이 있다.
02. 운영체제 개요
운영체제는 하드웨어 장치를 관리하고 사용자가 컴퓨터를 편하게 사용할 수 있는 환경을 제공하며, 응용 소프트웨어의 효율적인 실행을 지원하는 시스템 소프트웨어입니다. 하드웨어와 가장 가까운 위치에 있으며 컴퓨터의 기본 운영 및 관리를 담당하는 소프트웨어입니다.
1) 운영체제 기능
운영체제는 하드웨어를 효율적으로 관리하고 제어하는 기능을 바탕으로 하여, 사용자에게 보다 편리한 컴퓨팅 환경을 제공하는 것이 목적입니다. 운영체제의 기능으로는 "자원 관리", "자원 보호", "사용자 인터페이스 제공" 이 있습니다.
2) 운영체제 종류
운영체제는 컴퓨터 운영체제와 모바일 운영체제로 분류됩니다. 컴퓨터 운영체제에는 "유닉스", "리눅스", "윈도우", "맥 OS" 등이 있고, 모바일 운영체제에는 "안드로이드", "IOS" 등이 있습니다.
3) 운영체제 구성
운영체제는 크게, 핵심적인 "커널"과 외부에 보이는 "사용자 인터페이스"로 구성되어 있습니다.
(1) 커널
커널은 일반 사용자가 관여하지 못하는 시스템 레벨 수준의 제어 작업을 수행합니다. "메모리 관리", "프로세스 관리", "입출력장치 관리" 등의 일을 처리합니다. 커널 내에는 드라이버와 시스템 호출 기능이 있습니다.
(2) 사용자 인터페이스
사용자 인터페이스는 컴퓨터 사용자가 직접 프로그램을 제어하고 사용할 수 있는 환경을 뜻합니다. 운영체제가 커널에 명령을 전달하고, 실행 결과를 사용자와 응용 프로그램에서 돌려주는 방식입니다. 그래픽 기반의 "그래픽 사용자 인터페이스(GUI)"나 문자 기반의 "명령어 인터페이스(CLI)" 방식으로 나뉩니다.
4) 운영체제 관리
초창기 컴퓨터는 한 번에 하나의 프로그램만 실행되는 "단일 프로그래밍" 시스템이었습니다. 그래서 프로세스 관리나 메모리 관리가 덜 중요했는데, 오늘 날 컴퓨터는 여러 개의 프로그램을 메모리 내에 가지고 있는 "다중 프로그래밍" 시스템이 주로 사용되어 운영체제의 프로세스 및 메모리 관리 기능이 중요해졌습니다.
운영체제는 다중 프로그래밍 시스템이 사용될 때, 여러 개의 프로세스가 서로 충돌하지 않도록 메모리 상의 프로세스를 잘 관리해야 합니다. 또한, 메모리 내 프로세스의 위치를 추적하기 위해 메모리 관리도 수행해야 합니다.
03. 운영체제 프로세스 관리
1) 프로세스 개념
프로그램 대부분은 보조기억장치에 저장되어 있다가, 실행 명령을 받으면 메인메모리로 이동해 CPU에 의해 실행됩니다. "프로세스"란 실행 명령을 받아 메인 메모리로 올라간 프로그램을 뜻합니다. 즉, 컴퓨터 상에서 실행 중인 프로그램입니다. 프로세스는 운영체제에서 운영되는 시스템 작업의 기본 단위입니다.
다중 프로그래밍 환경에서는 프로세스 여러 개가 동시에 실행 중일 수 있는데, 프로세스는 생성된 후 준비 상태로 대기하다가 운영체제가 신호를 보내면 실행되고, 실행을 마치면 종료됩니다.
(1) 준비(Ready)
생성된 프로세스가 프로세서인 CPU 사용 시간을 할당받기 위해 기다리고 있는 상태입니다. 우선순위가 높은 프로세스를 CPU에 할당하면 실행 상태로 넘어가게 됩니다.
(2) 실행(Running)
CPU에 의해 프로세스가 실행되고 있는 상태입니다. 명령어는 하나씩 실행되는데 이 단계에서는 다음 단계로 넘어가는 루트가 "종료", "중단/방해", "입출력 또는 이벤트 기다림" 이렇게 3가지가 있습니다.
- 종료(Terminated): 프로세스의 모든 작업이 끝나면 종료된다.
- 중단/방해(Time out/Interrupt): 프로세스의 CPU 할당 시간이 완료되거나 방해가 발생하면 준비 상태로 넘어간다.
- 입출력 또는 이벤트 기다림(I/O. Event Wait): 실행 중인 프로세스가 입출력 명령을 마치면 CPU 사용을 반납하고 입출력 종료 신호가 올 때까지 대기 상태로 넘어간다.
(3) 대기(Waitng{Block})
입출력 등과 같이 임의의 자원을 요청한 후 할당받을 때까지 기다리는 상태입니다. 대기 중인 프로세스가 필요한 자원을 할당받으면 다시 준비 상태로 넘어갑니다.
2) 프로세스 제어 블록
프로세스 제어 블록(PCB)이란 운영체제가 관리하는 자료구조입니다. 프로세스 관리에 필요한 거의 모든 정보가 저장되어 있는 장소이며, 기본적으로 프로세스 ID, 각 프로세스에서 사용하는 레지스터 메모리 값의 백업 값 등이 저장되어 있습니다. 모든 프로세스는 별도의 PCB를 가지며, 프로세스가 생성될 때 만들어졌다가 프로세스가 실행을 마치면 삭제됩니다.
다중 프로그래밍 환경에서는 여러 개의 프로세스가 시간별로 CPU를 나눠서 사용하는데, 이때 CPU 내부 메모리인 레지스터에도 각자의 값을 저장해서 사용합니다. 그런데 만약 프로세스가 실행 상태를 벗어나게 된다면 실행 상태인 프로세스가 사용하는 레지스터 값 등은 해당 프로세스의 PCB에 저장이 되고 새롭게 실행 상태로 넘어온 프로세스의 레지스터 값 등은 CPU에 적재됩니다. 이 과정을 "문맥 전환" 이라고 합니다.
3) 프로세스 스케줄링
프로세스 스케줄링은 다중 프로그래밍 환경에서 현재 실행 중인 프로세스 다음에 어떤 프로세스를 실행하면 좋을지 결정하는 과정입니다. 준비 상태에 있는 여러 프로세스 중 CPU가 실제로 수행할 프로세스를 정하는 것입니다. 프로세스 스케줄링 기법으로는 "선도착 선처리 기법", "최단작업 우선 기법", "순환 순서 기법"이 있습니다.
(1) 선도착 선처리 기법
가장 간단한 스케줄링 방법이다. 먼저 생성된 프로세스, 즉 먼저 준비 상태에 들어온 프로세스를 먼저 실행시킵니다.
(2) 최단작업 우선 기법
준비 상태에 있는 프로세스 중 CPU 사용 시간이 가장 짧은 것부터 실행시키는 방법입니다. 이 방법을 적용하기 위해서는 프로세스의 총 실행 시간을 미리 알아야 합니다.
(3) 순환 순서 기법
한 프로세스가 CPU를 계속 차지하고 있는 것이 아니라, 여라 프로세스가 돌아가며 조금씩 차지하는 방법을 말합니다. 준비 상태에 있는 모든 프로세스에게 CPU 실행 시간을 골고루 나누어줍니다. 사용자와의 인터랙션이 빈번한 개인용 컴퓨터에 적합합니다.
4) 병행 프로세스
프로세스는 다른 프로세스와 협력 작업을 수행하기도 하는데, 2개 이상의 프로세스가 동시에 실행되는 것을 병행 프로세스라고 합니다.(병렬 프로세스와는 다른 개념) 병행 프로세스는 다른 프로세스와 협력하면서 실행되므로 서로 영향을 주고받습니다. 그래서 수행 과정상 예측할 수 없는 상황이 발생하기도 합니다. 이러한 오류를 막기 위해서 사용되는 개념이 바로 "동기화", "임계 영역", "상호 배제" 입니다.
(1) 동기화
하나의 자원(데이터)에 2개 이상의 프로세스가 동시에 접근하면 데이터가 불일치 상태에 놓일 수 있습니다. 이때 데이터의 일관성을 유지하기 위해서는 병행 프로세스의 처리 순서를 잘 정해야하는데 이를 "프로세스 동기화" 라고 합니다.
(2) 임계 영역
병행 프로세스의 코드 영역 중 자원(데이터)을 읽고 수정하는 등의 작업이 이루어지는 부분을 "임계 영역"이라고 합니다. 하나의 프로세스가 임계 영역 내에 존재하면 다른 프로세스들은 임계 영역에 진입하지 못하도록 제거해야 합니다.
(3) 상호 배제
하나의 프로세스가 공유 자원을 사용하는 동안 다른 프로세스가 자원을 사용하지 못하게 막는 것을 "상호 배제" 라고 합니다.
5) 교착 상태
교착 상태란 2개 이상의 프로세스가 절대 일어나지 않을 이벤트를 기다리고 있는 상태를 뜻합니다. 즉, 영원히 작업을 완료할 수 없는 상태에 빠져버리는 것입니다. 특정 프로세스가 공유 자원을 독점해 사용하고 있을 때 다른 프로세스가 그 자원을 요구하면 교착 상태가 발생합니다.
이런 교착 상태는 "상호 배제", "보유와 대기", "비선점", "순환 대기" 4가지 조건이 딱 맞아떨어질 때 발생합니다.
즉, 다른 말로 이 4가지 조건 중 한 가지라도 피할 수 있다면 교착 상태는 절대 일어나지 않습니다.
(1) 상호 배제
오직 하나의 프로세스만 자원을 사용할 수 있다는 조건입니다. 모든 프로세스는 원하는 자원에 대한 배타적인 통제권을 요구합니다. 해당 자원은 다른 프로세스에 동시에 사용될 수 없다는 뜻입니다.
(2) 보유와 대기
자원을 할당받은 상태에서 다른 자원을 기다리는 것입니다. 자원을 이미 가지고 있음에도 다른 프로세스가 보유한 자원을 추가로 요구하는 상황입니다.
(3) 비선점
한 프로세스가 작업을 끝내기 전까진 다른 프로세스가 해당 자원을 뺏을 수 없다는 것입니다. 어떤 프로세스에 할당된 자원을 다른 프로세스가 강제로 선점할 수 없다는 조건입니다.
(4) 순환 대기
각 프로세스가 자원을 가지고 있는 상태에서 다른 프로세스의 자원을 요청하는 것입니다. 자원 할당 그래프 같은 사이클을 형성합니다.
04. 운영체제의 메모리 관리
1) 메인메모리 관리 I : 단일 프로그래밍
단일 프로그래밍 기법에서는 한 번에 오직 하나의 프로그램만 주기억 장치에 저장해 실행할 수 있습니다. 사용자 프로그램을 메모리 주소의 시작 부분에 두면 운영체제는 사용자 프로그램이 운영체제로 침범하지 않도록 막기만 하면 되며 이외의 별다른 메모리 관리 기법은 필요하지 않습니다. 운영체제의 역할이 단순하여 구현하기 쉽지만, CPU를 효율적으로 사용할 수 없습니다.
2) 메인메모리 관리 II : 다중 프로그래밍
다중 프로그래밍 기법에서는 메인메모리에 여러 개의 작업을 쌓아 둔 후, CPU가 작업을 오가며 동시에 실행하는 기법입니다. 운영체제는 프로그램들이 서로 충돌하거나 상대방의 영역을 침범하지 않도록 관리합니다.
다중 프로그래밍 환경의 메인메모리 관리 기법에는 "고정 분할 메모리 관리"와 "가변 분할 메모리 관리" 가 있습니다.
(1) 고정 분할 메모리 관리
고정 분할 메모리 관리 기법은 가장 간단한 메모리 할당 방법으로, 메인메모리를 고정된 크기로 미리 나눠 두었다가 실행 중인 프로세스에 할당합니다. 분할된 메모리 구조를 유지하다가 프로그램이 실행되면 적당한 위치를 할당하는 식입니다. 나눠진 공간은 하나의 작업이 쌓일 수 있는 일정한 크기의 기억 공간이므로 다른 프로세스가 침범하지 않도록 보호되어야 합니다. 이를 위해 상한 주소와 하한 주소 값이 저장된 레지스터를 사용합니다.
고정 분할 메모리 관리 기법은 작업량과 분할 공간의 크기가 일치하지 않아 빈 공간이 발생할 수 있는데, 이를 "단편화" 현상이라고 합니다. 단편화 현상은 "내부 단편화", "외부 단편화" 이렇게 2가지 현상으로 나타나는데 내부 단편화는 작업물이 분할 공간에 들어가 있지만 공간의 크기가 커서 빈 공간이 발생하는 것이고, 외부 단편화는 분할 공간의 크기가 작업량보다 작아서 빈 공간이 된 것을 말합니다.
(2) 가변 분할 메모리 관리
가변 분할 메모리 관리 기법은 고정 분할 메모리 관리 기법의 단점을 보완하기 위해 등장한 기법입니다. 고정된 분할 공간의 경계를 없애고 작업량이 맞는 공간을 할당하며 작업이 완료되면 빈 공간은 다시 모아 관리합니다. 즉, 사용자 프로그램이 실행되면 그때그때마다 알맞은 크기로 공간을 분할해 할당합니다.
고정 분할 또는 분할 메모리 기법에서 빈 공간에 새로운 프로그램을 할당할 때는 다음의 3가지 방식을 사용합니다.
- 최초 적합(First Fit): 프로그램 크기보다 큰 분할 공간 중 처음 만나는 공간을 할당한다.
- 최적 적합(Best Fit): 프로그램 크기보다 큰 분할 공간 중 가장 작은 공간을 할당한다.
- 최악 적합(Worst Fit): 프로그램 크기보다 큰 분할 공간 중 가장 큰 공간을 할당한다.
3) 가상메모리 관리
가상메모리 관리는 지금 당장 실행해야 하는 부분만 메모리에 저장하고 나머지 프로그램은 보조기억장치에 둔 채 동작하는 방법입니다. 운영체제에서 지원하는 방법이며, 실제 메모리와 상관없이 메모리 공간을 제공하는 방법입니다.
가상메모리 구현 방법 중 "페이징 기법"은 프로그램을 일정 크기로 나누어 페이지를 만들고 페이지 단위별로 메인메모리에 올려 동작하는 방식으로 이루어집니다. 즉, 가상메모리를 일정한 크기의 페이지로 나누어 관리하는 것입니다.
페이징 기법에서 메인메모리는 "프레임"이라는 고정된 크기의 블록으로, 프로세스는 "페이지" 단위로 나뉩니다.(보통 페이지와 프레임은 크기가 같습니다.) 하나의 프로세스를 구성하는 페이지는 서로 다른 프레임에 할당되는데, 각 프로세스에 할당된 "페이지 테이블"이 이 페이지와 프레임 번호를 연결해 줍니다.