운영 체제란?(Operating System)
HW를 관리하고, 컴퓨터 시스템의 자원들을 효율적으로 관리하도록 도와주는 응용 프로그램과 HW간의 인터페이스
역할
1. 프로세스 관리 : 프로세스, 스레드, 스케줄링, 동기화, IPC통신
2. 저장장치 관리 : 메모리 관리, 가상메모리, 파일시스템
3. 네트워킹 : TCP/IP, 기타 프로토콜
4. 사용자 관리 : 계정관리, 접근권한 관리
5. 디바이스 드라이버 : 순차접근 장치, 임의접근 장치, 네트워크 장치프로세스 관리
OS에서 작동하는 응용프로그램을 관리하는 것
CPU를 점유할 프로세스를 결정하고 할당, 프로세스간 공유자원 접근, 통신 등을 관리한다.저장장치 관리
1차 저장장치인 메모리 영역의 할당과 해제, 가상메모리 등을 관리하고,
2차 저장장치인 하드디스크, NAND Flash Memory등을 관리한다.네트워킹
응용 프로그램이 네트워크를 사용하려면 OS에서 네트워크 프로토콜을 지원해야한다.
사용자 관리
한 컴퓨터를 여러명이 사용할 때, 사용자 별로 파일, 시스템 자원에 접근 권한을 지정해야 한다.
디바이스 드라이버
OS는 응용 프로그램이 HW를 사용할 수 있게 만들어야 한다.
따라서 디바이스 드라이버는 OS 안의 HW를 추상화하는 계층이다.
프로세스, 스레드
프로세스 : 프로그램을 메모리 상에서 실행중인 작업
스레드 : 프로세스 안에서 실행되는 여러 흐름 단위프로세스에서 주소공간 할당
Code : 코드 자체를 구성하는 메모리 영역(프로세스간 공유)
Data : 전역변수, 정적변수, 배열 등(프로세스간 공유X)
Heap : 동적 할당 시 사용 (프로세스간 공유X)
Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역, 공유X)
스레드는 Stack만 따로 할당받고 나머지는 공유한다.
즉, 프로세스는 고유 공간과 자원을 할당받아 사용, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용멀티프로세스
여러 프로세스가 병렬적으로 작업을 수행하는것
각각 독립된 메모리를 가지고 있어, 안정적이지만 Context Switching Overhead를 감안해야됨
Context Switching : 동작중인 프로세스의 상태를 보관하고, 다음 순번 프로세스의 상태를 복구하는 과정멀티스레드
하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것
스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리
Context Switching 없지만, 한개의 스레드가 공유 메모리를 망가뜨리면 타 스레드들도 작동불능 -> Critical Section 기법 사용
인터럽트(Interrupt)
프로그램을 실행하는 중 예기치 못한 상황이 발생할 경우 현재 실행중인 작업을 즉시 중단하고, 발생한 상황에 대한 처리가 필요함을 CPU에게 알리는 것
외부 인터럽트
I/O장치, 전원등 외부적인 요인으로 발생
CPU의 하드웨어 신호에 의한 발생
내부 인터럽트
잘못된 명령이나 데이터 사용(0나누기, 오버플로우...)시 발생
CPU의 하드웨어 신호에 의한 발생
소프트웨어 인터럽트
프로그램 코드에서 명시적으로 발생시키는 인터럽트, 주로 시스템 콜에 의해 발생인터럽트 발생 처리 과정
인터럽트 발생시, 수행중인 프로그램의 상태 레지스터와 PC 등을 스택에 잠시 저장한 뒤, 인터럽트 서비스 루틴으로 간다.
인터럽트가 아니라면 다른 프로그램의 상태를 주기적으로 점검하는 폴링을 사용해야 하는데, 이는 성능적으로 비효율적이다.
즉, 인터럽트는 발생시기를 예측하기 힘든 예외사항에 빠르게 대처하는 방법이다.
시스템 콜
응용 프로그램이 운영체제의 핵심 기능(커널)과 상호작용하기 위해 사용하는 인터페이스
인터럽트의 한 종류이며, 사용자가 동기적으로 발생시킨다.
평소 유저모드로 실행중인 응용 프로그램이 하드웨어 리소스에 접근하고 싶을 때 시스템 콜로 커널모드에 진입한다. 이렇게 리소스에 직접 접근을 막아둠으로써 안정성과 보안성을 높인다.
1. fork():
fork()는 현재 프로세스(부모 프로세스)를 복사하여 새로운 프로세스(자식 프로세스)를 생성하는 시스템 콜이다.
부모 프로세스와 자식 프로세스는 동일한 메모리 공간을 공유하지 않으며, 자식은 부모의 복사본을 가진다.
자식 프로세스는 fork() 호출에서 0을 반환하고, 부모 프로세스는 자식의 PID를 반환받는다.
2. exec():
exec()는 현재 프로세스를 새로운 프로그램으로 대체하는 시스템 콜이다.
fork()로 생성된 자식 프로세스는 exec()를 통해 새로운 프로그램을 실행할 수 있다.
프로세스의 메모리 공간이 완전히 새로운 프로그램으로 덮어쓰여진다.
3. wait():
부모 프로세스가 자식 프로세스가 종료될 때까지 기다리게 하는 시스템 콜이다.
자식 프로세스가 종료되면 그 종료 상태를 부모에게 전달하며, 부모 프로세스가 자식 프로세스 종료까지 다른 작업을 하지 않고 대기하게 한다.
PCB, Context Switching
PCB(Process Control Block)
프로세스의 메타데이터들을 저장해두는 곳, 커널의 메모리에 저장된다.
프로세스가 CPU에서 중단되거나 교체될 때(interrupt), 현재 실행 중인 프로세스의 상태는 PCB에 저장되고, 다음에 수행할 프로세스의 정보는 PCB에서 불러와 CPU에 적용한다. 이 과정을 Context Switching이라고 한다.
IPC(Inter Process Communication)
독립적으로 실행되는 프로세스간의 통신을 위해 커널이 제공하는 서비스
IPC 통신에서 프로세스 간 데이터를 동기화 및 보호하기 위해 세마포어와 뮤텍스를 사용한다.1. 익명 PIPE , Named PIPE
한 프로세스는 데이터를 쓰고, 한 프로세스는 데이터를 읽는 구조
한쪽 방향으로만 통신이 가능한 반이중 통신이다.2. Message Queue
파이프처럼 데이터의 흐름이 아닌 메모리 공간이다.
사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 다룰 수 있게 한다.3. 공유 메모리
데이터 자체를 공유하도록 지원하는 메모리이다.
커널에 요청해 공유 메모리를 할당받고, 모든 프로세스가 접근할 수 있게 된다.
IPC중 가장 빠르다.4. 소켓
네트워크 상에서 데이터를 주고받기 위해 필요한 인터페이스 역할을 하며, IP 주소와 포트 번호로 통신 상대를 식별한다.
CPU Scheduling
CPU를 잘 사용하기 위해 프로세스를 배정하는 알고리즘
선점(preemptive)
프로세스가 CPU를 사용하는 도중에도 운영체제가 강제로 프로세스를 중단시키고 다른 프로세스에 CPU를 할당할 수 있다.
1. Priority Scheduling :
우선순위가 높은 순서대로 처리하지만, Starvation 존재
Aging기법으로 Starvation 해결 가능
2. Round-Robin :
각 프로세스에 동일한 Time Quantum만큼 CPU를 할당
Quantum이 클수록 FCFS와 비슷해지고, 작으면 Context Switching OH 증가
3. Multilevel-Queue, Multilevel-Feedback-Queue :
각자 다른 Time Quantum을 가진 우선순위 큐를 사용한다.
우선순위가 높은 큐는 작은 Time Quantum을 할당해 밸런스를 조절한다.
피드백을 통해 프로세스가 큐를 이동할 수 있다.비선점(nonpreemptive)
프로세스가 CPU를 할당받으면 자신의 작업을 끝낼 때까지 CPU를 사용한다.
즉, 작업이 끝날 때까지 인터럽트가 발생하지 않는다.
ex) FCFS (First Come First Served), SJF(Shortest Job First)스케줄링 판단 기준
Response Time : 작업이 처음 실행될때까지 시간
Turnaround Time : 대기시간까지 합쳐 작업이 완료될때까지 걸린 총 시간
데드락(교착상태)
두개 이상의 프로세스나 스레드가 서로 자원을 얻지 못한 채 무한히 기다리는 상태
총 4가지의 조건이 모두 성립해야 데드락이 발생한다.
1. 상호 배제 (Mutual Exclusion) :
자원은 한번에 한 프로세스만 사용할 수 있다.
2. 점유 대기 (Hold and Wait) :
자원을 점유한 상태에서 다른 자원을 대기하는 프로세스가 존재해야 한다.
3. 비선점 (No preemption) :
다른 프로세스에 할당한 자원은 강제로 빼앗을 수 없다.
4. 순환 대기 (Circular wait) :
프로세스의 집합에서 순환 형태로 자원을 대기해야 한다.해결책
1. 예방 (prevention) :
데드락 조건중 한개를 제거해 해결한다. (자원 낭비가 심함)
상호배제 - 여러 프로세스가 공유 자원 사용
점유대기 - 프로세스 실행 전 모든 자원을 할당한다.
비선점 - 타 프로세스가 자원 요청시 반납
순환대기 - 프로세스에 순서대로 자원 배분
2. 회피 (avoidance) :
데드락 발생 자체를 피해가는 방법 (은행원 알고리즘)
프로세스가 자원을 요청할 때, 요청을 받아들여도 시스템이 데드락에 빠지지 않으면 자원을 할당한다.
3. 탐지 (Detection) + 회복 (Recovery) :
자원 할당 그래프로 데드락을 탐지하고, 해당 프로세스를 종료시키거나 자원을 선점(preemption)한다.
경쟁 상태 (Race Condition)
공유 자원을 둘 이상의 스레드 혹은 프로세스가 읽거나 쓰면서 결과값이 의도와 달라질 수 있는 상태
Race Codition 발생하는 경우
1. 커널 모드에서 인터럽트, context switching :
커널모드에서 데이터 수정 작업을 하다 인터럽트가 발생해 같은 데이터를 조작하는 경우
non-preemptive환경을 구성하거나, 커널 모드에서는 CPU 제어권을 넘기지 않게 구성해 해결할 수 있다.
2. 멀티 프로세스 환경에서 공유 메모리 사용 :
2개 이상의 프로세스가 커널 내부의 공유 데이터를 조작하는 경우
공유 데이터에 접근하려면 Lock을 획득하게 하면 해결할 수 있다.임계구역 (Critical Section) :
각 프로세스에서 공유 데이터를 접근하는 코드 부분
한 프로세스에서 Critical Section을 수행할 때 다른 프로세스가 그 데이터 영역에 접근하지 못하도록 해야한다.해결책 : 세마포어, 뮤텍스
뮤텍스(Mutex):
상호 배제를 보장하는 잠금 장치로, 하나의 스레드만 자원에 접근할 수 있도록 허용한다.
소유권을 가진 스레드만 잠금을 해제할 수 있다.
세마포어(Semaphore):
자원 카운터 기반의 기법으로, 여러 스레드가 동시에 자원에 접근할 수 있다.
즉, 세마포어는 여러 스레드가 동시 접근 가능한 자원의 개수이다.
소유권 개념이 없으며, wait와 signal로 동작을 제어한다.
페이징, 세그멘테이션
메모리를 효율적으로 관리하기 위해 존재하는 메모리 관리 기법이다.
1. 연속 메모리 관리
고정 분할 기법(내부 단편화 발생), 동적 분할 기법(외부 단편화 발생)
2. 불연속 메모리 관리
페이징(Paging):
메모리를 동일한 크기의 블록(페이지)으로 나눈다.
각 페이지는 물리 메모리의 프레임에 매핑되며, 외부 단편화가 없다.
세그멘테이션(Segmentation):
메모리를 가변적인 크기의 논리적 단위(세그먼트)로 나눈다.
외부 단편화가 발생할 수 있다.
페이지 교체 알고리즘
페이지 부재 발생시 기존에 존재하는 페이지 중 어느것을 교체할지 결정하는 법
1. FIFO :
먼저 메모리에 올라온 페이지(Victim Page)를 내보낸다.
2. OPT :
Optimal 알고리즘, 앞으로 가장 사용하지 않을 페이지를 Victim Page로 선정
실질적으로 카운트할 수 없기 때문에 구현하기 어렵다.
3. LRU :
Least Recently Used, 최근에 사용하지 않은 페이지를 Victim Page로 선정
메모리
메인 메모리(RAM)는 CPU가 직접 접근할 수 있는 물리적 메모리 공간이다.
가상 메모리(Virtual Memory)는 메인 메모리 크기보다 더 많은 메모리를 사용하기 위해 디스크의 일부를 메모리처럼 사용하는 방식이다. 즉, 메인 메모리 + 스왑공간(디스크)이다.MMU (Memory Management Unit: 메모리 관리 장치)
가상 메모리의 논리 주소를 가지고 실제 데이터가 담겨 있는 곳에 접근하기 위해서는 빠르게 물리 주소로 변환해준다.
또한 각 프로세스가 가진 독립적 메모리 공간을 보호한다. (base와 limit을 활용해 잘못된 접근이 오면 trap 발생시킴)메모리 과할당 (over allocating)
실제 메모리보다 큰 사이즈의 메모리를 프로세스에 할당한 상황
프로세스 실행 중 페이지 폴트 발생시, 디스크에 존재하는 페이지를 메모리에 올려야 하는데 이때 디스크의 페이지를 메인 메모리의 페이지와 교환하는 기법이 Swapping이다.
이때 메인 메모리에서 swap out 당하는 페이지를 고르는 기법이 paging이다.캐시 메모리
CPU와 메인메모리의 속도차이로 인한 성능 저하를 방지 (메모리 병목 현상)
메인메모리에 저장된 내용의 일부를 임시로 저장해둔다.
메인 메모리보다 CPU에 가까운 곳에 존재하고, SRAM으로 메인메모리(DRAM)보다 속도가 빠르다.
캐시 HIT 비율을 늘리기 위해 지역성을 사용한다.지역성
기억장치 내의 정보를 균일하게 액세스하지 않고 한순간 특정부분에 집중적으로 액세스 하는것
시간 지역성 : 최근에 참조된 주소의 내용은 곧 다시 참조된다.
공간 지역성 : 참조된 주소와 인접한 주소의 내용이 참조된다.
파일 시스템
컴퓨터에서 파일을 쉽게 발견할 수 있도록 유지관리하는 방법
커널 영역에서 동작하며, 계층적 디렉터리 구조를 가진다.
디스크와 메인 메모리 속도차를 줄이기 위해 사용한다.
순차접근, 직접접근, 인덱싱 등으로 존재할 수 있다.
Reference
https://gyoogle.dev/blog/computer-science/operating-system/Operation%20System.html
https://brightstarit.tistory.com/13
https://jeong-pro.tistory.com/93