운영체제란?
운영체제(operating system)란, 컴퓨터 하드웨어를 관리하는 소프트웨어이다.
운영체제는 컴퓨터 하드웨어를 관리할 뿐만 아니라, 컴퓨터 시스템의 자원들을 효율적으로 관리하고, 응용 프로그램과 하드웨어 간의 인터페이스로써 다른 응용 프로그램이 유용한 작업을 할 수 있는 환경을 제공해준다.
즉, 운영 체제는 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있는 환경을 제공하는 시스템 소프트웨어라고 할 수 있다.
개발자는 운영체제를 왜 공부해야 할까? 기업에서는 왜 그렇게 운영체제 이론을 강조하면서 기술질문을 하는 것일까?
우선 내가 만든 프로그램, 혹은 내가 사용하는 프로그램이 컴퓨터에서 어떻게 수행되는지를 알아야 에러가 발생했을 때 빠르게 원인을 찾아
해결할 수 있고, 프로그램의 실행 속도나 메모리 성능을 지속적으로 개선하는 등 서비스를 확장해 나갈 수 있기 때문이다.
더불어 운영체제를 잘 이해하면 프로그램을 만들기 전에 개발 난이도, 비용, 성능 등을 예측할 수 있다.
이걸 사전에 파악하는 것은 한정된 시간과 비용으로 서비스를 개발해야 하는 기업 입장에서는 매우 중요할 것이다.
나 역시 처음 웹 개발 공부를 시작할 때에는 웹 개발에 운영체제 지식이 왜 필요해? 그건 임베디드 하는 애들한테나 중요한거 아니야?
라는 생각을 하곤 했지만... 웹 서비스를 배포하거나 서버 트래픽 관리, DB 쿼리 최적화 작업만 해도 수많은 프로세스 에러를 만나게 되면서
운영체제를 공부해야 한다고 주변에 외치고 다녔더랜다.
이러한 운영체제의 종류에는 Windows, Linux, UNIX, MS-DOS 등이 있으며 각각 장단점이 있으므로 사용하고자 하는 용도에 알맞게 선택하여 사용하는 것이 좋다.
프로세스 관리
운영체제의 역할 중 하나는 프로세스 관리 이며, 운영체제에서 작동하는 응용 프로그램을 관리하는 기능이다.
컴퓨터 CPU가 한번에 처리할 수 있는 양은 제한적이다. 따라서 여러 응용 프로그램이 동시에 CPU을 사용하려고 한다면 운영체제는 이를 적절히 배분해 줄 수 있어야 할 것이다. 즉 프로세스 관리는 프로세서(CPU)를 관리하는 것이라고 볼 수도 있다.
운영체제는 현재 CPU를 점유해야 할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당한 다음, 이 프로세스의 공유 자원 접근 및 통신 등을 관리한다. 이러한 작업을 우리는 스케줄링, 동기화, IPC 통신 이라고 부르는 것이다.
(각각이 어떤 작업을 의미하는지는 이후 포스팅에서 알아보자)
프로세스와 스레드
프로세스란, 특정 프로그램이 메모리 상에서 실행중인 작업 이다. 이 때 프로세스 안에서 실행되는 여러 흐름 단위를 스레드 라고 한다.
프로세스가 생성될 때, 기본적으로 하나의 스레드가 함께 생성된다. 즉 프로세스마다 최소 1개 이상의 스레드가 존재할 수 있다.
하나의 프로세스에는 Code, Data, Heap 이라는 세가지 메모리 영역이 존재한다.
• Code : 코드 자체, 프로그램 명령 등이 저장되는 영역
• Data : 전역변수, 정적변수, 배열 등이 저장되는 영역
- 초기화 된 데이터는 data 영역에 저장된다.
- 초기화 되지 않은 데이터는 BSS(Block Started by Symbol) 영역에 저장된다.
• Heap : 동적 할당된 데이터(new, malloc 등)가 저장되는 영역
이 때 하나의 프로세스에 여러개의 스레드가 존재하는 경우, 각 스레드에는 별도의 Stack 영역이 독립적으로 주어지지만
Code, Data, Heap 영역은 소속된 프로세스의 것을 공유하여 사용한다.
• Stack : 지역변수, 매개변수, 리턴 값 등이 저장되는 영역 (임시 메모리 영역)
즉 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해,
스레드는 프로세스 내부에서 다른 스레드와 공간, 자원을 공유하면서 사용한다는 점에서 공간/자원 사용 측면의 차이가 있다.
멀티 프로세스
멀티 프로세스란 여러개의 프로세스가 동시에 병렬적으로 처리되는 상황을 의미한다.
보통 하나의 컴퓨터에 여러개의 CPU를 장착해야 가능하다. 단일 코어 CPU는 한번에 하나의 프로세스만 처리할 수 있기 때문이다.
• 장점 : 안전성 (메모리 침범 문제를 OS 차원에서 해결해준다)
• 단점 : 프로세스가 각각 독립된 메모리 영역을 갖고 있기 때문에, 작업량이 많을수록 오버헤드가 발생할 수 있다.
또한 Context Switching 으로 인한 성능 저하가 발생한다.
• Context Switching
- 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
- 프로세스는 동작 상태와 대기 상태를 반복한다. 동작 중인 프로세스가 대기 상태가 되면 해당 프로세스의 정보는 보관되어야 한다.
이후 대기 상태에서 다시 동작 상태가 되면 보관중이던 정보는 다시 복원되어야 한다. 이 과정이 바로 Contect Switching 이다.
- 프로세스는 각각 독립된 메모리 영역을 할당받아 사용하기 때문에, 캐시 메모리 초기화처럼 무거운 작업이 진행될 때 오버헤드가
발생할 수 있다.
멀티 스레드
멀티 스레드란 하나의 프로세스에서 여러 스레드가 각각 별개의 작업을 하나씩 처리하는 것을 의미한다.
즉 멀티 스레드를 이용하면 하나의 프로세스만 가지고 여러 작업을 동시에 처리할 수 있다.
멀티 프로세스로 여러 작업을 동시에 처리하는 것 보다 하나의 프로세스에서 멀티 스레드로 여러 작업을 동시에 처리하면
메모리 공간과 시스템 자원 소모를 줄일 수 있다.
또한 하나의 프로세스에 속한 스레드들은 Code, Data, Heap 공간을 공유하기 때문에
별개의 Code, Data, Heap 공간을 사용하는 멀티 프로세스 방식 보다 통신 방법이 간단하고 속도 역시 빠르다.
• 장점 : 멀티 프로세스 방식 보다 시간, 자원 손실이 적으며 쓰레드끼리 전역 변수와 정적 변수를 공유할 수 있다.
• 단점 : 안전성의 문제가 발생할 수 있다. 메모리 공간을 공유하기 때문에, 하나의 스레드가 메모리를 훼손하면, 모든 스레드의 작동이
불가능해진다. 이러한 문제는 Critical Section 에 동기화 기법을 적용하여 방지할 수 있다.
• Critical Section
- 특정 데이터에 둘 이상의 쓰레드가 동시에 접근해서 연산을 실행하는 경우 문제가 발생할 수 있다.
이러한 문제를 일으키는 코드 블록을 Critical Section 이라고 한다. 즉 한 순간에 하나의 쓰레드만 접근해야 하는 공유 리소스 영역
(전역 변수 등)에 접근하는 코드 블록을 Critical Section 이라고 한다.
- 동기화 기법을 이용하면 임계 영역에는 한번에 단 하나의 쓰레드만 접근하도록 제한할 수 있다.
• 동기화 기법의 종류
- 크리티컬 섹션(Critical Section) 기반 동기화 (유저 모드 동기화)
- 인터락 함수(Interlocked Family Of Function) 기반 동기화 (유저 모드 동기화)
- 뮤텍스(Mutex) 기반 동기화 (커널 모드 동기화)
- 세마포어(Semaphore) 기반 동기화 (커널 모드 동기화)
- 이름있는 뮤텍스(Named Mutex) 기반 프로세스 동기화 (커널 모드 동기화)
- 이벤트(Event) 기반 동기화 (커널 모드 동기화)
동기화 기법마다 사용해야 하는 경우가 특별하게 정해져 있는 것은 아니지만,
목적에 적합한 동기화 기법을 잘 선택해서 사용하면 간결하고 정확한 코드를 작성할 수 있다.
참고자료
'CS Knowledge > 운영체제' 카테고리의 다른 글
[OS] CPU 스케줄링 개념 (0) | 2022.09.16 |
---|---|
[OS] 스레드와 멀티스레드 (0) | 2022.09.08 |
[OS] 프로세스와 Context Switching (0) | 2022.09.08 |
[OS] 운영체제 구조 (0) | 2022.09.07 |
[OS] 운영체제 개요 (0) | 2022.09.07 |