✏️ 운영체제(OS)
- 목적 : 처리능력 향상, 사용 가능도 향상, 신뢰도 향상, 반환 시간 단축 등이 있다.
- 기능
- 프로세서, 기억장치, 입출력장치, 파일 및 정보 등의 자원을 관리한다.
- 자원을 효율적으로 관리하기 위해 자원의 스케줄링 기능을 제공한다.(스케줄링: 어떤 자원을 누가, 언제, 어떤 방식으로 사용할지를 결정해주는 것을 뜻한다.)
- 사용자와 시스템 간의 편리한 인터페이스를 제공한다.
- 시스템의 각종 하드웨어와 네트워크를 관리하고 제어한다.
운영체제의 시스템 자원 관리
운영체제가 없다면, 응용 프로그램이 실행될 수 없다.
응용 프로그램
은 컴퓨터를 이용해 다양한 작업을 하는 것이 목적이고, 운영체제
는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 도와준다.
- 프로세스 관리(CPU)
- 메모리 관리
- I/O(입출력) 관리(디스크, 네트워크 등)
응용 프로그램 관리
모든 응용 프로그램이 시스템의 자원을 마음대로 사용한다면, 해커에 의한 공격에 무방비한 상태가 된다.
따라서 응용 프로그램은 권한에 대한 관리가 필요하다. 또한 여러 사람이 하나의 기기를 사용하는 경우에는 사용자 관리하는 일도 매우 중요하다.
응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리한다.
- 응용 프로그램이 운영체제를 통해 컴퓨터에게 일을 시키려면, 컴퓨터를 조작할 수 있는 권한을 운영체제로 부터 부여받아야 한다.
- 권한을 부여받고 난 후에는, 운영체제가 제공하는 기능을 이용할 수 있다.
- 응용 프로그램이 운영체제와 소통하기 위해서는, 운영체제가 응용 프로그램을 위해 인터페이스(API)를 제공해야 한다.
- 응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것을 시스템 콜(System call)이라고 부른다.
ex) 응용 프로그램이 프린터 사용에 대한 권한을 획득한 후에는, 프린터를 사용할 때 필요한 API를 호출해야 한다. 이 API는 시스템 콜로 이루어져 있다.
✏️ 프로세스
: 프로그램이 실행 중인 상태로 특정 메모리 공간에 프로그램의 코드가 적재되고 CPU가 해당 명령어를 하나씩 수행하고 있는 상태
운영 체제에서는 프로세스를 사용하여 프로그램을 수행하게 되는데 실행 중인 하나의 애플리케이션을 프로세스
라고 부른다.
사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행한다.
이때 실행되는 애플리케이션을 프로세스
라고 부른다.
ex) Chrome 브라우저를 두 개 실행하면, 두 개의 프로세스(다중 프로세스)가 생성된다.
프로세스 구성 요소
- 유저 메모리 영역 관리(Virtual Address Descriptors)
프로세스 별로 독립된 영역을 가지게 되는 곳은 유저 메모리 공간이다.
- 핸들 테이블(Handle Table)
핸들 테이블은 프로세스에서 사용하는 모든 핸들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간이다.
- 독립적인 메모리 공간
프로세스 단위로 관리되는 자원 중 가장 중요한 구별점은 가상 메모리이다.
프로세스 특징
- 자원 소유의 단위
각각의 프로세스는 자신의 실행 이미지 로드와 실행에 필요한 추가적인 메모리 공간을 가지고 있어야 한다. 이것은 각 프로세스마다 구별되어야 하며 해당 프로세스가 접근하고자 하는 파일, I/O 장치들에 대해서 또한 프로세서 단위로 할당 받아 관리되어야 한다.
- 디스패칭의 단위
프로세스는 하나의 프로그램이 운영체제로부터 CPU의 자원을 일정 기간 동안 할당 받아 명령어를 실행하는 것이며, 운영체제는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해서 CPU의 사용 시간을 각각의 프로세스에 골고루 나눠주어야 한다. 하나의 프로세스에서 여러 개의 디스패칭 단위가 실행될 수 있도록 하고 있으며, 이러한 디스패칭 단위를 스레드라고 부른다.
프로세스 상태
- 실행(Run) : 프로세스가 프로세서를 차지하여 서비스를 받고 있는 상태
- 준비(Ready) : 실행될 수 있도록 준비되는 상태
- 대기(Waiting) : CPU의 사용이 아니라 입출력의 사건을 기다리는 상태
프로세서 VS 프로세스
프로세서(Processor)
프로세서는 하드웨어적인 측면과 소프트웨어적인 측면으로 나누어 볼 수 있다.
- 하드웨어적인 측면 : 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛으로, 중앙처리장치(CPU)를 의미하며 적어도 하나 이상의 ALU와 레지스터를 내장하고 있다.
- 소프트웨어적인 측면 : 데이터 포맷을 변환하는 역할을 수행하는 데이터 처리 시스템을 의미한다. 워드프로세서나 컴파일러 등이 속해있다.
프로세스(Process)
프로세스는 특정 목적을 수행하기 위해 나열된 작업의 목록을 의미한다.
메모리에 적재 되어 프로세서에 의해 실행 중인 프로그램을 프로세스라고 볼 수 있다.
✏️ 스레드
: 명령어가 CPU를 통해서 수행되는 객체의 단위
하나의 프로세스 내에는 반드시 1개 이상의 스레드가 존재하며 이러한 스레드는 같은 프로세스에 있는 자원과 상태를 공유한다.
같은 프로세스 내에 있는 스레드는 같은 주소 공간에 존재하게 되며 동일한 데이터에 접근할 수 있다.
또한 하나의 스레드가 수정한 메모리는 같은 메모리를 참조하는 스레드에 영향을 미치게 된다.
스레드가 필요한 이유
하나의 프로세스 안에서 여러 개의 루틴을 동시에 수행하여 수행 능력을 향상하기 위해 스레드를 사용하게 되는데, 독립적으로 수행하여 처리할 때 사용하게 된다. 즉 여러 개의 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해서이다.
ex) 워드 프로세서에서 사용자로부터 키보드 입력 받거나, 그래픽이나 UI를 그리고 문법 오류를 체크하는 등 워드 프로세스 내에서 여러 요청들을 동시에 처리해야 하늗네 이 때 스레드가 필요하다.
스레드 구성 요소
- 가상 CPU : 인터프리터, 컴파일러에 의해 내부적으로 처리되는 가상 코드
- 수행 코드 : Thread Class에 구현되어 있는
run()
Method 코드
- 처리 데이터 : Thread에서 처리하는 데이터
스레드 특징
- 프로세스 내에서 실행되는 흐름의 단위이다. 하나의 스레드는 시작해서 종료할 때 까지 한 번에 하나씩 명령들을 수행한다.
- 각 스레드마다 call stack이 존재(call stack: 실행 중인 서브 루틴을 저장하는 자료 구조)하며, 나머지 Code, Data, Heap 영역은 스레드 끼리 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
- 스레드는 다른 스레드와 독립적으로 동작한다. 독립적으로 동작하기 때문에 두 개 이상의 스레드가 동작되는 경우, 두 개 이상 스레드의 실행 및 종료순서는 예측할 수 없다.
싱글 스레드와 멀티 스레드
싱글 스레드(Single-Thread)
: 프로세스가 단일 스레드로 동작하는 방식의 일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법이다.
하나의 레지스터, 스택으로 표현한다.
자바스크립트
가 대표적인 싱글 스레드 언어이다.
싱글 스레드의 장점
- 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
- 자원 접근에 대한 동기화를 신경쓰지 않아도 되기 때문에 문맥 교환 작업 또한 요구하지 않는다.
- 프로그래밍 난이도가 쉽고, CPU 메모리를 적게 사용합니다.
싱글 스레드의 단점
- 여러 개의 CPU를 활용하지 못한다.
- 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.
- 싱글 스레드 모델은 에러 처리를 못하는 경우 멈춰버리게 된다.
멀티 스레드(Multi-Thread)
하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다.
또한, 멀티 프로세스(multi process)는 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것을 의미한다.
멀티 스레딩의 장점
- 멀티 스레드는 작업을 분리해서 수행하기 때문에 실시간으로 사용자에게 응답할 수 있다.
- 멀티 스레드는 한 프로세스를 여러 프로세서에서 수행할 수 있기 때문에 훨씬 효율적이다.
멀티 스레딩의 문제점
- 주의 깊은 설계가 필요하며, 디버깅이 까다롭다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어려우며 다른 프로세스에서 스레드를 제어할 수 없다.
- 문맥 교환 작업을 요구한다. (문맥 교환: CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 것)
동시성 & 병렬성 차이
- Concurrency(동시성, 병행성): 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 착각을 불러일으킴
- 시분할: 운영체제는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 한다.
- Paralleism(병렬성): 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행됨