CS Interview

운영체제 - CS 면접 총정리

게임이 더 좋아 2021. 11. 22. 01:59
반응형
728x170

 

저는 공룡책 기반 + 구글링으로 정보를 얻었습니다.

피드백 정말 정말 해주시면 감사하겠습니다.

 

22.02.07 업데이트

22.10.11 업데이트

 


 

프로세스-스레드

 

동기-비동기

더보기

 

교착상태

 

메모리(페이징, 가상메모리)

더보기

 

 

 

 

스케줄링

 

 

 

기타

 


 

개념질문

 

Q. 페이지 폴트, Page Fault가 무엇인가?

더보기

A. 가상 메모리의 페이지(논리 메모리) 테이블에는 페이지가 Main Memory에 있는지, Swap area(Disk)에 있는지 표시하는 Valid bit를 사용한다.

-> 0이면 디스크에 있고, 1이면 메모리에 있다는 뜻이다.

 

프로세스가 페이지를 요청(demand)했을 때 그 페이지가 메모리에 없는 경우를 페이지 폴트라고 한다.

페이지 폴트가 발생하면 프레임(물리 메모리)을 새로 할당 받아야 하며,

프로세스가 당 페이지를 사용할 수 있도록 스왑 영역에서 메인 메모리로 옮겨야 한다.

그리고 페이지 테이블을 재구성 하고, 프로세스의 작업을 재 시작한다.

 

Q. 요구 페이징, Demand Paging이 무엇인가?

더보기

A. 요구 페이징은 페이징 기법을 토대로 프로세스의 일부 페이지들만 메모리에 적재하고

나머지는 하드 디스크에 두며, 페이지가 필요할 때 메모리를 할당받고 페이지를 적재시키는

메모리 관리 기법을 말한다.

 

여기서 Demand의 의미는 페이지가 필요할 때까지는 물리 메모리에 적재하지 않는다는 말이다.

Demand를 해야 메인 메모리에 적재시키는 것이다.

만약 Demand를 했을 때 메인 메모리가 부족하게 되면 Page Replacement가 일어난다.

 

Q. 문맥 전환(Context Switching)이 무엇인가?

더보기

A. 멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서, 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(context)을 교체하는 작업을 context switching이라고 한다.

 

OS에서 context는 CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들이다.

보통 context는 프로세스의 PCB(Process Control Block)에 저장된다.

 

Q. 페이지 테이블은 어떻게 구성되어 있는가?

더보기

1. Valid bit

-> 페이지가 메모리에 적재되어 있는지를 나타냄 (0: 스왑 영역, 1: 메인 메모리)

2. dirty bit

-> 페이지가 메모리에 적재된 후 수정되었는지  (0 : 수정 x , 1 : 수정 o)

3. Physical Address field

-> 페이지가 메모리에 적재되어있을 경우 물리 프레임 번호가 기록됨

-> 페이지가 메모리에 없을 경우 디스크 주소(디스크 블록 번호)가 기록됨

 

 

 

Q. 메모리가 어떻게 구성되어 있는지 설명해 주세요.

더보기

A. 메모리는 크게 코드, 데이터, 스택, 힙 영역으로 나누어져 있다.

 

코드 영역은 실행될 프로그램의 코드가 저장되어 있는 영역이다.

데이터 영역은 전역 변수(global)와 정적(static) 변수 그리고 리터럴값이 저장되어 있는 영역이다.

스택 영역은 지역변수(local)와 매개 변수(parameter)가 저장되어 있으며 함수의 호출과 함께 할당되는 영역이다.

힙 영역은 사용자에 의해 동적으로 할당되고 해제될 수 있는 메모리 영역이다.

스택 영역은 컴파일 타임에 크기가 결정되고, 힙 영역은 런 타임에 크기가 결정된다.

 

Q. 시스템호출 또는 시스템콜, System call이란?

더보기

A. 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다.

 

시스템 콜은 Application Program Interface, API를 통해서

커널(kernel) 영역의 기능을 사용자 모드(user)가 사용 가능하게한다.

-> 원래 유저는 커널영역에 접근할 수 없음(시스템 콜을 쓰는 방법 외에는 접근 불가능)

해당 기능으로는 

  1. Process creation and management (프로세스 생성, 관리)
  2. Main memory management (메인 메모리 관리)
  3. File Access, Directory and File system management (파일 관리)
  4. Device handling(I/O) (직접 하드웨어 기능 관리)
  5. Protection (보호)

 

https://www.geeksforgeeks.org/introduction-of-system-call/

 

Q.CPU Bound 와 I/O Bound의 차이는 무엇인가?

[CS Interview] - CPU Bound와 I/O Bound의 차이

 

Q. 운영 체제란 무엇일까? 무엇을 위해 만들었을까?

더보기

A. 운영체제는 유저와 하드웨어 간의 인터페이스 역할을 하는 소프트웨어다.

OS로 하여금 하드웨어의 구조를 몰라도 유저가 성능을 이끌어낼 수 있음.

 

운영체제는 크게 2가지 목적을 가지고 있다.

 

1. 유용한 사용자 프로그램을 실행할 수 있는 환경을 제공한다.

-> 직접적으로 운영체제가 유용한 것은 아니지만 유용한 프로그램이 실행될 수 있도록 환경 제공

