[운영체제] 시스템 구조 & 프로그램 실행 2 : 동기식 입출력, 비동기식 입출력, DMA, 프로그램 실행

드림보이즈·2023년 8월 11일
0

동기식 입출력, 비동기식 입출력

동기식 입출력 (Synchronous I/O)

  • I/O 요청 후 입출력 작업이 완료된 뒤에야 제어가 사용자 프로그램에 넘어감
  • 구현 방법 1 : I/O 끝날 때 까지 CPU 기다림, 매 시점 하나의 I/O만 일어날 수 있음
  • 구현 방법 2 : I/O 완료될 때 까지 해당 프로그램에게서 CPU 빼앗음, I/O 처리 기다리는 줄에 그 프로그램을 줄 세움, 다른 프로그램에게 CPU를 줌

비동기식 입출력 (ASynchronous I/O)

  • I/O가 시작된 후 입출력 작업이 끝나길 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감

그림을 보면 이해가 쉽다.

동기식 입출력을 보자.
사용자 모드에서 실행 중이던 프로세스 A가 시스템 콜 요청을 한다.
mode bit을 0으로 바꾸고 커널모드로 인터럽트 서비스 루틴을 실행한다.
'파일을 읽어 와라' 라는 요청이었다고 해보자.(data transfer 부분)
'파일을 읽어 오기 완료' 전까진 CPU는 기다리기만 한다.

비동기식 입출력의 경우,
인터럽트 서비스 루틴을 실행하고 바로 CPU는 사용자 프로그램에 넘어가
I/O 작업을 하는 동안 프로그램을 실행시키고 있는 것이다.
I/O 작업이 완료되면 해당 I/O Device controller가 인터럽트로 알려준다.

둘 중 뭐가 좋고 나쁨의 문제가 아니다.
내가 프로그램을 만들 때, 반드시 결과를 받아야 다음 일을 진행할 수 있을 경우에는 동기식을 쓰고,
아닐 경우엔 비동기식으로 코드를 짜면 되는 것이다.

DMA(Direct Memory Access) Controller


DMA 컨트롤러가 없는 경우를 보자.
CPU에게 인터럽트가 ㅈㄴ 많이 온다.
키보드 a 하나 눌렀다고 인터럽트 걸고, 클릭 하나 했다고 인터럽트 걸고, CPU가 일을 제대로 할 수 있겠는가?
DMA는 I/O 작업을 일정 량이 차면, buffer storage의 내용을 메모리에 전송을 하고,
CPU에 인터럽트 요청을 1번 보내는 것이다.

이를 통해 인터럽트의 빈도를 줄일 수 있다.


서로 다른 입출력 명령어

  • I/O를 수행하는 special instruction에 의해,
  • Memory Mapped I/O에 의해

'파일 시스템'에서 자세하게 설명하지만, 쉽게 설명하자면
I/O device도 주소가 있다. 근데 이게 커널 영역에 있어, 운영체제만 알 수 있는 것이다.
이걸 사용자 메모리에 올려 운영체제 도움 없이도 접근하는 것이다.

저장장치 계층 구조


위로 갈수록 빠르고, 비싸고, 휘발성이 있다.

프로그램 실행 (메모리 load)

하드 디스크에 실행 파일인 프로그램이, 실행하면
프로세스 마다 0번지 부터 code, data, stack 영역으로 가상 메모리 address space를 부여 받는다.
그 다음에 주소 변환을 통해서 물리적인 메모리에 실제로 올라가는 것이다.

커널 주소 공간의 내용

커널 영역에는

  • code : 인터럽트 핸들러 함수들, 자원 관리 위한 코드, 코드들이 있고,
  • data : Process의 데이터인 PCB, 하드웨어마다 관리하기 위한 테이블이 있고,
  • stack: 프로세스 마다 커널 스택이 있다.

사용자 프로그램이 사용하는 함수

  • 사용자 정의 함수
  • 라이브러리 함수
  • 커널 함수

프로그램의 실행

profile
10년 후 세계 최고 블록체인 개발자

0개의 댓글

관련 채용 정보