CS 정리-6

유호준·2023년 5월 4일
1

CS 정리

목록 보기
6/12

Deadlock 에 대해 설명해 주세요.

프로세스가 한정되어 있는 자원을 얻지 못해 다음 처리를 하지 못해 무한히 기다리는 상태

Deadlock 이 동작하기 위한 4가지 조건에 대해 설명해 주세요.

  • circular wait : 프로세스가 원형으로 서로의 자원을 요구할 때
  • mutual exclusion : 자원은 하나의 프로세스만 가질 수 있을 때
  • no preemitive : 자원을 다른 프로세스가 빼앗지 못할 때
  • hold and wait : 자원을 점유한 채로 다른 자원을 소유하기 위해 대기할 때

그렇다면 3가지만 충족하면 왜 Deadlock 이 발생하지 않을까요?

프로세스가 자원을 언젠가 얻을 수 있기 때문에 발생하지 않는다.

어떤 방식으로 예방할 수 있을까요?

  • 조건을 3가지만 만족하도록 한다
  • 프로세스가 자원을 할당받기 이전에 Deadlock이 발생할지 확인 후 자원을 할당한다.(은행원 알고리즘)

왜 현대 OS는 Deadlock을 처리하지 않을까요?

  1. 빈번히 발생하는 것이 아니라 이를 계속 확인하여 자원을 할당하는 오버헤드가 더 크다고 판단
  2. 현대 시스템의 복잡성으로 인해 이를 완전히 방지하는 것은 불가능

Wait Free와 Lock Free를 비교해 주세요.

Wait Free

  • 호출이 다른 스레드와 충돌해도 모두 딜레이 없이 완료되어야 한다.

Lock Free

  • 여러개의 스레드에서 동시 호출해도 단위시간마다 적어도 한개의 호출이 완료
  • non-blocking
  • 호출이 다른 스레드와 충돌해도 적어도 한개의 스레드는 딜레이 없이 완료된다.

CAS

  • 두 알고리즘을 구현하는데 반드시 필요
  • cas(&a, old, new);
    의미 : a의 값이 old이면 new로 바꾸고 true를 리턴
    다른 버전의 의미 : a 메모리를 다른 스레드가 먼저 업데이트 해서 false가 나왔다. 모든 것을 포기하라.

프로그램이 컴파일 되어, 실행되는 과정을 간략하게 설명해 주세요.

  1. 전처리
  • 소스파일 상 주석 제거
  • 헤더 파일 코드 호함
  • 매크로를 값으로 변환
  1. 컴파일
    어셈블리어로 번역
  2. 어셈블
    어셈블리어를 기계어로 번역
  3. 링킹
    실행가능한 파일로 묶어주는 과정

링커와, 로더의 차이에 대해 설명해 주세요.

링커

  • 오브젝트 파일을 합쳐 하나의 프로젝트를 만드는 데 사용되는 것이 링커
  • 라이브러리 루틴을 찾아 검색
  • 객체 모듈이 점유할 메모리 위치를 결정하고 절대 참조를 조정하여 명령을 재배치
  • 개체 파일간의 외부 참조 해결

로더

  • 오브젝트 프로그램을 메인메모리에 저장하여 실행하는 기능
  • 할당: 실행 프로그램을 실행시키기 위해 기억장치 내에 옮겨놓을 공간을 확보
  • 연결: 부 프로그램 호출 시 할당된 기억장소의 시작주소를 호출한 부분에 등록하여 연결하는 기능
  • 재배치: 디스크 등의 보조 기억 장치에 저장된 프로그램이 사용하는 각 주소들을 할당된 기억장소의 실제 주소로 배치하는 기능
  • 적재: 실행 프로그램을 할당된 기억공간에 실제로 옮기는 기능

컴파일 언어와 인터프리터 언어의 차이에 대해 설명해 주세요.

컴파일 언어는 컴파일 과정을 수행하여 기계어로 번역하고 실행가능한 파일로 생성하여 프로그램을 실행하지만 인터프리티 언어는 인터프리티 언어가 한줄씩 번역을 수행하여 실행한다.

JIT에 대해 설명해주세요.

  • Just In Time의 약자이다.
  • 실행 시점에 자주 쓸만한 코드들을 기계어로 변환시켜 저장했다가 재사용할 때 이를 사용하는 방식을 말한다.
  • 초기에는 메모리를 할당받던가 하는 작업으로 인해 실행속도가 느릴수도 있으나 그 이후에는 실행속도가 많이 향상된다.

