컴퓨터 시스템은 무엇이고 그 위에서 프로그램이 어떻게 돌아갈까?
CPU와 메모리로 구성된 컴퓨터 내부와 I/O장치로 구성된 컴퓨터 외부로 구성
전원키면 운영체제가 메모리에 항상 상주 (그림에서 흰색)
프로그램 실행시키면 프로그램이 메모리에 올라가서 프로세스가 된다 (그림에서 메모리 내 분홍, 파랑색)
각각의 작은 I/O컨트롤러도 작업공간이 있다
CPU에서는 두 가지의 기계어 계속 실행
CPU가 운영체제에 의해 실행될 때는 믿고 맡길 수 있다
하지만, 운영체제가 사용자 프로그램이 CPU를 사용할 때는 악의적일 수도 있다 (무한루프, 메모리 무한히 쓰도록 하는 등)
CPU가 사용자 프로그램에게 넘어가면 운영체제가 제어할 수 없다
따라서, CPU에서 기계어 실행할 때 운영체제가 실행하는지, 사용자 프로그램이 실행하는것인지 구분하는 것이 필요하다
프로그램 및 운영체제의 보호장치
기계어 실행 전, 특권 명령 && 모드빗이 0 인지 먼저 판단한다
불순한 것이 확인되면 자동적으로 CPU가 운영체제한테 넘어간다 (모드빗 1에서 0)
인터럽트 / 익셉션
CPU가 다음 기계어 실행하기 앞서서 인터럽트 라인에 들어온 시그널 확인한다
인터럽트는 I/O 기계들이 발생시킬 수 있다
인터럽트가 오면 자동적으로 운영체제로 넘어간다 (모드빗 1에서 0)
CPU는 기계어로 연산하는데, 연산에 인풋과 아웃풋을 저장하기 위한 빠르고 작은 레지스터가 붙어 있다
프로그램 카운터는 레지스터 중 하나
타이머는 씨피유의 독점을 막기위해 사용하는 부가적인 하드웨어
CPU 뺏어오는 방법은 운영체제 혼자할 수 없다
따라서 일정 시간 간격으로 인터럽트를 발생시키는 타이머를 사용할 수 있다
시간 세팅한 타이머를 통해 CPU 제어권을 자동으로 운영체제한테 넘긴다
인터럽트 들어옴 >
프로그램 카운터는 운영체제 가리킴 >
자동적으로 모드빗이 0으로 바뀜 (모든 기계어 다 실행가능) >
다른 프로그램에게 CPU 넘겨줌 >
모드빗을 1로 바꾸어서 제한된 기계어만 실행가능 >
타이머 인터럽트 들어옴 >
CPU 제어권이 운영체제로 넘어가서 CPU를 다른 프로그램에게 넘겨줌 >
파일 읽어와야 된다면 디스크 전담 컨트롤러에게 요청(특권명령 기계어)
*모든 I/O 장치에 접근하는 기계어는 전부 특권명령으로 묶여있다(= 즉, 사용자 프로그램을 가지고 있으면서 아이오 장치에 접근할 수가 없다)
사용자 프로그램이 뭘 하고 싶은데 권한이 없을 때 운영체제에게 부탁하는 것
사용자 프로그램에서 기계어가 실행되다가 운영체제 기계어 실행으로 점프가 필요
인터럽트 라인에 인터럽트가 들어오는 방법이 있지만 인터럽트가 들어오지 않았을 때,
스스로 사용자 프로그램이 인터럽트를 건다!
자신의 기계어를 통해 인터럽트 라인을 세팅
* 원래 하드웨어들이 인터럽트 거는 것 : 하드웨어 인터럽트
* 소프트웨어가 할 수 없는 작업 요청 위해 스스로 인터럽트 거는 것 : 소프트웨어 인터럽트
프로그램 실행중 파일 읽는것은 I/O 작업의 특권명령, 프로그램이 못함 >
프로그램이 운영체제한테 시스템 콜 >
디스크 컨트롤러한테 부탁 >
그 동안 운영체제는 다른 프로그램 기계어 실행하고 있다 >
디스크 컨트롤러가 요청한 파일을 다 읽었으면 인터럽트 건다 >
운영체제한테 넘어감 >
읽어온 파일을 메모리에 카피
직접 못하니까 운영체제한테 시스템콜 >
원하는 키보드 인풋 들어오면 인터럽트 걸어서 운영체제한테 알려줌 >
운영체제는 그 내용을 요청한 사용자 프로그램한테 넘겨줌
모든 아이오장치를 전담하는 작은 CPU
* 디바이스 컨트롤러는 하드웨어, CPU도 하드웨어
* 운영체제는 소프트웨어
* 디바이스 드라이버는 소프트웨어 : CPU가 수행하는 코드
* 디바이스 컨트롤러에서 수행되는 코드: 펌웨어 (이미 코딩되어 있는 것)
CPU에서의 작업과 I/O 요청이 싱크되는 것
I/O 요청 요청 > 인터럽트 걸어서 전달 > 작업 완료 후 결과를 보고 그 다음 스텝 진행
사용자 프로그램이 입출력 요청 필요(직접 못함) >
운영체제 커널의 디스크 드라이버 통해 디스크 컨트롤러에게 파일 읽기 요청 >
입출력 요청한 프로그램은 대기 >
작업 후 컨트롤러가 CPU에게 인터럽트 걸어서 확인 후 다음 작업 진행
CPU가 요청 > 그 다음 즉시 자기 할 일을 하는 CPU
사용자 프로그램이 입출력 요청 필요 >
결과 무관하게 CPU가 작업 진행
*결과값 얻기 전에 할 수 있는 작업들이 있음 (읽기가 아니라 쓰기 요청이면 가능)
직접 메모리에 접근할 수 있는 컨트롤러
인터럽트가 너무 자주 걸리는 것을 방지할 수 있다
분량 차면 DMA가 메모리에 카피 >
작업 끝나면 인터럽트 라인 세팅 >
바로 인터럽트가 발생하는 것보다 덜 빈번하게 발생 >
! CPU 효율적 !
기계어 (= 명령어)
좌측은 I/O 전담 기계어
우측은 메모리 기계어를 I/O까지 연장