운영체제 4장 Thread


프로세스는 가상주소공간, IO 장치등 리소스를 관리하는 부분과
cpu에 대한 관리부분으로 나누어질수 있다.
PCB 내용 대부분은 리소스를 관리하는 장부와 cpu의 실행상태 관리, state, 우선순위와 reg 상태등이 있었음
여기서 cpu에 관한부분을 독립시킨것이 스레드


스레드 - PC의 궤적이 실타래처럼 그릴수 있다고 해서 스레드라고 함
cpu를 할당하는(dispatching) 단위로 독립. lightweight process라고도 한다(오버헤드가 작아졌다)
나머지 리소스에 대한 ownership은 process, task 라고 따로 이야기 하게 되고
현재 사용하는 모든 운영체제는 스레드를 가진다

멀티스레딩 - 여러 스레드가 동시에 돌수 있도록, concurrent paths of execution(스레드) 를 싱글 프로세스에서 제공할수도 있도록 함



single 스레드로 프로세스를 실행하는것은 MS-DOS가 있음


자바에서 멀티스레드가 제공되고 있다. 언어에서는 synchronized 키워드 사용하여 여러 스레드가 돌때 변수간의 충돌을 막는(atomic 하게 업데이트) 기능 제공




#


프로세스 - 리소스 할당의 단위, protection의 단위
프로세스는 PCB말고도 주소공간을 가지고 있고, 그 안에 프로세스의 이미지(실행코드, 변수들)을 담고있다.
프로세스는 프로세서, 파일, IO장치를 protection하는 기능을 가지고 있다.
동시에 실행하다보면 서로 침범할수 있기 때문



#
하나의 프로세스를 쪼개서 여러개의 스레드가 돌아가도록 하려면
실행상태, context, execution stack, 스레드별 정적변수 - 를 나누어 써야하는 문제가 있다
메모리, 장치도 나누어 써야 함
위의것은 TCB가 나누어 쓰고, 아래것은 PCB가 관리


Thread control block에는 cpu에 관한것만 따로 빼서 만들어준다
스레드별로 user stack, kernel stack 을 만들어준다




# 스레드의 장점
네트워크 프로그램에서 시작
특정 포트에 대해 기다리고 있는 프로세스들이 있다
그 과정에서 다른 포트로 연결이 된다는것은, 프로세스를 바꾸는 작업이 필요
cpu를 제외한 나머지 리소스는 똑같이 사용, 각각을 프로세스를 새로 만드는것이 아니라 스레드를 만듦으로서, 나머지는 공유하도록 하여 효율적으로 사용
locality때문에 스위칭도 빠름
같은 기억공간 안에서 communication 하기때문에 효율적이다.(캐시가 바뀔 필요 없음)
인터넷 서비스와 같이 동시 접속자수를 늘릴수 있기 때문에 스레드 사용


싱글 유저 시스템에서도 유용
Foreground, background work 가능
asynchronous processing - io를 시키면서 입력을 집어넣는
실행속도 빨라짐
modular program structure가능


스레드는 OS에서 지원해야 한다
스케줄링, 디스패치를 스레드 단위로 할수 있도록 만들어져야
스레드 레벨의 data structure 가 필요
이것은 프로세스에 종속되어 있다 - suspend,종료 시키면 그 안의 모든 스레드들이 suspend,종료


스레드의 실행상태는 cpu에 관련된 부분만 있기 때문에 단순하다
running - ready - blocked(io같은 이벤트를 기다리는 경우)
새 스레드 생성, 블록, unblock, 종료 등의 이벤트에 의해 상태가 변환



#




스레드의 장점을 RPC 관점에서
하나의 프로세스 안에서 여러 동작을 동시에 가능하도록 한다



스레드 프로그래밍을 하게되면 동기화가 필요
여러개의 프로그램이 동작하면서 변수들과 IO 장치를 공유한다



# 스레드의 종류





ULT - user space에서 스레드가 여러개 존재, kernel에서는 하나의 프로세스로 본다
os 는 PCB만 갖고, TCB는 없는것.

장점 - 스레드간의 스위칭은 커널모드의 전환이 필요없다, 스케줄링 방법도 이 안에서 정해짐, OS와 상관 없기때문에 어떤 OS든 가능하다.
단점 - ULT가 중단된다는 것은 os는 프로세스 자체를 중단시키기 때문에 os서비스를 부르지 않은 스레드까지 중단시킴, 프로세스 단위로 os를 관리하기 때문에 멀티프로세스의 장점을 얻지는 못함. 







KLT - TCB를 만들어서 kernel 레벨에서 각각의 독립적인 스레드로 실행할수 있도록 만든것 
application은 더이상 스레드 관리에 신경쓰지 않음
예시 - 윈도우

장점 - multiple 스레드가 운영체제에 의해 관리되므로 동시에 스케줄링 될수있음
프로세스 안에서 하나의 스레드가 중단되더라도 커널 안에서 그것만 중단되고 나머지는 그대로 실행되는..., 커널 루틴도 멀티스레드로 동작되도록 

단점 - 오버헤드, 커널 레벨로 전환이 필요. 그래도 프로세스 레벨에서 관리하는것 보다는 낮다


그래서 ULT, KLT를 조합할수 있도록 함



#
암달의 법칙 : 그래서 멀티 프로세서를 사용하고 멀티 스레드를 지원하는 OS를 사용해서 얼마나 속도를 높일수 있는가.
하나의 프로그램에서 근본적으로 순차적으로 실행할수밖에 없다 : (1-f) fraction
나머지는 병렬할수 있는 부분 : f
N개의 프로세서를 사용해서 실행시간을 T(N) = (1-f)T(1) + f * T(1)/N
앞의 항 - 순차적 실행 (아무리 병렬처리기를 써도 줄일수 없는것)
뒤의 항 - f개를 N개의 프로세서를 사용하여 병렬

속도향상은
T(1) / T(N) = 1 / [(1-f) + F / N]
나누어준 시간이 된다 (1-f)가 커지면 speed up은 줄어든다.
병렬처리기를 사용해도 순차적으로 실행될수밖에 없는 부분이 크면 어쩔수가 없다는것



잘 만들지 않은 이상은 멀티코어가 항상 좋은 결과를 가져오는 것은 아니더라

잘 만들어서 순차적으로 실행되는 부분을 줄였을때 멀티코어의 장점이 드러난다



이런 장점을 잘 활용할수 있는 application
여러 스레드가 동작하고 있고 동시에 동작하는게 좋은 - 병렬처리하는 gpu, 딥러닝
멀티 프로세스가 있는 applications
java applications
여러 인스턴스를 띄우는 application - ppt같은경우 화면에 여러개를 띄울수 있다.