[CS] OS와 커널 Program과 Process, Hardware과 Software, thread

devAnderson·2022년 5월 23일
0

CS

목록 보기
2/5

🚍 0. 정리의 이유

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

🚍 1. OS vs 커널

OS란 소프트웨어로 컴퓨터 사용자가 컴퓨터의 물리적인 장치인 하드웨어들을 손쉽게 사용할 수 있도록 인터페이스를 제공하고, 컴퓨터 자원을 관리 분배하며, 오류를 검출하여 해결하는 역할을 한다.

OS는 컴퓨터가 전원이 켜지는 순간 동시에 실행이 된다.
OS 역시 소프트웨어이므로, 컴퓨터 시스템에서 수행되기 위해서는 메모리에 적재되어야 한다.

간단히 메모리의 구조를 정리하자면
-code(text) : 실행 명령어들이 저장되는 공간이다.
-Data : 프로그램의 전역변수와 정적 변수들이 저장되는 공간이다. (전역변수는 프로그램 실행 시 초기화되며 전체 영역에서 사용가능, 정적 변수는 프로그램 실행시 초기화되는데 정적 지역변수는 중괄호 내부에서만 사용가능하고 정적 전역변수는 해당 소스 파일내부에서만 사용가능.)
-Stack : 함수의 매개변수와 지역변수가 저장되는 공간이다. (LIFO, stack frame 단위로 관리됨)
-Heap : 런타임 시점에서 개발자가 동적으로 할당하거나 소멸되는 공간이다. (minor, major 영역, Bump to the pointer, 이때 여러 원인으로 인해 GC로 수거되지 않고 남아있는 Garbage들이 존재하는 것을 Memory leak 이라고 함)

하지만, 운영체제와 같은 크기가 방대한 소프트웨어가 메모리에 전부 다 탑재되면 공간의 낭비가 된다.

따라서, 운영체제중에서 필요한 부분만을 메모리에 올려놓게 되는데, 이렇게 메모리 공간에 상주하는 운영체제 부분을 커널이라고 한다.

이후, OS에 의해 관리되는 모든 프로세스들은 리소스에 접근하기 위해서 필연적으로 OS가 제공하는 인터페이스를 활용하여 요청을 하게 되는데 이것을 "system call" 이라고 한다. 예를들어,

cp test1.txt test2.txt

라는 명령어를 사용자가 키보드로 입력한다면, 이 유저의 입력에 대해서 I/O 시스템 콜을 사용한다. 이 시스템 콜을 통해 cp가 입력이 되면 먼저 test1.txt의 파일 디렉토리에 접근하지 위한 시스템 콜을 요청하고, 있다면 test2.txt 파일을 찾기 위한 시스템 콜을 날리고... 이렇게 반복적으로 시스템콜을 통해 허가를 받음으로서 최종적으로 해당 cli 명령어를 실행하게 된다.

🚍 2. Program vs Process, multi process

Program이란 소프트웨어(프로그램 자체와 운용 유지 보수와 관련된 정보들의 일체)의 일부로, 컴퓨터에게 특정한 작업을 실행시키도록 할 수 있는 명령어들을 모아둔 실행 파일을 의미한다. 예를들어, chrome.exe를 실행시키면 컴퓨터는 이 프로그램 내의 cli 명령어들을 순차적으로 실행시켜 브라우저를 띄우게 한다.

이런 프로그램은 RAM과 같은 Primary memory(휘발성 메모리)에 저장되어 있지 않고 하드디스크와 같은 반영구적 저장 장소에 저장되어 있다가 실행이 필요할 때마다 OS에 의해 가져와져서 RAM에 탑재된 뒤 빠르게 읽혀지며 실행된다.

위의 OS에서 언급한 것처럼, 모든 프로그램은 컴퓨터로부터 전달받는 리소스들을 가지고 메모리에 탑재되어 실행된다.

프로세스는 위에서 말한 스텍, 힙, 코드, 데이터 외에 최소 1개의 스레드를 가진다.

기본적으로 프로세스는 별도의 주소공간에서 실행되고 있으며, 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스간 통신 (Inter-Process communication)을 통해 접근해야 한다.

IPC란 inter process communication의 줄임말이다. 즉, 프로세스간 데이터 통신을 위한 설비이다.
IPC는 크게 메세지 전달형식과 공유메모리 형식으로 나뉘게 된다.

(위의 내용 중 세마포어는 공유할 수 있는 메모리에 대해 접근할 수 있는 프로세스의 양을 제한하는 "접근제어"형태를 통해 프로세스간 통신을 구현하는 방식을 뜻한다)

멀티 프로세스

다수의 프로세서가 다수의 프로세스를 동시처리하는 것을 뜻한다.
위에서 언급했던 프로세스의 개념은 결국 작업처리에 있어서 CPU를 사용하게 되는데, 이때 CPU의 자원(core와 cache memory 등) 을 분할받은 단위인 프로세서 하나가 하나의 프로세스의 처리에 사용되는 것을 뜻하고, 멀티 프로세스는 이 하나의 프로세서가 수많은 프로세스를 담당해서 연산처리를 하는 것을 뜻한다.

각 프로세서들이 자원을 공유하면서 작업을 처리하기 때문에 하나의 프로세서가 멈추더라도 작업진행이 정지되지 않는다.
단, 각 프로세스들끼리 메모리 영역을 차지하며 따라서 많은 CPU 연산 시간이 필요해진다.

🚍 3. thread

스레드란 프로세스 내에서 동작되는 작업들의 실행 흐름이다. 스레드들은 프로세스 내에 존재하는 코드, 힙, 데이터를 공유한다. 각 스레드에는 자신이 어디까지의 코드를 실행했는지에 대한 레퍼런스인 레지스터와 작업 처리에 사용되는 스텍을 고유하게 가진다.

멀티 스레드

멀티 스레드는 하나의 프로세스 내에 다수의 스레드로 구성되어 서로 코드 힙, 데이터를 공유한 상태로 적절하게 자원을 사용해서 작업처리속도를 향상시키는 것을 뜻한다.

멀티 프로세스와 다르게 IPC와 같은 전처리가 필요하지 않아 상대적으로 속도가 빠르다.
단, 멀티 스레드는 IPC의 공유메모리 형식과 같이 서로간에 동일한 자원을 사용하고 있기 때문에 동기화의 문제가 발생하므로 이에 대한 처리가 필요하다. 즉, 스레드끼리의 작업처리순서와 공유자원에 대한 접근을 제어해야 한다. 만약 하나의 스레드에 문제가 발생할 경우 전체 프로세스가 영향을 받는다는 단점이 있다.

일반적으로 "Lock"을 통해 프로세스를 잠가서 동기화처리를 하는데 (세마포어와 비슷하다) 과도할 경우 병목현상으로 인한 성능저하를 유발한다.

profile
자라나라 프론트엔드 개발새싹!

0개의 댓글