기술면접에 좀 더 초점을 맞춰 간단하게 핵심만 정리하였습니다.
운영체제에 대한 자세한 이론은 전공 서적을 구입하여 공부하는 것을 추천 드립니다.
메모리
- 종류
- 레지스터
- 캐시
- 주 메모리
- 자기 디스크
- 자기 테이프
- 위에서 부터 아래로 접근 시간이 길고 저장용량이 크다
- 자기 디스크,테이프는 비 휘발성이다
캐시 메모리
- 매핑방법
- Fully Associative Mapping : 주소 전체를 태그에 넣어 비교하는 것→비싸다
- Direct Mapping : 주소를 tag,index로 나누어 저장 →싸지만 성능이 좋지 않다
- Set Associative Mapping : 인덱스별로 여러 tag-data set을 만들어 저장하는 방식 → 가격도 적당하고 성능도 괜찮다.
프로세스와 쓰레드의 차이
- 프로세스 : 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- 프로그램 : 어떤 작업을 위해 실행할 수 있는 파일
- 운영체제로부터 독립된 메모리 영역(Code,Data,Stack,Heap의 구조를 가진)을 할당받는다
- 각 프로세스는 별도의 주소 공간에서 실행되기에 다른 프로세스의 메모리에 접근할 수 없다.
- 접근하기 위해선 파이프, 파일, 소켓 등의 IPC(inter-process communication)을 사용해야 한다
- 스레드 : 프로세스 안에서 실행되는 여러 흐름 단위
- 프로세스 내에서 stack만 따로 할당받는다.
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름이기에 자원들을 같은 프로세스 내의 스레드끼리 공유한다.
- 그렇기에 한 스레드가 자원을 변경하면 다른 이웃 스레드가 즉시 그 결과를 볼 수 있다.
- 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하고, 스레드는 다른 스레드와 공간,자원을 공유하면서 사용하는 차이가 존재한다.
멀티 프로세스 대신 멀티 스레드?
- 멀티프로세스 : 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
- 메모리 침범 문제를 OS 차원에서 해결하기에 안전하다는 장점이 있다
- 하지만, 각각 독립된 메모리 영역을 갖고 있기에 작업량이 많을 수록 오버헤드가 발생되고 잦은 Context Switching으로 성능이 저하된다
- Context Switching : 현재 진행되고 있는 Task의 상태를 저장하고 다음 Task의 상태 값을 읽어 작업을 진행시키는 과정
- 쓰레드는 교체 시 스택 영역만 변경하면 되기에 프로세스의 Context Switching에 비해 비용이 저렴하다.
- Context Switching : 현재 진행되고 있는 Task의 상태를 저장하고 다음 Task의 상태 값을 읽어 작업을 진행시키는 과정
- 멀티 스레드 : 하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것
- 스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해준다
- 이웃 스레드간 자원을 공유하기에 저렴하다
- 하지만, 하나의 스레드가 데이터 공간을 망가뜨리면 모든 스레드가 작동 불능 상태가 된다.
- 그리고, 여러 쓰레드가 하나의 자원에 동시 접근하는 경우 동기화 문제가 발생할 수 있다.
- 멀티 스레드를 사용하는 이유
- 스레드는 이웃 스레드간 자원을 공유하기에 ContextSwitching의 비용이 저렴하다.
- 같은 이유로 Context Switching의 전환 속도가 빠르다
Thread-safe
- 여러 스레드가 동시에 하나의 자원에 접근하는 경우에도 의도한 대로 동작하는 것을 의미한다.
- 그렇기 위해서는 공유 자원에 접근하는 부분인 임계 영역으로의 접근을 Mutex, Semaphore등을 통해 제한해야 한다.
- 뮤텍스는 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것, 락을 걸은 스레드만 락을 해제할 수 있다.
- 데커, 피터슨, Bakery등의 알고리즘이 대표적이다.
- 세마포어는 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것이다.
- 정한 세마포어 수 만큼의 프로세스가 동시에 자원에 접근할 수 있다.
- 세마포어의 수를 1로 설정하면 뮤텍스처럼 사용할 수 있다.
- 뮤텍스는 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것, 락을 걸은 스레드만 락을 해제할 수 있다.
DeadLock
- 스레드A는 스레드B가 들고있는 자원 b의 락이 풀리기를 기다리고 있고 스레드 B는 스레드A가 들고있는 자원 A의 락이 풀리기를 기다리고 있는 상태, 즉, 서로의 자원의 락이 풀리기를 끊임없이 기다리고 있는 상태를 의미한다.
- 데드락의 조건으로는
- Mutual Exclustion : 한 번에 한 프로세스만 공유 자원을 사용할 수 있다.
- Hold and wait : 공유 자원을 이미 들고있는 상태에서 다른 공유자원을 기다린다.
- No preemption : 한 프로세스가 다른 프로세스의 자원을 강제로 뺏을 수 없다.
- Circular wait : 두 개 이상의 프로세스가 자원 접근을 기다리는데 그 관계에 사이클이 존재한다.
- 이 조건들을 모두 만족한다면 데드락이 발생가능하다.
- 다른 말로는, 위 조건중 하나 이상을 제거하면 데드락을 방지할 수 있다.
가상 메모리와 페이징
- 프로세스의 가상 메모리 공간을 같은 크기를 가지는 페이지들로 분할한다.
- 물리 메모리 또한 같은 크기의 프레임들로 분할된다
- 이때 페이지와 프레임을 서로 연결하는 매핑 정보를 가진 테이블을 페이지 테이블이라 한다.
- 페이지 테이블이 너무 커진다면
- 페이지 테이블의 계층을 추가하는 Multilevel Paging
- 해싱을 이용하는 Inverted Page Table 을 적용한다.
페이지 폴트란
- 실제 메모리와 매핑되어 있지 않는 페이지에 대한 참조를 하는 경우를 말한다.
페이지 교체 알고리즘
- 가상 메모리에 적재한 페이지가 가득 차게 되면 추가로 페이지를 가져오기 위해 기존의 페이지와 교체를 해야 하는데, 이 과정에서 자주 사용되고 최근에 사용된 페이지는 공간,시간적으로 지역성이 높기에 교체하는 것이 불합리 할 수 있다. 따라서, 가능한 자주사용되지 않고 한참 전에 사용된 페이지를 교체해주는 것이 비용적인 측면에서 좋다.
- NRU,LRU, FIFO, Second Chance등 많은 알고리즘이 존재한다.
참고
https://github.com/gyoogle/tech-interview-for-developer
https://github.com/WeareSoft/tech-interview/blob/master/contents/os.md