2. 하드웨어의 자원을 효율적으로 사용하게 만든다.

-> 유저가 직접 자원관리를 하는 것이 아니다.

 

++ 프로세스 관리, 기억장치 관리, 주변장치 관리, 파일 관리를 담당함.

 

**여기서 자원이란 CPU, Main Memory, I/O Device, File System 등 많은 것을 말한다.

 

Q. 커널이란 무엇인가?

더보기

A. 운영체제의 핵심 부분으로, 자원할당, 하드웨어 인터페이스, 보안, 인터럽트 제어, 네트워크 관리 등을 담당한다.


다시 말해서 OS의 목적이 하드웨어와 유저 간의 인터페이스 역할을 한다고 했다.

그 OS에서 해당 기능을 할 수 있는 이유가 바로 Kernel이 사용자 수준의 소프트웨어와 하드웨어의 통신을 관리하는 중요한 역할을 하기 때문이다.

 

 

Q. 교착 상태의 4 가지 필요 조건은 무엇입니까?

더보기

A.

1. 상호 배제, Mutual Exclusion

-> 자원을 공유하지 않는다.

 

2. 점유 대기, Hold and Wait

-> 이미 확보한 자원을 들고 나머지 필요한 자원을 기다린다.

 

3. 선점, No preemption

-> 가지고 있는 자원은 빼앗기지 않는다.

 

4. 순환 대기, circular wait

-> 자신의 자원을 가진 채로 상대의 자원을 원하는 것이 Cycle이 만들어질 경우

 

Q. 스풀링이란 무엇입니까?

더보기

A. 버퍼에 데이터를 저장해 주기억 장치와 주변 장치의 효율을 증가시키는 기술을 말한다.

-> CPU와 메인메모리와 처리 속도의 차이를 줄이기 위한 것이다.

 

EX) 프린터를 사용할 때, 미리 인쇄할 데이터를 보내서 Out(출력)이 진행되는 동안 기다리는 것이 아니라 CPU가 다른 작업을 할 수 있게 하는 것이다.

 

Q. 뮤텍스란?

더보기

A. Race Condition을 해결 하기 위한 방법으로 자원을 점유할 때 lock을 걸어서 정상적으로 작동하게 한다.

 

다시 말하자면 Critical Section을 가진 Thread들의 running time이 서로 겹치지 않게, 각각 단독으로 실행되게 하는 기술이다.

-> Thread 간의 비동기 작업이 원활히 진행될 수 있도록 스레드들 또는 프로세스간에 '통신'을 한다고 생각하면 된다.


 

Q. 세마포어란?

더보기

A. Mutex가 하나의 자원을 Lock을 걸었다면 Semaphore는 다수의 자원을 분배하는 방식이다.

한정된 수의 사용자만을 지원할 수 있는 공유 자원에 대한 접근을 통제한다.

 

** 세마포어는 락을 걸지 않은 쓰레드도 Signal을 보내 lock을 해제할 수 있다는 점에서, wait 함수를 호출한 쓰레드만이 signal 함수를 호출할 수 있는 뮤텍스와 다르다.

 

 

Q. 기아(Starvation) 란 무엇입니까?

더보기

A. 어떠한 프로세스가 작업하기 위해 자원을 할당 받아야 하는데 우선순위나 어떠한 이유로 자원을 점유하지 못한 상태로 계속 대기하는 것

 

Q. 에이징(Aging)는 무엇입니까?

더보기

A. 어떠한 프로세스가 작업하기 위해 자원을 할당 받아야 하는데 우선순위나 어떠한 이유로 자원을 점유하지 못하지만 시간이 지날수록 우선순위가 높아져 결국은 자원을 점유하게 만드는 기법

 

Q. 스케줄링,Scheduling이란

더보기

A. CPU 스케줄러는 프로세스가 생성된 후 종료될 때까지 모든 상태 변화를 조정하는 일을 한다.

스케줄링이 추구하는 목적은 5가지 정도가 있다.

 

공평성 : 모든 프로세스가 자원을 공평하게 배정받아야 하며, 특정 프로세스가 배제되어서는 안 된다.

효율성 : 시스템 자원을 Idle Time을 최소한 하도록 스케줄링해야 한다.

안정성 : 우선순위를 사용하여 중요한 프로세스가 먼저 처리되도록 해야 한다.

응답 시간 최소화 : 응답이 없는 경우 사용자는 시스템이 멈춘 것으로 가정하기 때문에 시스템은 적절한 시간 안에 프로세스의 요구에 반응해야 한다.

무한 연기 회피 : 특정 프로세스의 작업이 무한히 연기되어서는 안 된다. (Starvation)

 

Q. 지역성이란 무엇인지 설명하시오.

더보기

A. 지역성,Locality은 실행 중인 프로세스에서 나타나는 특성이다.

동일한 값이나 관련 저장 위치를 자주 액세스하는 특징을 말하는 것이다.

한번 참조한 데이터(동일한 값)를 짧은 시간 안에 다시 참조하거나 -> 시간적 지역성

한번 참조한 데이터의 근처(관련 저장 위치)에 있는 데이터를 짧은 시간 안에 참조하는 -> 공간적 지역성

