🌞 스케줄러
프로세서 버스트의 예 : load, store, add, read
위와 같은 사진으로 프로세스는 CPU버스트와 I/O버스트의 순환구조로 이루어져 있다.
여기서 프로세스는 프로세서 중심 프로세스 와 입출력 프로세스로 나뉘는데,
먼저 프로세서 중심 프로세스는 프로세서버스트가 매우길다. 그 반면에 입출력프로세스 는 프로세서버스트가 짧다.
위의 이유 때문에 입출력프로세스는 프로세서 중심 프로세스 보다 빨리 작업을 할 수 있다.
따라서 스케줄러가 프로세스의 우선순위를 결정할 때 입출력프로세스 를 우선으로 설정한다.
왜냐하면 프로세서 중심 프로세스를 앞으로 두게되면 입출력프로세스의 지연시간이 길어진다. 결국 이말은 유저에게 직접적인 영향을 주는 입출력이 느려진다는 것이다.
프로세스의 레지스터들을 내용 보관하고 다른 프로세스의 레지스터들을 적재
오버헤드 발생
-> 메모리 속도, 저장할 레지스터 수, 특수 명령어의 유무에 따라 다름
-> OS 설계 시 불필요한 문맥 교환을 감소시켜야 함
인터럽트 발생 시 Context Switching이 일어날수도 안 일어날수도 있다.
입출력 완료 인터럽트에 의해서 입출력 동작이 종료되면 대기 상태의 프로세스를 준비 상태로 바꿔준다. 이 인터럽트에 의해서 Context Switching이 일어나지는 않는다.
저장할 데이터가 많을수록 오버헤드가 많이 발생하여 시스템이 지연된다.
🌞 스레드
스레드 실행 환경 정보 -> 레지스터
지역 데이터 -> 스택
사용자 응답성
자원 공유
경제성 - 쓰레드 교환은 문맥 교환보다 오버 헤드가 적음
다중 프로세서 아키텍처를 활용하여 성능과 효율 향상
확장성
🌞 스레드의 구현
사용자 스레드 다수 개가 한 개의 커널 스레드에 대응
다대일 매핑
특징
1) 스레드와 관련된 모든 동작이 사용자 영역
2) 사용자 영역의 스레드 라이브러리로 구현
3) 커널은 스레드가 아닌 프로세스에 프로세서 할당
요즘 거의 사용안함
커널영역과 사용자영역은 메모리의 한 부분임.
커널 스레드는 사용자영역의 스레드가 실행되어도, 실행이 되고 있는지 알 수가 없다.
따라서 스레드는 프로세스 하나를 실행하는 것으로 알고 있고, 사용자 영역의 있는 스레드매니저는 여러개의 스레드를 스케줄에 맞게 실행하고 있는것이다.
사용자 수준 스레드는 병렬성이 없다.
커널의 지원이 필요없다.
커널에 대한 지원 없이 라이브러리로 만들어지기 때문에 이식성이 높다.
커널 오버헤드가 일어나지 않는다. ( Context Switching이 일어나지 않음 )
TCB가 커널영역에 존재한다. 커널스레드와 사용자 스레드가 1대1로 매핑 되어있다.
소프트웨어적인 유연성이 떨어짐
다중 프로세서로 병렬 수행이 가능하다.
사용자 스레드 여러개를 커널 스레드 여러 개에 유연하게 맵핑
다대다 매핑
커널이 커널 스레드 수를 동적으로 조절
커널 영역에서 병렬 처리 정도를 결정
단점 보완
1) 사용자 수준 스레드 구현의 병렬성 문제 해결
2) 커널 수준 스레드 구현의 프로세스당 스레드 수 제한 문제 해결
복잡하여 오버헤드 큼
ex) ThreadFiber 패키지가 있는 Windows