<kocw 반효경 교수님의 강의를 듣고 정리한 내용입니다>
"Thread is basic unit of CPU utilization"
Thread : CPU의 수행 단위이다.
스레드는 동일한 프로세스에서 stack, Program Counter, register set를 별도로(독립적으로) 갖고있다.
스레드가 동료 스레드와 공유하는 부분 (=Task)
: 1. Code section
2. Data section
3. OS resources
하나의 서버 스레드가 blocked 상태인 동안에도 동일한 테스크(Task) 내의 다른 스레드가 실행 되어 빠른 처리 가능 [빠른 응답성]
ex) 네이버를 연다 -> 웹페이지를 읽어온다. (오래 걸림) (blocked상태)
이미지, 텍스트 파일 요청을 다른 스레드로 실행
여러 스레드를 사용하면 이미 읽어온 텍스트라도 화면이 올려주면 결과를 빨리 볼 수있다.
동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능향상을 얻을 수 있다. [별도의 프로세스로 만들 경우에는 독자적인 주소공간 필요(메모리를 낭비)]
<자원을 효율적으로 사용>
프로세스를 하나 만드는 것은 오래 걸리지만 스레드 하나 만드는 것은 오버헤드가 그렇게 크지 않다. + 문맥교환은 오버헤드가 크지만 스레드간의 CPU 스위치는 간단하다.
스레드는 커널, 라이브러리를 통해 구현할 수 있다.
커널의 지원을 받아 구현하면 커널 스레드라고 한다.
커널이 스레드가 여러 개 있음을 한다.
라이브러리의 지원을 받아 구현하면 유저 스레드라고 한다.
커널이 프로세스에 스레드가 여러 개 있는 것을 모른다.
부모 프로세스를 복제 생성하여 자식 프로세스를 만든다.
-> 부모 프로세스의 주소 공간 내용(code, data, stack)을 그대로 복제해서 생성한다.
fork, exec는 모두 시스템 콜이고 시스템 콜의 코드는 커널의 코드에 위치해있다.
즉, 부모 프로세스는 자식 프로세스를 만들어달라고 os에게 부탁한다.
프로세스의 세계에서는 자식 프로세스가 먼저 종료된 후에야 부모 프로세스가 종료할 수 있다.
[자발적 종료]
exit() -> 프로세스가 마지막 명령을 수행한 후 OS에게 이를 알려줌
자식 프로제스가 종료될 때 부모에게 output data를 보낸다.
[비자발적 종료]
abort()
-> 자식이 할당 자원의 한계치를 넘어설 때
-> 자식에게 할당된 태스크가 더 이상 필요하지 않음
-> 부모가 종료(exit)하는 경우 - 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
-> 키보드로 kill, break등을 친 경우
-> 지금까지의 상태를 잊어버리고 그 주소공간을 완전히 새로운 프로그램으로 덮어씌운 후 첫 부분부터 다시 실행을 시작하도록 하는 시스템 콜이다.
프로세스를 block상태로 만드는 시스템 콜
(자식 프로세스가 종료 되기를 기다리면서)
자식 프로세스가 종료되면 부모 프로세스는 block에서 ready상태로 변경된다.
커널을 통해 메세지 전달
- 직접 전달 (이름을 명시적 표시)
- 간접 전달
[주소 공간을 공유하는 방법]
주소공간의 일부를 공유 한다.