http://www.kocw.net/home/cview.do?lid=f7dd9c50298b4bc5
CPU 수행 단위, lightweight process
동일한 웹 브라우저여도 각각의 프로세스로 취급되므로 각각의 Stack, Data, Code 주소공간이 만들어짐 -> 비효율적
-> 실행 파일이 동일하므로 똑같은 기계어로 구성되어있을 텐데 (다른 함수를 호출하고 있을 것이므로 data와 stack은 달라도) 좀 더 효율적으로 사용할 수 있진 않을까?
좀 더 효율적으로 사용하기 위해 쓰레드
도입
동일한 프로그램을 여러 개 띄워놔도 프로세스가 하나만 만들어지는 것
stack, data, code 동일
code의 서로 다른 부분을 실행하고 있을 것이므로 이 부분만 따로 관리를 해주자! -> CPU의 실행 단위
PCB에서 코드의 어느 부분을 수행하고 있는가에 대한 값(pc, register) 만 쓰레드를 여러 개를 둔다.
프로세스에서 cpu 수행 부분만 별도 쓰레드로 가지고 있고 그 외의 것들은 단일 쓰레드로 share하는 것이 효율적!
- 한 프로세스에서 다른 프로세스로 context switch 하는 것은 오버헤드가 많이 발생
그러나 한 프로세스에서 쓰레드를 바꿔가면서 사용하면 비싼 오버헤드가 발생하지 않고 효율적으로 수행할 수 있음~
크롬은 쓰레드를 여러 개 띄우면 보안 문제가 발생하므로 프로세스를 여러 개 둔다는 말도 있고.. 이런 식으로 구현 코드가 다를 수는 있음
CPU 사용 단위
PC와 register, 함수 호출과 관련된 stack space는 별도로 가지고 있음
그 외 모든 code section, data section, OS resources는 쓰레드끼리 공유함
정리하자면, 프로세스 내에서 프로세스가 독자적으로 가지고 있는 것이 쓰레드, 공유하고 있는 부분을 task
비동기식 I/O가 쓰레드 환경에서 이루어질 수 있는 것!!!
커널 쓰레드
: 운영체제가 쓰레드를 아예 알고 있는 경우
운영체제가 cpu 스케줄링을 할 때 A쓰레드에서 B쓰레드로 넘겨야지 라고 알고 있는 것
유저 쓰레드
: 운영체제가 쓰레드의 존재를 모르는 경우
사용자가 쓰레드 기반으로 프로그램을 만들어도 운영체제에서는 그 쓰레드의 존재를 모르는 것
운영체제는 그 프로세스에 cpu를 주기만 하고, 그 프로세스 내부에서 A쓰레드를 실행하다가 A가 i/o 하러 가면 운영체제에 비동기식 입출력을 요청해서 cpu를 받은 다음 B쓰레드에 넘기는 식...
사용자 프로그램단에서 쓰레드 운영