종종 스레드 개념이 헛갈릴때가 있는데 그때 보기 위해 퍼다 나른 자료 ~_~
원작자는 잘 모르겠습니다.
스레드
-하나의 프로그램 내에서 둘 이상의 프로그램 흐름을 만들어 내기 위해 사용된다
-프로세스처럼 완벽히 독립적인 구조가 아니기 때문에 스레드들 사이에는 공유되는 요소가 있다.
-따라서 문맥교환에 걸리는 시간이 프로세스보다 짧다
프로세스의 메모리 구조
-자식 프로세스가 생성된 다음엔 모든 것이 부모 프로세스와 독립적이다.
-메모리 구조상에서는 아무런 관계가 없다.
-이런 메모리 구조를 가졌기 때문에 프로세스간 데이터를 주고 받기 위해 IPC가 필요.
스레드의 메모리 구조
-하나의 프로세스에서 두개의 스레드를 생성했을 때의 구조
-스레드는 스택만 새로 생성될 뿐 그 이외의 영역은 부모프로세스의 영역을 공유한다
스레드의 특징
1.스택을 독립적으로 할당
- 추가적인 실행 흐름을 만들 수 있다
2.코드 영역을 공유한다
-그림처럼 프로세스간 공유는 되지 않는다
-스레드는 자신을 생성한 프로스세가 갖고있는 함수를 호출할 수 있다
3.데이터와 힙을 공유한다
-스레드간 힙과 데이터영역을 공유하기 때문에 IPC가 필요없다
-전역변수와 malloc함수를 통해서 동적할당한 메모리 공간은 공유가 가능하다
windows에서는
-프로세스는 단지 스레드를 담는 상자에 지나지 않는다.
-따라서 실제 프로그램의 흐름을 형성하는것은 스레드이다.
-스케줄러가 실행의 단위로 선택하는 것도 프로세스가 아닌 스레드이다.
-windows에서는 스레드가 존재하지 않는 프로세스는 있을 수 없다 프로세스 생성과 동시에
main함수를 호출해줄 스레드를 생성한다 이를 main스레드라고 한다
커널 영역과 유저 영역
-커널 영역은 프로세스에 할당된 총 메모리 공간중 유저영역을 제외한 나머지 영역
-유저 영역은 프로그램이 동작하기위해 사용되는 메모리 공간 (코드. 데이터, 스택, 힙)
커널모드와 유저모드
-커널모드는 전 영역에 접근을 허용한다
-유저모드는 커널영역을 보호하기위해 제한된 영역의 메모리 접근만 허용한다
-커널이 실행되어야 하는 경우에는 커널모드로 전환이 일어난다
커널레벨 스레드
-프로그래머의 요청에 따라 스레드를 생성 및 스케줄링 하는 주체가 커널
-안정성과 다양한 기능성이 제공됨
-커널모드와 유저모드의 전환이 빈번하여 성능저하로 이어짐
유저레벨 스레드
-커널에서 스레드 기능을 지원하지 않을때 스레드 기능을 제공하는 라이브러리 활용하는 방식
-스케줄러가 스케줄링 하는 대상이 프로세스가 된다
-스레드를 스케줄링하는 스케줄러는 유저영역에서 실행됨
-커널모드와 유저모드의 전환이 없다
-프로그래밍이 어렵고 결과 예측이 어렵다