@notion
<운영체제와 정보기술의 원리> 반효경 저
1. 컴퓨터 시스템의 구조
컴퓨터는 외부장치에서 내부장치로 데이터를 읽어와 각종 연산을 수행한 후, 그 결과를 외부장치로 다시 내보내는 방식으로 업무를 처리한다.
- 전자는 입력(input), 후자는 출력(output)
- 내부장치: CPU, 메모리
- 외부장치(입출력(I/O) 장치): 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등
각 하드웨어 장치에는 컨트롤러라는 것이 붙어있다.
- 컨트롤러: 장치를 제어하는 일종의 작은 CPU
운영체제는 컴퓨터가 부팅되었을 때부터 항상 수행되면서 각종 자원들을 관리해야 하므로 항상 메모리에 올라가 있다. 하지만 운영체제의 모든 코드를 다 메모리에 상주시키면 메모리의 낭비가 발생하므로 항상 메모리에 올라가 있는 부분은 전체 운영체제 중 핵심적인 부분에 한정된다.
- 커널(kernel): 전체 운영체제 중, 항상 메모리에 올라가 있는 핵심적인 부분
2. CPU 연산과 I/O 연산
입출력 장치에서 로컬 버퍼로 읽어오는 일은 컨트롤러가 담당하며, 컨트롤러는 인터럽트를 발생시켜 이 작업이 끝났는지를 CPU에 보고한다.
- 로컬버퍼(local buffer): 장치 컨트롤러가 가지고 있는, 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
- 인터럽트: 컨트롤러들이 CPU의 서비스가 필요할 때 이를 통보하는 방법
기본적으로 CPU는 메모리에서 명령을 하나씩 읽어와 수행한다. 명령 하나를 수행할 때마다 인터럽트가 발생했는지 확인하고, 발생했으면 다음 명령을 수행하기 전에 인터럽트를 처리한다.
3. 인터럽트의 일반적 기능
다양한 인터럽트에 대한 처리 루틴은 운영체제 커널 내에 있다.
- 하드웨어 인터럽트 → 컨트롤러 등 하드웨어 장치가 인터럽트 라인을 세팅
- 소프트웨어 인터럽트(트랩) → 소프트웨어가 그 일을 수행
- 예외사항(exception): 사용자 프로그램이 0으로 나누는 연산 등 비정상적인 작업을 시도하거나 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 이에 대한 처리를 위해 발생시키는 인터럽트
- 시스템 콜(system call): 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법
운영체제는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터를 가지고 있다.
- 인터럽트 벡터: 인터럽트 종류마다 번호를 정해서 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조
실제 처리해야 할 코드는 인터럽트 처리 루틴 또는 인터럽트 핸들러라고 불리는 다른 곳에 정의된다.
4. 인터럽트 핸들링
- 인터럽트 핸들링: 인터럽트가 발생한 경우 처리해야 할 일의 절차
어떤 프로그램이 실행되던 중에 인터럽트가 발생하면 그 프로그램의 실행 상태를 PCB에 저장 후 CPU의 제어권이 인터럽트 처리 루틴으로 넘어가게 되며, 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 이어지게 된다.
- 제어블록(Process Control Block, PCB): 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 운영체제에 둔 자료구조로, 각각의 프로그램마다 하나씩 존재하며, 프로그램이 실행 중이던 코드의 메모리 주소와 레지스터값, 하드웨어 상태 등을 저장
운영체제는 인터럽트가 발생했을 때만 CPU의 제어권을 획득한다. 나머지는 사용자 프로그램이 CPU를 계속 점유하고 있다.
5. 입출력 구조
- 입출력(I/O): 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것
- 동기식 입출력: ****어떤 프로그램이 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식
동기식 입출력을 요청한 프로그램은 입출력이 완료될 때까지 다음 명령을 수행할 수 없기 때문에 그동안 CPU가 낭비된다. CPU의 효율적인 사용을 위해 입출력이 수행되는 동안 다른 프로그램에게 CPU를 양도하면 동시에 다수의 입출력 연산이 일어날 수 있으므로, 다수의 프로그램이 동시에 입출력 연산을 요청하는 경우 동기성(synchronization)을 보장하기 위해 장치마다 큐(queue)를 두어 요청된 순서대로 처리할 수 있도록 한다.
요청된 입출력 연산이 완료되면 CPU에게 입출력이 완료되었음을 인터럽트로 알려준다. 운영체제 커널은 인터럽트 처리루틴으로 가서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록 그 프로그램의 상태를 봉쇄 상태로부터 해제시킨다.
- 비동기식 입출력: 입출력 연산을 요청한 후에 연산이 끝나기를 기다리는 것이 아니라 CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식
비동기식 입출력에서는 읽어올 결과와 관련 없이 처리 가능한 작업부터 처리하며, 입출력 연산이 완료되면 마찬가지로 인터럽트를 통해 이를 CPU에 알리고 그 시점부터 읽어온 데이터를 필요로 하는 명령을 수행할 수 있게 된다.
- 예시
- 프로그램 A가 실행 중에 디스크에서 어떤 데이터를 읽어오는 명령을 만나게 되면 프로그램 A는 시스템 콜을 통해 CPU에게 일종의 소프트웨어 인터럽트를 발생시킨다.
- CPU는 지금까지 프로그램 A의 코드를 실행하던 일을 멈추고 현재의 상태를 저장한 후 인터럽트에 의해 처리해야 할 커널의 루틴으로 이동하여 컨트롤러에게 입출력 연산을 요청한다.
- 컨트롤러는 A가 요청한 데이터를 디스크로부터 자신의 로컬버퍼로 읽어온다.
- 그 동안 프로그램 A는 CPU를 다시 할당받지 못하게 된다. (봉쇄 상태)
- 운영체제는 CPU를 다른 프로그램 B에 할당한다.
- 정보가 로컬버퍼로 다 들어오면 컨트롤러는 CPU에게 입출력이 완료되었다는 사실을 인터럽트를 발생시켜 알린다. (하드웨어 인터럽트)
- 프로그램 B를 수행 중이던 CPU는 수행하던 지점 및 상태를 저장해놓고 인터럽트를 처리한다.
- 처리 루틴 → 로컬버퍼에 있는 A가 요청한 데이터를 A의 메모리 영역으로 읽어오고, A의 봉쇄 상태를 해제시켜 이제 A에게 CPU를 할당해도 됨을 표시
- 원래 수행하던 프로그램 B의 지점으로 돌아가서 하던 업무를 계속 수행한다.
- 프로그램 A는 자신의 차례가 되면 CPU를 할당받고 입출력 연산 이후의 작업을 수행한다.
6. DMA
컨트롤러가 CPU에게 인터럽트를 발생시키면 CPU는 컨트로러의 로컬버퍼와 메모리 사이에서 데이터를 옮기는 일을 하게 되는데, 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU 업무가 방해를 받게 되어 CPU 사용의 효율성이 떨어지는 문제점이 발생한다. 이러한 비효율성을 극복하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 하나 더 둔다.
- DMA(Direct Memory Access): 일종의 컨트롤러로서, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역할
7. 저장장치의 구조
- 주기억장치: 휘발성(volatile)의 RAM을 매체로 주로 사용
- 보조기억장치: 비휘발성(nonvolatile)의 마그네틱 디스크를 주로 사용
보조기억장치의 용도는 크게 두 가지로 구분된다. 첫 번째는 파일 시스템 용이다. 전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억장치에 저장한다. 두 번째는 스왑 영역 용이다. 메모리 공간이 부족한 경우 운영체제는 프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓는다.(=스왑 아웃) 이후 필요 시 다시 메모리 영역으로 올린다.
- 하드디스크: 보조기억장치의 가장 대표적인 저장매체로, 여러 개의 마그네틱 원판들이 있고, 암(arm)이 이동하며 원판에 저장된 데이터를 읽고 쓰는 방식으로 동작
8. 저장장치의 계층 구조
레지스터, 캐시 메모리, 메인 메모리 등의 휘발성 저장장치로 구성되는 부분이 상위에 존재하며 상위 저장장치 계층으로 갈수록 접근 속도가 월등히 빠르지만 용량은 상대적으로 적다. 하지만 당장 필요한 정보(e.g. 반복되는 코드)만을 선별적으로 저장하면 하위에 있는 큰 용량의 저장장치를 가지고 있는 것과 비슷한 성능 효과를 낼 수 있다.
- 캐싱 기법: 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적 기법
9. 하드웨어의 보안
우리가 흔히 사용하는 운영체제는 여러 프로그램이 동시에 실행될 수 있는 다중 프로그래밍(multi-programming) 환경에서 동작한다. 그러므로 각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간에 충돌을 일으키는 문제를 막기 위해 하드웨어에 대한 각종 보안 기법이 필요하다. 따라서 중요한 정보에 접근해 위험한 상황을 초래할 수 있는 연산은 커널모드에서만 실행되도록 하고, 일반적인 연산만 사용자 모드에서 수행하도록 통제하여 하드웨어의 보안을 유지한다.
- 커널 모드(kernel mode, system mode): 운영체제가 CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드로, 모든 종류의 명령을 다 실행 가능
- 사용자 모드(user mode): 일반 사용자 프로그램이 실행되며 제한적인 명령만 수행 가능
사용자 프로그램이 중요한 연산을 수행하지 않도록 CPU 내부에 모드비트(mode bit)를 두어 사용자 프로그램을 감시한다. 모드비트가 0으로 세팅되어 있으면 커널모드, 1로 세팅되어 있으면 사용자모드이며, CPU는 보안과 관련된 명령을 수행하기 전 항상 모드비트를 조사한다.
사용자 프로그램이 수행되다가 보안이 필요한 중요한 명령을 수행해야 할 경우에는 시스템 콜을 통해 운영체제가 대신해줄 것을 요청한다. 인터럽트 발생 시 모드비트는 자동으로 0이 세팅되고, 요청된 작업 후에는 다시 1로 만들어 사용자 프로그램에게 CPU를 넘겨준다.
- 특권명령: 시스템의 보안과 관련된 명령으로, 모드비트가 0일 때에만, 커널모드에서 운영체제에 의해서만 수행 가능
10. 메모리 보안
여러 프로그램이 메모리에 동시에 올라가서 실행되기 때문에 하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있으므로 인터럽트 벡터와 인터럽트 처리루틴이 있는 곳은 각별한 보안이 필요하다. 2개의 레지스터를 사용해서 프로그램이 접근하려는 메모리 부분이 합법적인지 체크하면 메모리를 보호할 수 있다.
- 기준 레지스터(base register): 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리상의 가장 작은 주소를 보관 (시작 주소)
- 한계 레지스터(limit register): 그 프로그램이 기준 레지스터값부터 접근할 수 있는 메모리의 범위를 보관 (프로그램 길이)
사용자 프로그램은 기준 레지스터값부터 기준 레지스터+한계 레지스터값 사이의 주소 영역에만 접근 가능하며, 이 범위에 없으면 예외상황이라는 소프트웨어적인 인터럽트를 발생시켜 CPU의 제어권을 해당 프로그램으로부터 운영체제로 이양시킨다.
메모리 접근 연산은 특권명령이 아니지만, 레지스터 값을 세팅하는 연산은 특권명령으로 규정해야 한다.
11. CPU 보호
CPU가 하나의 프로그램에 의해 독점되는 것을 막기 위해 운영체제는 타이머라는 하드웨어를 사용한다.
- 타이머: 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 하는 역할
- 로드 타이머(load timer): 타이머의 값을 세팅하는 명령으로 특권명령에 속한다.
타이머는 여러 프로그램이 CPU의 시간을 조금씩 나누어 사용하는 시분할 시스템에서도 사용된다.
12. 시스템 콜을 이용한 입출력 수행
입출력 명령은 특권명령이므로 사용자 프로그램은 직접 입출력을 수행하는 대신 운영체제에 시스템 콜이라는 서비스 대행 요청을 하여 입출력을 수행한다. 그러면 운영체제는 해당 시스템 콜을 처리하기 위한 루틴으로 가서 정의된 명령을 수행한다. 예를 들어 시스템 콜이 디스크 입출력 요청이었으면 디스크 컨트롤러에게 입출력 요청을 수행하도록 명령하고, 디스크 컨트롤러가 입출력 수행을 마치면 CPU에게 인터럽트로 입출력이 완료되었음을 알림으로써 해당 프로그램이 다시 CPU를 할당받을 수 있게 한다.
'books > OS' 카테고리의 다른 글
[OS] 디스크 관리 (1) | 2024.06.11 |
---|---|
[OS] 가상메모리 (2) | 2024.06.11 |
[OS] CPU 스케줄링 (1) | 2024.03.26 |
[OS] 프로세스 관리 (1) | 2024.03.24 |
[OS] 프로그램의 구조와 실행 (1) | 2024.02.06 |