컴퓨터 내부장치 : CPU, 메모리
컴퓨터 외부장치(입출력 장치) : 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등
컴퓨터 내부로 데이터가 들어오는 것 = 입력(input)
컴퓨터 외부로 데이터가 나가는 것 = 출력(output)
컨트롤러 : 일종의 작은 CPU / 각 하드웨어 장치마다 존재하면서 이들을 제어
커널(kernel) : 항상 메모리에 올라가 있는 부분 (전체 운영체제 중 핵심적인 부분)
입출력 장치들의 I/O 연산 - 입출력 컨트롤러가 담당, 컴퓨터 내에서 수행되는 연산 - 메인 CPU 담당
로컬 버퍼(local buffer) : 각 장치를 제어하기 위해 설치된 장치 컨트롤러라는 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
CPU는 매 시점 메모리에서 명령(instruction)을 하나씩 읽어와서 수행
작업을 하던 중 인터럽트 라인(interrupt line)에 신호가 들어오면 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리
⇒ 명령을 하나 처리할 때마다 인터럽트가 발생했는지 확인
운영체제 커널 내에 있는 인터럽트 처리루틴은 다양한 인터럽트에 대해 각각 처리해야 할 업무들을 정의함
ex. 디스크 컨트롤러가 인터럽트 발생시킬 경우
CPU는 하던 일을 멈추고 인터럽트 발생시 실행시킬 코드를 찾아 수행
수행 하는 일 : 디스크의 로컬 버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시하는 일
하드웨어 인터럽트 : 하드웨어 장치가 CPU의 인터럽트 라인을 세팅
소프트웨어 인터럽트 : 소프트웨어가 CPU의 인터럽트 라인을 세팅
⇒ 인터럽트 라인에 신호를 보내서 인터럽트가 발생했음을 알려주는 방식은 둘 다 동일
인터럽트 벡터(interrupt vector) : 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조
인터럽트 처리 루틴(interrupt service routine), 인터럽트 핸들러(interrupt handler) : 실제 처리해야 할 코드
소프트웨어 인터럽트(트랩, trap)
비정상적인 작업을 시도하거나 권한이 없는 작업을 시도할 때 발생
사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법
인터럽트 핸들링(interrupt handling) : 인터럽트가 발생한 경우에 처리해야 할 일의 절차
프로세스 제어 블록(Process Control Block: PCB) : 각각의 프로그램마다 하나씩 존재하며 해당 프로그램의 어느 부분이 실행 중이었는지를 저장
→ 실행 중이던 코드의 메모리 주소, 레지스터 값, 하드웨어 상태 등이 저장
오늘날의 컴퓨터 운영체제는 인터럽트가 발생할 때만 실행됨
입출력 : 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것
*CPU의 명령 수행 속도는 빠르지만 입출력 장치에서 데이터를 읽어오는 등의 입출력 연산은 상대적으로 느림
1) 동기식 입출력
입출력이 진행되는 동안 그 프로그램의 다음 명령을 수행하지 않고 기다림
입출력이 완료되어 인터럽트 통제 사실이 전달된 후에야 CPU의 제어권이 그 프로그램에게 넘어가서 다음 명령 수행 가능
✔️ CPU는 입출력 연산이 끝날 때 까지 인터럽트를 기다리며 자원 낭비
다른 프로그램에게 CPU를 양도하지 않고 입출력 연산이 완료될 때까지 기다린다면, 매 시점 하나의 입출력 연산이 실행
입출력이 실행되는 동안 다른 프로그램에게 CPU를 양도하면, 동시에 다수의 입출력 연산 가능
✔️ 다수의 입출력이 진행될 경우, 명령 수행 순서가 바뀔수 있음
입출력 요청의 동기화를 위해 장치별로 큐(queue)를 두어 요청한 순서대로 처리할 수 있도록 함
연산 완료의 통보는 인터럽트를 통해 수행
운영체제 커널은 인터럽트 처리루틴으로 가서 해당 프로그램의 상태를 봉쇄 상태로부터 해제
2) 비동기식 입출력
CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 다시 부여
데이터와 관련 없이 수행 할 수 있는 일은 먼저 수행하고, 읽어오(쓰)는 데이터가 있어야 수행 가능한 일은 입출력이 완료된 후에 수행하게 됨
인터럽트를 통해 입출력 완료 여부를 알려줌
원칙적으로 메모리는 CPU에 의해서만 접근 가능함
CPU 외의 장치가 메모리 데이터에 접근하기 위해서는 CPU에 인터럽트를 발생시켜 CPU가 이를 대행해야 함
메모리 접근 연산이 CPU에 의해서만 진행되면 연산 처리 속도 및 효율성이 떨어짐
이를 극복하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 하나 더 둠
DMA(Direct Memory Access)
: 일종의 컨트롤러, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아 줌
DMA는 바이트(byte) 단위가 아니라 블록(block) 단위로 메모리 읽어 옴 → CPU에 인터럽트 발생시켜 해당 작업의 완료 알림
1) 주기억장치 (메모리)
대부분 전원이 나가면 저장되었던 내용이 모두 사라져버리는 휘발성의 RAM을 매체로 사용함
2) 보조기억장치
주로 전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성의 마그네틱 디스크를 주로 사용
① 파일 시스템용 (file system)
전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억 장치에 저장
디스크를 파일 시스템용으로 사용
② 스왑 영역 (swap area)
메모리의 연장 공간 (하드디스크가 가장 널리 이용)
프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고 그렇지 않은 부분은 디스크 스왑 영역에 내려 놓음
스왑 아웃(swap out) : 디스크에 내려놓는 일
여러개의 마그네틱 원판들이 존재하고, 암(arm)이 이동하며 원판에 저장된 데이터를 읽고 쓰는 방식으로 동작
디스크 원판의 표면은 트랙(track)으로 나뉘고, 각 트랙은 섹터(sector)로 나뉨
섹터에 최소한의 단위 정보 저장됨
빠른 저장장치부터 느린 저장장치까지 단계적인 계층구조로 이루어짐
빠른 저장장치 : 단위 공간 당 가격이 높음, 적은 용량 사용
느린 저장장치 : 가격이 저렴하여 대용량으로 사용, 접근 속도가 느림
CPU 내부에 존재
레지스터(register), 캐시 메모리(cache memory), 메인 메모리(main memory)
휘발성 저자장치로 구성 됨
전원이 나가도 지워지지 않는 비휘발성 저장장치
당장 필요한 정보만을 선별적으로 저장하면 성능 좋음
다중 프로그래밍 환경에서 동작함
각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간의 충돌을 일으키는 문제를 막기 위해 하드웨어에 대한 보안 기법 필요
1) 커널 모드(kernel mode, system mode) : CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드 → 모든 종류의 명령 실행 가능
2) 사용자 모드(user mode) : 일반 사용자 프로그램 실행 → 제한적인 명령만 수행 가능
0으로 세팅되어 있으면 커널모드로서 모든 명령 수행할 수 있음
1로 세팅되어 있으면 사용자모드로서 제한된 명령 수행할 수 있음
CPU는 보안과 관련된 명령을 수행하기 전에는 항상 모드비트 조사 후 수행
인터럽트가 발생할 때 모드비트는 자동으로 0 세팅
요청된 작업이 모두 끝난 후에는 모드비트를 다시 1로 만들어 사용자 프로그램에게 CPU 넘겨 줌
특권 명령 : 시스템의 보안과 관련된 명령들 / 모드비트가 0 일때 = 커널모드에서 운영체제에 의해서만 수행 가능
하드웨어 장치에서 보안이 유지되는 방식
⇒ 모든 입출력 명령은 특권명령으로 규정해서 사용자 프로그램이 직접 입출력하는 것 차단
(입출력이 필요한 경우, 운영체제가 입출력 명령 대신 수행)
사용자 프로그램이 입출력을 하고 싶으면 시스템 콜로 운영체제에 요청해야 함
하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있기에 보안 필요
적어도 인터럽트 벡터와 인터럽트 처리루틴이 있는 곳은 각별한 보안이 필요
(사용자 프로그램이 인터럽트 처리루틴을 접근하거나 변경할 수 있을 경우, 특권명령을 보안성이 침해되는 명령으로 변형할 수 있기 때문)
2개의 레지스터를 사용해 프로그램이 접근하려는 메모리 부분의 합법성 체크
1) 기준 레지스터(base register)
: 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근 가능한 메모리상의 가장 작은 주소 보관
2) 한계 레지스터(limit register)
: 프로그램이 기준 레지스터값부터 접근할 수 있는 메모리의 범위 보관
⇒ 어떤 프로그램이 실제 메모리에 올라가 있는 부분의 시작 주소와 그 프로그램의 길이
접근하려는 주소가 기준 레지스터+한계 레지스터 밖이면 불법적인 메모리 접근 → 인터럽트 발생
(이후 paging 기법에 대해서도 살펴볼 예정)
⇒ 운영체제가 2개의 레지스터값을 직접 세팅해주고 사용자 프로그램은 값을 변경할 수 없게 함.
CPU가 하나의 프로그램에 의해 독점되는 것을 막기 위해 타이머(timer)라는 하드웨어를 사용
→ 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 함
일정한 시간 단위로 세팅될 수 있으며, 매 클럭 틱(clock tick) 당 1씩 감소
0이 되는 순가 인터럽트 발생
→ 시분할 시스템에서 현재 시간을 계산하기 위해서도 사용
로드 타이머(load timer) : 타이머의 값을 세팅하는 명령(특권 명령)
시분할 시스템 : 여러 프로그램이 CPU의 시간을 조금씩 나누어 사용하는 시스템
입출력 명령은 운영체제 코드에 구현되어 있으며, 사용자 프로그램은 운영체제에 시스템 콜이라는 서비스 대행 요청을 하여 입출력 수행
시스템 콜 : 소프트웨어적인 인터럽트
→ 사용자 프로그램이 시스템 콜을 할 경우 트랩이 발생해 CPU의 제어권이 운영체제로 넘어감