코딩 테스트 및 기술 면접 대비 학습
운영 체제
운영 체제
운영체제(OS, Operating System)란 하드웨어 위에 설치되어 하드웨어 계층과 다른 소프트웨어 계층을 연결하는 소프트웨어 계층이다.
컴퓨터 시스템의 자원을 관리하고, 사용자가 컴퓨터를 사용할 수 있는 환경을 제공하는 역할을 하며 대표적인 OS로는 윈도우, 맥OS, 리눅스, 유닉스 등이 있다.
운영 체제의 목적
- 처리 능력(throughput) 향상: OS는 자원 관리를 통해 일정 시간 내에 시스템이 처리하는 일의 양을 향상시킨다.
- 반환 시간(turnaround time) 단축: OS는 사용자가 시스템에 요청한 작업을 완료할 때까지 소요되는 시간을 단축시킨다.
- 사용 가능도(availability) 향상: 사용 가능도는 시스템 자원을 얼마나 빨리 제공할 수 있는가를 의미한다. OS는 사용자가 컴퓨터를 사용해야 할 때 자원을 즉시 사용할 수 있게 한다.
- 신뢰도(reliability) 향상: 신뢰도는 시스템이 주어진 문제를 정확하게 푸는지를 의미한다. OS는 입력 값에 대한 정확한 값을 줄 수 있도록 신뢰도를 향상해야 한다.
OS는 하드웨어와 소프트웨어를 이어주는 계층으로써 한정된 자원 안에서 정확하고 빠르게 주어진 문제를 해결하는 것이 목적이다.
OS 성능을 평가하는 기준으로 처리 능력, 반환 시간, 사용 가능도, 신뢰도가 사용되기도 한다.
CPU와 메모리 구조
CPU(Central Processing Unit, 중앙 처리 장치)는 '컴퓨터의 뇌' 역할을 하며, 컴퓨터에서 프로그램을 실행하는데 필요한 연산을 처리하고 수행하며, 프로세서(Processor)라고도 한다.
메모리는 데이터를 저장하기 위한 기억장치로 휘발성 메모리인 주 기억장치와 비휘발성 메모리인 보조 기억장치가 있다.
- 주 기억장치 : RAM
- 보조 기억장치 : SSD, HDD 등
메모리의 계층 구조
- 레지스터(Register) : CPU가 사용자 요청을 처리하는 데 필요한 데이터를 임시로 저장하는 기억장치이다. CPU 내부에 존재하며 접근 속도가 빠르다.
- 캐시 메모리(Cache Memory) : CPU와 RAM 사이의 속도 차이를 해결하기 위한 기억장치, CPU 내부에 위치하며 접근 속도가 레지스터 다음으로 빠르다.
- RAM(Ramdom Access Memory) : 컴퓨터에서 프로그램을 실행할 때 필요한 정보를 저장한다. CPU에서 접근 속도가 하드 디스크보다 빠르고, 휘발성 기억장치이다. 보통 메모리라고 할 때 RAM을 의미하는 경우가 많다.
- 하드 디스크(Hard Disk) : 사용자가 필요한 데이터와 프로그램을 저장하며 비휘발성 기억장치이다.
프로그램을 실행하면 OS가 디스크에 있는 프로그램을 메모리로 로드한다.
메모리에 로드한 프로그램을 프로세스(Process)라고 하며, CPU가 처리한다.
CPU는 하나의 프로세스만 처리할 수 있어서 멀티 프로세스 환경에서는 OS가 스케줄링을 통해 CPU에 프로세스를 할당한다.
커널과 시스템 콜
커널(kernel)은 OS의 핵심 요소로, 컴퓨터 하드웨어와 프로세스의 보안, 자원 관리, 하드웨어 추상화 같은 중요한 역할을 수행한다.
자원 관리를 위해 CPU 스케줄링, 메모리 관리, 입출력 관리, 파일 시스템 관리 등을 담당한다.
운영체제는 커널에서 관리하는 중요 자원에 사용자가 쉽게 접근하지 못하게 커널모드와 사용자 모드로 모드를 나눈다.
- 커널모드 : 하드웨어에 직접 접근해 메모리, CPU와 같은 자원을 사용할 수 있다.
- 사용자 모드 : 커널 모드 자원에 접근 할 수 없다. 실행된 프로세스가 자원에 접근하려면 시스템 콜을 호출해 커널에 요청해야 된다.
- 시스템 콜 : 사용자 모드에서 커널 모드에 접근해 필요한 기능을 수행할 수 있게 하는 시스템 함수, 커널은 시스템 콜로 요청을 처리하고 시스템 콜로 결과 값을 반환
- 프로세스 제어, 파일조작, 장치 관리, 데이터의 유지 보수, 통신, 보호를 할 수 있다. 예) fork(), wait()
시스템 콜에서 커널에 매개변수를 전달하는 방법
- 매개변수를 CPU의 레지스터에 직접 전달, 이 방식은 매개변수의 개수가 레지스터의 개수보다 많으면 문제가 발생할 수 있어서 권장하지 않는다.
- 매개변수를 메모리에 저장한 후 메모리의 주소 값을 레지스터에 저장
- 매개변수를 프로그램의 Stack에 push하고 OS에서 pop해 매개변수를 전달
프로세스(Process)
https://eleunadeu.tistory.com/121
이전에 프로세스와 스레드에 관련해 정리한 적이 있으므로 간단하게만 정리함.
프로세스
프로세스는 컴퓨터에서 실행 중인 하나의 프로그램을 의미하며, 프로그램은 특정 작업을 수행하기 위한 명령어의 집합이다.
OS는 프로그램을 실행하면서 디스크에 저장된 데이터를 메모리로 로드하고, 프로세스는 OS로부터 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당받는다.
- 다른 프로세스의 메모리 영역에 접근할 수 없다.
프로세스의 메모리 영역 구조
- 스택 : 지역 변수, 파라미터(매개변수), 반환되는 주소 값 등이 저장되는 영역, 높은 주소 값에서 낮은 주소 값으로 메모리가 할당되고, 크기는 컴파일 때 결정된다.
- 힙 : 사용자에 의해 동적 메모리 할당이 일어나는 영역, 낮은 주소 값에서 높은 주소 값으로 메모리가 할당되며, 크기는 런타임 때 결정된다.
- 데이터 : 전역 변수, 정적 변수, 배열, 구조체 등이 저장되는 영역, BSS(Block, Stated Symbol) 영역과 데이터 영역으로 나눌 수 있으며, BSS 영역은 초기화하지 않은 변수를, 데이터 영역은 초기화한 변수를 저장한다.
- 코드 : 실행할 코드가 기계어로 컴파일되어 저장되는 영역, 텍스트 영역이라고도 한다.
스택 영역이 힙 영역을 침범하는 경우를 스택 오버플로, 힙 영역이 스택 영역을 침범하는 경우를 힙 오버플로라고 한다.
- 오버플로(Overflow) : 메모리 공간에서 할당할 수 있는 최대 범위를 넘어가는 것
- 언더플로(Underflow) : 메모리 공간에서 할당할 수 있는 최소 범위보다 작은 것
스레드
프로세스는 한 개 이상의 스레드를 갖는데, 스레드는 프로세스에서 실제로 실행되는 흐름의 단위를 의미한다.
프로세스의 메모리 공간을 이용하고, 지역 변수를 저장하는 스택 영역을 할당받으며, 전역 변수를 저장하는 힙 영역은 다른 스레드와 공유한다.
사용자 레벨 스레드와 커널 레벨 스레드
커널에서 자원을 보호하기 위해 내부적으로 사용자 모드와 커널 모드로 구분하는 것처럼 스레드도 스레드를 관리하는 주체에 따라 구분됨.
사용자 레벨 스레드는 사용자가 라이브러리를 이용해 생성 및 관리하고, 커널 레벨 스레드는 커널이 스레드를 생성 및 관리한다.
멀티 스레드 환경의 사용자 레벨 스레드와 커널 레벨 스레드의 관계
- 다대일 모델(many-to-one model)
- 사용자 레벨 스레드 n개에 커널 레벨 스레드 1개가 매핑되어 사용자 레벨에서 스레드를 관리한다. 하나의 사용자 레벨 스레드에서 시스템 콜을 호출하면 나머지 사용자 레벨 스레드는 커널 레벨에 접근할 수 없음(멀티 코어의 병렬성 이용 불가)
- 일대일 모델(one-to-one model)
- 사용자 레벨 스레드 1개에 커널 레벨 스레드 1개가 매핑된다. 하나의 사용자 레벨 스레드에서 시스템 콜을 호출하면 다른 사용자 레벨 스레드가 모두 실행되지 않는 다대일 모델의 단점을 해결하지만 사용자 레벨 스레드 수만큼 커널 레벨 스레드가 생성되므로 성능 저하가 일어날 수 있다.
- 다대다 모델(many-to-many model)
- 사용자 레벨 스레드 n개에 커널 레벨 스레드 m개가 매핑된다. 커널 레벨 스레드의 수(m)는 사용자 레벨 스레드 수(n)의 이하이며, 다대일, 일대일 모델의 장점을 포함하지만 구현이 어렵다.
PCB
OS는 프로세스를 제어하기 위해 프로세스 정보를 저장하는데, 이를 PCB(Process Control Block)라고 한다.
PCB에 저장되는 정보
- 프로세스의 현재 상태
- 고유 PID(Process ID)
- 부모 프로세스의 PID
- 자식 프로세스의 PID
- PC(Program Counter) : 다음 실행할 명령어의 주소
- 프로세스의 우선 순위
- 메모리 제한
- ...
프로세스의 생성
새로운 프로세스는 기존 프로세스에서 fork() 함수를 호출해 생성한다(fork() 함수에는 함수를 호출한 프로세스를 복사하는 기능이 있음).
기존 프로세스를 부모 프로세스, 복사된 프로세스를 자식 프로세스라고 한다(부모 프로세스에서 fork() 함수를 호출 시 부모는 자식 프로세스의 PID 값을 자식 프로세스는 0을 반환).
프로세스 상태
- 생성(new) : 프로세스가 PCB를 가지고 있지만 OS로부터 승인 받기 전
- 준비(ready) : OS로부터 승인받은 후 준비 큐에서 CPU 할당을 기다림
- 실행(running) : 프로세스가 CPU를 할당받아 실행함
- 대기(waiting) : 프로세스가 입출력이나 이벤트 발생을 기다려야 해서 CPU 사용을 멈추고 기다림
- 종료(terminated) : 프로세스가 실행을 종료함
프로세스 상태 변화
- 생성 → 준비 : 생성 상태의 프로세스가 OS로부터 승인을 받아, 준비 상태 프로세스가 모인 준비 큐(ready queue)에 추가됨
- 준비 → 실행 : 준비 큐에 있는 프로세스 중 우선순위가 높은 프로세스가 디스패치(dispatch)되어 실행됨
- 실행 → 준비 : CPU 독점을 방지하기 위해 타임아웃(timeout)되어 준비 상태로 변경됨
- 실행 → 대기 : 입출력 또는 이벤트 때문에 대기 상태로 변경됨
- 대기 → 준비 : 입출력 또는 이벤트가 완료되어 준비 상태로 변경됨
- 실행 → 종료 : 실행 중인 프로세스가 정상적으로 끝나서 종료 상태로 변경됨
'항해 99' 카테고리의 다른 글
WIL-15 (0) | 2024.05.19 |
---|---|
기술면접 대비 5주차 (0) | 2024.05.16 |
기술면접 준비 4주차 정리 (0) | 2024.05.09 |
SSL / TLS (0) | 2024.05.08 |
WIL - 13 (0) | 2024.05.06 |