목차
-
1. OS란 무엇일까?
-
1) OS란
-
2) 커널 코드란
-
2. 시스템 콜이란?
-
1) 유저모드와 커널모드
-
2) 대표적인 시스템 콜 (C 기준)
-
3. 프로세스 메모리 구조에 대해 설명.
-
4. 프로세스와 스레드의 차이는?
-
5. 데드락에 대해
-
1) 데드락의 뜻과 발생 조건
-
2) 데드락을 피할 수 있는 방법은?
-
3) mutex와 semaphore에 대해
-
6. Race Condition(동시성 문제)
-
7. CPU 스케줄링에 대해
-
1) CPU 스케줄링과 이것이 필요한 이유를 설명해주세요.
-
2) 대표적인 스케줄링 알고리즘엔 어떤 것이 있을까요?
-
8. 메모리 관리
-
1) 페이지 관리에 대해
-
2) 가상 메모리란?
-
3) Thrashing
-
9. 캐시에 대해
-
1) 메모리의 계층 구조에 대해 설명해주세요
-
2) 지역성이 무엇이죠?
1. OS란 무엇일까?
1) OS란
- 하드웨어 자원을 이용하기 위한 소프트웨어 프로그램이라고 생각할 수 있다..
- 메모리, 디스크, CPU, 그리고 그들을 이어주는 각종 버스들을 관리하고 제어하여 사용자 프로그램을 효율적으로 구동할 수 있도록 합니다.
- 간단히 말하면 응용 프로그램과 하드웨어 사이의 인터페이스라 할 수 있다. 응용 프로그램이 하드웨어 자원을 사용할 때 OS의 커널코드가 동작하도록 하는 시스템 콜을 사용할 수 있다..
2) 커널 코드란
- 많고많은 ~ OS코드(수천만줄 단위)중, 핵심적인 역할을 수행하는 OS 코드
- 컴퓨터 하드웨어가 작동하기 위해 꼭 실행중이어야 하기 때문에, 상시로 메모리에 올라와있는 OS 프로세스 코드를 말합니다
2. 시스템 콜이란?
1) 유저모드와 커널모드
- 유저모드는 응용 프로그램 개발자가 작성한 응용 프로그램을 실행하고 있는 상태를 의미합니다. 그러니까 OS의 커널코드가 아닌 실행 파일의 코드가 CPU에 의해 실행되는 상태
- 커널모드는 유저의 응용 프로그램이 아니라 OS의 커널 코드가 실행되고 있는 상태입니다. 하드웨어를 직접적으로 조작하고있는 상태라고 할 수 있습니다.
- 응용 프로그램이 커널 코드를 호출하기 위한 시스템 콜(네트워크/하드웨어 장비 IO작업, 프로세스/스레드 생성 작업 등)을 하거나 커널 코드의 실행이 필요할 때 커널모드가 활성화됩니다.
- 모드가 나뉘는 이유는, 응용 프로그램이 하드웨어 리소스를 직접 사용하는 침입을 막아 하드웨어를 안전하게 보호하기 위함입니다.
- 컴퓨터는 유저모드와 커널모드를 반복적으로 스위칭하면서 프로그램을 실행
2) 대표적인 시스템 콜 (C 기준)
- 프로세스 관련 : 생성하는 fork(), 실행하는 execv(), 블락 상태에 두는 wait() 등
- 파일 관련 : open(), close(), write() 등
- 네트워크 관련 : listen(), accept() 등..
- 환경 관련 : uid, gid 관련 getter 및 setter들
3. 프로세스 메모리 구조에 대해 설명.
- 하드웨어가 실행할 수 있는 명령어 집합인 프로그램이 실행되면 컴퓨터의 메인 메모리에 프로세스를 위한 공간이 생성됨
- 코드 영역 : CPU가 참조하는 영역. 명령어가 들어있다
- 힙 영역 : 동적 메모리가 할당되는 영역
- 스택 영역 : 프로세스 내부의 스레드들에서 사용되는 지역변수의 공간. 메소드 인자, 지역변수, 리턴 주소 등을 담고있다
- 데이터 영역 : 정적(static) 데이터, 프로그램 전반적으로 사용되는 전역 변수 데이터가 저장된 영역
- PCB : Process Control Block. 실행중인 프로세스 인스턴스의 pid, 상태, 스케줄링 정보, 페이징 정보 등이 저장되어있음
- NEW : 프로세스가 막 생성된 상태
- RUNNABLE : CPU에 의해 프로세스가 실행중인 상태
- BLOCKED : 인터럽트나 IO 작업으로 인해 CPU가 블락된 상태
- WAIT : 주어진 타임 슬라이스를 다 써서(RR 등의 알고리즘을 사용했을 경우)
- FINISHED : 모든 명령어를 수행한 뒤 종료상태에 이른 프로세스
4. 프로세스와 스레드의 차이는?
- 프로세스의 작은 실행 흐름이 스레드
- 프로그램 전체를 실행시키기 위한 독립적인 메모리 공간을 갖고 있는 프로세스와 달리 스레드는 함수/메소드 실행에 필요한 pc와 sp, 스택 공간만을 가짐
- 프로세스 메모리 전체를 reload해야하는 프로세스간 컨텍스트 스위칭에 비해, 스레드는 일부 레지스터 값만 바꾸면 되므로 멀티 스레드에 조금 더 특화됨
- 그러나 프로세스 내부의 공유 자원에 대한 동시성 문제에 대한 컨트롤을 고려해야하고, 아무리 비용이 낮다한들 너무 많은 스레드는 컨텍스트 스위칭 비용 때문에
5. 데드락에 대해
1) 데드락의 뜻과 발생 조건
- 데드락은 서로 다른 프로세스/스레드들이 다음 단계 진행을 위해 자신이 가진 자원을 점유한 채 다른 프로세스가 점유한 자원을 요구하고 있을 때, 양 쪽 모두 프로세스의 다음 단계로 진행하지 못하는 상황을 말합니다.
- 발생 조건
- 상호 배제 : 서로 원하는 자원이 여러 프로세스에 의해 공유될 수 없다
- 비선점 : 다른 프로세스가 점유한 자원을 빼앗을 수 없다
- 점유와 대기 : 자신이 가진 자원을 점유하고 일정 시간이 지나도 점유 상태를 해제하지 않는다
- 환형 대기 : 공유 자원과 프로세스 간의 자원 할당 그래프를 그렸을 때 원 모양이 나온다
2) 데드락을 피할 수 있는 방법은?
- 데드락 발생 조건 네 가지중 하나를 만족하지 않으면 됩니다.
- 자원을 프로세스에게 할당하기 전에 미리 데드락의 발생 가능성을 파악하고 계산한 뒤 데드락이 일어나지 않을 때만 자원을 할당하는 방법을 사용할 수 있는데, 자원을 할당할 때마다 이를 고려하는 것은 번거롭고 시간이 오래 걸립니다
- 그래서 현대 OS는 데드락을 감지한 뒤 이를 수복하는 것에 집중 -> 데드락을 감지하면 우선순위가 낮은 프로세스들을 하나씩 중단하면서 데드락을 회피
3) mutex와 semaphore에 대해
- 데드락이나 동시성 문제를 피하기 위해 공유 자원에 접근하는 코드 영역인 임계 영역에 진입하기 전 락을 얻거나 어떤 신호를 주고받는 매커니즘
- MUTualEXculsion : 임계 영역에 접근하기 위해 락을 획득해야하는 매커니즘. 락을 획득한 프로세스/스레드만이 해당 락을 해제할 수 있음. 대기 중인 프로세스들이 락을 계속 확인하는 spinlock, 대기 큐에서 대기하는 wait queue 방식이 있음
- Semaphore : signal 기반. 어진 숫자만큼의 자원이 존재하고, 그 숫자만큼의 세마포어를 프로세스가 사용하는 매커니즘. 하나의 프로세스가 자원을 사용할 때 사용한 만큼 세마포어값을 감소시키고, 사용 뒤 다시 증가시킨다. 만약 세마포어 값이 0이었을 경우, 대기 큐에서 세마포어를 얻기 위해 대기wait하고 있었을 다른 프로세스에게 signal을 보낸다
- 뮤텍스와 이진 세마포어 : 뮤텍스는 뮤텍스 락을 얻은 프로세스만이 락을 해제할 수 있지만, 세마포어는 그렇지 않다. 또한 mutex의 경우, 우선순위가 높은 프로세스가 락을 획득하지 못해 수행되지 못하는 상황을 고려하여 해당 프로세스가 얻고자 하는 락을 가진 프로세스의 순위를 높이는 priority inheritence가 존재
6. Race Condition(동시성 문제)
- 여러 스레드가 동시에 공유 자원에 접근하여 작업을 수행하기 때문에, 작업의 결과를 예측할 수 없는 상태
- 자바의 경우 synchronized 키워드로 해당 객체의 모니터락을 얻어
7. CPU 스케줄링에 대해
1) CPU 스케줄링과 이것이 필요한 이유를 설명해주세요.
- 현대 OS는 기본적으로 멀티 프로세스
- 여러개의 프로세스들이 마치 동시에 진행되는 것처럼 보이는 동시성을 보여주기 위해 여러 프로세스들이 적절한 시간과 순서로 실행될 필요가 있는데, 이를 스케줄링 프로세스가 알맞은 알고리즘으로 프로세스들을 스케줄링함
2) 대표적인 스케줄링 알고리즘엔 어떤 것이 있을까요?
- RR : 라운드 로빈 알고리즘. 단순히 주어진 타임슬라이스만큼 CPU를 점유한 후 다음 프로세스에게 권한을 넘겨줌. 대부분의 현대 스케줄링 알고리즘은 RR을 기본으로 하고있음
- 우선순위 큐 알고리즘 : 우선순위가 다른 프로세스마다 큐를 둔 후 상위 우선순위 큐의 프로세스부터 CPU가 실행하는 방식. 일반적으로 IO bound process가 더 높은 우선순위를 가짐(CPU를 짧게 점유하기 때문)
- 다단계 피드백 큐 스케줄링(이름뭥미) : 우선순위 큐 알고리즘에서, 우선순위가 낮은 큐의 프로세스들의 기아 상태를 막기 위해 일정 시간마다 하위 큐에 있는 프로세스에 aging을 시키는 방식
8. 메모리 관리
1) 페이지 관리에 대해
- 프로세스의 메모리는 일반적으로 매우 크고, 현대의 멀티 프로세스 환경에서 모든 프로세스의 런타임 메모리 공간을 하나의 RAM에 올려놓는 것은 무리가 있음
- 제각각의 크기를 가진 메모리 공간을 적재하고 빼는동안 빈공간이 늘어나는 fragment 현상도 발생
- 따라서 전체 메모리를 일정한 크기frame로 쪼갠 뒤 메모리들을 매핑하는 전략을 사용
2) 가상 메모리란?
- 전술했듯, 프로세스가 실행되는데 필요한 메모리 공간은 일반적으로 매우 큼
- 프로그램 실행에 필요한 일부 메모리 세그먼트들만을 RAM에 옮겨놓고, 그렇지 않은 것들은 디스크로 swap out시킨다.
- 이렇게 디스크 공간을 "가상 메인 메모리" 공간으로 사용함으로써, 실제 물리 메모리 공간보다 더 큰 공간 사용가능
- 가상 메모리 분리 단위인 페이지를 실제 RAM 분리 단위인 프레임에 매핑하기 위해 페이지 테이블 존재 :
3) Thrashing
- 멀티 프로세스 정도가 커지면, 메인 메모리에 올라와야하는 페이지의 양도 매우 많아짐
- 이렇게 되면, 페이지를 교체하는데 쓰이는 시간이 멀티 프로세스의 프로세스 코드들을 실행해야 하는 시간을 잡아먹게됨
- 따라서 멀티 프로세스의 양이 늘어났지만, 동시 처리 속도는 현저히 떨어지는 현상=thrashing 발생
9. 캐시에 대해
1) 메모리의 계층 구조에 대해 설명해주세요
- CPU에 가장 가까운 레지스터부터 먼 디스크나 하드웨어 정보까지 컴퓨터가 사용할 수 있는 데이터가 저장된 저장소는 계층 구조를 갖고 있다는 뜻
- 레지스터 - L1캐시 - L2캐시 - 메인메모리 - SSD - HDD 순으로 빠르지만, 비싸고 저장공간이 적음
2) 지역성이 무엇이죠?
- spatial locality : 참조된 메모리 주소 주변의 메모리가 또 한 번 참조될 확률이 높다
- time locality : 최근에 참조된 메모리 공간이 다시 한 번 참조될 확률이 높다
- 실제로 for 반복문, 리스트/배열 참조 등의 이유로 지역성은 실제 코드 동작에서 흔하게 볼 수 있다
1. OS란 무엇일까?
1) OS란
- 하드웨어 자원을 이용하기 위한 소프트웨어 프로그램이라고 생각할 수 있다..
- 메모리, 디스크, CPU, 그리고 그들을 이어주는 각종 버스들을 관리하고 제어하여 사용자 프로그램을 효율적으로 구동할 수 있도록 합니다.
- 간단히 말하면 응용 프로그램과 하드웨어 사이의 인터페이스라 할 수 있다. 응용 프로그램이 하드웨어 자원을 사용할 때 OS의 커널코드가 동작하도록 하는 시스템 콜을 사용할 수 있다..
2) 커널 코드란
- 많고많은 ~ OS코드(수천만줄 단위)중, 핵심적인 역할을 수행하는 OS 코드
- 컴퓨터 하드웨어가 작동하기 위해 꼭 실행중이어야 하기 때문에, 상시로 메모리에 올라와있는 OS 프로세스 코드를 말합니다
2. 시스템 콜이란?
1) 유저모드와 커널모드
- 유저모드는 응용 프로그램 개발자가 작성한 응용 프로그램을 실행하고 있는 상태를 의미합니다. 그러니까 OS의 커널코드가 아닌 실행 파일의 코드가 CPU에 의해 실행되는 상태
- 커널모드는 유저의 응용 프로그램이 아니라 OS의 커널 코드가 실행되고 있는 상태입니다. 하드웨어를 직접적으로 조작하고있는 상태라고 할 수 있습니다.
- 응용 프로그램이 커널 코드를 호출하기 위한 시스템 콜(네트워크/하드웨어 장비 IO작업, 프로세스/스레드 생성 작업 등)을 하거나 커널 코드의 실행이 필요할 때 커널모드가 활성화됩니다.
- 모드가 나뉘는 이유는, 응용 프로그램이 하드웨어 리소스를 직접 사용하는 침입을 막아 하드웨어를 안전하게 보호하기 위함입니다.
- 컴퓨터는 유저모드와 커널모드를 반복적으로 스위칭하면서 프로그램을 실행
2) 대표적인 시스템 콜 (C 기준)
- 프로세스 관련 : 생성하는 fork(), 실행하는 execv(), 블락 상태에 두는 wait() 등
- 파일 관련 : open(), close(), write() 등
- 네트워크 관련 : listen(), accept() 등..
- 환경 관련 : uid, gid 관련 getter 및 setter들
3. 프로세스 메모리 구조에 대해 설명.
- 하드웨어가 실행할 수 있는 명령어 집합인 프로그램이 실행되면 컴퓨터의 메인 메모리에 프로세스를 위한 공간이 생성됨
- 코드 영역 : CPU가 참조하는 영역. 명령어가 들어있다
- 힙 영역 : 동적 메모리가 할당되는 영역
- 스택 영역 : 프로세스 내부의 스레드들에서 사용되는 지역변수의 공간. 메소드 인자, 지역변수, 리턴 주소 등을 담고있다
- 데이터 영역 : 정적(static) 데이터, 프로그램 전반적으로 사용되는 전역 변수 데이터가 저장된 영역
- PCB : Process Control Block. 실행중인 프로세스 인스턴스의 pid, 상태, 스케줄링 정보, 페이징 정보 등이 저장되어있음
- NEW : 프로세스가 막 생성된 상태
- RUNNABLE : CPU에 의해 프로세스가 실행중인 상태
- BLOCKED : 인터럽트나 IO 작업으로 인해 CPU가 블락된 상태
- WAIT : 주어진 타임 슬라이스를 다 써서(RR 등의 알고리즘을 사용했을 경우)
- FINISHED : 모든 명령어를 수행한 뒤 종료상태에 이른 프로세스
4. 프로세스와 스레드의 차이는?
- 프로세스의 작은 실행 흐름이 스레드
- 프로그램 전체를 실행시키기 위한 독립적인 메모리 공간을 갖고 있는 프로세스와 달리 스레드는 함수/메소드 실행에 필요한 pc와 sp, 스택 공간만을 가짐
- 프로세스 메모리 전체를 reload해야하는 프로세스간 컨텍스트 스위칭에 비해, 스레드는 일부 레지스터 값만 바꾸면 되므로 멀티 스레드에 조금 더 특화됨
- 그러나 프로세스 내부의 공유 자원에 대한 동시성 문제에 대한 컨트롤을 고려해야하고, 아무리 비용이 낮다한들 너무 많은 스레드는 컨텍스트 스위칭 비용 때문에
5. 데드락에 대해
1) 데드락의 뜻과 발생 조건
- 데드락은 서로 다른 프로세스/스레드들이 다음 단계 진행을 위해 자신이 가진 자원을 점유한 채 다른 프로세스가 점유한 자원을 요구하고 있을 때, 양 쪽 모두 프로세스의 다음 단계로 진행하지 못하는 상황을 말합니다.
- 발생 조건
- 상호 배제 : 서로 원하는 자원이 여러 프로세스에 의해 공유될 수 없다
- 비선점 : 다른 프로세스가 점유한 자원을 빼앗을 수 없다
- 점유와 대기 : 자신이 가진 자원을 점유하고 일정 시간이 지나도 점유 상태를 해제하지 않는다
- 환형 대기 : 공유 자원과 프로세스 간의 자원 할당 그래프를 그렸을 때 원 모양이 나온다
2) 데드락을 피할 수 있는 방법은?
- 데드락 발생 조건 네 가지중 하나를 만족하지 않으면 됩니다.
- 자원을 프로세스에게 할당하기 전에 미리 데드락의 발생 가능성을 파악하고 계산한 뒤 데드락이 일어나지 않을 때만 자원을 할당하는 방법을 사용할 수 있는데, 자원을 할당할 때마다 이를 고려하는 것은 번거롭고 시간이 오래 걸립니다
- 그래서 현대 OS는 데드락을 감지한 뒤 이를 수복하는 것에 집중 -> 데드락을 감지하면 우선순위가 낮은 프로세스들을 하나씩 중단하면서 데드락을 회피
3) mutex와 semaphore에 대해
- 데드락이나 동시성 문제를 피하기 위해 공유 자원에 접근하는 코드 영역인 임계 영역에 진입하기 전 락을 얻거나 어떤 신호를 주고받는 매커니즘
- MUTualEXculsion : 임계 영역에 접근하기 위해 락을 획득해야하는 매커니즘. 락을 획득한 프로세스/스레드만이 해당 락을 해제할 수 있음. 대기 중인 프로세스들이 락을 계속 확인하는 spinlock, 대기 큐에서 대기하는 wait queue 방식이 있음
- Semaphore : signal 기반. 어진 숫자만큼의 자원이 존재하고, 그 숫자만큼의 세마포어를 프로세스가 사용하는 매커니즘. 하나의 프로세스가 자원을 사용할 때 사용한 만큼 세마포어값을 감소시키고, 사용 뒤 다시 증가시킨다. 만약 세마포어 값이 0이었을 경우, 대기 큐에서 세마포어를 얻기 위해 대기wait하고 있었을 다른 프로세스에게 signal을 보낸다
- 뮤텍스와 이진 세마포어 : 뮤텍스는 뮤텍스 락을 얻은 프로세스만이 락을 해제할 수 있지만, 세마포어는 그렇지 않다. 또한 mutex의 경우, 우선순위가 높은 프로세스가 락을 획득하지 못해 수행되지 못하는 상황을 고려하여 해당 프로세스가 얻고자 하는 락을 가진 프로세스의 순위를 높이는 priority inheritence가 존재
6. Race Condition(동시성 문제)
- 여러 스레드가 동시에 공유 자원에 접근하여 작업을 수행하기 때문에, 작업의 결과를 예측할 수 없는 상태
- 자바의 경우 synchronized 키워드로 해당 객체의 모니터락을 얻어
7. CPU 스케줄링에 대해
1) CPU 스케줄링과 이것이 필요한 이유를 설명해주세요.
- 현대 OS는 기본적으로 멀티 프로세스
- 여러개의 프로세스들이 마치 동시에 진행되는 것처럼 보이는 동시성을 보여주기 위해 여러 프로세스들이 적절한 시간과 순서로 실행될 필요가 있는데, 이를 스케줄링 프로세스가 알맞은 알고리즘으로 프로세스들을 스케줄링함
2) 대표적인 스케줄링 알고리즘엔 어떤 것이 있을까요?
- RR : 라운드 로빈 알고리즘. 단순히 주어진 타임슬라이스만큼 CPU를 점유한 후 다음 프로세스에게 권한을 넘겨줌. 대부분의 현대 스케줄링 알고리즘은 RR을 기본으로 하고있음
- 우선순위 큐 알고리즘 : 우선순위가 다른 프로세스마다 큐를 둔 후 상위 우선순위 큐의 프로세스부터 CPU가 실행하는 방식. 일반적으로 IO bound process가 더 높은 우선순위를 가짐(CPU를 짧게 점유하기 때문)
- 다단계 피드백 큐 스케줄링(이름뭥미) : 우선순위 큐 알고리즘에서, 우선순위가 낮은 큐의 프로세스들의 기아 상태를 막기 위해 일정 시간마다 하위 큐에 있는 프로세스에 aging을 시키는 방식
8. 메모리 관리
1) 페이지 관리에 대해
- 프로세스의 메모리는 일반적으로 매우 크고, 현대의 멀티 프로세스 환경에서 모든 프로세스의 런타임 메모리 공간을 하나의 RAM에 올려놓는 것은 무리가 있음
- 제각각의 크기를 가진 메모리 공간을 적재하고 빼는동안 빈공간이 늘어나는 fragment 현상도 발생
- 따라서 전체 메모리를 일정한 크기frame로 쪼갠 뒤 메모리들을 매핑하는 전략을 사용
2) 가상 메모리란?
- 전술했듯, 프로세스가 실행되는데 필요한 메모리 공간은 일반적으로 매우 큼
- 프로그램 실행에 필요한 일부 메모리 세그먼트들만을 RAM에 옮겨놓고, 그렇지 않은 것들은 디스크로 swap out시킨다.
- 이렇게 디스크 공간을 "가상 메인 메모리" 공간으로 사용함으로써, 실제 물리 메모리 공간보다 더 큰 공간 사용가능
- 가상 메모리 분리 단위인 페이지를 실제 RAM 분리 단위인 프레임에 매핑하기 위해 페이지 테이블 존재 :
3) Thrashing
- 멀티 프로세스 정도가 커지면, 메인 메모리에 올라와야하는 페이지의 양도 매우 많아짐
- 이렇게 되면, 페이지를 교체하는데 쓰이는 시간이 멀티 프로세스의 프로세스 코드들을 실행해야 하는 시간을 잡아먹게됨
- 따라서 멀티 프로세스의 양이 늘어났지만, 동시 처리 속도는 현저히 떨어지는 현상=thrashing 발생
9. 캐시에 대해
1) 메모리의 계층 구조에 대해 설명해주세요
- CPU에 가장 가까운 레지스터부터 먼 디스크나 하드웨어 정보까지 컴퓨터가 사용할 수 있는 데이터가 저장된 저장소는 계층 구조를 갖고 있다는 뜻
- 레지스터 - L1캐시 - L2캐시 - 메인메모리 - SSD - HDD 순으로 빠르지만, 비싸고 저장공간이 적음
2) 지역성이 무엇이죠?
- spatial locality : 참조된 메모리 주소 주변의 메모리가 또 한 번 참조될 확률이 높다
- time locality : 최근에 참조된 메모리 공간이 다시 한 번 참조될 확률이 높다
- 실제로 for 반복문, 리스트/배열 참조 등의 이유로 지역성은 실제 코드 동작에서 흔하게 볼 수 있다