728x90
운영체제와 컴퓨터
운영체제의 역할
- CPU 스케줄링과 프로세스 관리
- CPU 소유권을 어떤 프로세스에 할당할지, 프로세스의 생성과 삭제, 자원 할당 및 반환을 관리
- 메모리 관리
- 메모리를 어떤 프로세스에 얼만큼 할당해야하는지를 관리
- 디스크 파일 관리
- 디스크 파일을 어떤 방법으로 보관할지 관리
- I/O 디바이스 관리
- 마우스, 키보드 등 입출력 장치와 컴퓨터 간에 데이터를 주고받는 것을 관리
- CPU 스케줄링과 프로세스 관리
운영체제의 구조
- GUI
- 명령어가 아닌 아이콘과 마우스를 이용한 클릭 등으로 컴퓨터와 상호작용할 수 있는 인터페이스
- CUI
- 그래픽이 아닌 명령어로 처리하는 인터페이스
- 드라이버
- 하드웨어를 제어하기 위한 소프트웨어
- 커널
- 시스템콜 인터페이스를 제공하며 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O 요청 관리 등 운영체제의 중추적인 역할
- 시스템콜
- 운영체제가 커널에 접근하기 위한 인터페이스
- 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용됨
- 프로세스와 스레드에서 운영체제로 어떤 요청을 할 때 시스템콜이라는 인터페이스와 커널을 거쳐 운영체제에 전달됨
- GUI
modebit
- 시스템콜이 작동될 때 유저 모드와 커널 모드를 구분할 때 사용되는 플래그 변수
컴퓨터의 요소
- CPU (Central Processing Unit)
- 산술논리연산장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치
- 메모리에 존재하는 명령어를 해석해서 실행하는 역할
- 운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 CPU가 처리
- 산술논리연산장치 (Arithmetic Login Unit)
- 덧셈, 뺄셈 등 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리 연산을 계산하는 디지털 회로
- 제어장치 (Control Unit)
- 프로세스 조작을 지시하는 CPU의 한 부품
- 입출력장치 간 통신을 제어하고 명령어를 읽고 해석하며 데이터 처리를 위한 순서를 결정
- 레지스터
- CPU안에 있는 임시기억장치
- CPU는 자체적으로 데이터를 저장할 방법이 없기에 레지스터를 거쳐 데이터를 전달
- 인터럽트
- 어떤 신호가 들어왔을 때 CPU를 일시정지 시키는 것
- 인터럽트 발생 시 핸들러 함수가 있는 인터럽트 벡터로 가서 핸들러 함수가 실행됨
- 우선 순위가 존재하며 우선 순위에 따라 실행됨
- 하드웨어 인터럽트
- I/O 디바이스에 의해서 발생하는 인터럽트
- 인터럽트 라인이 설계된 후 순차적인 인터럽트 실행을 중지하고 운영체제에 시스템콜을 요청해서 원하는 디바이스를 향해 디바이스에 있는 작은 로컬 버퍼에 접근하여 수행
- 소프트웨어 인터럽트
- 트랩(trap)이라고도 하며 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동
- DMA 컨트롤러
- I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
- CPU에 많은 인터럽트 요청이 올 경우 부하가 발생하므로 CPU를 보조하는 역할
- 메모리
- RAM(Random Access Memory)라고도 불리며 데이터의 상태, 명령어 등을 기록하는 장치
- 타이머
- 특정 프로그램에 시간 제한을 거는 역할
- 디바이스 컨트롤러
- 컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU
- CPU (Central Processing Unit)
메모리
- 메모리 계층
- 레지스터
- CPU안에 있는 작은 메모리
- 휘발성, 속도 가장 빠름, 기억 용량 가장 적음
- 캐시
- L1, L2 캐시를 지칭, L3 캐시도 있음
- 휘발성, 속도 빠름, 기억 용량 적음
- 주기억장치
- RAM
- 휘발성, 속도 보통, 기억 용량 보통
- 보조기억장치
- HDD, SDD
- 휘발성, 속도 낮음, 기억 용량 많음
- 레지스터
- 캐시
- 데이터를 미리 복사해 좋는 임시 저장소
- 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리
- 시간 지역성
- 최근 사용한 데이터에 다시 접근하려는 특성
- 공간 지역성
- 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
- 캐시히트와 캐시미스
- 캐시히트
- 캐시에서 원하는 데이터를 찾는 것
- 캐시미스
- 데이터가 캐시에 없을 경우 주메모리로 가서 데이터를 찾아오는 것
- 캐시히트
- 캐시매핑
- 캐시가 히트되기 위해 매핑하는 방법
- 직접 매핑
- 처리가 빠르지만 충돌 발생이 잦음
- 연관 매핑
- 순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑
- 충돌이 적지만 모든 블록을 탐색해야 해서 속도가 느림
- 집합 연관 매핑
- 직접 매핑과 연관 매핑을 합친 방법
- 순서를 일치시키지만 집합을 둬서 저장하며 블록화되어 있기 때문에 검색은 좀 더 효율적
- 웹 브라우저의 캐시
- 쿠키
- 만료기한이 있는 키-값 저장소
- same site 옵션을 strict로 설정하지 않은 경우 다른 도메인에서 요청했을 때 자동 전송됨
- 4KB 까지 저장가능
- httponly 옵션 적용 시 js에서 접근 불가능
- 로컬 스토리지
- 만료기한이 없는 키-값 저장소
- 10MB 까지 저장가능
- 웹 브라우저를 닫아도 유지되며 도메인 단위로 저장, 생성됨
- HTML5 를 지원하지 않는 브라우저에서는 사용 불가능
- 클라이언트에서만 수정 가능
- 세션 스토리지
- 만료기한이 없는 키-값 저장소
- 탭 단위로 생성되며 탭을 닫을 때 데이터 삭제
- 5MB 까지 저장가능
- HTML5 를 지원하지 않는 브라우저에서는 사용 불가능
- 클라이언트에서만 수정 가능
- 쿠키
- 메모리 계층
메모리 관리
- 가상 메모리
- 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 메모리 관리 기법
- 가상적으로 주어진 주소를 가상 주소라 하며, 실제 메모리상에 있는 주소를 실제 주소라고 함
- 가상 주소는 메모리관리장치에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축 가능
- TLB
- 메모리와 CPU 사이에 있는 주소 변환을 위한 캐시
- 스와핑
- 당장 사용하지 않는 영역을 하드디스크로 옮겨 필요할 때 다시 RAM으로 불러와 올리고, 사용하지 않으면 다시 하드디스크로 내림을 반복하여 RAM을 효과적으로 관리하는 것
- 페이지 폴트
- 프로세스의 주소 공간에는 존재하지만 RAM에는 없는 데이터에 접근했을 경우 발생
- 페이지 폴트와 스와핑 과정
- CPU는 물리 메모리를 확인하여 해당 페이지가 없을 경우 트랩을 발생해서 운영체제에 알림
- 운영체제는 CPU의 동작을 잠시 멈춤
- 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인
- 페이지기 없으면 프로세스를 중단하고 현재 물리 메모리에 비어있는 프레임이 있는지 탐색
- 물리 메모리에도 없다면 스와핑이 발동됨
- 비어 있는 프레임에 해당 페이지를 로드, 페이지 테이블 최신화
- 중지되었던 CPU 재시작
- 페이지
- 가상 메모리를 사용하는 최소 크기 단위
- 프레임
- 실제 메모리를 사용하는 최소 크기 단위
- 스레싱
- 메모리의 페이지 폴트율이 높은 것을 의미
- 컴퓨터의 심각한 성능 저하를 초래
- 메모리에 너무 많은 프로세스가 동시에 올라갈 경우 스와핑이 많이 일어나서 발생
- 페이지 폴트 발생 시 CPU 이용률이 낮아지고 운영체제에서는 가용성을 높이기 위해 메모리에 더 많은 프로세스를 올리게 됨, 그 과정이 반복되며 발생
- 해결방법으로는 메모리를 늘리거나, HDD를 SSD로 교체, 작업세트, PFF 등이 있음
- 작업 세트
- 프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드하는 것
- PFF (Page Fault Frequency)
- 페이지 폴트 빈도를 조절하기 위해 상한선과 하한선을 만드는 방법
- 메모리 할당
- 연속 할당
- 메모리에 '연속적으로' 공간을 할당하는 것
- 고정 분할 방식
- 메모리를 미리 나누어 관리하는 방식
- 내부 단편화 발생
- 가변 분할 방식
- 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 관리하는 방식
- 외부 단편화 발생 가능
- 최초 적합
- 위쪽이나 아래쪽부터 시작해서 홀을 찾으면 바로 할당
- 최적 적합
- 프로세스의 크기 이상인 공간 중 가장 작은 홀부터 할당
- 최악 적합
- 프로세스의 크기와 가장 많이 차이가 나는 홀에 할당
- 내부 단편화
- 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상
- 외부 단편화
- 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상
- 홀
- 할당할 수 있는 비어있는 메모리 공간
- 불연속 할당
- 메모리를 동일한 크기의 페이지로 나누고 프로그램마다 페이지 테이블을 두어 메모리에 프로그램을 할당하는 것
- 페이징
- 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당
- 주소 변환이 복잡해짐
- 세그멘테이션
- 페이지 단위가 아닌 세그먼트로 나누는 방식
- 홀 크기가 균일하지 않은 문제 발생
- 페이지드 세그멘테이션
- 공유나 보안을 세그먼트로나누고, 물리적 메모리는 페이지로 나누는 것
- 연속 할당
- 페이지 교체 알고리즘
- 오프라인 알고리즘
- 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
- 미래에 사용되는 프로세스를 알 수 있는 방법은 없기에 다른 알고리즘과의 성능 비교에 대한 기준을 제공
- FIFO (First In First Out)
- 가장 먼저온 페이지를 교체 영역에 가장 먼저 놓는 방법
- LRU (Least Recently Used)
- 참조가 가장 오래된 페이지를 교체하는 방법
- '오래된' 것을 파악하기 위해서 각 페이지마다 계수기, 스택을 두어야 함
- NUR (Not Used Recently)
- 참조되었음을 구분하기 위한 비트를 사용하여 우선순위를 정하고 우선 순위에 따라 프로세스를 교체하는 방법
- LFU (Least Frequently Used)
- 가장 참조 횟수가 적은 페이지를 교체하는 방법
- 오프라인 알고리즘
- 가상 메모리
프로세스와 스레드
- 프로세스
- 컴퓨터에서 실행되고 있는 프로그램
- CPU 스케줄링의 대상이 되는 작업
- 프로그램으로부터 인스턴스화 된 것
- 스레드
- 프로세스 내 작업의 흐름
- 프로그램이 메모리에 올라가면 프로세스가되는 인스턴스화 발생, 이후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행
- 컴파일
- 프로그램이 컴파일러를 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것
- 아래의 컴파일 과정 설명은 C언어 기반의 프로그램을 대상으로 한 설명입니다.
- 전처리
- 소스코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환
- 컴파일러
- 오류 처리, 코드 최적화 작업 진행, 어셈블리어로 변환
- 어셈블러
- 어셈블리어를 목적 코드로 변환
- 링커
- 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일 생성
- 프로세스의 상태
- 생성 상태
- 프로세스가 생성된 상태
- fork(), exec() 함수를 통해 생성
- fork()
- 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수
- 주소 공간만 복사하며 부모 프로세스의 비동기 작업 등을 상속하지 않음
- exec()
- 새로운 프로세스를 생성하는 함수
- fork()
- PCB가 할당됨
- 대기 상태
- CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
- 대기 중단 상태
- 메모리 부족으로 일시 중단된 상태
- 실행 상태
- CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태
- 중단 상태
- 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- 일시 중단 상태
- 중단된 상태에서 프로세스가 실행되려 했지만 메모리 부족으로 일시 중단된 상태
- 종료 상태
- CPU소유권과 메모리를 모두 놓고 가는 상태
- 생성 상태
- 프로세스의 메모리 구조
- 동적 영역
- 스택
- 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 '동적'인 특징이 있음
- 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데 힙과 스택의 메모리 영역이 겹치면 안되기 때문에 둘 사이의 공간은 비워 놓음
- 힙
- 동적 할당할 때 사용됨
- 런타임 시 크기가 결정됨
- 스택
- 정적 영역
- 데이터 영역
- 전역변수, 정적변수가 저장되며 프로그램이 종료되면 사라지는 변수가 들어있는 영역
- BSS 영역
- 초기화 되지 않은 변수가 0으로 초기화 되며 저장됨
- Data 영역
- 0이 아닌 다른 값으로 할당된 변수들이 저장됨
- 코드 영역
- 프로그램에 내장되어 있는 소스 코드가 들어가는 영역
- 수정 불가능한 기계어로 저장되어 있음
- 데이터 영역
- 동적 영역
- PCB (Process Control Bolck)
- 운영체제에서 프로세스에 대한 메타데이터를 저장한 '데이터'
- 프로세스 생성 시 운영체체는 해당 PCB를 생성
- 구조
- 프로세스 스케줄링 상태
- 프로세스가 CPU에 대한 소유권을 얻은 이후 또는 이후 경과된 시간과 같은 기타 스케줄링 정보
- 프로세스 ID
- 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
- 프로세스 권한
- 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
- 프로그램 카운터
- 프로세스에서 실행해야할 다음 명령어의 주소에 대한 포인터
- CPU 레지스터
- 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
- CPU 스케줄링 정보
- CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
- 계정 정보
- 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- I/O 상태 정보
- 프로세스에 할당된 I/O 디바이스 목록
- 프로세스 스케줄링 상태
- 컨텍스트 스위칭
- PCB를 교환하는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
- 멀티프로세싱
- 동시에 두가지 이상의 일을 수행할 수 있는 것
- 웹 브라우저
- 브라우저 프로세스
- 주소 표시줄, 북마크 막대, 뒤로가기 버튼 등을 담당하며 네트워크 요청이나 파일 접근 같은 권한을 담당
- 랜더러 프로세스
- 웹 사이트가 '보이는' 부분의 모든 것을 제어
- 플러그인 프로세스
- 웹 사이트에서 사용하는 플러그인을 제어
- GPU 프로세스
- GPU를 이용해서 화면을 그리는 부분을 제어
- 브라우저 프로세스
- IPC (Inter Process Communication)
- 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
- 공유 메모리
- 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성하는 것
- 메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않음
- 같이 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요
- 파일
- 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
- 소켓
- 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터
- 익명 파이프
- 프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
- 부모, 자식 프로세스 간에만 사용 가능
- 명명된 파이프
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 이중 파이프
- 컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와 통신 가능
- 메시지 큐
- 메시지를 큐 데이터 구조 형태로 관리하는 것
- 커널에서 관리되며 다른 IPC 방식에 비해서 사용방법이 직관적이고 간단
- 스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 프로세스와 달리 코드, 데이터, 힙 영역은 스레드끼리 공유
- 멀티스레딩
- 프로세스 내 작업을 여러개의 스레드로 처리하는 기법
- 스레드끼리 자원을 공유하기에 효율성이 높음
- 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있음
- 공유 자원
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수
- 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태라고 함
- 임계 영역
- 공유 자원에 접근할 때 순서, 타이밍 등의 이유로 결과가 달라지는 영역
- 뮤텍스
- 공유 자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금
- 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근 불가능
- 세마포어
- 일반화된 뮤텍스
- 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리
- 조건 변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없음
- 바이너리 세마포어
- 0과 1 두 가지 값만 가질 수 있는 세마포어
- 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘
- 카운팅 세마포어
- 여러 개의 값을 가질 수 있음
- 여러 자원에 대한 접근을 제어하는데 사용됨
- 모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
- 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리
- 교착 상태
- 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- 원인
- 상호 배제
- 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능
- 점유 대기
- 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점
- 다른 프로세스의 자원을 강제적으로 가져올 수 없음
- 환형 대기
- 둘 이상의 프로세스가 서로의 자원을 요구하는 상황
- 상호 배제
- 해결 방법
- 자원 할당 시 애초에 조건이 성립되지 않도록 설계
- 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘' 사용
- 교착 상태 발생 시 사이클이 있는지 탐색 후, 관련된 프로세스를 한 개씩 제거
- 교착 상태 발생 시 사용자가 직접 작업 종료
CPU 스케줄링 알고리즘
- CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야하는 일을 스레드 단위로 CPU에 할당
- CPU 스케줄링 알고리즘은 CPU 이용률은 높게, 주어진 시간에 많은 일을 하게, 준비 큐에 있는 프로세스는 적게, 응답 시간은 짧게 설정하는 것이 목표
- 비선점형 방식
- 프로세스가 스스로 CPU 소유권을 포기하는 방식
- FCFS (First Come, First Served)
- 가장 먼저 온 것을 가장 먼저 처리하는 알고리즘
- 오래 실행되는 프로세스가 있다면 '준비 큐에서 오래 기다리는 현상(convoy effect)'이 발생할 수 있음
- SJF (Shortest Job First)
- 실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘
- '긴 시간을 가진 프로세스가 실행되지 않는 현상(starvation)'이 발생할 수 있음
- 실제 실행 시간에 대한 계산은 불가능 하기에 과거의 실행했던 시간을 토대로 추측해서 사용
- 우선순위
- SJF에서 오래된 작업일 수록 우선순위를 높이는 방법을 적용한 알고리즘
- 선점형 방식
- 사용 중인 프로세스를 강제 중단시키고 다른 프로세스에 CPU 소유권을 할당하는 방식
- 라운드 로빈
- 각 프로세스에 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘
- SRF
- SJF와 유사하지만 작업 도중 실행 시간이 더 짧은 작업이 들어올 경우 진행 중이던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘
- 다단계 큐
- 운선순위에 따른 준비 큐를 여러개 사용하고, 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용한 것
- 큐 간의 프로세스 이동이 불가
'독후감 > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
면접을 위한 CS 전공지식 노트 (5) - 자료 구조 (0) | 2025.05.28 |
---|---|
면접을 위한 CS 전공지식 노트 (4) - 데이터베이스 (0) | 2025.05.13 |
면접을 위한 CS 전공지식 노트 (2) - 네트워크 (0) | 2025.05.09 |
면접을 위한 CS 전공지식 노트 (1) - 디자인 패턴과 프로그래밍 패러다임 (0) | 2025.05.08 |