OS 깨끗하게 리뷰하기 (1)

지금까지 Network, DB를 리뷰했다. OS도 빼먹을 수 없다고 생각한 필자는 OS의 기본 상식에 대해서 빠르게 훑고자 한다.

운영체제(OS)란

운영체제는 하드웨어를 관리하고 응용 프로그램과 하드웨어 사이에서 시스템의 동작을 관리하는 시스템 소프트웨어이다. 운영체제가 하는 일을 크게 나누면 다음과 같다.

  • 프로세스 관리: CPU를 점유해야할 프로세스를 정하고, 할당하며 프로세스 간 공유 자원 접근과 통신을 관리한다.
  • 저장장치 관리: Main Memory와 2차 저장 메모리를 관리하여 메모리 영역 할당/해제/침범 방지 및 가상 메모리 기능
  • 네트워킹: 네트워크 프로토콜 지원
  • 사용자 관리: 한 컴퓨터 당 여러 계정 관리
  • 디바이스 드라이버: 하드웨어를 추상화 해주는 디바이스 드라이버 관리

운영체제는 두 개의 독립된 동작 모드인 사용자 모드와 커널 모드로 나뉜다. 부팅시 커널 모드로 시작하고, 운영체제가 올라오면 그 때부터 사용자 모드가 시작된다. 시스템에 치명적인 커널 명령어를 막기 위함이다.

프로세스와 스레드

Process란 운영체제에서 시스템 자원을 할당받는 작업의 단위로, 메모리에 올라와 실행되고 있는 프로그램의 instance라고도 한다. Thread란 프로세스 안에서 실행되는 여러 흐름 단위이다. 프로세스당 최소 하나의 Thread (메인 스레드)를 가지고 있다.

프로그램이란? 어떤 작업을 실행할 수 있는 파일

그림에서 볼 수 있듯, 프로세스는 독립된 메모리 영역 (Code, Data, Stack, Heap)를 배정 받는다. 이러한 프로세스는 다른 주소에서 실행되기에 서로의 자원에 접근할 수 없다. 만약 접근하고 싶다면 IPC (Inter Process Communicaton)를 사용해야 한다.

IPC란 커널에서 제공하는 IPC 설비를 통해 통신 할 수 있다. Pipe, Named Pipe, Messaging Queue, 공유 메모리, 메모리 앱, 소켓 등이 있다.

Code, Data, Stack, Heap에 대해 짧게 설명해 보겠다. Code는 코드 자체를 구성하는 메모리 영역, Data는 전역변수나 정적변수, Heap은 동적 할당시 (new나 malloc)에 사용, Stack은 지역변수나 리턴 값 (임시 메모리)에 사용한다. new는 초기값가능, 메모리 바꾸기 불가, malloc은 반대.

Thread는 그러나 Stack을 제외한 나머지는 모두 같이 공유한다. 그래서 멀티 프로세스보다 멀티 스레드가 보통 자주 쓰인다. 멀티 스레드로 실행하는 경우 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들고, 메모리를 공유하여 자원 소모가 적다 (또한 프로세스 간 Context Switching은 오버헤드가 크다). 또한 스레드간 전환 속도가 빠르고 통신 비용이 적다. 그러나 동기화 문제와 전역 변수를 공유하여 문제가 생길 수 있다.

System Call이란? 커널 영역의 기능을 쓰게 해준다. 프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신 등이 이를 통해 가능하다. 프로세스를 생성할 때는 fork, exec을 통해서 가능한데, fork는 새 프로세스를 생성하고 exec은 호출한 프로세스를 새로운 프로세스로 덮어씌운다.

Semaphore & Mutex

멀티스레드에서 동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역인 critical section (임계영역) 문제를 고려해야한다. 이를 위한 해결에 대한 기본 조건으로 Mutual Exclusion, Progress, Bounded Waiting이 있다. Mutual Exclusion은 한 프로세스가 Critical section에서 실행중이라면 다른 프로세스들은 실행될 수 없다. Progress는 Critical Section에서 실행중인 프로세스가 없고 별도의 동작이 없는 프로세스만이 진입후보로 들어올 수 있다. Bounded Waiting은 한 프로세스가 Critical section에 대한 진입을 요청한 후에는 다른 프로세스 의 Critical section 진입이 유한한 횟수로 제한되어야 한다. 이러한 기본 조건을 위한 해결책이 바로 Mutex와 Semaphore이다 (이게 해결이 된다면 Thread-Safe하다고 한다. 의도된 대로 동작한다는 것!) 둘다 동기화를 시켜준다.

