Search
💾

[OS] System Structure & Program Execution 1

참고 강의
하드웨어 구조
CPU + Memory로 구성된 컴퓨터와 I/O device들로 구성(간단)
memory : CPU의 작업 공간
CPU는 매순간, 매 Clock Cycle마다 메모리에서 기계어를 하나씩 읽어서 실행을 함.
키보드, 마우스 → 정보가 안으로 들어가는 device(Input Device)
프린트 → 처리 결과가 내보내는 device(Output Device)
하드 디스크(보조 기억 장치) → I/O device로 볼 수 있음
Disk에 있는 데이터를 읽어서 메모리로 읽어들이기도 하고(Input Device)
처리 결과를 Disk에 저장하기도 한다(Output Device)
I/O device들은 그 Device를 전담하는 작은 CPU같은게 붙어있다 → device controller(hardware)
CPU와 I/O device들은 성능 속도 차이가 존재한다. 따라서, device controller가 각각의 I/O device들을 통제.
ex. Disk의 head를 어떻게 움직일지, 어떤 데이터를 읽을지, 디스크 내부를 통제하는 건 CPU의 역할이 아니고 Disk Controller가 그 역할을 한다.
CPU는 매 클락마다 Memory에서 Instruction를 읽어서 처리(반복)
제어 정보를 위해 control register, status register를 가진다.
buffer에 있는 값을 프로그램으로 넘겨주거나 프로그램에 있는 데이터를 화면에 출력하기 위해 buffer에 담은 다음에 어떻게 하라는 지시는 control register를 통해서 한다.
CPU : Memory, local buffer에 접근 / Device Controller : 자기 자신의 Local Buffer만 접근
  device driver(sofeware) : OS 코드 중 각 장치별 처리루틴
