운영체제란?
운영체제란 컴퓨터 하드웨어 바로위에 설치되어 사용자 및 다른 소프트웨어와 하드웨어를 연결하는 계층이다. 컴퓨터 하드웨어를 직접적으로 다루면 매우 어렵고 복잡하기 때문에 운영체제라는 중간다리를 만듦으로서 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공한다. 또한 운영체제는 실행중인 프로그램을 메모리 공간에 적절히 분배함으로서 컴퓨터 시스템의 자원을 효율적으로 관리한다.
엄밀히 따지자면 좁은 의미의 운영체제는 "커널"이라 부르며 항상 메모리에 상주하는 부분을 의미한다. 넓은 의미의 운영체제는 커널 뿐 아니라 메모리 상주하지 않는 주변 유틸리티 시스템을 포함하는 개념이다.
운영체제는 동시작업 가능 여부로도 분류할 수 있다. 한 번에 하나의 작업만 처리하는 MS-DOS와 같은 운영체제와 동시에 명령이나 프로그램을 수행하는 UNIX, MS Windows가 있다 (현대 운영체제)
운영체제는 처리방식에 따라서도 분류할 수 있다. 일괄처리(batch processing) 운영체제는 작업요청들을 모아서 한꺼번에 처리한다. 시분할(Time sharing) 운영체제는 여러 작업을 일정한 시간단위로 분할해서 CPU에 할당한다. 하나의 작업을 완료할 때까지 기다리는 일관처리 대신 시분할 운영체제는 반응형(interactive) 방식을 구현할 수 있게 되었다.
운영체제 처리방식의 또하나의 종류로 실시간(Realtime OS) 방식이 있다. 정해진 시간 안에 어떠한 일이 반드시 종료됨을 보장하는 운체이다. 이 방식은 특수한 목적으로 완료 시간이 반드시 최우선으로 되어 원자로, 군사용 시스템에 자주 사용된다.
스케쥴링
CPU는 하드웨어라 생각을 못한다 그냥 코드를 읽어와서 계산만 수행하는 기계이다. 어떤 프로그램을 얼마나 CPU를 할당해서 수행할 것인지 정하는 것은 메모리 영역 가장 밑단에 있는 운영체제가 결정한다.
컴퓨터 자원을 분배하는데 있어 사용자간 형평적 & 효율적 분배가 핵심이다. 스케쥴링은 어떻게 컴퓨터 자원을 효율적으로 활용할지에 대한 전략이다. 스케쥴링에는 대표적으로 디스크 스케쥴링과 CPU 스케쥴링이 있다.
디스크는 CPU에 비해 백만배정도 느리다. 디스크가 워낙 느리다보니 프로그램 A로부터도 오고 프로그램 B로부터도 오고 요청이 밀리게 된다. 이때 요청이 온 순서대로 처리하면 자원이 굉장히 비효율적이다. 따라서 순서를 뒤바꿔서라도 자원을 최적화하여 활용하기 위해 운영체제는 디스크 스케쥴링을 한다. 즉 디스크 스케쥴링은 디스크에 들어온 요청을 어떤 순서로 처리할까? 에 대한 전략이다.
CPU는 하드웨어라 생각을 못한다 그냥 코드를 읽어와서 계산만 수행한다. 어떤 프로그램을 얼마나 CPU를 할당해서 수행할 것인지 정하는 것은 메모리 영역 가장 밑단에 있는 운영체제가 결정한다. CPU 스케쥴링은 바로 운영체제에 의해 어떤 프로그램에게 CPU 사용권을 줄건지 순서를 매기는 것과 같다.
유닉스 (UNIX)
대표적인 운영체제의 예시로는 유닉스가 있다. 기존의 운영체제를 만들기위해서 어셈블리어를 사용했는데 이는 너무 복잡하고 힘든 작업이었다. 유닉스를 만들때는 이 작업을 간소화하고자 새로운 프로그래밍 언어를 만들었다. 이때 새로만든 언어가 바로 C언어이다. 유닉스가 가장 대표적인 운영체제가 된 이유중 하나는 소스코드가 무료로 공개되어있다는 것과 높은 이식성을 가지고 있다는 것이다. (서로다른 하드웨어(컴퓨터) 기기라도 쉽게 적용시킬 수 있다.) 이는 C언어 때문에 가능했는데 서로 다른 어셈블리어를 사용하더라도 C언어를 통해 퉁칠 수 있기 때문이다. 유닉스의 또다른 장점은 커널(메모리에 항상 상주하는 녀석)이 매우 작다. 최소한의 커널 구조를 통해 확상성이 높아진다.
용어 정리
Multi Tasking
엄밀히 말하면 CPU에서는 하나의 작업만 수행한다. 짧은 시간에 여러작업을 돌려서하다 보니 동시에 하는 것처럼 보이는 것. 이렇게 짧은 시간동안 시분할로 CPU가 작업을 처리하는 것을 Multi Tasking이라 부른다. (포괄적인 용어)
Multi Programming
메모리에 여러프로그래밍이 동시에 올라가는 방식을 Multi Programming 이라 부른다. 멀티태스킹과 같지만 메모리적인 측면을 강조한 용어
Time Sharing
CPU의 시간을 분할하여 나누어쓴다는 의미를 강조하는 용어
Multi Process
Multi Proecess도 시분할로 여러프로그램을 동시에 처리하는 듯한 모습을 보여주는 용어로 Multi tasking과 같다.
Multi Processor
이 용어는 Multi tasking 과 다른 의미를 지닌다. 멀티 프로세서는 하나의 컴퓨터에 CPU(processor)가 여러개가 있어 여러 CPU가 프로세스들을 처리함을 의미한다. 어떻게 보면 진짜 일을 동시에 처리하는 것이라고 볼 수 있다. (하드웨어적으로 다르다)
컴퓨터 구조와 운영체제 작업 처리 방식
CPU는 메모리에 올라와있는 기계어를 가져와서 작업을 수행한다. 메모리의 어떤 명령어를 가져올지는 CPU 옆에 있는 프로그램 카운터(Program Counter) 레지스터가 가리키는 주소를 통해 알 수 있다. CPU가 레지스터가 가리키는 주소 명령어를 읽어와 열심히 일하고 있을 때 I/O작업등 잠깐 멈추고 다른 작업을 해야할 때가 있다. 일하고 있던 CPU의 작업을 멈추는 방법은 interrupt 이다. CPU는 기계어를 실행시키기에 앞서 interrupt 유무를 확인한다. interrupt line 에서 interrupt 이 확인되면 자동적으로 CPU 권한은 운영체제에게 넘어간다. 이때 CPU 권한이 운영체제에게 넘어갔음(커널 모드)을 표시하기 위해 mode bit은 0 으로 설정된다. 이렇게 사용자 프로그램 실행중 I/O작업을 위해 운영체제에게 요청하는 것을 system call 이라고 부른다.
하던 작업이 잠깐 멈추고 (interrupt call) 하고 들어온 작업을 수행한뒤에 원래 작업으로 돌아오려면 이전 작업하고 있던 메모리주소가 필요하기 때문에 인터럽트 당한 시점의 레지스터와 프로그램 카운터를 저장한 후 CPU제어를 interrupt 처리루틴에 넘기게 된다. 이러한 작업 정보 저장을 Context save 라고 한다.
위 작업을 정리하면 결국 원래의 사용자 프로그램이나 다른 사용자 프로그램을 실행시키기 위한 과정이라고 볼 수 있다.
- 인터럽트 발생 및 커널 모드 전환 (모드 비트 = 0)
- 현재 실행 상태 저장 (컨텍스트 저장)
- 운영체제가 인터럽트 또는 시스템 호출 처리 (운체가 다른 사용자 프로그램 실행 or 현재 프로그램 계속 실행 결정)
- 실행 상태 복원 (컨텍스트 복원)
- 사용자 모드로 전환 (모드 비트 = 1)
- 사용자 프로그램 재개
만약 하나의 사용자 프로그램에서 무한 루프가 돌아서 CPU권한이 운체에게 평생 넘어가지 않을 수도 있다. 이를 방지하기 위해 Timer가 존재한다. timer를 통해 운영체제는 프로그램마다 일정시간을 할당하고 CPU를 넘긴다. 하나의 프로그램에서 무한루프가 돌더라도 일정시간이 지나면 OS가 다시 CPU 주도권을 가져와 다른 프로그램에게 CPU 권한을 줄 수 있다.
I/O 작업 처리에 있어 동기와 비동기 처리방식이 있다. 동기식은 I/O 입출력시 시스템 콜을 한 후 입출력 작업이 완료된 이후에야 커널이 사용자 프로그램에게 CPU를 넘기는 방법이다. 여기서는 I/O 가 완료될 때 가지 OS가 CPU를 점유하게 된다. 비동기식은 I/O 입출력시 시트템 콜을 하고 입출력이 I/O 디바이스에서 실행되면 작업이 끝나기 전에 OS가 다른 사용자 프로그램에게 CPU를 바로 넘긴다. 두경우 모두 I/O 작업이 끝나면 interrupt를 CPU에 보낸다. 디바이스로부터 결과값을 가져와서 먼가 해야할 때는 동기식으로 처리해야하지만 CPU가 놀고 있는 것을 방지하기 위해 I/O가 완료될 때까지 해당 프로그램에게서 CPU를 뺏고 I/O 처리를 기다리는 줄에 프로그램을 줄 세우고 다른 프로그램에게 CPU를 주는 방식이 사용된다.
Interrupt도 일종의 오버헤드이다. 특히 고속 I/O 장치의 경우 인터럽트가 너무 자주 발생해 성능저하 문제를 일으킬 수 있다. 예를들어 지금 내가 치고 있는 타자 하나하나 입력될 때마다 CPU에 interrupt 가 걸리면 성능 저하가 심화될 것이다. 이런 작은일들은 I/O버퍼에 특정 크기만큼 저장해둔다. DMA(direct memory access)는 버퍼에 저장되어 있던 I/O 값을 직접 메모리에 블록단위로 복사해서 메모리에 저장한다. 따라서 바이트 단위가 아닌 블록 단위로 인터럽트가 발생해 CPU 부하를 감소시킨다.
컴퓨터 시스템에서 CPU가 I/O 작업을 요청할 때, 두 가지 방식으로 접근할 수 있습니다: 포트-기반 I/O(Port-Mapped I/O 또는 Isolated I/O)와 메모리-매핑 I/O(Memory-Mapped I/O) 이다.
포트-기반 I/O(Port-Mapped I/O 또는 Isolated I/O)
포트-기반 I/O는 I/O 장치와의 통신을 위해 별도의 I/O 공간(주소 공간)을 사용하는 방식이다. CPU는 I/O 장치를 제어하기 위해 특정 I/O 포트를 사용한다다. (메모리 주소와는 별개의 공간)
메모리-매핑 I/O(Memory-Mapped I/O)
메모리-매핑 I/O는 I/O 장치를 메모리 주소 공간 내에 배치하여, CPU가 일반 메모리에 접근하는 것처럼 I/O 장치에 접근하는 방식이다. O 장치는 메모리의 특정 주소 범위에 매핑되며, 이를 통해 CPU가 표준 메모리 접근 명령어를 사용해 I/O 장치와 통신한다.
저장장치 구조
위 저장계층 구조를 보면 맨위에는 CPU가 있다고 볼 수 있다. CPU는 아래 Register가 가리키는 명령을 따라가고 이후 아래 데이터를 이용하며 작업이 진행되는 방식이다. 즉 저장장치 계층 구조에서 원본 데이터는 항상 하위 계층에 있고 상위 계층에서는 필요한 정보만 뽑아쓰는 방식이라고 볼 수 있다. 하지만 언제나 정보를 아래에서 위까지 계속 끌어다 쓰면 오버헤드 문제가 있기 때문에 자주 사용할 정보는 상위 계층에 공간을 따로 만들어 저장해서 재사용할 경우 하위 계층까지 내려가지 않고 바로 가져다 쓴다. 이러한 정보를 복사해서 상위 계층에 저장해놓는 시스템을 Caching 이라고 부른다. 물론 용량에 제한이 있기 때문에 최대한 재사용성이 높은 정보를 저장해야 한다. (Primary는 excutable한 메모리, Secondary는 I/O 작업을 거쳐야하는 메모리). - 속도면에서도 윗단으로 갈 수록 빠르기 때문에 캐시메모리는 필수.
프로그램의 실행
실행파일들은 하드디스크에 파일시스템으로 저장되어 있고 이를 실행시키면 램메모리에 올라가 프로세스가 된다. 하지만 이를 정확하게 말하면 디스크에서 램에 바로 올라가는 것이 아닌 사이에 가상메모리를 거치게된다. 가상 메모리에서 프로세스만의 독자적인 주소 공간이 만들어지고 이 주소공간은 코드/스택/데이터로 구성된다. 이렇게 가상 메모리에 형성된 공간은 전부 물리적 메모리에 올라가는 것이 아닌 필요한 부분만 올라가게 된다. 가상메모리에는 있지만 물리적 메모리에 올라가있지 않은 부분은 디스크 공간인 swap area에 남아있게 된다. 이후에는 항상 메모리 공간에 상주하고 있는 커널(OS)과 다르게 각 프로세스들은 자신의 할 일이 끝나면 메모리에서 사라진다. 여기서 전원이 나가면 파일시스템의 데이터만 보존되고 물리메모리, Swap area 공간은 사라지게 된다.
커널또한 일종의 프로세스로서 code / data / stack 공간을 보유하고 있다. 커널(운영체제)의 가상메모리를 들여다보면 위와같이 구성되어 있다.
커널의 코드
커널의 코드영역에는 시스템콜과 인터럽트 처리 코드 그리고 자원 관리와 기타 서비스를 위한 코드가 내재되어 있다
커널의 데이터
커널의 데이터 영역에는 모든 하드웨어들을 관리하기 위한 자료구조, 모든 프로세스들을 관리하기 위한 자료구조를 가지고 있다. 이때 프로세스를 관리하기 위한 자료구조를 PCB라고 부른다. PCB(process control block)는 프로세스 상태를 관리하고, 문맥 교환(context switch) 시 프로세스 상태를 저장하고 복구하는 데 사용된다.
커널의 스택
실행되는 각 프로세스는 자신만의 커널 스택을 가지고 있으며, 해당 프로세스가 커널 모드에서 실행될 때 사용된다
결국 모든 프로그램은 함수로 되어있다. 이러한 함수의 종류에는 사용자 프로그램이 사용하는 함수는 사용자 정의 함수, 라이브러리 함수, 커널 함수 3가지가 있다.
- 사용자 정의 함수는 자신의 프로그램에서 정의한 함수(ex. 개발자가 정의한 함수)이다.
- 라이브러리 함수는 외부에서 가져다 쓴 함수로 자신의 프로그램 실행파일에 포함되어 있다.
- 커널함수는 운영체제 프로그램의 함수로 시스템 콜이 동작하는 함수이다.
함수의 종류에 따라 거쳐가는 주소공간 또한 다르다. 사용자 정의 함수와 라이브러리 함수는 사용자 프로그램 주소공간의 코드가 user mode에서 실행된다. 반면에 시스템 콜이 불리면 운영체제에게 넘어가 kernel 주소공간의 커널함수가 실행된다. 즉 프로그램이 실행된다는 것은
사용자 프로그램 주소공간의 사용자저정의/라이브러리 함수 -> 시스템콜 -> 커널공간의 커널함수 -> ,,,
반복하다 프로그램이 끝나는 것이다.
https://core.ewha.ac.kr/publicview/C0101020140307151724641842?vmode=f
'Computer Science > Operating System' 카테고리의 다른 글
Deadlocks (0) | 2024.06.07 |
---|---|
Process Synchronization (0) | 2024.06.04 |
CPU Scheduling (0) | 2024.06.02 |
Process Management (0) | 2024.06.02 |
Process (0) | 2024.05.31 |