CS공부중인데 질문이있습니다.

운영체제를 공부하고있는데 이해가 잘안되는부분들이 많습니다.

프로세스가 입출력을 요구할 때 CPU는 입출력관리자에게 입출력작업을 지시하고 다른작업을 하다가 입출력관리자로부터 입출력완료 인터럽트를 받으면 하던일을 중지하고 인터럽트를 처리한다고 배웠습니다.
또한 프로세스는 입출력작업을 지시했을경우 입출력작업이 끝날때 까지 아무것도 못한다고 배웠습니다.

이때 프로세스 아무것도 못한다는건 이 프로세스의 타임슬라이스동안 CPU가 아무일도 안하는것이고 디스패치가되어 다른프로세스가 실행상태가되면 CPU는 게속 일을하는건가요?

입출력작업 인터럽트를 수신하는건 CPU 스케줄러인가요? 하드웨어적요소인가요?
하드웨어적요소가 아닌 소프트웨어적 요소라면 메모리에 올라와 실행될텐데 다른 프로세스처럼 시분할방식으로 작동하는게 아닌가요?

4개의 좋아요

말씀하신 내용에서 "프로세스"를 "스레드"로 바꾸시면 더 의미가 명확합니다.

이때 프로세스 아무것도 못한다는건 이 프로세스의 타임슬라이스동안 CPU가 아무일도 안하는것이고 디스패치가되어 다른프로세스가 실행상태가되면 CPU는 게속 일을하는건가요?

위의 경우를 간단하게 예를 들어볼까요?

현재 스레드가 (100초가 걸리는) File.Write를 호출합니다. 그럼, Write 호출을 한 스레드는 커널의 File.Write까지 이어지고 거기서 I/O Request를 발생시킨다음 그 스레드는 대기 모드로 빠집니다.

즉, 스케줄러의 대기 모드 목록에 넣어집니다.

따라서, 그 스레드에게는 이제 어떠한 timeslice도 의미가 없습니다. 그러다가 100초가 지나 I/O 장치로부터 인터럽트가 발생하면, 그 I/O를 대기하던 스레드를 "대기 모드 목록"에서 빼내 다음 스케줄링에서 실행이 되도록 "준비(Runnable) 모드 목록"으로 이전시킵니다. 이후, 스케줄러가 실행되면 Runnable 모드의 스레드를 다시 timeslice를 적용해 실행해 나갑니다.

입출력작업 인터럽트를 수신하는건 CPU 스케줄러인가요? 하드웨어적요소인가요?

인터럽트를 수신하는 건 하드웨어적인 요소지만, 인터럽트에 해당하는 코드를 수행하는 건 소프트웨어적인 요소입니다. 운영체제는 초기화 시, CPU와 약속된 규칙에 따라 인터럽트 테이블을 만들고 그 주소를 CPU(인텔 CPU의 경우 IDTR 레지스터)에 설정합니다.

인터럽트는 시분할 방식으로 동작하지 않습니다. "시분할 방식"이란 건 작업 분배의 차원에서 스레드 스케줄러가 관여했을 때 의미있는 것이지, 인터럽트 자체로는 시분할 처리와 연관이 없습니다. 인터럽트가 발생하면 곧바로 CPU는 모든 코드 수행을 멈추고 IDTR 레지스터에 지정된 주소로부터 인터럽트 핸들러의 주소로 점프해 코드를 수행합니다. 자칫 이런 경우, 동기화에 민감한 데이터를 수정 중에 다른 인터럽트가 발생해 상태가 깨지는 것을 방지하기 위해, 중요한 코드 처리 중에는 인터럽트 발생을 disable 시켜버립니다.

8개의 좋아요