공부한 내용을 이해한대로 정리하자면!
프로세스를 하나의 실행 프로그램 단위로 볼 수 있을 것 같다. 가령 MS-WORD를 켰다고 했을 때 워드 프로그램 실행을 위한 단위를 프로세서로 보고, 내부적으로는 우리에게 보여줄 메뉴, 툴바 같은 UI출력, 키보드 입력 시 글자 입력, 첫 문장에서는 대문자로 자동 변경, 틀린 문자 빨간줄 긋기 등 각종 세부적인 기능 작동을 위한 명령 단위 하나하나를 스레드라고 볼 수 있다.
CPU가 멀티 코어로 구성되어 있다면 프로세스 여러 개를 병렬로 동시에 처리할 수 있게 되고, 그만큼 수많은 프로세서를 다 처리하는데 걸리는 시간이 단축된다고 볼 수 있다.
더 나아가 프로세서 안에 스레드 또한 단일 스레드와 멀티 스레드로 나뉜다. 단일 스레드는 하나의 프로세서에서 스레드를 하나씩 순차적으로 처리하겠다는 의미이다. 이전의 예시처럼 워드를 실행했을 때 가동 되어야 할 그 많은 스레드를 순차적으로 처리한다면 분명 느릴 수 밖에 없을 것이다. 또한 스레드 하나가 처리 중 차단되면 그 뒤에 스레드는 기다려야 한다. 즉 극단적으로 봤을 때 프로세스가 차단될 수도 있다. 프로그램이 죽는 것이다. 하지만 멀티 스레드는 하나의 프로세서 안에서 스레드를 병렬로 처리하는 방법으로 이는 위 프로세스 예시와 마찬가지로 병렬 처리에서 얻을 수 있는 장점이 있다. 하나의 스레드가 사망한다 하더라도 나머지 스레드가 정상작동 하므로 프로세스 자체가 사망할 확률이 매우 낮아진다.
또 기억해야할 부분으로 여겨지는 것은 멀티 스레드가 하나의 프로세스에 배정된 리소스 즉 레지스터, 스택 등을 공유한다는 점이다. 이러한 리소스 공유를 위한 처리, 그리고 스레드의 원활한 처리를 위한 context switching 기능이 추가됨으로서 오버헤드가 증가하는 것은 사실이나 단일 스레드 방식을 유지하면서 프로세서를 여럿 늘려서 처리하는 것과 비교했을 때는 솔라리스 운영체제 기준으로 멀티 스레딩이 약 30배 가량 빠르다는 연구 결과가 있다고 한다.
시스템 콜은 유저 모드와 커널 영역의 경계에서 소통을 이어주는 도구라고 한다. 유저 모드에 있는 애플리케이션 실행을 위해 데이터 편집이나 리소스 배정 등을 받기 위해서는 커널에게 요청을 해야 한다. 그 이유는 애플리케이션이 리소스의 딥한 영역까지의 컨트롤 권한을 주는 것을 방지하는 보안 차원에서의 보호를 위함이라고 한다.
아래는 강의를 정리한 내용이다.
프로세스
- 메모리에 로드되어 CPU에 의해 실행되고 있는 실행 프로그램
- 레지스터, 코드, 데이터, 스택, 힙 등의 집합체로 실행 중인 인스턴스를 의미
프로세스의 상태
- 생성(new): 시스템에서 프로세스를 생성하고, PCB를 커널에 저장
- PCB란? (Process Control Block)
- 프로세스에 대한 메타데이터를 보관해둔 블럭을 의미한다.
- 메타데이터
- PID: 프로세스 식별자
- 프로세스 상태: 준비, 실행, 대기, 중단 등
- 프로그램 카운터: 다음에 실행될 명령어의 주소
- 그 외 레지스터 저장 영역, 프로세서 스케줄링 정보, 계정 정보, 입출력 상태 정보, 메모리 관리 정보를 담고 있다.
- PCB란? (Process Control Block)
- 준비(ready): CPU의 배정을 기다리는 상태
- 실행(running): 준비 상태에서 디스패치된 프로세스가 실행되는 상태
- Timer Runout: 주기 내에 작업이 완료되지 않은 프로세스의 경우 인터럽트를 발생시켜 준비 상태로 전이되는 현상
- Block: 실행 상태의 프로세스가 입출력이나 다른 작업을 수행하는 경우 해당 작업이 완료될 때 까지 대기 상태로 전이되는 현상
- 대기(wait): 프로세스가 어떤 사건이 완료되기를 기다리는 상태, 주로 입출력의 완료 또는 신호의 접수에 해당한다.
- Wake up: 대기 중인 사건이 끝날 경우 프로세스가 준비 상태로 전이되는 현상을 말한다.
- 종료(Terminated): 프로세스 실행이 종료된 상태, 할당된 자원을 회수한다.
스레드
- CPU활용의 기본 단위
- 프로세스 내에서 프로그램 명령을 실행하는 기본 단위
- 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택 으로 구성
- 동일 프로세스 내 스레드 간 코드, 데이터 섹션, open files 등의 운영체제 자원을 공유
단일스레드
- 프로세스 내 제어 스레드가 1개인 경우를 말함 [장점]
- 자원 공용화를 하지 않으므로 접근을 통제하는 기법을 고려하지 않아도 됨
- context switching 작업이 불필요하니 오버헤드 요소가 줄어든다. [단점]
- 멀티 코어 CPU를 활용할 수 있는 강점을 버리는 것
- 어쨌든 하나의 프로그램에는 다수 개의 스레드(요청 사항에 대한 처리)가 존재할 수 밖에 없는데 이를 하나씩 순차적으로 처리한다면 전체적인 처리 속도가 느려질 수 밖에 없다. 게다가 이 중 하나라도 차단되면 이후 쓰레드는 기다려야 하고, 극단적으로 프로세스 사용 불능 상태가 될 수 있다.
멀티스레드
- 프로그램을 다수의 실행 단위로 나누어 실행
- 각각의 스레드가 고유의 레지스터와 스택으로 표현
- 스레드 중 일부가 차단(꺼짐)되거나 장시간 수행된다 하더라도 나머지 스레드가 병렬로 처리하므로 극단적으로 프로세스 전체가 차단될 확률이 확 줄어든다.
- 프로세스 내 자원(레지스터, 스택 등)과 상태를 공유하므로 효율적인 운영이 확보된다.
- 프로세스 할당량을 줄일 수 있게 된다. 단인스레드에 비해 하나의 프로세스에서 다수의 스레드를 병렬처리 할 수 있기 때문이다. 그래서 프로세스 하나 할당하는데 드는 높은 리소스 비용을 절감할 수 있으므로 경제적이다. (프로세스를 생성하는데 드는 오버헤드보다 멀티 스레드 기법에서 context switch를 진행하는데 드는 오버헤드가 대체로 더 저렴하다.)
- 멀티 코어 CPU에서 멀티 프로세스 + 멀티 스레딩 기법이면 강력하니까. (확장성)
시스템 콜
응용 프로그램이 시스템 자원 사용 요청과 같은 운영체제에게 기능 수행을 요청해야 할 때 쓰는 수단을 시스템 콜이라고 한다.
시스템 콜의 존재 이유는 응용 프로그램이 수행되는 곳 즉 유저 프로세스 단에서 운영체제 단인 커널로의 직접적인 접근을 방지하기 위한 역할, 즉 전달자의 역할을 수행하기 위함이다. 가장 큰 이유는 응용 프로그램에게 코어한 영역의 커널 컨트롤을 맡길 경우 보안 이슈가 발생할 수 있기 때문이다.
이렇듯 시스템 콜 사이에서 유저 프로세스와 커널 영역으로 나뉘어진 것을 보고 듀얼 모드라고 부르며 실제로는 거의 대부분의 처리를 시스템 콜을 통해 함께 처리한다.
시스템 콜이 주로 하는 일
[프로세스 제어]
- 프로세스 생성과 종료
- 로드, 실행
- 프로세스 속성 가져오기, 설정하기
- wait, signal 이벤트
- 메모리 할당 및 해제
[파일 관리]
- 파일 생성, 삭제, 열기, 닫기, 읽기, 쓰기, 속성 확인, 속성 지정 등
[장치 관리]
- 장치 요청, 해제, 읽기, 쓰기....
[정보 유지]
- 시스템 날짜, 데이터, 프로세스, 파일 및 장치 가져오기 및 설정
[통신]
- 통신 관련
[보호]
- 파일 권한 관련
유저 스레드와 커널 스레드
시스템 콜에 의해 나뉘어진 유저 모드와 커널 모드에 각각의 스레드를 생성할 수 있다.
유저 스레드
커널 지원 없이 커널 위에서 동작하므로 운영체제의 영향에서 독립적이다. 즉 어느 운영체제에서나 사용이 가능하다. 그래서 시스템 콜을 거치는 작업이 없으므로 빠른 생성, 관리가 가능하다. 하지만 커널 접근이 안되는 이상 멀티 스레드, 멀티 프로세싱의 이점을 가질 수 없으므로 쓰레드 하나가 차단 당하면 프로세스 전체 차단으로 이어질 수 있다.
커널 스레드
운영체제로부터 직접 지원받으므로 멀티스레딩이 가능하므로 유저 스레드의 단점을 해결한다. 하지만 유저 스레드에 비해 수백배 느리다는 단점이 있다.
어떤 프로세스냐에 따라 유저 스레드에서만 처리해도 끝날 프로세스가 있고, 반드시 커널 스레드를 거쳐야 하는 프로세스가 있을 것이다. 그래서 각각의 모드에서 스레드를 어떻게 배치할 것이냐에 따라 리소스 운영 효율이 달라진다.
'백엔드 개발자(node.js)가 되는 과정' 카테고리의 다른 글
[WIL] 23. 06. 19 ~ 06. 23 (0) | 2023.06.26 |
---|---|
nodejs 비밀번호 해싱 처리하기 (0) | 2023.06.26 |
Sequelize로 MySQL JOIN하기 (0) | 2023.06.21 |
Sequelize로 모델 생성 및 테이블 연동하기 (0) | 2023.06.21 |
Sequalize로 MYSQL 데이터베이스 마이그레이션하기 (0) | 2023.06.20 |