동기화, IPC, interrupt

devAnderson·2022년 5월 30일
0

CS

목록 보기
5/5

🚍 0. 정리의 이유

최근 기술 면접들을 보는 중, 한 기업에서 자료구조와 알고리즘과 같은 기초 CS 지식을 물어보는 경우가 있었다. 슬프게도, 거진 대부분의 내용에 대해서 답변을 제대로 하지 못했다고 스스로 판단하고 있다. 차라리 아예 몰랐다면 모를까, 전에 한번 공부했다고 생각했는데 전부 다 까먹어서 대답하지 못한 건 큰 실책이다. 지식적 부끄러움의 경험을 다신 잊지 말자는 절치부심의 마음으로 항상 이 첫번째 헤더는 유지하면서 매일 CS 공부를 조금씩 정리하도록 한다.

🚍 1. 동기화

한정적인 운영체제의 공유 자원을 수많은 프로세스들의 쓰레드들이 접근하여 사용하려고 할 경우, 필연적으로 기존 데이터가 변경되어 stale해지는 상황이 벌어지게 된다. 데이터 변경으로 인해 해당 자원을 사용하게 되면서 벌어지는 데이터의 변동 격차를 해결하기 위해서는 필연적으로 동기화 작업이 필요하다.

즉, 여러 쓰레드들이 존재할 때, 하나의 자원에 대해서 처리 권한을 주거나 순서를 조정하는 과정을 동기화라고 말한다.

이 때 동기화의 핵심 개념은 임계 구역이다.

임계 구역이란, 각 프로세스의 스레드가 공유 자원에 접근하기 위해 거쳐야 하는 코드 블록이다. 이 임계구역을 기준으로 공유 자원을 동시 사용하지 못하도록 하는 상호 배제기법을 구현한 것이 뮤텍스이다.

뮤텍스

이 임계구역에 들어가기 위해서는 필수적으로 Critical Section Key 라고 하는 객체를 가지고 있어야 한다. 해당 객체를 가진 스레드는 임계 구역에 들어가 공유자원을 사용하는 코드를 활용할 수 있고, 그 외의 스레드들은 "Lock" 이 되는 상태로 대기하게 된다.

문제는 공유 자원에 대해서 한번에 하나의 스레드만 사용할 수 있으므로 상대적으로 시간이 오래걸린다.

다중 스레드가 한번에 공유 자원에 접근하기 위한 방법을 세마포어라고 한다.

세마포어

공유 자원을 사용할 수 있는 임계구역에 접근할 스레드 수 자체를 counter로 지정하여 그 수만큼의 스레드가 공유자원을 접근해 활용할 수 있는 구조를 뜻한다.

단, 이 때에는 필연적으로 임계구역 내 스레드들끼리 서로간에 필요한 자원을 선점해서 교착상태에 빠지는 "데드락" 현상이 발생할 수 있으므로,
이를 해결하기 위해

  1. 교착 상태를 발생시킬 것 같아보이는 스레드의 요청은 거절하는 교착상태 회피
  2. 교착 상태를 일으키는 프로세스들을 강제종료시킨 후 순서대로 재시작시켜 하나씩 해결해가는 교착 상태 회복

을 통해 해결해야 한다.

🚍 2. Inter Process Communication (IPC)

컴퓨터가 구동되는 순간, 수많은 프로세스가 생겨나고 이 프로세스들은 독자적으로 내부에 코드,힙,데이터,스텍 자원을 가진 상태로 메모리에 탑재되어 운용되고 있다. 그런데 필요에 따라서는 각 프로세스가 독립적으로 활동하기 보다 두 프로세스가 서로 함께 작업을 처리하게 되는 경우가 생긴다.

이 때에, 프로세스들은 서로간의 내부에서 처리된 내용을 프로세스끼리 공유해야 하는 상황이 벌어지게 되는데 이 상황을 IPC라고 한다.

IPC를 하는 방법은 크게 2가지로 나누어진다

  1. 메세지 전달형

해당 이미지의 첫번째에 해당하는 방식으로, 메모리에 컴퓨터의 부팅 시점에서부터 존재하는 OS kanel space 에 지속적으로 시스템 콜을 이용하여 프로세스간 메세지를 전달하는 방식으로, 단순히 정보전달을 통해 프로세스간 데이터 공유를 하기 때문에 conflict가 일어나지는 않지만 너무 많은 시스템 콜로 인해 오버헤드가 발생할 가능성이 존재한다.

  1. 메모리 공유형

해당 이미지의 두번째에 해당하는 방식으로, 시스템 콜을 사용할 필요 없이 메모리 내에 shared area를 형성해서 이 공간 내에서 상호간 데이터 공유를 하는 방식이다. 시스템 콜을 거치지 않기 때문에 속도가 더 빠르지만, 메모리의 한 영역을 선점하고 있기 때문에 너무 많은 shared area가 생겨날 경우, 메모리가 부족하게 되는 스텍오버플로우 현상이 발생할 가능성이 존재한다.

🚍 3. Interrupt

예를들면 키보드와 같은 입력장치에 유저 입력이 실행될 경우, CPU가 프로그램을 실행하고 있을 때 이런 즉시 처리되야 하는 작업에 대해서 예외처리가 가능해야 한다. (사용자는 입력에 대해서 즉각적인 출력을 요구한다)

따라서 이렇게 들어오는 중간 처리를 가능하도록 CPU의 프로세서에게 알려주는 것 인터럽트라고 한다.

CPU 내에는 인터럽트 라인이라고 하는 인터럽트 실행 버퍼를 생성해서 인터럽트라인의 세팅을 미리 검사한 후 있다면 처리하게 된다.

이렇게 생겨나는 인터럽트에는 위에서 말한 것처럼 외부 하드웨어로부터 오는 입력에 의해 인터럽트가 발생할 수 있고, 소프트웨어적으로 시스템 콜이 발생해서 인터럽트가 발생할 수 있다.

인터럽트의 과정은 소프트웨어 인터럽트를 예시로 가정하자면

  1. Process A가 시스템 콜을 통해 인터럽트를 언급한다.
  2. CPU는 현재 진행중이던 기계어 코드를 중단한다.
  3. 현재까지 수행중이던 process의 내용은 PCB(process control block) 으로 커널에서 계속 관리중이고, CPU역시 자신의 레지스터에 어떤 프로세스가 처리되고 있었는지를 등록한다.
  4. 레지스터의 PC(program counter) 에 인터럽트를 발생시킨 프로세스 명령어 주소를 저장한다.
  5. 인터럽트 서비스 루틴(인터럽트된 내용을 처리하는 것) 을 실행한다.
  6. 처리가 완료되면, 기존에 작업하고 있던 레지스터 내의 내용을 복원하고 이어서 실행한다.
profile
자라나라 프론트엔드 개발새싹!

0개의 댓글