업데이트:

프로세스

프로세스란 실행 중인 프로그램을 말한다. 보통 프로그램과 많이 비교가 되는데 프로그램은 실행 코드, 프로세스는 메모리에 올라가 있는(적재된) 작업 단위이다. 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원, 스레드로 구성된다.

▪️ 프로그램 : 실행할 수 있는 파일 또는 프로그램

▪️ 프로세스 : 메모리에 적재되고 프로그램이 실행되고 있는 상태

상태


생성 new 프로세스가 생성된 상태
실행 running 명령어들이 실행되는 상태
준비 ready 프로세스가 CPU로부터 메모리 공간을 할당 받길 기다리는 상태
대기 waiting 특정 이벤트가 발생하길 기다리는 상태
종료 terminated 프로세스가 실행을 끝마친 상태

상태전이


디스패치 Dispatch 준비 → 실행 우선순위가 높은 프로세스를 선정하여 명령어 실행
보류 Block 실행 → 대기 프로세스가 입출력(I/O)이나 자원 등을 기다리기 위해 대기로 전환
깨움 Wake Up 대기 → 준비 입출력이 완료되거나 자원이 할당되어 다시 실행
시간제한 Timer Runout 실행 → 준비 프로세스가 정해진 시간만큼 CPU 자원을 사용하고 반납

메모리 구성


하나의 프로세스는 아래 네 가지의 메모리 영역을 할당받는다.

코드 영역 Code 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역
데이터 영역 Data 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역
스택 영역 Stack 함수 안에서 선언된 지역 변수, 매개 변수, 리턴값 등이 저장되는 영역. 함수 호출 시 기록, 종료 시 제거
힙 영역 Heap 관리 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간. 동적 메모리 할당 공간

스레드

스레드란 프로세스 내에서 실제로 작업을 수행하는 주체로 프로세스보다 작은 작업 실행 단위이다. 모든 프로세스에는 한 개 이상의 스레드가 존재하는데, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라 한다.

💡 사용 목적? 여러 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해 사용한다.

▪️ 프로세스 : 독립적 실행, 각각 별개의 메모리

▪️ 스레드 : 프로세스 내의 메모리 공유, 빠른 전환 속도

각 스레드는 독립적으로 Thread ID, 프로그램 카운터 (PC), 레지스터 집합, 스택을 소유하고, 같은 프로세스 내에 스레드들은 서로 코드, 데이터 등의 시스템 자원을 공유한다.

사용 이유


▪️ 메모리 절약

▪️ Context Switching에 비해 오버헤드 절감

▪️ 작업들 간의 통신 비용 절감

💡 Context Switching? 현재까지의 작업 상태나 다음 작업에 필요한 데이터들을 저장하고 읽어오는 작업, 여러 프로세스가 하나의 프로세서를 공유할 때 발생한다.

종류


스레드를 지원하는 주체에 따라 아래 두 가지로 나눌 수 있다.

사용자 레벨 스레드 User-Level Thread 커널 레벨 스레드 Kernel-Level Thread
커널 영역의 상위에서 지원, 사용자 레벨의 라이브러리를 통한 구현 운영체제가 지원, 커널이 스레드 생성 및 스케줄링 관리
빠른 속도 사용자 스레드에 비해 느린 생성, 관리
하나의 스레드가 중단될 경우 나머지 스레드 모두 중단 스레드가 중단되더라도 다른 스레드를 중단 없이 계속 실행

멀티스레드

멀티스레드는 두 개 이상의 여러 개의 스레드를 이용하는 프로그램이다. 멀티스레드에서 각각의 스레드는 하나의 독립적인 프로세스처럼 작업을 수행한다.

▪️ 멀티 프로세스 : 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것

▪️ 멀티 태스킹 : CPU 1개에서 여러 프로세스를 동시에 수행하는 것

▪️ 멀티 스레드 : 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것

⚠️ 주의: 멀티스레딩이 언제나 좋은 성능을 보이는 것은 아니다. 싱글 스레드가 더 효율적일 수 있다.

모델


▪️ 다대일 Many-to-One

하나의 커널 스레드에 여러 유저 스레드를 연결하는 모델로, 주로 커널 스레드를 지원하지 않는 시스템에서 사용된다. 한 번에 한 유저 스레드만 커널에 접근할 수 있어 여러 개의 스레드가 동시에 시스템 호출을 사용할 수 없다는 단점이 있다.

▪️ 일대일 One-to-One

하나의 커널 스레드에 하나의 유저 스레드가 대응하는 모델로 다대일 방식의 단점을 해결할 수 있다. 커널 스레드의 생성은 오버헤드가 크기 때문에 성능 저하가 발생할 수 있다는 단점이 있다.

▪️ 다대다 Many-to-Many

여러 유저 스레드에 작거나 같은 수의 커널 스레드가 대응하는 모델로 다대일 방식과 일대일 방식의 문제점을 해결하기 위해 나왔다. 커널이 유저 스레드와 커널 스레드의 매핑을 적절하게 조절한다.

장점


👍 응답성 Responsiveness : 작업을 분리해서 수행하기 때문에 사용자에게 실시간으로 응답할 수 있다.

👍 경제성 Economy : 프로세스를 새로 생성하는 것보다 스레드를 새로 생성하는 것이 훨씬 비용이 적게 든다.

👍 자원 공유 Resource Sharing : 자신이 속한 프로세스 내의 다른 스레드들과 메모리나 자원을 공유하여 효율적으로 사용할 수 있다.

👍 확장성 Scalability : 한 프로세스를 여러 프로세서에서 수행할 수 있다.

💡 프로세서? 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛으로 중앙처리장치(CPU)를 의미한다.

단점


👎 싱글 코어 멀티스레딩은 스레드 생성 시간이 단일스레드보다 느리다.

👎 공유하는 자원에 동시에 접근하는 경우 의도하지 않은 값을 읽어오거나 수정할 수 있다. (동기화 작업 필요)

👎 프로그래밍 난이도가 높고, 스레드 수만큼 자원을 많이 사용한다.

싱글스레드

하나의 프로세스에서 하나의 스레드로만 실행하며 하나의 레지스터와 스택으로 표현한다.

장점


👍 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.

👍 Context Switching 작업을 요구하지 않는다.

👍 프로그래밍 난이도가 쉽고, 자원을 적게 사용한다.

단점


👎 여러 CPU를 활용하지 못한다.

👎 하나의 작업이 완료되어야 다른 작업을 수행할 수 있다.

댓글남기기