[운영체제] Chapter 2. System Structure & Program Execution (1)
2022. 11. 23. 17:31ㆍCS/운영체제
728x90
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
컴퓨터 시스템 구조, Mode bit, Timer, Device Controller, 입출력(I/O)의 수행, 시스템 콜(System Call), 인터럽트(Interrupt), DMA(Direct Memory Access) Controller
- 컴퓨터 시스템에서 하드웨어가 어떻게 동작하는지
- 프로그램들이 하드웨어 위에서 어떻게 돌아가는지
1. 컴퓨터 시스템 구조
- 컴퓨터 시스템의 구조는 컴퓨터 내부장치인 CPU, 메모리와 컴퓨터 외부 장치인 디스크 , 키보드, 마우스, 모니터, 네트워크 장치 등으로 구성된다.
- 컴퓨터는 외부장치에서 내부장치로 데이터를 읽어와 각종 연산을 수행한 후, 그 결과를 외부장치로 다시 내보내는 방식으로 업무를 처리한다.
- 입력(input): 외부장치의 데이터 → 컴퓨터 내부
- 출력(output): 컴퓨터 내부의 데이터 → 외부 장치
- 예) 디스크에서 내용을 읽어 컴퓨터 내부에서 어떤 연산을 한 후(입력) 디스크의 데이터에 데이터를 저장(출력)
1-1. 입출력 장치(I/O device)
- 입출력 장치들의 I/O연산은 입출력 컨트롤러가 담당
- 장치 컨트롤러(device controller)
- 메모리 및 입출력 장치 등의 각 하드웨어 장치에는 일종의 작은 CPU인 컨트롤러라는 것이 붙어 있어 장치를 제어한다.
- 예) 디스크 컨트롤러가 디스크에서 헤드가 어떻게 움직이고 어떤 데이터를 읽을지 디스크 내부를 통제
- 로컬 버퍼(local buffer)
- 컨트롤러의 작업공간으로 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
- 디스크나 키보드 등에서 컨트롤러가 데이터를 읽어오면 → 로컬 버퍼에 데이터를 임시로 저장 → 메모리에 전달
- 로컬 버퍼로 읽어오는 작업이 끝났는지를 메인 CPU가 지속적으로 체크하는 것이 아니라 장치에 있는 컨트롤러가 인터럽트를 발생시켜 CPU에 보고
- 인터럽트: 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등 CPU에게 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시켜 CPU의 서비스가 필요하다고 통보하는 방법
1-2. CPU
- 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당(연산을 한다는 것 = CPU가 무언가 일을 한다)
- CPU는 매 클럭 사이클마다 메모리에서 인스트럭션(instruction: 명령)을 하나 읽어서 실행
- 실행해야 할 인스트럭션의 메모리 주소를 프로그램 카운터 레지스터(= PC register)가 가지고 있음
- 인터럽트 라인(interrupt line)
- CPU는 항상 메모리에 있는 인스트럭션만 실행하지만 프로그램은 항상 메모리만 가지고 작업하는 것은 아니다.
- 키보드 입력, 디스크에서 읽어오는 데이터 등의 명령 요청이 끝났을 때 CPU가 어떻게 알 수 있는가?
→ (명령) CPU가 직접 접근하지 않고 I/O device에 접근하라는 명령을 장치 컨트롤러에게 시키고
→ (명령 끝) 작업이 끝나면 장치에 있는 컨트롤러가 인터럽트 라인을 세팅해서 인터럽트를 발생시킴
- 키보드 입력, 디스크에서 읽어오는 데이터 등의 명령 요청이 끝났을 때 CPU가 어떻게 알 수 있는가?
- CPU는 인스트럭션 하나를 수행할 때마다 인터럽트가 발생했는지를 확인하고
- 인터럽트 라인에 신호가 들어오면(= 인터럽트가 발생했으면) 다음 명령을 수행하기 전에 인터럽트 처리를 한다.
- 인터럽트의 종류는 다양 ~ 각각의 인터럽트 발생 원인마다 라인을 다르게 해서 구분 ~ CPU는 해당 인터럽트를 처리하기 위한 루틴으로 넘어가서 커널 내의 인터럽트 처리 코드를 수행
- 인터럽트가 발생하지 않았으면 다음 명령을 계속 수행
- 인터럽트 라인에 신호가 들어오면(= 인터럽트가 발생했으면) 다음 명령을 수행하기 전에 인터럽트 처리를 한다.
- CPU는 항상 메모리에 있는 인스트럭션만 실행하지만 프로그램은 항상 메모리만 가지고 작업하는 것은 아니다.
- 모드 비트(mode bit)
- CPU에서 실행되는 것이 운영체제인지 사용자 프로그램인지 구분하는 방법
- 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
- mode bit를 통해 하드웨어적으로 두 가지 모드의 operation 지원
- mode bit == 0 : 커널 모드(= 모니터 모드, 시스템 모드): OS 코드 수행(특권 명령)
- 보안이 필요한 명령으로 입출력 장치, 타이머 등 각종 장치에 접근하는 명령어
- 모든 종류의 명령을 다 실행할 수 있다. 메모리 접근뿐 아니라 I/O device 접근 가능
→ OS가 CPU를 가지고 있기 때문 - 보안을 해칠 수 있는 중요한 명령어는 커널 모드에서만 수행 가능
- interrupt나 exception 발생 시 하드웨어가 mode bit을 0으로 바꿈
- mode bit == 1 : 사용자 모드: 사용자 프로그램 수행(일반 명령)
- 메모리에서 자료를 읽어와 CPU에서 계산하고 결과를 메모리에 쓰는 일련의 명령들
- 사용자 프로그램이 CPU를 가지고 있을 때 보안상의 목적으로 제한된 인스트럭션만 CPU에서 수행 가능
- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 세팅
- 사용자 프로그램이 입출력(OS 코드에 있음)을 하고 싶으면? → 시스템 콜
- mode bit == 0 : 커널 모드(= 모니터 모드, 시스템 모드): OS 코드 수행(특권 명령)
- registers: CPU 내부에 있는 메모리보다 더 빠르면서 정보를 저장할 수 있는 임시 기억장치
1-3. 타이머(timer)
- CPU가 하나의 프로그램에 의해서 독점되는 것을 막기 위해 운영체제가 사용하는 하드웨어 장치
- 사용자 프로그램 A에서 무한루프를 수행하면서 CPU가 다른 프로그램으로 넘어가지 못하게 독점하고 있으면 시분할 기능을 구현할 수 없다.
- 컴퓨터를 부팅했을 때 OS가 CPU를 가지고 있다가
→ 사용자 프로그램이 실행되면 timer에 값을 세팅한 다음 CPU를 넘겨주고
→ 타이머는 매 클럭 틱 때마다 1씩 감소, (타이머 값이 0이 되면 타이머 인터럽트가 발생)
→ 세팅된 시간이 종료되면 타이머가 OS에게 CPU 제어권이 넘어가도록 인터럽트를 발생
→ CPU가 하던 일을 잠시 멈추고 CPU 제어권을 사용자 프로그램에서 운영체제로 자동으로 넘어감
→ 운영체제가 다음 프로그램에 CPU를 넘겨준다. - 운영체제와 타이머로 CPU를 특정 프로그램이 독점하는 것으로부터 보호, CPU의 시분할을 구현
- 컴퓨터를 부팅했을 때 OS가 CPU를 가지고 있다가
- 타이머의 값을 세팅하는 명령: 로트 타이머(load timer): 특권 명령
2. Device Controller
- I/O device controller
- 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU
- 제어정보(CPU가 I/O에 명령할 때 해당 레지스터를 통해 지시하기 위한 정보)를 위해 control register, status register를 가짐
- local buffer를 가짐
- I/O는 실제 device와 local buffer 사이에서 일어남
- 실제 데이터는 local buffer에 임시저장, 지시는 제어 레지스터를 통해
- 인터럽트를 당한 CPU는 컨트롤러의 local buffer와 메모리 사이의 데이터를 옮기는 일을 한다.
- CPU만 메모리와 로컬 버퍼에 접근 가능하다. 작은 CPU인 컨트롤러는 자신의 로컬 버퍼에만 접근 가능
- 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우
입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU의 업무가 방해되어 효율성이 떨어지는 문제점 발생 - ⇒ DMA(Direct Memory Access) Controller
- 직접 메모리를 접근할 수 있는 컨트롤러로, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역할
- 로컬 버퍼에서 메모리로 읽어오는 작업을 CPU 대신 DMA가 담당해서 CPU는 원래 하던 작업을 멈추고 인터럽트를 처리할 필요가 없다.
- DMA는 블록 단위로 정보를 메모리로 읽어온 후에 CPU에게 인터럽트를 발생시켜 CPU에 발생하는 인터럽트의 빈도를 줄여 효율성을 높인다.
- 만약 CPU와 DMA가 동시에 메모리에 접근하면 메모리 컨트롤러가 중재
- 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우
- device driver(장치구동기): OS코드 중 각 장치별로 인터페이스에 맞게 처리 루틴, CPU가 실행하는 코드 → software
- device controller(장치제어기): 각 장치를 통제하는 일종의 작은 CPU → hardware
- device controller가 실행하는 코드는 펌웨어
3. 입출력(I/O)의 수행
- 모든 입출력 명령은 특권 명령(사용자 프로그램이 직접 I/O 하는 것이 아닌, 운영체제를 통해서만 이루어짐)
- 입출력 명령은 운영체제 코드에 구현되어 있다.
- 그러면 사용자 프로그램은 어떻게 I/O를 하는가? → OS에게 서비스 대행을 요청하여 입출력을 수행
- ⇒ 시스템 콜(system call)
- 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법
- 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 이에 대한 처리를 위해 발생시키는 인터럽트(특권 명령은 커널 모드에서 운영체제에 의해서만 수행할 수 있다)
- 운영체제 커널에 있는 코드를 사용자 프로그램이 실행하고자 할 때 인터럽트 라인 세팅을 통해 CPU 제어권을 운영체제로 넘겨 실행
- 내 프로그램 안에서 함수를 호출하면 프로그램 내부에서 메모리 주소를 바꾸는 것
- 내 프로그램이 실행되다 I/O 요청을 위해 운영체제 함수를 호출(= 시스템 콜)하면
→ 직접 OS로 jump 할 수 없다 (= mode bit == 1 일 때 OS 접근 X)
→ 프로그램이 직접 인터럽트 라인을 세팅하는 인스트럭션을 실행- timer, I/O 인터럽트 말고 프로그램이 OS에게 요청하기 위해 trap(소프트웨어 인터럽트)
- 이 과정에서 CPU는 장치 컨트롤러에게 명령
- 올바른(그 장치에 접근 권한이 있는지) I/O 요청인지 확인 후 I/O 수행,
- ⇒ 시스템 콜(system call)
- CPU와 I/O 장치의 수행 속도는 크게 차이 난다
- 입출력이 진행되는 동안 CPU가 입출력의 완료만을 기다리며 명령을 수행할 수 없다
- 또한 입출력을 요청한 프로세스(A)에게 CPU의 제어권을 넘겨줄 경우, 요청 데이터 없이는 다음 명령을 수행할 수 없다
- → OS는 입출력을 요청한 다음 CPU의 제어권을 다른 프로세스(B)에게 이양한다
→ 요청된 입출력 작업이 완료되면 컨트롤러가 CPU에게 인터럽트를 발생(하드웨어 인터럽트)
→ CPU는 로컬 버퍼와 메모리 사이의 데이터를 옮기고
→ 입출력을 요청했던 프로세스(A)에게 다시 CPU를 획득할 수 있는 권한을 준다
→ 프로세스(A)는 CPU를 기다리는 큐에 삽입, CPU의 제어권은 다시 인터럽트를 당한 프로세스(B)에서 하던 작업을 계속 수행
4. 인터럽트(Interrupt)
- 인터럽트: 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등 CPU에게 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시켜 CPU의 서비스가 필요하다고 통보하는 방법
- 인터럽트를 당한 시점의 레지스터와 program counter를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다
- 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있음
- 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조
- 운영체제에 정의되어 있음
- 인터럽트 처리 루틴(Interrupt Service Routine, 인터럽트 헨들러)
- 해당 인터럽트를 처리하는 커널 함수, 실제 처리해야 할 코드
- 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있음
- 인터럽트의 좁은 의미
- 하드웨어 인터럽트(일반적인 인터럽트)
- 하드웨어가 발생시킨 인터럽트, 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅
- 예) 타이머, I/O controller
- Trap(소프트웨어 인터럽트)
- 소프트웨어가 CPU 인터럽트 라인을 세팅
- Exception: 프로그램이 오류를 범한 경우
- mode bit == 1일 때 CPU가 실행할 수 없는 인스트럭션을 실행하려 하면 → 인터럽트 라인이 자동으로 세팅 → CPU가 사용자 프로그램에서 OS로 넘어감 → 사용자 프로그램 강제 종료
- System call: 프로그램이 커널 함수를 호출하는 경우
- CPU의 서비스가 필요한 경우 CPU 옆에 있는 인터럽트 라인에 신호를 보내서 인터럽트가 발생했음을 알려주는 방식은 둘 다 동일하다.
- 일단 인터럽트가 발생하면 CPU는 하던 일을 멈추고 운영체제 커널 내에서 해당 인터럽트의 처리를 위해 정의된 코드를 찾게 된다.
- 하드웨어 인터럽트(일반적인 인터럽트)
- 인터럽트를 처리 중에 또 다른 인터럽트가 발생하는 경우를 허용하지 않는다. → 일관성을 유지하기 위해
- 현대의 운영체제는 인터럽트에 의해 구동된다.
- 부팅 후 정상 상태에 머무르게 되면 CPU가 항상 사용자 프로그램에 의해 사용
- 운영체제는 단지 인터럽트가 발생했을 때에만 잠깐 CPU의 제어권을 획득할 수 있다.
- ⇒ 운영체제가 직접 CPU를 점유하는 경우는 인터럽트에 의하지 않고는 발생하지 않는다.
그럼에도 불구하고 운영체제는 컴퓨터 시스템 내의 모든 하드웨어 및 소프트웨어 자원을 체계적이고 효율적으로 관리할 수 있다.
[복습]
이화여자대학교 반효경 교수님의 [2014년 1학기 운영체제], [2017년 1학기 운영체제] 강의 정리입니다.
반효경 교수님의 [운영체제와 정보기술의 원리] 교재를 참고하였습니다. 감사합니다.
https://core.ewha.ac.kr/publicview/C0101020140311132925816476?vmode=f
728x90
'CS > 운영체제' 카테고리의 다른 글
[운영체제] Chapter 3. Process(2) (0) | 2022.12.14 |
---|---|
[운영체제] Chapter 3. Process(1) (2) | 2022.12.11 |
[운영체제] Chapter 2. System Structure & Program Execution (2) (0) | 2022.11.24 |
[운영체제] Chapter 1. Introduction to Operating Systems (0) | 2022.11.20 |
[운영체제] Chapter 1. 강의소개 (0) | 2022.11.19 |