하드웨어를 사용하기 위해서 디바이스 드라이버를 설치 해야한다.
I/O device를 사용해야하는 상황이 오면 디바이스 드라이버를 사용해서 명령을 함.
CPU가 I/O device를 실행하기 위해서 필요한 코드를 담고 있다.
일을 하기 위한 메뉴얼, 동작을 하기 위해서 무슨 일을 해야하는지 → 디바이스 내부에 펌웨어
Device Controller들의 작업 공간 → local buffer(data register)
CPU안에는 Memory보다는 빠르면서 정보를 저장할 수 있는 작은 공간이 존재 → Register
지금 CPU 안에서 실행되는 것이 운영체제인지, 사용자 프로그램인지 구분해주는 것 → Mode bit
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
0 : 모니터 모드(커널 모드, 시스템 모드), OS 코드 수행
이 때는 무슨 일이든 다 하게끔 되어 있다. ex. 메모리 접근, I/O 접근 가능(특권 명령)
Interrupt가 들어오면 Mode bit를 0으로 바꾸고 CPU 제어권을 OS에게 넘겨줌
1 : 사용자 모드, 사용자 프로그램 수행
제한된 Instruction만 실행 가능(보안상의 목적)
메모리 접근, I/O 접근 이런 시도를 하면 Mode bit를 보고 Instruction 실행이 안되도록 구현해둠.
OS가 mode bit를 1로 바꾸어서 넘겨줌
I/O 어떻게 사용하는가?
특정 프로그램이 CPU를 독점하는 것을 막는 것 → Timer
If, 계속 CPU를 쓰는 프로그램을 생성(무한 루프를 돔), 다른 프로그램에게 CPU가 넘어가지 못해서 Time Sharing를 사용할 수 없다. → 이런 상황을 위해서 Timer가 존재
OS가 사용자 프로그램에게 CPU를 넘겨줄 때, 수십ms의 시간을 타이머에 세팅한 후에 넘겨준다.
Instruction 실행 중간에 지정된 시간이 되면 Timer가 Interrupt를 건다.(타이머 Interrupt)
OS가 사용자 프로그램에게 CPU를 줄 때는 자유롭게 주지만 한 번 넘어가면 뺏지 못함. 따라서, Timer를 둬서 CPU가 사용자 프로그램에서 OS로 넘어올 수 있도록 만든 것.
OS가 관리를 하면서 타이머의 도움을 받아서 실행.
CPU의 Time Sharing를 구현하기 위해서 Timer를 두고 있는 것 → 사용자 프로그램이 CPU를 사용하고 싶을 때 이야기
I/O를 해야한다면 사용자 프로그램이 I/O를 해달라고 운영체제에게 자진해서 CPU를 넘기게 된다.
I/O device로의 접근은 OS를 통해서만 할 수 있도록 막아뒀다. → I/O 작업을 해야 할 때, 스스로 CPU를 넘겨주는 이유
I/O 작업 자체가 오래걸리다보니 해당 프로그램말고 다른 프로그램에게 CPU를 넘긴다.
I/O 작업을 요청한 프로그램은 I/O Controller가 요청한 작업이 끝나서 local buffer 해당 작업물을 저장하면 CPU에게 Interrupt를 건다. → 자동으로 CPU가 OS에게 넘어감
OS는 해당 buffer값을 해당 프로그램의 메모리 영역으로 copy해주고 Interrupt 당하기 전에 실행하던 프로그램을 실행(PC값에 저장된 주소값에 해당하는 프로그램) → Timer가 남아있다고 한다면, 아니면 I/O 작업을 요청한 프로그램에게 CPU를 준다.
CPU가 인터럽트가 발생했는지 감지하는 곳 → Interrupt line
Interrupt : CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것 → 각 자원(하드웨어 자원, Device, Peripherals)들의 현 상황을 파악할 수 있는 방식
1.
I/O device가 작업을 처리하기 위해서 걸 수도 있고(Hardware interrupt)
2.
Timer가 시간이 끝나서 걸 수도 있고(Hardware interrupt)
3.
사용자 프로그램이 I/O device를 사용하기 위해서 걸 수도 있다.(sofeware interrupt, trap)
System Call : 프로그램이 커널 함수를 호출(커널 모드 진행을 위해)
Exception : 프로그램이 오류를 범함(스스로 자신에게 인터럽트를 하는 경우)
CPU가 Instruction를 처리하고 있는 중간에, I/O device일을 접근하는 Instruction를 처리하는 상황이 오는데 CPU는 Memory랑만 일하기 때문에 Memory를 접근하는 Instruction만 실행하게 되어 있다. 그러다가 디스크에서 읽어올 것이 있으면 요청을 보내는데 device controller에게 CPU가 일을 직접 시킨다.
device controller는 진행한 일을 자신의 local buffer에 저장. Input device에서 뭐가 들어오는지 지켜보는게 아니고 들어오면 알려달라고 한 뒤, 자신의 일을 계속한다(이 행동 자체가 시간이 오래걸리기 때문)
“Input device에서 들어오는 값을 사용하지 않으면 더 이상 진행이 안된다” 라고 한다면 CPU가 다른 프로그램에게 넘어간다.
하나의 Instruction이 끝나고 나면 Interrupt line를 체크한다. → Interrupt 들어온 게 없으면 다음 Instruction 실행(반복)
각각 인터럽트마다 어떤 일을 처리해야하는지 정의되어 있는 코드(처리하는 커널 함수) → Interrupt 처리 루틴(= Interrupt Service Routine, 인터럽트 핸들러)
어떤 함수(처리 루틴 주소)를 처리하러 가야하는지 표시해주는 것(일종의 테이블) → 인터럽트 벡터
컴퓨터 시스템에 존재하는 각 자원들의 현 상황을 파악할 수 있는 방식
Interrupt는 언제 처리될까?
Interrupt는 어떻게 처리될까?
중첩된(다중) Interrupt 처리는?
  현대의 운영체제는 인터럽트에 의해 구동됨 → Interrupt가 들어올 때만 CPU가 OS에게 넘어감
  CPU가 Interrupt를 많이 당한다 == 효율적이지 못하게 동작
  DMA(Direct Memory Access) Controller를 두자!
중간에 I/O device에 작업이 들어왔을 때 CPU에게 Interrupt를 걸어서 CPU가 I/O device에 있는 내용을 copy하게 하는게 오버헤드가 크다!
CPU는 계속 자기일을 하고 있고 중간중간 buffer 들어오는 내용은 작업이 끝났으면 DMA가 직접 buffer에 있는 내용을 복사하는 일을 해준다. 그 작업을 다 하고 나서 CPU에게 Interrupt를 한 번만 걸어서 CPU에게 보고. 중간에 Interrupt를 당하는 빈도가 줄어서 효율적으로 사용할 수 있음
빠른 입출력 장치(인터럽트를 빈번히 거는 장치)를 메모리에 가까운 속도로 처리하기 위해서 사용
CPU의 중재없이 device controller가 device의 buffer storage의 내용을 메모리에 block단위로 직접 전송 → block 단위로 interrupt 발생
CPU, DMA가 동시에 같은 메모리 영역을 접근할 수 있기 때문에 memory controller가 이를 중재하는 역할을 함. 누가 먼저 쓰게 할 지 정리하는 역할.