프로세스는 어느 실행 단계 동안 메모리의 정보를 균일하게 액세스하는 것이 아니라 특정 페이지만 집중적으로 참조하는 현상을 말한다. 

 

** 파레토 법칙으로도 설명한다.

사용되는 사용 빈도의 80%는 20%의 메모리라고도 부른다.

 

Q. 시간 지역성

더보기

A. 시간 지역성은 특정 자원들을 상대적으로 짧은 시간안에 재사용한다는 것을 의미한다.

한 순간 한 지점에서 특정 메모리 위치를 참조할 때 동일한 위치에서 가까운 미래에 다시 참조할 가능성이 높다.

즉, 최근에 액세스한 항목은 오래지 않아 다시 액세스할 가능성이 있다는 것이다.

순환(루프), 서브 프로그램, 스택, 계산이나 합계에 사용하는 변수는 시간 지역성에 적용하는 예이다.

-> 이전에 계산된 결과는 다음 계산에 쓰인다.

 

Q. 공간 지역성

더보기

A. 공간 지역성은 프로세스가 메모리의 어떤 위치를 참조하면 그 근처를 이후에도 계속 참조할 가능성이 높다는 것이다. 상대적으로 가까운 위치에서 데이터 요소를 사용한다는 것을 의미한다.

메모리의 특정 위치를 특정 시간에 참조할 때 가까운 미래에 가까운 메모리 위치를 참조할 가능성이 높다.

데이터 정렬과 1차원 배열의 요소 탐색과 같이 선형 액세스할 때를 순차적 지역성이라고 한다.

-> 연속된 메모리 영역 확보

이는 공간 지역성의 특수한 경우이다.

배열 검색(순회), 순차적 코드의 실행, 근처의 관련 변수 선언 등이 공간 지역성을 적용하는 예이다.

 

Q. 캐시의 원리

더보기

A. 캐시 메모리는 속도가 빠른 장치와 느린 장치간의 속도차에 따른 병목 현상을 줄이기 위한 메모리이다.

-> CPU 속도와 메모리 Load/Read/Write의 차이

이러한 역할을 수행하기 위해서는 CPU 가 어떤 데이터를 원할 것인가를 어느 정도 예측할 수 있어야 한다.

캐시의 성능은 작은 용량의 캐시 메모리에 CPU 가 이후에 참조할, 쓸모 있는 정보가 어느 정도 들어있느냐에 따라 좌우되기 때문이다.

-> Cache Miss가 많으면 캐시가 쓸모 없음

이 때 적중률(Hit rate)을 극대화 시키기 위해 데이터 지역성(Locality)의 원리를 사용한다.

 

임계구역 (Critical Section)

더보기

A. 여러 프로세스가 데이터를 공유하면서 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분

 

경쟁상태 (Race Condition)

더보기

A. 공유자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값에 영향을 줄 수 있는 상태를 말한다.

동시접근시 자료의 일관성을 해치는 결과가 나타난다.

비동기 작업 시 고려해야 함

 

Q. CPU스케줄링 알고리즘의 종류를 설명하시오.

더보기

A. 대표적인 것들만 알아보자.

  • 비선점 프로세스 스케줄링 -> 빼앗기 가능
    • FCFS (First Come First Served Scheduling) -> 먼저 자원 사용을 요청한 프로세스에게 자원을 할당
    • SJF (Shortest Job First Scheduling) -> CPU 점유 시간이 가장 짧은 프로세스에 CPU를 먼저 할당(기아상태발생가능)->Aging으로 해결 가능

 

  • 선점 프로세스 스케줄링 -> 빼앗기 불가능
    • RR (Round Robin Scheduling) ->프로세스들 사이에 우선순위를 두지 않고, 순서대로 시간단위(Time Quantum)로 CPU를 할당
    • SRTF (Shortest Remaining-Time First Scheduling) -> SJF 스케줄링을 선점 형태로 수정한 방식. 현재 작업 중인 프로세스를 중단시키고 최단 잔여시간 프로세스의 처리를 시작하는 방식(기아상태 발생가능)

 

 

Q. 프로세스 제어 블록, PCB 에 대해 설명하시오

더보기

A. PCB 는 특정 프로세스에 대한 정보를 저장하는 블록이다.

OS는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB 를 생성 한다.

프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업 정보를 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다.

그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.

이것을 Context Swtiching이라고 한다.

 

Q. 인터럽트란 무엇인가?

더보기

프로그램을 실행하는 도중에 예기치 않은 상황이 발생한 경우, 현재 실행중인 작업을 즉시 중단하고, 발생된 상황을 우선 처리한 후 실행중이던 작업으로 복귀하여 계속 처리하는 것이다.

이것이 인터럽트다.

예기치 않은 상황이 아니더라도 인터럽트는 발생할 수 있는데

하드웨어 장치들이 CPU에게 보내는 신호로 입출력 또는 타이머 완료 등을 CPU에게 알리는 방법이다.

이것이 바로 하드웨어 인터럽트다.

인터럽트가 발생하면 CPU는 그 즉시 하던 일을 멈추고 인터럽트 핸들러에게 인터럽트 요청을 처리하는 코드를 실행시키게 한다.

