운영체제는 컴퓨터 하드웨어를 관리할 뿐만 아니라, 컴퓨터 시스템의 자원들을 효율적으로 관리하고, 응용 프로그램과 하드웨어 간의 인터페이스로써 다른 응용 프로그램이 유용한 작업을 할 수 있는 환경을 제공해준다.
즉, 운영 체제는 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있는 환경을 제공하는 시스템 소프트웨어라고 할 수 있다.
개발자는 운영체제를 왜 공부해야 할까? 기업에서는 왜 그렇게 운영체제 이론을 강조하면서 기술질문을 하는 것일까?
우선 내가 만든 프로그램, 혹은 내가 사용하는 프로그램이 컴퓨터에서 어떻게 수행되는지를 알아야 에러가 발생했을 때 빠르게 원인을 찾아 해결할 수 있고, 프로그램의 실행 속도나 메모리 성능을 지속적으로 개선하는 등 서비스를 확장해 나갈 수 있기 때문이다.
더불어 운영체제를 잘 이해하면 프로그램을 만들기 전에 개발 난이도, 비용, 성능 등을 예측할 수 있다. 이걸 사전에 파악하는 것은 한정된 시간과 비용으로 서비스를 개발해야 하는 기업 입장에서는 매우 중요할 것이다.
나 역시 처음 웹 개발 공부를 시작할 때에는 웹 개발에 운영체제 지식이 왜 필요해? 그건 임베디드 하는 애들한테나 중요한거 아니야? 라는 생각을 하곤 했지만... 웹 서비스를 배포하거나 서버 트래픽 관리, DB 쿼리 최적화 작업만 해도 수많은 프로세스 에러를 만나게 되면서 운영체제를 공부해야 한다고 주변에 외치고 다녔더랜다.
이러한 운영체제의 종류에는 Windows, Linux, UNIX, MS-DOS 등이 있으며 각각 장단점이 있으므로 사용하고자 하는 용도에 알맞게 선택하여 사용하는 것이 좋다.
프로세스 관리
운영체제의 역할 중 하나는 프로세스 관리이며, 운영체제에서 작동하는 응용 프로그램을 관리하는 기능이다.
컴퓨터 CPU가 한번에 처리할 수 있는 양은 제한적이다. 따라서 여러 응용 프로그램이 동시에 CPU을 사용하려고 한다면 운영체제는 이를 적절히 배분해 줄 수 있어야 할 것이다. 즉 프로세스 관리는 프로세서(CPU)를 관리하는 것이라고 볼 수도 있다.
운영체제는 현재 CPU를 점유해야 할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당한 다음, 이 프로세스의 공유 자원 접근 및 통신 등을 관리한다. 이러한 작업을 우리는 스케줄링, 동기화, IPC 통신 이라고 부르는 것이다. (각각이 어떤 작업을 의미하는지는 이후 포스팅에서 알아보자)
프로세스와 스레드
프로세스란, 특정 프로그램이 메모리 상에서 실행중인 작업 이다. 이 때 프로세스 안에서 실행되는 여러 흐름 단위를 스레드 라고 한다.
프로세스가 생성될 때, 기본적으로 하나의 스레드가 함께 생성된다. 즉 프로세스마다 최소 1개 이상의 스레드가 존재할 수 있다.
이 때 하나의 프로세스에 여러개의 스레드가 존재하는 경우, 각 스레드에는 별도의 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) 기반 동기화 (커널 모드 동기화)
동기화 기법마다 사용해야 하는 경우가 특별하게 정해져 있는 것은 아니지만, 목적에 적합한 동기화 기법을 잘 선택해서 사용하면 간결하고 정확한 코드를 작성할 수 있다.
네트워크 이론을 공부할 때 반드시 마주치게 되는 개념이 있다. 바로 OSI 7 Layers 이다. 이 용어가 무엇을 의미하는지, 각 레이어는 무엇으로 이루어져 있는지 간단하게 살펴보자.
일단 컴퓨터 네트워킹이라는 개념은 아주 광대하고 복잡하다. 전 세계에 퍼져있는 거대한 인터넷망에 대한 이론이 상당히 심플하게 정리될 수 있다면 그거야말로 초-신기술일 것이다. 하지만 그런 마법같은 일은 일어나지 않았고, 개발자들은 이 복잡한 개념을 어떻게 정리해야 할지 고민한 결과,
네트워크 구조는 총 7가지의 계층 구조로 나누어지게 되었다.
그 결과, 거대한 네트워크 통신이 일어나는 과정을 단계별로 파악할 수 있게 되었고 네트워크 통신 규칙 및 통신 기술도 이러한 계층 구조에 기반하여 만들어지기 시작했다.
이에 따라 7개의 레이어 중 특정한 곳에 이상이 생기면 다른 단계의 장비 및 소프트웨어를 건들지 않고도 이상이 생긴 단계만 고칠 수 있게 되니 기술의 생산성이 높아졌고, 통신 기술은 점점 빠르게 발전할 수 있었다.
OSI 7 계층
OSI 7 계층은 위 그림과 같이 총 7개의 레이어로 이루어져 있다.
사용자가 데이터를 다른 누군가에게 보내면, 해당 데이터는 각 레이어를 거치며 제각기 다른 형태로 감싸져 다음 레이어로 전달된다. 7번째 계층부터 차례대로 각 계층의 의미와 역할을 간단하게 살펴보자.
7 Layer : Application Layer (응용 계층)
• 네트워크 상에서 데이터가 이동할 때 가장 끝과 끝에 위치한 목적지라고 볼 수 있다. - 예를 들어 A가 B에게 편지를 보낸다고 할 때, A가 보낸 편지는 A의 집에서 시작되어 우체국을 거치고, 도로 위를 이동하고, 우편 배달부의 손을 거쳐 최종적으로 B의 집에 도착한다면 A의 집과 B의 집이 Application Layer에 해당한다.
• 네트워크 소프트웨어의 UI 부분 및 사용자의 입출력(I/O) 부분을 담당한다.
• 어플리케이션 계층 프로토콜
- HTTP(웹 문서), SMTP(전자메일), FTP(파일) 등 다양한 프로토콜을 포함한다.
- 특정 위치에 있는 어플리케이션이 다른 위치에 있는 어플리케이션과 데이터를 교환할 때 이 프로토콜이 사용된다.
•네트워크 어플리케이션
- 어플리케이션 계층에서 생성되는 데이터는 메시지(message) 라고 불린다.
- 이러한 메시지들은 어플리케이션 계층 프로토콜에 의해 처리되며, 우리가 사용하는 브라우저나 메일 프로그램 등은 프로토콜을 보다 쉽게 사용하게 해주는 응용프로그램이다.
- 메시지는 또 다른 어플리케이션 계층까지 전해지기 위해 바로 다음 계층인 Transport Layer로 전달된다.
6 Layer : Presentation Layer (표현 계층)
• 표현 계층은 데이터 표현 형식이 서로 다른 어플리케이션끼리 통신할 때 서로의 데이터를 해석할 수 있도록 해주며, 데이터 해석 외에도 데이터 압축, 데이터 암호화 등의 작업을 담당한다.
- 예를 들어 EBCDIC로 인코딩된 문서 파일을 ASCII 파일로 바꿔 주는 것, 데이터가 TEXT 인지, GIF 인지, JPG 인지 구분하는 것 등이 표현 계층이 수행하는 역할이다.
• 표현 계층이 이러한 서비스를 제공해주기 때문에 어플리케이션 단계에서는 데이터가 표현 및 저장되는 형식을 신경쓰지 않아도 된다.
5 Layer : Session Layer (세션 계층)
• 데이터가 통신하기 위한 논리적인 연결이 이루어지는 계층이다. 쉽게 말해 통신이 맺어지는 관문이라고 할 수 있다.
• 세션 설정, 유지, 종료, 전송 중단시 복구 등의 기능을 수행하며 TCP/IP 세션의 생성과 소멸 작업을 책임지고 담당한다.
• 통신을 관리할 수 있는 기능으로 동시 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex) 등을 제공하며
통신 체크 포인팅 작업, 그리고 유휴/종료/다시 시작 등의 상태에 대한 작업을 수행한다.
4 Layer : Transport Layer (전송 계층)
• 어플리케이션 레이어(4~7 계층)에서 만들어진 메시지를 클라이언트 단에서 서버로 전송하는 역할을 담당하는 계층이다.
- A가 B에게 편지를 보내려면 편지를 우체통에 넣어야 한다. 이 때 A가 쓴 편지가 어플리케이션 레이어에서 만들어진 메시지라면, 편지를 우체통에 넣는 행위가 메시지를 서버에 올리는 작업이라고 할 수 있다.
• 즉 통신을 활성화시키는 계층이며 포트를 열어 응용프로그램이 데이터를 전송 할 수 있도록 연결을 맺는 역할을 수행한다.
• 어플리케이션 레이어에서 메시지를 받아 Transport 레이어에서 한번 더 감싸는 작업을 거치면 해당 데이터는 세그먼트(Segment) 라고 불리게 된다. 이 데이터는 다시 바로 다음 계층인 Network 레이어로 전달된다.
• 만약 어플리케이션 레이어에서 데이터가 여러 개 도착했다면 전송 계층에서 이를 하나의 세그먼트로 모아 다음 계층에 전달한다.
• Transport Layer에는 TCP 와 UDP 라는 Transport Protocol 이 존재한다.
• 이 두가지 통신 규약을 통해 사용자들은 데이터가 신뢰할 수 있고, 손상되지 않은 데이터임을 보장받을 수 있다.
• Transport Layer가 존재함으로써 해당 계층의 상위 계층들은 데이터 전달의 유효성이나 효율성을 신경쓰지 않아도 된다.
•TCP (Transmission Control Protocol)
- 연결 지향형 서비스 : 연결 관리를 위한 연결 설정(3 way handshake) 및 연결 해제(4 way handshake)가 필요하다.
- 신뢰성 있음 (Reliable):패킷의 손실, 중복, 순서바뀜 등이 없도록 보장한다.
- Network 레이어로 세그먼트를 보낼 때 제대로 전달 되었는지 확인하고, 전송에 실패한 경우 재전송한다.
• UDP (User Datagram Protocol)
- TCP와 달리 비연결적인 접속 상태로 통신하며, 신뢰성이 없고 순서화되지 않은 서비스를 제공한다.
◦ 메세지가 제대로 도착했는지 확인하지 않는다 : 확인 응답 없음
◦ 수신된 메세지의 순서를 신경쓰지 않고 전송한다 : 순서 제어 없음
◦ 흐름 제어를 위한 피드백을 제공하지 않는다 : 흐름 제어 없음
◦ checksum 을 제외하면 특별한 오류 검출 및 제어가 없다.
- 그 대신 실시간 응용 및 멀티캐스팅이 가능하므로 빠른 요청과 응답이 필요한 실시간 서비스에 적합하다.
◦ 멀티캐스팅 : 여러 다수 지점에 데이터를 동시 전송하는 것 (1:多)
- 또한 TCP가 세그먼트 헤더로 20 바이트를 사용하는데 비해 UDP는 8 바이트만 사용하므로 헤더 데이터 처리에 소요되는 비용이 적다
3 Layer : Network Layer (네트워크 계층)
• Transport Layer 에서 전달된 세그먼트는 네트워크 계층 내에서 패킷(packet)이라는 이름으로 불린다.
• 이 계층에서 가장 중요한 기능은 데이터그램을 목적지까지 안전하고 빠르게 전달하는 기능(라우팅)이다.
- 즉 목적지로 데이터를 보낼 수 있는 가장 빠른 경로를 선택하고, 경로를 따라 패킷을 전달하는 것이 이 계층의 역할이다.
• IP 프로토콜
- IP 데이터그램의 필드를 정의하며 라우터가 이 필드에 어떻게 작용하는지를 정의한다.
• 라우팅 프로토콜
- 출발지와 목적지 사이에서 패킷이 이동하는 경로를 결정한다.
- 네트워크 레이어는 여러개의 라우터(패킷 스위치)를 통해 패킷을 전송하고, 라우터를 하나 지날 때 마다 데이터를 가장 빠르게 전송할 수 있는 라우터를 재탐색하며 경로를 만들어 나간다.
2 Layer : DataLink Layer (데이터링크 계층)
• 앞서 Network Layer는 출발지와 목적지 간에 일련의 라우터를 거쳐 데이터그램을 전송한다고 이야기했다. 이 때 경로상의 한 라우터에서 다른 라우터로 데이터그램을 이동시킬 때 데이터링크 레이어의 서비스를 이용하게 된다.
- 각 라우터에서 네트워크 계층은 데이터그램을 아래 데이터링크 레이어로 보내고, 데이터링크 레이어는 다음 라우터에 해당
데이터그램을 전달한다. 다음 라우터에 데이터그램이 도착하면, 해당 라우터의 데이터링크 레이어는 받은 데이터그램을 상위 네트워크 레이어로 올려 보낸다.
• 데이터링크 계층에서 전송되는 데이터 단위를프레임(frame)이라고 하며, 이 계층에서는맥 주소를 가지고 통신한다.
• 대표적인 장비로는브리지, 스위치등이 있다. (해당 장비들이 맥 주소를 사용한다)
1 Layer : Physical Layer (물리 계층)
• 이 계층에서는 주로 전기적, 기계적, 기능적인 특성을 이용해 통신 케이블로 데이터를 전송한다.
• 물리 계층에서 사용되는 통신 단위는 비트(bit)이며 이것은 1과 0, 즉 전기적으로 On, Off 상태를 나타내는 신호이다.
•물리 계층은 데이터를 전달하기만 할뿐 수신/발신하려는 데이터가 무엇인지, 어떤 에러가 있는지 등은 전혀 신경 쓰지 않는다. 단지 데이터를 전기적인 신호로 변환해서 주고받는 기능만 할 뿐이며, 이 계층에 속하는 대표적인 장비는 통신 케이블, 리피터, 허브 등이 있다.