[OS] 5. 스레드
스레드
-
스레드는 프로세스의 코드에 정의된 절차에 따라 CPU 에 작업을 요청하는 실행단위이다. 즉 어떠한 프로그램 내에서 실행되는 흐름의 단위를 말한다.
- 일반적으로 하나의 어플리케이션은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다.
- 프로세스의 작업 과정
- 운영체제는 코드와 데이터를 메모리에 가져온다.
- 프로세스 제어블록(PCB)을 생성한다.
- 작업에 필요한 메모리 영역을 확보한다.
- 준비된 프로세스를 준비큐에 삽입한다.
- 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야할 일을 CPU 에 전달하고 CPU 가 작업을 수행한다.
- 이 때 CPU 스케줄러가 CPU 에 전달하는 일 하나가 스레드이다.
- 또한 CPU 가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드이다.
- 운영체제 입장에서 작업 단위는 프로세스이고 CPU 입장에서 작업 단위는 스레드이다.
- 운영체제 - 프로세스
- CPU - 스레드
- 스레드는 프로세스 내에서 각각 stack 만 따로 할당받고 code, data, heap 영역은 공유한다.
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다.
- 프로세스 vs. 스레드
- 프로세스는 자원을 공유하지 않지만, 스레드는 자원을 공유한다!!
스레드 관련 용어
-
멀티스레드
- 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영기법
- 하나의 어플리케이션을 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것이다.
- 바꿔 말하면 하나의 프로세스가 동시에 여러 개의 스레드를 수행할 수 있도록 하는 것이다.
- 워드프로세서 프로세스 내의 문서 편집, 문서 입출력, 맞춤법 검사 등의 스레드들이 동시에 작업을 한다.
- 하나의 프로세스안의 스레드는 강하게 연결되어 있으므로 워드프로세스가 종료되면 프로세스 내의 스레드도 강제종료된다.
- 멀티스레드는 변수나 파일 등을 공유하고 전역 변수나 함수 호출 등의 방법으로 스레드간 통신을 한다.
- 멀티태스크
- 운영체제가 CPU 에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법(시분할 시스템)이다.
- 시분할 시스템에서 운영체제가 CPU 에 전달하는 작업은 프로세스가 아니라 스레드이다.
- 워드프로세서와 프린트 스풀러는 서로 독립적으로 작동하다가 필요할 때 출력할 데이터를 주고받는다.
- 워드프로세스가 비정상적으로 종료되어도 프린터 스플러는 정상적으로 작동한다.
- 즉 컴퓨터를 사용할 때 인터넷도 사용하고 카카오톡도 사용하고 게임도 하는 등 다양한 작업을 동시에 사용할 수 있도록 하는 것이다.
- 서로 독립적인 프로세스는 데이터를 주고받을 때 프로세스간 통신(Inter Process Communication, IPC)을 주고 받는다.
- 멀티프로세싱
- CPU 를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업환경.
-
즉, 다수의 프로세서가 협력적으로 일을 처리하는 것을 의미한다.
- 프로세서 는 CPU 등의 하드웨어를 의미하고, 프로세스는 실제 메모리에 적재되어 프로세서에 의해 실행되고 있는 프로그램을 의미한다.
- 슈퍼스칼라 기법 : 하나의 컴퓨터에 여러 개의 CPU 혹은 하나의 CPU 내 여러 개의 코어에 스레드를 배정하여 동시에 작동하는 것이다.
- CPU 멀티스레드
- 한번에 하나씩 처리해야하는 스레드를 파이프라인 기법(병렬기법)을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬기법이다.
Multi-Process vs. Multi-Thread
- 멀티 프로세스는 하나의 프로세스가 죽어도 다른 프로세스에게는 영향을 끼치지 않는다. 반면에 멀티 스레드는 디버깅이 어렵기 때문에 하나의 스레드에 문제가 생기면 전체적인 프로세스에 영향을 준다.
- 멀티 프로세스는 각각 독립된 메모리 영역을 갖고 있어 오버헤드 또는 Context Switching 이 발생하여 성능이 저하될 수 있다. 반면에 멀티 스레드의 경우 코드 영역과 데이터 영역을 공유하기 때문에 자원소모가 적고 응답시간이 단축되어 시스템 처리율이 향상된다.
멀티스레드의 구조
- 멀티스레드는 비슷한 일을 하는 2개의 프로세스를 만드는 것보다, 하나의 프로세스 내에 여러 개의 스레드를 생성하고 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.
- 멀티스레드가 필요한 이유
- 워드프로세서에서 여러 개의 작업을 동시에 진행하는 경우를 생각해보자
- 멀티태스킹의 경우,
fork()
시스템 호출로 프로세스를 여러개 만들어서 동시에 여러 작업을 진행한다.- 비슷한 일을 하는 2개의 프로세스를 만든다.
- 워드프로세서의 코드 일부, 프로세스 제어 블록, 공유변수가 메모리의 여러 곳에 중복되어 메모리가 낭비된다.
- 멀티스레드의 경우, 하나의 워드프로세서에 스레드를 여러 개 생성하여 동시에 여러 작업을 진행한다.
- 코드, 파일등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.
- 첫번째 워드프로세서는 천천히 실행되지만 두번째부터는 빠르게 실행된다.
- 멀티스레드의 장점
- 응답성 향상 : 하나의 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.
- 자원공유 : 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원활하게 진행할 수 있다.
- 효율성 향상 : 여러 개의 프로세스를 생성하는 것과 달리 멀티스레드는 불필요한 자원의 중복을 막는다.
- 다중 CPU 지원 : 2개 이상의 CPU 를 가진 컴퓨터에서 멀티스레드를 사용하면, 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.
- 멀티스레드의 단점
- 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다. 반면에 프로세스를 여러 개 만들 경우, 프로세스는 독립적이고 서로 공유하지 않기 때문에 한 프로세스의 문제가 다른 프로세스로 전달되지 않는다.
멀티스레드 모델
- 사용자 스레드(User-level thread)
- 운영체제가 멀티스레드를 지원하지 않을 때 사용하는 방식
- 초기의 스레드 시스템에서 이용되었다.
- 커널 입장에서는 일반 프로세스이지만 커널이 하는 일을 라이브러리가 대신 처리하여 여러 개의 스레드를 작동한다.
- 라이브러리는 커널이 지원하는 스케줄링이나 동기화 같은 기능을 대신 구현해준다.
- 사용자의 프로세스 내에 여러 개의 스레드가 존재하지만 커널의 스레드 하나와 연결되기 때문에 1 to N 모델이라고 부른다.
- 장점
- 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요없다.
- 커널에서 문맥 교환을 하는 이유는 시간을 나누어 서로 다른 프로세스를 처리하기 위해서이다.
- 문맥교환 같은 부가적인 작업이 줄어들어 속도가 빠르다.
- 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요없다.
- 단점
- 한 프로세스의 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU 를 동시에 사용할 수 없다.
- 공유 변수를 보호하는 장치를 라이브러리에서 구현해야 해서 보안에 취약하다.
- 커널 스레드 (Kernel-level thread)
- 커널이 멀티스레드를 지원하는 방식
- 하나의 사용자 스레드가 하나의 커널 스레드와 연결되기 때문에 1 to 1 모델이라고 부른다.
- 독립적으로 스케줄링 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있다.
- 장점
- 커널 레벨에서 모든 작업을 지원하기 때문에 멀티 CPU 를 사용할 수 있다.
- 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있다.
- 커널의 기능을 사용하므로 보안에 강하고 안정적이다.
- 단점
- 문맥교환을 할 때 오버헤드 때문에 느리게 작동한다.
- 멀티레벨 스레드(Multi-level thread)/ 하이브리드 스레드(Hybrid thread)
- 사용자 스레드와 커널 스레드를 혼합한 방식으로, M to N 모델이라고 불린다.
댓글 남기기