**이 코드는 Interrupt Service Routine으로 ISR이라고 부른다.

 

Q.Round Robin에 대해 설명하시오

더보기

현대적인 CPU 스케줄링

각 프로세스는 동일한 크기의 할당 시간을 갖게 된다.

할당 시간이 지나면 프로세스는 선점(다른 프로세스에 의해 빼앗김)당하고

ready queue 의 제일 뒤에 가서 다시 줄을 선다.

RR은 CPU 사용시간이 랜덤한 프로세스들이 섞여있을 경우에 효율적

RR이 가능한 이유는 프로세스의 context 를 save 할 수 있기 때문이다.

 

장점

Response time이 빨라진다.
n 개의 프로세스가 ready queue 에 있고 할당시간이 q인 경우 각 프로세스는 q 단위로 CPU 시간의 1/n 을 얻는다. 즉, 어떤 프로세스도 (n-1)q time unit 이상 기다리지 않는다. (Starvation 존재 x)

프로세스가 기다리는 시간이 CPU 를 사용할 만큼 증가한다.
공정한 스케줄링이라고 할 수 있다.

 

주의할 점

설정한 기준 할당시간이 너무 길어지면 FCFS와 같아진다.

또 너무 작아지면 스케줄링 알고리즘의 목적에는 이상적이지만 잦은 context switch 로 overhead 가 발생한다.

그렇기 때문에 적당한 할당시간을 설정하는 것이 중요하다.

 

Q. 페이지 교체, Page Replacement란 무엇인지 설명하시오.

더보기

 

페이지 교체는 페이지 부재(page fault)가 발생하면

메인 메모리에 있으면서 사용하지 않는 페이지를 디스크(Swap Area)로 내보내고 새로운 페이지로 바꾸는 과정이다.

-> page fault handler가 담당함.

 

** 페이지 교체의 목표는 현재 작업 집합에 포함되지 않거나 가까운 미래에 참조되지 않을 페이지를 Swap-Area로 내려 페이지 폴트의 횟수를 줄이는 것이다.

 

내보낼 페이지를 고를 때는 시스템의 효율성에 영향을 주므로 페이지 부재 비율이 가장 낮은 알고리즘을 선택한다.

 

대표적인 알고리즘

LRU(Least Recently Used)

LRU 알고리즘은 실제메모리의 페이지들 중에서 가장 오랫동안 사용되지 않은 페이지를 선택하는 방식으로 많이 사용되고 있다.

 

 

Q. 스래싱, Thrashing이란 무엇인가?

더보기

A.

스래싱은 프로세스의 처리 시간보다 페이지 교체에 소요되는 시간이 더 많아지는 현상을 말한다.

-> 다른 프로그램을 실행하기 위해 페이지 교체하는 작업을 해야하기 때문이다.

다중 프로그래밍 시스템이나 가상 메모리를 사용하게 되면

하나의 프로세스 수행과정 중에서 Page fault가 잦아지고 이로 인해 전체적인 시스템 성능이 낮아진다.

다중 프로그래밍 정도가 높아짐에 따라 CPU의 이용률이 높아지는 것은 사실이나 과도할 경우 성능이 급격하게 떨어진다.

 

Q. Dispatch란 무엇인가?

더보기

A. 준비 상태에서 대기하고 있는 프로세스 중 하나가 프로세서를 할당받아 실행 상태로 전이되는 것을 말한다.

 

 

 

 


응용질문

 

Q. 스레드 생성과 프로세스 생성의 차이는 무엇인가?

더보기

-Thread 생성에는 기존의 Heap, Data, Code를 공유하기 때문에 자원이 덜 드는 반면

 

-Process는 OS로부터 자원을 할당받아서 PCB부터 부모 프로세스 메모리의 복사 등 모든 것을 새로 만들어야하기 때문에 자원이 초기에 많이 든다.

 

스레드, Thread는 프로세스 보다 생성, 소멸에 대한 오버헤드가 적고

프로세스보다 빠른 컨텍스트 스위칭이 가능하며 프로세스 통신처럼 어렵게 데이터를 공유하지 않는다.

 

Q. 프로세스와 스레드의 차이

더보기

프로세스는 OS로부터 자원을 할당받아서 생성할 수 있고

스레드는 프로세스로부터 자원을 할당받아서 생성한다.

프로세스에는 code, data, stack, heap 영역이 존재하고

스레드는 code, data, heap을 공유하면서 stack을 따로 가져 독립적인 흐름을 가진다.

스레드를 여러개 두어 멀티스레딩으로 연산 효율을 높일 수 있지만

동기화 처리를 제대로 해주지 않으면 deadlock이나 결과가 달라질 수 있다.

 

 

 

Q. 단편화의 종류와 발생하는 이유는?

더보기

A. 페이징은 프로세스가 차지하는 물리적 메모리 공간이 비연속적이 되도록 허용하는 메모리 관리 기법을 말한다.

(논리적으로는 연속됨)

페이징은 외부 단편화가 발생하지 않으며, 따라서 별도의 압축 과정이 필요하지 않다.

페이징 기법을 사용할 때, 외부 단편화는 발생하지 않는다.

모든 사용 가능한 프레임은 그것을 필요로 하는 프로세스에게 할당될 수 있기 때문이다.