만약 공유자원에 대해 여러 프로세스나 스레드가 동기화 없이 공유된 자원에 접근하려면 어떻게 될까? 그렇다면 Race Condition이 발생하게 된다. 예를 들어 동시에 내가 돈을 10만원을 넣고 남이 20만원을 넣으면 30만원이 들어와야하는데 10만원만 들어오던가 할 수 있다.

동기화란 공유하는 자원의 일관성을 유지하는 것이다

Sempahore

세마포어는 Signalling 매커니즘이라 락을 걸지 않은 쓰레드도 시그널을 통해 락을 해제할 수 있다. 세마포어는 지정된 변수의 값만큼 접근할 수 있고, 공유자원 상태를 나타내는 카운터 변수를 사용하여 자원을 사용하면 숫자를 줄이고 사용이 완료되면 올라간다.

Mutex

뮤텍스는 Locking 매커니즘으로 하나의 쓰레드만이 뮤텍스를 다른 Critical Section에 들어올 수 있다. 그리고 그 쓰레드가 나갈때 뮤택스를 해제할 수 있다.

PCB and Context Switching

Process Management는 프로세스가 여러 개일때 CPU가 CPU 스케줄링을 통해 관리하는 것 말한다. 이때 CPU는 각 프로세스를 추적해야하므로 프로세스 특징을 가지고 있는게 Process Metadata다. Process ID, Process state, Owner, CPU Usage 등 이 포함되어있는데 이 metadata는 프로세스가 생성되면 Process Control Block (PCB)에 저장된다. 각 프로세스가 생성될때마다 PCB가 각각 생성되고, 프로세스 완료되면 제거된다.
Context Switching은 현재 실행하고 있는 Process나 Thread의 상태를 저장하고 다음 진행할 것의 값을 읽어 적용하는 과정을 뜻한다. 현재 실행하고 있는 Process나 Thread의 PCB 정보를 저장하고, 다음 실할 것의 PCB 정보를 Register에 적재하고 CPU가 이전에 실행했던 과정을 연속적으로 수행할 수 있다.

Deadlock (교착상태)

Deadlock이란 첫번째 프로세스/스레드가 두번째 프로세스/스레드의 락이 풀리기를 기다리고 있고, 반대도 마찬가지인 경우 무한대기 상태에 빠지게 되어 Deadlock이라 한다. 4가지 조건이 있다.

  1. mutual exclusion 상호 배제
    한번에 한 프로세스만 공유 자원을 사용할 수 있다.
  2. hold and wait 점유 대기
    공유 자원에 대한 접근 권한을 가진 프로세스가 양보하지 않은 상태에서 다른 자원에 대한 요청을 할 수 있다.
  3. No preemtion 비선점
    한 프로세스가 다른 프로세스의 자원 접근 권한을 취소할 수 없다.
  4. Circular wait 순환대기
    개 이상의 프로세스가 자원 접근을 기다리는데, 그 관계에 사이클이 존재한다.

이 중 하나라도 깨지면 교착상태는 해결된다.

Interrupt

인터럽트란 프로그램 실행 중에 예기치 못한 일이 발생한 경우 실행중인 작업을 즉시 중단하고 발생된 상황을 먼저 처리해야함을 CPU에 알리는 것. 외부/내부 인터럽트는 CPU의 하드웨어 신호로 발생하고 소프트웨어 인터럽트는 명령어로 발생한다. 외부 인터럽트는 입출력 장치, 전원 이상 등의 외부 요인으로 발생한다. 내부 인터럽트는 Trap이라고 하며 잘못된 명령이나 데이터를 사용하는 경우 발생한다 (0으로 나누기 등). 소프트웨어 인터럽트는 명령의 요청으로 이루어진다. 인터럽트 처리 과정은 다음과 같다.

Reference

https://developerhenrycho.tistory.com/18
https://dkwjdi.tistory.com/247
https://mangkyu.tistory.com/104
https://gyoogle.dev/blog/computer-science/operating-system/
https://github.com/WeareSoft/tech-interview/blob/master/contents/os.md
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4