스레드
스레드를 사용하는 이유는?
- 높은 처리율(throughput)과 성능 향상.
- 병렬성(parallerlism)을 높일 수 있음.
스레드마다 별도의 copy로 가지고 있는 것은?
- Program Counter와 Register, stack
왜 별도로 가지고 있는가?
- 각 스레드가 서로 다른 일을 하기 때문에, CPU 수행과 관련된 정보 필요하기 때문.
스레드의 장점 4가지
- 응답성
- 하나의 스레드로 일하는 것 보다, 여러 스레드로 일하는 것이 응답이 훨씬 빠르기 때문.
- 자원 공유
- code, data 그리고 각종 자원들을 공유해서 좀 더 효율적으로 사용 가능
- 프로세스를 여러개 두면 전부 다 개별 자원이기 때문에 공간 낭비 심함.
- 경제성
- 프로세스 하나 만드는 overhead보다 스레드 하나 만드는 overhead가 훨씬 적음.(30배)
- 그리고 프로세스끼리 context switch하는 것보다 스레드끼리 context switch 하는 것이 overhead가 훨씬 적음.(5배)
- 효율성
- 서로 다른 CPU에서 각 스레드가 병렬적으로 일 할 수 있음.
COW에 대해 설명
- Copy-On-Write 라고 부름.
- 메모리 낭비를 최소화하기 위해 자식 프로세스를 생성해도 자원을 전부 복사해서 생성하지 않음.
- write가 발생했을 때 copy를 하는 것.
부모 스레드가 자식 스레드를 생성하는 과정부터 종료하는 과정 서술(fort(), wait(), exec(), exit()
- 부모 스레드가 fork() 시스템 콜을 이용해 운영체제에게 자식 스레드 생성 부탁.
- 부모 스레드는 자식스레드가 죽을 때까지 wait() 시스템콜로 인해 block 상태.
- 자식 스레드는 fork() 시스템 콜 이후의 코드들을 전부 처리
- 자식 스레드 안에 exec() 시스템 콜을 사용해 새로운 프로그램 실행
- 만약 부모 스레드가 wait() 시스템 콜을 이용해 기다리고 있다면, 자식 프로세스는 exec() 시스템 콜을 사용해 다시 돌아올 수 없기 때문에 부모 프로세스 무한 대기?
- 자식 스레드가 끝나면 block되어 있던 부모 프로세스는 다시 돌아와서 나머지 아래 코드 수행
- exit() 시스템 콜이나, main 문이 끝나면 종료
프로세스간 협력 메커니즘 2가지
- message passing
- 커널을 통해 각 프로세스에게 메시지 전달해서 통신
- shared memory
- 서로 다른 프로세스 간에도 일부 주소 공간을 공유하는 메커니즘
message passing 하는 방법 2가지
- Direct Communication -> 통신하려는 프로세스의 이름 명시적 표시
- Indirect Communication -> mailbox 또는 port를 통해 메시지를 간접 전달
CPU burst와 I/O burst 설명
- CPU burst는 CPU를 연속적으로 쓰면서 인스트럭션을 실행하는 단계
- I/O burst는 I/O 작업을 실행하는 단계
CPU bound job보다 I/O bound job의 cpu burst 빈도수가 높은 이유는?
- CPU bound job은 연속적으로 쓰기 때문에 CPU burst의 빈도가 높지 않음.
- 그에 반해, I/O bound job은 CPU를 짧게 끊어서 쓰고, I/O 작업에 많은 시간을 쓰기 때문에.
preemptive와 nonpreemptive가 무엇인지 예를 들어 설명
- nonpreemptive는 CPU의 주도권을 강제로 빼앗지 않고 자진 반납하는 것임.
- Running -> Blocked
- I/O 작업 요청을 하는 시스템 콜 같은 것을 했을때는 자진 반납.
- Terminate
- preemptive는 CPU의 주도권을 강제로 빼앗기는것
- Running -> Ready
- CPU를 더 쓰고 싶은데 시간이 다 되어 time interrupt가 일어나서 빼앗김.
- Blocked -> Ready
- 여기서는 I/O 작업 같은 긴 작업이 끝나고 Ready 상태로 돌아갈 때 우선순위가 매우 높아서 바로 다시 CPU의 주도권을 가져와야 하는 경우가 해당됨.