하지만 내부 단편화가 발생할 수 있다는 단점이 있다.

프레임(물리적 메모리)은 일정한 크기로 할당되기 때문이다.

 

그러나 내부 단편화를 위해 페이지의 크기를 작게 만든다고 해도 총 페이지의 갯수가 그만큼 늘어나기 때문에 페이지를 관리하는 오버헤드 또한 증가하게 된다.

 

 

Q. TLB의 개념에 대해 설명하고, TLB miss와 TLB hit이 일어나는 경우에 대해서 설명해주세요

더보기

A. TLB는 Page Table 자체가 메인 메모리에 있기 때문에

그것의 속도 차 때문에 떨어지는 성능을 막기 위한 일종의 캐시다. (Buffer의 B다.)

TLB는 적은 수의 페이지 테이블만을 포함하고 있다.

CPU에 의해 논리적 주소가 생성될 때, 그 주소의 페이지 번호가 TLB에 제시된다.

 

만약 그 페이지 번호가 TLB에서 발견된다면 (TLB hit)

해당하는 프레임은 즉시 사용가능해지며 메모리에 접근할 수 있다.

 

하지만 만약 페이지 번호가 TLB에서 발견되지 않았다면, (TLB miss)

그 페이지 테이블에 대한 메모리 참조가 만들어져야 한다.

페이지 번호에 대응하는 프레임 번호를 TLB에 저장하여, 다음에 해당 페이지를 참조할 때 빠르게 메모리에 접근할 수 있도록 한다.

 

Q. 스택을 스레드마다 독립적으로 할당하는 이유는?

더보기

A. 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.

 

즉, 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다.

즉, 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

Thread가 비동기적 사용이 가능한 이유라고 할 수 있다.

 

Q. PC Register를 Thread마다 독립적으로 할당하는 이유는?

더보기

A. PC, Program Counter 는 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.

(다음에 수행해야 할 Instruction의 위치)

Thread는 CPU 를 할당받았다가 스케줄러에 의해 다시 선점당한다.

그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다.

따라서 PC 레지스터를 독립적으로 할당한다.

 

Q. Thread-safety란?

더보기

A. Thread-safe는 멀티 스레드 프로그래밍 환경에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 말한다. (각 수행결과가 올바르게 나오는 것이 보장)

다시 말해서 Multi-Threading으로 수행이 가능한 부분을 말한다.

-> 데이터의 일관성이 깨지지 않는 부분

 

Thread-safe한 코드를 만들기 위해서는 Critical Section 처리를 통해 이루어진다.

1. Re-entrancy

어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.

 

2. Thread-local storage

공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.

이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.

 

3. Mutual exclusion

공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제한다.

 

4. Atomic operations

공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.

 

Q. 멀티프로세싱, Multi-Proecessing 과 멀티쓰레딩, Multi-Treading 의 차이는 무엇인가?

더보기

A.

멀티프로세싱은 말 그대로 여러 프로세스를 동시에 실행하는 것

멀티쓰레딩은 여러 쓰레드를 병렬적으로 실행하는 것을 의미한다.

멀티 프로세싱은 일반적으로 하나의 프로그램에 대해서 부모 프로세스로 부터 나온 여러 자식프로세스로 프로그램을 실행하는 것을 의미하고

멀티쓰레딩은 하나의 프로세스에 대해 여러 쓰레드가 자원을 공유하면서 실행하게 되는 것을 말한다.

 

멀티 프로세스보다 멀티 쓰레드가 더 유용하다고 흔히 말하는 이유가 몇 가지 있다.

1. 프로세스 생성은 큰 오버헤드를 가진다.프로세스들이 독립적인 메모리 공간을 가지므로

생성하는 프로세스를 위해 작업하는 메모리 할당, 부모 프로세스의 메모리 복사, PCB 생성 등 오버헤드가 크다.

2. 프로세스 컨텍스트 스위칭의 오버헤드가 쓰레드보다 크다.

3. 프로세스 사이의 통신이 스레드보다 어렵다.

 

멀티쓰레딩은 힙과 data를 공유하면서 진행되기 때문에 리소스적인 측면에서 멀티프로세싱보다 더 효율적인 경우가 많다.

 

구체적인 차이

멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만

(Process 간 Context Switching 보다 빠른 것이지 이것도 Overhead가 있다)

오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다.

-> Thread는 각각의 독립적 흐름이 존재(Stack 영역)

 

멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 수행된다는 장점이 있지만

멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재한다.

 

따라서 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 한다.

 

Q. 멀티프로그래밍과 멀티태스킹의 차이는 무엇인가?

 

Q. Sync 와 Async의 차이는 무엇인가?

더보기

동기 작업이란 한 번에 하나씩 수행되는 것을 의미한다.

즉, 해당 작업이 끝나기 전까지는 현재 진행중인 작업 외의 다른 작업을 수행하지 못함을 의미한다.

 

비동기 작업이란 한 번에 하나 이상이 수행될 수 있음을 의미한다.

즉, 현재 작업을 진행중이더라도 다른 작업을 수행할 수 있다.

또한 작업에 대한 결과를 바로 원하지 않는다.

 

** 다만 싱글 스레드라고 해서 비동기작업을 못하는 것은 아니다.

 

 



 

