운영체제의 역할은 무엇인가?
- CPU 스케줄링과 프로세스 관리
- 메모리관리
- I/O 디바이스 관리
- 디스크 파일 관리
CPU(중앙처리장치) 란?
- 데이터와 명령어를 해석하고 실행하는 장치이다.
- CPU가 여러 개가 있으면 각자 해석하고 실행속도가 빨라진다.
- CPU는 제어장치, 산술연산장치, 레지스터로 구성되어 있다.
제어장치 : 여러 장치들을 컨트롤하고, 명령어를 해석한다.
산술논리장치 : 해석된 명령어에 따라 실제 연산을 수행하려면 필요하다.
레지스터 : 연산 수행시 메모장에다가 중간 중간 임시로 메모해가며 연산하는게 좋다.
명령어 인출(Fetch)
- 제어 장치가 프로그램 카운터(PC)를 통해 메모리에서 [ 3 더하기 5 ] 명령어를 가져온다.
명령어 해독(Decode)
- 제어 장치가 명령어를 해독하며 [ 더하기 ] 연산을 수행해야 한다는 것을 파악한다.
- 제어 장치는 ALU에 더하기 연산을 수행하라고 지시한다.
명령어 실행(Execute)
- 제어 장치가 레지스터에서 값을 가져와 ALU에 전달한다. 이 경우 3과 5를 레지스터에서 읽어온다.
- ALU는 3과 5를 더하여 결과인 8을 계산한다.
결과 저장(Store)
- 제어 장치는 ALU의 결과 8 를 다시 레지스터에 저장하도록 지시한다.
- 결과는 이후 필요할 때 메모리로 옮겨지거나 다른 연산에 사용된다.
DMA(Direct Memory Access) 컨트롤러가 무엇인가?!
- CPU의 보조일꾼
- 데이터를 메모리와 주변 장치(예: 하드 드라이브, 그래픽 카드, 네트워크 카드 등) 간에 직접 전송할 수 있도록 도와준느 하드웨어 장치다.
왜 필요하지?
- 보통 데이터를 전송할 떄는 CPU가 직접 관여한다.
- 근데 CPU가 DMA에게 일을 시키고, 다른일을 하면 성능에 매우 좋기 때문이다!
- DMA이 없다면??? 데이터가 전송할때까지 CPU는 다른일을 하지 못하고, 기다려야한다!
- 근데 해당 역할을 DMA에게 위임해준다.
메모리 계층이 무엇일까?
레지스터, 캐시, 메모리(ram) , 주기억장치, 저장장치(HDD, SDD), 보조기억장치
캐시란?
- 캐시는 CPU와 메모리 사이에 존재하는 고속 메모리이다.
- 자주 사용되는 데이터를 캐시에 저장해두면, 메모리까지 갈 필요없이 캐시에서 데이터를 꺼내서 쓰면 된다.
지원성원리란?
- 최근에 쓰인 데이터는 다시 쓰일 가능성이 높다 ( 시간지역성 )
- 최근에 쓰인 데이터의 주변 데이터 공간도 다시 쓰일 가능성이 높아 ( 공간지역성 )
캐시 매핑의 의미와 방법은?
캐시 매핑은 캐시가 히트되기 위해 매핑하는 방법을 말하고 직접매핑, 연관매핑, 집합연관매핑 3가지가 존재한다.
직접 매핑
단순히 메모리와 캐시를 직접 매핑하는 것이다.
장점 : 속도가 빠르다. CPU는 자신이 원하는 데이터가 메모리의 어느 주소공간에 있는지 알고있다. 그렇기 때문에 자신이 원하는 데이터가 캐시의 어느 주소에 있는지 나눗셈을 통하여 쉽게 알수 있다.
단점 : 충돌이 많다.
연관 매핑
메모리에 있는 데이터를 캐시의 어느 공간이든 저장할 수 있는 방법 (직접매핑처럼 규칙이 없다)
장점 : 충돌이 적다
단점 : 속도가 오래 걸린다. CPU는 해당 데이터가 캐시의 어느 위치에 있는지 알 수 없기 때문에 캐시 공간을 하나하나탐색해야한다.
직합연관매핑
캐시를 여러개 집합으로 나누고 하나의 집합에 연관 매핑을 적용한 것
빠른 검색 : 캐시의 집합 내에서만 탐색하면 된다.
충돌 적음 : 직접 매핑보다는 충적이 적다. 예) 집합 1에 저장할 떄는 집합 1의 칸들만 확인하면 되므로, 충돌이 일어나도 집합 내에서만 처리하면된다.
한정된 메모리를 어떻게 관리하면 좋을까?
- 가상 메모리를 사용하면된다.
가상 메모리
- 컴퓨터가 실제 메모리(물리적 메모리)보다 더 많은 메모리를 사용할 수 있게 해주는 기술이다.
- 운영 체제에서 프로그램에게 제공하는 메모리 주소 공간
- 메모리는 한정되어 있는데, 프로그램에게 너 이만큼의 메모리를 사용할 수 있어 라고 속이는 것이다.
페이지 테이블
- 가상 메모리 주소와, 실제 메모리 주소를 매핑시켜주는 역할
페이지 폴트
- 가상 메모리에는 존재하지만, 실제 메모리(RAM)에는 없는 데이터에 접근할 경우 발생
스와핑
- 페이지 폴트가 발생하면, 메모리에서 사용하지 않는 영역을 하드디스코로 옮기고, 필요한 데이터를 하드디스크에서 메모리로 옮겨준다.
메모리 연속 할당이란?
프로세스A, 프로세스B, 프로세스C 가 순차적으로 메모리 공간에 할당된다.
메모리 연속할당에는 고정분할방식, 가변분할방식이 존재 한다.
고정분할방식
- 메모리를 미리 나누어 관리하는 방식이며, 메모리가 미리 나뉘어 있기 때문에 융통성이 없다. 또한 내부 단편화가 발생
내부단편화?
메모리를 5KB씩 미리 나누었는데, 막상 프로그램은 3KB만 사용하게되는 현상
가변분할방식
- 매시점 프로그램 크기에 맞게 동적으로 메모리를 나눠서 사용 (미리 나누지 않는다!)
- 내부 단편화는 발생하지 않고, 외부 단편화가 발생한다.
외부단편화?
메모리 내에 여러 개의 작은 빈 공간이 흩어져 있어, 필요한 만큼의 여녹된 공간을 확보하기 어려운 문제가 있다.
메모리에 5KB, 10KB, 2KB의 빈 공간이 흩어져 있는 경우, 12KB의 연속된 공간이 필요할 때 이를 찾기 어렵다.
가변크기 할당의 문제점은 무엇인가?
- 외부 단편화 문제
- 프로세스마다 할당 되는 메모리 크기가 다르다 보니 발생하는 문제이다.
- 프로세스마다 할당 되는 메모리 크기가 같으면 외부 단편화는 발생하지 않는다.
프로세스마다 할당되는 메모리 크기를 같게 만들면 되지 않을까?
프로세스의 논리(가상)메모리를 '같은' 크기 페이지로 자르면?? 실제 메모리의 프레임도 '같은' 프레임으로 자르면?
페이지 → 프레임에 알맞게 들어맞게 만들고, 불연속적인 할당을 하면 즉 외부 단편화는 생기지 않는다!
페이징 기법이란?
- 논리주소를 같은 크기의 페이지로 자르고, 같은 크기의 프레임에 불연속적으로 페이지를 할당하는 것이다.
해결해야하는 문제가 뭐야?
페이지가 불연속적으로 할당되어 있는데 흩어진 페이지를 CPU가 어떻게 찾을수 있어?
- 페이지와 프레임을 연결해놓은 테이블이 있어야 한다. 이것이 바로 페이지 테이블이다. 페이지 번호와 매핑되는 프레임 번호가 있다. 그럼 CPU는 페이지 테이블을 통해 원하는 페이지가 어떠한 프레임에 위치해 있는지 찾아갈수있다.
페이지 테이블을 활용하면 좋은데 또 문제점이 있지않아?
1. 페이지 테이블에서 원하는 페이지가 어떤 프레임에 있는지 찾는 과정 1번
2. 실제 프레임에 접근하는 과정 1번
총 2번의 절차가 이루어 진다.
중간에 페이지 테이블을 복사해서 자주 사용하는 데이터는 캐시를 둔다.
1. 캐시에 접근 1번
2. 프레임에 접근 1번
물론 2번 접근하지만 속도는 더 빠르다
페이지 테이블에 페이지와 프레임을 매핑한 정보가 들어있다고 했는데 조금더 자세하게 알아보자.
CPU가 특정 주소에 접근하려면 알아야 되는건?
- 어떤 페이지에 속하고 있는지, 해당 페이지속에서 어느 위치에 있는지 알아야한다.
- 어떤 페이지에 속하냐(페이지 번호) + 해당 페이지속에서 어느 위치에 속하냐 (오프셋)
- 자세히는 페이지번호 + 오프셋 ↔ 프레임번호 + 오프셋이 있는것이다
- 여기서 오프셋은 페이지와 프레임이 같아야 한다. 그래야 올바른 주소를 찾을 수 있기 때문이다.
또 문제가 있다. CPU는 페이지 테이블의 주소를 어떻게 알 수 있을까?
- 프로세스 테이블, 베이스, 레지스터가 페이지 테이블 주소를 가르킨다.
페이지 교체 알고리즘
메모리는 한정되어 있기 떄문에, 스와핑이 많이 일어난다.
스와핑은 많이 일어나지 않도록 설계되어야 하며 이는 페이지 교체 알고리즘을 기반으로 스와핑이 일어난다
- FIFO : 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법을 의미
- LRU : 참조가 가장 오래된 페이지를 바꾼다, 스택 방식을 사용함
- NUR : 일명 clock 알고리즘이고, 먼저 0과 1을 가진 비트를 둔다. 1은 최근에 참조되었고 0은 참조 되지 않음을 의미함. 시계 방향으로 돌면서 0을 찾고 0을 찾은 순간 해당 페이지를 교체하고, 해당 부분을 1로 바꾸는 알고리즘
- LFU : 가장 참조횟수가 적은 페이지를 교체함
프로세스
컴퓨터에서 실행되고 있는 프로그램 (메모리에 올라간 프로그램)
스레드
프로세스 내 작업 흐름
프로세스의 상태
- 생성 상태 : 프로세스 생성 단계
- 대기 상태 : CPU를 할당받기전 상태
- 실행 상태: 메모리를 할당 받아서, CPU 가 작업하는 상태
- 중단 상태: I/O 작업 등으로 인해, CPU 가 작업하지 않는 상태
- 일시 중단 상태: 메모리 부족으로 일시적으로 중단한 상태
- 종료 : 메모리와 CPU 의 소유권을 모두 놓고 가는 상태
프로세스의 메모리 구조
- 코드 영역 : 프로그램의 코드가 저장되는 곳
- 데이터 영역 : 전역 변수와 정적 변수가 저장되는 곳
- 힙 영역 : 동적 메모리가 저장되는 곳
- 스택 영역 : 함수 호출 시 지역 변수와 호출 정보(매개변수, 반환값)가 저장되는 곳
PCB (Process Control Block)
프로세스의 메타데이터이다.
PCB 에 있는 정보
- 프로세스 ID (Process ID, PID)
- 각 프로세스를 고유하게 식별하는 번호
- 예시: 프로세스 A의 PID가 1234라면, 운영체제는 1234번 프로세스를 특정할 수 있다.
- 프로세스 상태 (Process State)
- 프로세스가 현재 어떤 상태에 있는지를 나타낸다.
- 상태 예시: 실행 중 (Running), 준비 상태 (Ready), 대기 상태 (Waiting), 종료 (Terminated)
- 프로세스가 다음에 실행할 명령어의 주소를 저장한다.
- 예시: 프로그램이 현재 10번째 명령어를 실행 중이라면, 프로그램 카운터는 11번째 명령어의 주소를 가리킨다.
- 레지스터 (Registers)
- 프로세스가 사용하는 CPU 레지스터의 값들을 저장한다
- 예시: 연산 결과나 함수 매개변수 등이 레지스터에 저장
- 메모리 관리 정보 (Memory Management Information)
- 프로세스가 사용하는 메모리 영역에 대한 정보를 저장
- 예시: 프로세스의 코드, 데이터, 힙, 스택 영역의 시작 주소와 크기 등.
- 입출력 상태 정보 (I/O Status Information)
- 프로세스가 사용하는 입출력 장치와 파일에 대한 정보를 저장
- 예시: 프로세스가 사용하는 파일 디스크립터나 입출력 장치의 상태.
- 계정 정보 (Accounting Information)
- 프로세스의 CPU 사용 시간, 메모리 사용량, 우선순위 등의 정보를 저장
- 예시: 프로세스가 실행된 시간이나 자원 사용량.
컨텍스트 스위칭
- PCB 기반으로 프로세스의 상태를 저장하고, 로드 시키는 과정을 말함
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생됨
- 컨텍스트 스위칭 과정에서 유휴시간 발생(idle time)
- 캐시미스도 발생함 ( 기존 프로세스에서 사용중이던 캐시는, 새로운 프로세스에서는 소용없음 )
참고!
스레드에서도 컨텍스트 스위칭이 발생하는데, 스레드는 스택을 제외한 모든 메모리 영역을 공유하기 때문에,
컨텍스트 스위칭 비용이 적게듬.
IPC 란?
사전적 의미로 IPC 는 inter Process Communication 의 약자로 프로세스간 통신이다
- 프로세스간 데이터를 주고 받고 서로 상호작용할 수 있게 하는 메커니즘임
- 사전적 의미로는 프로세스간 통신의 의미만 있지만, 프로세스끼리 자원을 어떻게 사용할지의 의미도 함께 내포되어 있다
IPC 의 주요 측면
- 데이터 주고 받기 : 프로세스간 데이터를 주고 받음
- 메시지 큐, 파이프 라인, 소켓
- 자원관리 (동기화 ) : 프로세스간 자원을 공유하는데 있어, 여러 프로세스가 동시에 자원을 사용하지 않도록 관리함
- 공유 메모리
메시지 큐랑 파이프라인의 차이점
- 파이프라인은 단순히 데이터 흐름을 제공함
- 메시지 큐는 데이터 흐름과, 데이터를 저장함
메시지 큐의 장점
- 비동기 처리: 프로듀서와 컨슈머가 동시에 실행되지 않더라도 메시지를 주고받을 수 있다. 프로듀서는 메시지를 큐에 넣기만 하면 되고, 컨슈머는 필요할 때 메시지를 꺼내 처리하면 된다.
- 유연성: 시스템 간의 결합도가 낮아져 독립적으로 개발, 배포, 유지보수가 가능하다. 프로듀서와 컨슈머는 서로의 존재를 알 필요 없이 메시지 큐를 통해 간접적으로 통신한다.
- 확장성: 메시지 큐는 여러 프로듀서와 여러 컨슈머를 지원할 수 있어, 시스템의 부하를 분산시키고 확장성을 높일 수 있다.
- 안정성: 메시지가 큐에 저장되므로, 일시적인 시스템 장애가 발생하더라도 메시지가 손실되지 않는다. 컨슈머가 다시 가동되면 큐에 저장된 메시지를 계속 처리할 수 있다.
스레드와 멀티스레딩
스레드 : 프로세스가 작업을 수행하는 작은 실행단위
- 프로세스가 동시에 여러 작업을 처리할 수 있게 해준다.
- 웹브라우저(프로세스)를 예로 들면 웹 페이지를 로드하고 (실행1-스레드), 사용자가 입력하는 내용을 처리하고 (실행2-스레드), 다운로드를 진행할 수 있음 (실행3-스레드)
- 즉 , 여러 작업을 도잇에 수행할 수 있다
각각의 스레드는 코드, 데이터, 힙 영역을 공유하여 쓰고, 스택 영역만 독립적으로 가질수 있다.
공유자원
여러 프로세스나 스레드가 동시에 사용할 수 있는 자원
예 : 컴퓨터 메모리, 프린터, 데이터베이스 등등
임계영역
여러 프로세스나 스레드가 공유 자원에 접근하는 코드 부분 → 임계 영역은 한 번에 하나의 프로세스만 접근할 수 있어야함, 다른 프로세스가 동시에 접근하면 문제가 발생함
프린터의 예로 들면
- 임계 영역: 실제로 프린터에 인쇄 명령을 보내는 코드 부분
- 만약 두 명의 사용자가 동시에 인쇄 명령을 보내면, 인쇄 결과가 뒤죽박죽이 되거나 서로의 문서가 섞일 수 있다. 이를 방지하기 위해 한 번에 한 명만 프린터를 사용할 수 있도록 해야 함
임계 영역 문제를 해결하기 위해 상호 배제(Mutual Exclusion)라는 개념을 사용함. 이를 위해 다음과 같은 방법을 사용함
- 뮤텍스(Mutex): 하나의 프로세스만 임계 영역에 들어갈 수 있도록 보호하는 도구.
- 세마포어(Semaphore): 동시에 접근할 수 있는 프로세스의 수를 제어하는 신호를 사용.
- 2개의 프로세스가 동시에 임계영역에 접근하면 문제가 발생하는거 아닌가?
- 읽기 작업의 경우, 두개의 프로세스가 동시에 접근해도 문제 없음
- 쓰기 작업의 경우, 두개의 프로세스가 동시에 접근하면 문제가 있기 떄문에 보통, 이진 세마포어를 사용하여 상호 배제를 보장하는 것이 일반적
- 2개의 프로세스가 동시에 임계영역에 접근하면 문제가 발생하는거 아닌가?
- 모니터(Monitor): 모니터는 동기화 코드 작성을 간편하게 해주는 구조적이고 자동화된 접근 방식을 제공하며, 프로그래머는 복잡한 세부 사항을 신경 쓰지 않고 공유 자원에 대한 안전한 접근을 구현할 수 있습 ( 예 : 자바의 synchronized )
뮤텍스와 이진 세마포어의 차이는?
- 뮤텍스: 잠금을 기반으로 상호배제가 일어남
- 이진 세마포어 : 신호를 기반으로 상호 배제가 일어남.
교착상태
여러 프로세스가 서로의 자원을 기다리느라 진행할 수 없는 상태를 말함
- 예시 : 프로세스A가 프로세스B 가 점유하고 있는 자원을 요청할 떄, 프로세스B도 프로세스 A가 점유하고 있는 자원을 요청함. → 서로 무한 대기…
- 교착 상태의 원인
- 상호배제
- 점유대기
- 비선점
- 환형대기
- 해결 방법 → 교착상태 원인을 깨부신