본인이 사용하는 언어는, 어떤식으로 컴파일 및 실행되는지 설명해 주세요.

  • 스위프트에서는 전처리기가 없다.
    - 이를 llbuild(하위 레벨 빌드 시스템)을 통해 해결한다.
  • LLVM을 거쳐서 컴파일된다.
    - Swift -> Swift AST -> SIL -> LLVM IL-> 어셈블리어 -> 기계어
    • 프론트엔드
      • clang, swiftc 두가지 컴파일러를 지원한다.
        • 소스코드를 분석 및 최적화하고 이를 LLVM이 어셈블리어로 번역해 줄 중간 언어인 LLVM IR을 생성한다.
    • 백엔드(LLVM)
      • LLVM을 어셈블리어로 변환하고 어셈블러가 이를 기계어로 변환한다.
  • 어셈블러는 어셈블리 코드를 재배치 가능한 기계어로 변환한다. 이 때, Mach-O 파일을 생성한다.
    - Mach-O
    - 의미가 있는 data chunks로 그룹화된 바이너리 바이트 스트림
    - Darwin 기반 OS에서 쓰임
    - chunks에는 바이트 순서, CPU타입 chunks 크기 등과 같은 메타데이터 포함
    • 재배치 가능한 파일
      • 실행가능한 파일이나 공유 오브젝트 파일을 생성하기 위해 다른 오브젝트 파일들과 링킹할 수 있는 코드와 데이터를 갖는 파일
  • 링커
    - Mach-O파일들과 라이브러리 파일들을 결합해 단일 실행 파일 생성

IPC가 무엇이고, 어떤 종류가 있는지 설명해 주세요.

IPC는 프로세스끼리 통신을 하기 위한 것으로, 공유 메모리, 메세지 큐, 파이프 등이 있습니다.

Shared Memory가 무엇이며, 사용할 때 유의해야 할 점에 대해 설명해 주세요.

Shared memory는 메모리의 공간을 공유하는 것으로, 사용할 때 서로 공유되는 영역에 대한 동기화에 유의해야한다.

메시지 큐는 단방향이라고 할 수 있나요?

메시지큐는 일반적으로 양방향으로 통신이 가능하다.

Thread Safe 하다는 것은 어떤 의미인가요?

Thread safe하다는 것은 여러 스레드에서 접근하거나 수정하더라도 항상 올바른 동작을 하는 것을 보장한다는 것이다.

Thread Safe 를 보장하기 위해 어떤 방법을 사용할 수 있나요?

세마포어, 뮤텍스, 모니터가 있다.

Peterson's Algorithm 이 무엇이며, 한계점에 대해 설명해 주세요.

피터슨 알고리즘은 뮤텍스락을 구현하기 위한 알고리즘 중 하나이다. 데커 알고리즘과 유사하지만 진입기회를 양보하는 것에 차이가 있다. 한계점은 두 개의 프로세스가 있을 때 적용할 수 있고, 세개 이상은 아직 논의되고있다.

Race Condition 이 무엇인가요?

Race condition 이란 critical section에 대해 동시에 접근하여 그 결과가 올바르게 실행되지 못할 수도 것을 의미한다.

Thread Pool, Monitor, Fork-Join에 대해 설명해 주세요.

Thread Pool

스레드를 필요할떄 생성하고 필요없을 때 삭제하는 것이 아니라 미리 스레드를 만들어놓고 이를 꺼내서 쓰는 방식으로 스레드를 생성하고 회수하는데 걸리는 오버헤드를 방지할 수 있다.

Monitor

동기화 기구로 공유자원 접근 함수에는 최대 한개의 스레드만 접근할 수 있도록 한다. 모니터의 경우 두 개의 큐가 존재하고 배타동기와 조건동기가 있다. wait()함수를 통해 조건동기 큐로 함수를 블록 시킬 수 있다.

ex) P1, P2가 있고 항상 P1이 P2 먼저 실행시키고 싶다면 P2 실행코드 이전에 wait() 함수로 블록시킨 뒤 P1이 끝나고 notify()함수를 통해 P2를 깨어나게 하면 된다.

Fork-Join

효율적인 병렬처리를 위한 기능으로 작업을 나눠 효율적으로 처리하는 기법을 의미한다.

참고자료

profile
포트폴리오 - https://drive.google.com/file/d/152OM9p7JQorjUfvR4BaxqGuP5xtQ8-fM/view?usp=sharing

0개의 댓글