Q. 멀티 스레딩의 장점과 단점은 무엇인가?

더보기

A.

멀티 스레딩은 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상 시키는 것이다.

하나의 프로그램에서 동시에 여러 개의 일을 수행할 수 있도록 해준다.

장점 :

응답성 - 프로그램의 일부분이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.

ex) 멀티 스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에서 사용자와 상호작용 가능하다.(Chrome을 생각해보자)

경제성 - 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다. 스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있으며, 프로세스의 context switching과 달리 스레드간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.

멀티프로세서의 활용 - 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다.

단점:

임계영역 - 둘 이상의 스레드가 동시에 실행하면 문제를 일으키는 코드 블록이다.

공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 다른 스레드에서 사용 중인 변수나 자로구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수있다.

따라서 동기화가 필요하다. (Multi-Threading에서 동시성 프로그래밍이 필요한 이유)

동기화를 통해 스레드의 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있다.

그러나 불필요한 부분까지 동기화를 하는 경우, 과도한 LOCK으로 인해 병목 현상을 발생시켜 성능이 저하될 가능성이 높기 때문에 주의해야 한다.

CONTEXT SWITCHING, 동기화 등의 이유 때문에 싱글 코어 멀티 스레딩은 스레드 생성 시간이 오히려 오버헤드로 적용해 단일 스레드보다 느리다.

-> 쓸 데 없이 멀티 스레딩을 하는 것은 좋지 않다. ( 하나로 할 수 있는 것은 하나로 해라)

 

 

Q. 커널 수준 스레드와 사용자 수준 스레드의 각각 장단점은?

더보기

A.

 

커널 수준 스레드 - > 운영체제의 커널에 의해 운용하는 것을 말한다.

장점

  • 프로세스의 스레드들을 몇몇 프로세서에 한꺼번에 디스패치 할 수 있기 때문에 멀티프로세서 환경에서 매우 빠르게 동작한다.
  • 다른 스레드가 입출력 작업이 다 끝날 때까지 다른 스레드를 사용해 다른 작업을 진행할 수 있다.
  • 커널이 각 스레드를 개별적으로 관리할 수 있다.
  • 커널이 직접 스레드를 제공해 주기 때문에 안정성과 다양한 기능이 제공된다.

단점

  • 스케줄링 동기화를 위해 커널을 호출하는데 무겁고 오래걸린다. (저장한 내용을 다시 불러오는 과정이 필요)
  • 즉, 사용자 모드에서 커널 모드로의  전환이 빈번하게 이뤄져 성능 저하가 발생한다.
  • 사용자가 프로그래밍할 때 구현하기 어렵고 자원을 더 많이 소비하는 경향이 있다.

 

사용자 수준 스레드 -> 사용자가 만든 라이브러리를 사용하여 스레드를 운용한다.

장점

  • 운영체제에서 스레드를 지원할 필요가 없다
  • 스케줄링 결정이나 동기화를 위해 커널을 호출하지 않았기 때문에 인터럽트가 발생할 때 커널 레벨 스레드보다 오버헤드가 적다
  • 즉, 사용자 영역 스레드에서 행동을 하기에 OS Scheduler의 context switch가 없다. (사용자 레벨 스레드 스케줄러 이용)
  • 커널은 스레드의 존재조차 모르기 때문에 모드 간의 전환이 없고 성능 이득이 발생한다.

단점

  • 시스템 전반에 걸친 스케줄링 우선순위를 지원하지 않는다. (무슨 스레드가 먼저 동작할 지 모른다)
  • 프로세스에 속한 스레드 중 I/O 작업 등에의해 하나라도 블록이 걸린다면 전체 스레드가 블록된다.

 


 

 사용자 수준 스레드와 커널 수준 스레드 차이는 별 거 없다.

코드가 실행되는 모드의 차이이다.

커널 수준의 스레드는 커널 모드기 때문에 write()같은 함수를 사용할 수 있다.

사용자 모드에서 커널 스레드를 사용하면 문맥 교환이 일어나서 오버헤드가 발생할수 있다. 

사용자 스레드가 여럿 있을때 하나라도 커널 모드가 되면 다른 쓰레드가 중지된다. 

그래서 요즘에는 혼합해서 쓸수 있는 스레드를 사용하는 것으로 알고 있다.

 

 

 

Q. 논리적 주소와 물리적 주소에 대해 설명하시오

더보기

A.

논리적 주소

주소 프로그램이 실행되는 동안 CPU에 의해 생성 된 것이 논리적 주소다.

-> CPU는 논리적 주소를 쓴다.

논리적 주소는 실제 메모리 위치를 액세스하려면 변환을 해야 한다.

->Address Translation을 해야 실제 메모리 위치에 접근할 수 있다.

논리적 주소는 메모리 관리 장치라는 하드웨어 장치에 의해 해당 물리적 ​​주소에 매핑된다.

 

 

물리적 주소

물리적 주소 는 메모리의 물리적 위치를 식별한다.

MMU ( Memory-Management Unit) 는 해당 논리 주소를 이용하여 실제 주소로 변환한다.

사용자는 실제 주소(Physical Address)를 절대 다루지 않는다.

