스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
멀티 프로세스, 멀티스레드 이러한 방식을 사용하는 이유는 다중 프로그램의 작업을 병렬적으로 사용하기 위함이다. (사용자 경험 개선)
멀티 프로세스보다 멀티 스레드를 선호하는 이유는 메모리의 공간을 효율적으로 사용하기 위해서이다.
멀티 스레드의 메모리공유는 프로세스보다 간단하고 문맥교환시 캐시 메모리를 따로 비울 필요가 없기 때문에 성능이 자연스럽게 더빠르다.
하지만 이러한 공유자원으로 인한 충돌로 병목현상을 방지하기 위해 동기화 작업이 필요하다.
(성능저하 발생방지)
문맥교환 이라고 함은 프로세스의 상태를 전이 하는것이다. 실행중인 프로세스를 대기상태로 바꾸거나 반대 역활로, 프로세스의 생성과 저장, 할당 등을 담당하는 PCB에서 관리한다.
커널 레벨 스레드
커널 스레드는 운영체제가 지원하는 스레드 기능으로 구현되고, 커널이 스레드의 생성 및 스케줄링 등을 관리한다.
스레드가 시스템 호출 등으로 중단되더라도, 커널은 프로세스 내의 다른 스레드를 중단시키지 않고 계속 실행시켜준다.
멀티프로세싱 환경에서 커널은 여러 개의 스레드를 각각 다른 프로세서에 할당할 수 있다.
다만, 사용자 스레드에 비해 생성 및 관리하는 것이 느리다. (전환시 문맥교환으로 인한 성능저하가 있을수있음)
사용자 레벨 스레드
사용자 스레드는 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현되며, 라이브러리는 스레드의 생성 및 스케줄링 등에 관한 관리 기능을 제공한다.
동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠른 장점이 있는 반면, 여러 개의 사용자 스레드 중 하나의 스레드가 시스템 호출 등으로 중단되면 나머지 모든 스레드 역시 중단되는 단점이 있다. 이는 커널이 프로세스 내부의 스레드를 인식하지 못하며 해당 프로세스를 대기 상태로 전환시키기 때문이다.
프로세스는 기본적으로 다른 프로세스와 메모리를 공유하지 않는다.
프로세스가 CPU에 의해 실행이 되고 다른 프로세스가 실행될때 Context Switching 이 일어나게 된다. 이때 kernel 모드로 들어가고 자신의 프로세스 스레드의 정보를 PCB에 저장하고, 다른 프로세스의 스레드를 복원한다. 그리고나서 로딩중인 프로세스의 mmu 메모리를 바라보게 함. 그 이후 TLB의 cache정보를 비운다. 그래야 다른프로세스가 로딩될때 자신의 메모리를 사용할수 있다.
스레드의 문맥교환에서는 같은 프로세스 내에서 스위칭이 발생하기 때문에 메모리 주소관련 처리를 할 필요가 없기 때문에 상대적으로 더 빠르다.
문맥교환이 자주 일어나면 애플리게이션 관점에서는 순수한 오버헤드라고 한다.- 즉 CPU를 잡아먹는 안좋은것 그래서 문맥교환이 자주 일어나는것이 좋지는 않다.
Thrashing 이라는것은 OS환경에서 메모리 관리에 관한 내용에서 시스템의 성능이 극도로 저하되는 현상이다.
주로 프로세스를 과도하게 사용할때 발생하며, 해결을 위해서는 프로세스의 수를 조절하거나 메모리를 증설하여 해결할수있다.