-> 우리는 실제 메모리에 접근하지 않는다. (OS가 자원 관리)

 

사용자 프로그램은 논리 주소를 생성하고 프로그램이이 논리 주소에서 실행되고 있다고 생각(Illusion)

물리적 주소는 사용자에 의해 해당 논리적 주소에 의해 접근할 수 있다.

 

**논리 주소와 실제 주소의 주요 차이점

 

1. 논리 주소와 실제 주소의 기본적인 차이점은 프로그램의 관점에서 CPU가 논리적 주소를 생성한다는 것이다.

한편, 물리적 주소는 실제 메모리 유닛에 존재하는 위치이다.

2.. 동일한 논리 주소 및 실제 주소는 컴파일 타임 및로드 시간 주소 바인딩 방법에 의해 생성된다.

3. 런타임 주소 바인딩 방법이 서로 다른 동안 생성 된 논리 및 실제 주소다.

 

 

 

Q. GPU와 CPU의 차이에 대해 설명하세요. 

더보기

A.

CPU는 입출력장치, 기억장치, 연산장치 등을 포함한 컴퓨터 리소스를 관리하는 최상위 계층의 중앙처리장치이다.

따라서 데이터 처리와 더불어 프로그램에서 작업의 우선순위를 지정하고 전환하며 가상 메모리를 관리하는 등의 역할을 한다.

CPU는 직렬 처리에 최적화된 몇 개의 코어로 구성되어 있다.

 

GPU는 반복적이고 비슷한 대량의 연산을 수행하며 이를 병렬적(parallel)으로 나누어 작업하기 때문에 CPU에 비해 속도가 압도적으로 빠르다.

GPU는 병렬 처리용으로 설계된 수천 개의 보다 소형이고 효율적인 코어로 구성되어 있다.

-> NVDIA 에서는 CUDA로 알려져있다.

 

Q. Page의 크기가 커질 경우, 작아질 경우 어떻게 되는가?

더보기

Page 크기는 보통 1~4KB의 용량을 가진다.

 

 

페이지 크기가 작아지면

장점

1. 페이지 단편화가 감소되고, 한 개의 페이지를 주기억장치로 이동하는 시간이 줄어든다.

2. 불필요한 내용이 주기억장치에 적재될 확률이 적어서 효율적인 워킹 셋을 유지할 수 있음

3. Locality에 더 알맞아 기억장치 효율이 높아짐

단점

1. 페이지 맵 테이블의 크기가 커지고, 매핑속도가 느려짐

2. 디스크 접근 횟수가 많아져 전체적 I/O 시간이 늘어남

 

 

페이지 크기가 커진다면

장점

1. 페이지 정보를 갖는 페이지 맵 테이블의 크기가 작아지고 매핑 속도는 빨라진다.

2. 디스크 접근 횟수가 줄어들어 I/O 시간이 줄어든다.

단점

1. 페이지 단편화가 증가하는 경향이 있고, 한 개의 페이지 자체가 주기억장치로 이동하는 시간이 늘어난다.

2. 불필요한 내용까지도 적재되는 경우가 있다.

 

Q. 프로그램 실행 초기에는 모두 page fault 가 날 것이다. 어떻게 하는가?

더보기

Prepaging이라는 기법이 있다.

처음에 과도한 page fault를 방지하기 위해 프로그램 초기에 필요할 것 같은 모든 페이지를 한꺼번에 페이지 프레임에 적재하는 기법이다.

-> 다만 잘못 사용하면 사용하지도 않을 페이지들을 적재하여 비효율을 초래할 수도 있다.

 

Q. 다중프로그래밍, Multiprogramming 기법이란 무엇인가?

더보기

다중프로그래밍은 여러 프로그램들을 동시에 메모리에 올려놓고 동시에 실행시키는 기법이다.

CPU가 한 프로그램을 실행하다가 I/O 등의 이유로 CPU가 유휴상태로 놓일 때, 올라와 있는 다른 프로그램을 실행시켜서 CPU를 최대한 활용한다.

 

Q. 다중프로그래밍, Multiprogramming 기법에 대한 문제점이 무엇인가?

더보기

1. 여러 가지 프로그램을 메인 메모리에 올리기 위해 메모리 크기가 더 필요하다.

 
2. 여러 프로그램을 동시에 올리기 때문에 어떤 프로그램을 몇 가지나 올려야 하는지에 대한 고찰이 필요
 
3. 다중 프로그래밍 정도가 높으면 CPU Context Switching이란 것에 대한 오버헤드가 높아진다.
 
4. I/O 장치로부터 입출력이 끝났음을 알아야 했기에 인터럽트(interrupt)라는 개념이 생겨났다.
 
5. 여러 가지의 프로그램이 동시에 실행됨에 따라 동기화 문제가 발생했다. (자원 동시 접근)
 
6. 동기화 문제, 교착상태를 해결하는 방법이 제시되었다.
 

 

 

Q. Thrashing, 스래싱을 방지하기 위해서는 어떻게 해야하는가?

**스래싱 : (메인 메모리와 Swap-Area 사이의 잦은 입출력)

더보기

1. 다중 프로그래밍 정도를 낮춘다. (Degree of MultiPromgramming)

-> 쉽게 말하면 CPU 하나가 실행하는 프로그램들의 수

2. Page Fault를 조절한다.

3. 부족한 자원을 증설하거나 일부 프로세스를 중단시켜서 자원을 확보한다.

4. 페이지 교체 알고리즘을 수정한다.

 

Q. 가상 메모리를 쓰는 이유는 무엇인가?

더보기

물리 메모리는 컴퓨터에 장착된 실제 메모리로 최대 크기는 CPU에 의해 제한된다.

32-bit CPU에서는 4GB 이상의 물리메모리 이상을 사용할 수 없다.

 

프로세스의 주소 공간은 4GB로 고정크기를 가지고 있다.

그렇다면 4GB 이상의 프로세스를 실행할 수 있는가? 를 생각할 수 있다.

더군다나 여러가지 프로세스가 동시에 실행된다면 4GB를 넘기는 쉬울텐데 어떻게 우리가 사용하고 있는지를 알아야 한다.

 

우리는 여기서 프로세스가 실행되기 위해서 프로세스 전체를 물리 메모리에 적재해야하는가?를 생각해볼 수 있다.

만약 모든 프로세스가 물리 메모리에 올라와있어야 한다면

우리는 4GB보다 큰 프로세스를 실행할 수 없다.

하지만 일부 메모리만을 적재한 채 실행될 수 있다는 것이 사실이다.

실제로 프로그램 크기의 20%부분만이 프로세스 실행 시간의 80%를 차지하여

모든 프로세스를 올려놓지 않아도 된다.

즉, 가상메모리라는 것은 우리(사용자)가 생각하기에 물리적 메모리 이상의 프로세스도 실행할 수 있다고 착각하게 만드는 일루전이다. 

다시 말해서 가상 메모리 기법은 프로세스의 적재 공간을

메모리에서 보조 기억 장치의 영역까지 확장하여 사용하는 것이다.

**물리 메모리를 디스크 공간까지 확장하여 필요에 따라 스와핑이 일어날 뿐이다.

 

 

Q. 가상 메모리의 작동 방식은?

더보기

1. 물리 메모리 영역을 하드 디스크(Swap Area)까지 확장하고 프로세스를 RAM(메인 메모리)와 하드 디스크에 나누어 저장한다.

-> RAM보다 큰 프로세스 적재가능

2. 프로세스가 실행될 때 프로세스 전체가 물리 메모리에 적재되어 있는 것이 아니라 필요한 것들만 올려서 실행할 수 있도록 한다

-> 필요하다면 Swap Area에서 메인 메모리로 적재한다.

 

3. 메인 메모리에 빈 영역이 부족해지면 우리는 하드 디스크의 일부분도 메인 메모리와 같이 사용한다.

-> 메인 메모리가 부족하면 렉이 걸리는 이유 중 하나다. 하드 디스크의 전송 속도는 정말 느리다.

 

4. Swap Area에서 메인 메모리로 적재하는 과정은 Swap-in, 메인 메모리에서 다시 내리는 것을 Swap-out이라고 한다.

 

5. 가상 메모리 기법을 사용하게 되면 사용자는 프로세스의 크기에 구애받지 않고 프로그램 작성 및 실행이 가능해진다.

프로세스는 항상 0번부터 시작한다고 착각하게 되며 실제로는 어떤 부분이 메인 메모리에 있고 하드 디스크에 있는지 모르는 일루전,Illusion이 일어난다.

**운영체제가 모든 것을 담당해서 처리한다.

 

 

Q. 32-bit 운영체제란 무엇인가?

더보기

32bit의 주소 체계를 관리하는 운영체제로 해당 CPU로 작업할 수 있는 메모리 공간은 4GB = 2^32 가 최대이다.

그 이상의 메모리는 접근할 수 없다.

*8GB 램을 써도 인식을 못한다는 말이 바로 그말이다.

 

Q. 32-bit의 주소를 사용하며 Page 크기가 2KB이고 물리 메모리는 1GB인 시스템이 있다.

프로세스 A가 사용자 공간에서 54321바이트를 차지한다고 할 때, 다음 질문에 답하라

1. 물리 메모리의 프레임 크기는?

2. 프레임 개수는?

3. 프로세스 A의 주소 공간의 크기와 페이지의 개수는?

4. 프로세스 A는 몇 개의 페이지로 구성되는가?

5. 페이지 테이블의 항목 크기가 4 바이트라면 프로세스 A의 페이지 테이블 크기는?

 

더보기

1. 프레임 크기와 페이지 크기는 동일하므로 2KB

 

2. 물리 메모리를 프레임 크기로 나누면 1GB/2KB -> 2^19

 

3. 32비트 주소 체계에서는 프로세스 A 자체의 주소 공간 크기는 4GB이다.

페이지의 개수는 주소 공간을 페이지 크기로 나누면 된다. 2^32 / 2^11 => 2^21

 

4. 프로세스 A의 실제크기가 54321바이트이므로 2KB로 나누면 26.5가 나온다.

즉, 27개의 페이지를 차지한다고 생각하면 된다.

 

5. 페이지 테이블의 항목 수는 페이지 개수와 동일하다. 그러므로 테이블의 크기는 4Byte * 2^21

2^23 -> 8MB이다.

 

 

반응형
그리드형