운영체제의 역할은 사용자 인터페이스와 자원관리를 위한 것이다.
일괄처리는 다수개의 프로그램을 읽어 저장해 놓되, 한 번에 한 개씩의 프로그램을 실행시켜 주는 방식이다. 왜 다수개의 프로그램을 읽어서 저장해두고, 하나씩 처리하는 것이냐? 면접을 예시로 들면, 여러 명의 면접자를 대기시켜두고, 순서대로 면접 보는 것과 같은 맥락이다.
한 명 끝나고 또 오라고 하고 기다리는 것보다는 여러명을 대기시켜두는 게 소모되는 시간을 줄이고, 스무스하게 연결짓는 거다.
이게 운체에서는 job-to-job의 transition을 스무스하게 한다라고 한다.
그래서 요즘은 일괄처리를 하되, 다중 프로그래밍을 통해서 한 번에 하나씩이 아닌, 한 번에 여러개의 일을 동시에 처리하는 Batch로 발전했다.
운영체제는 다중 프로그래밍 시스템, 다중처리 시스템, 시분할 시스템, 대화식 시스템과 같이 사용자에게 보다 나은 서비스를 제공하기 위해 발전해왔다. 덕분에 효과적인 자원관리가 가능하게 된 거다.
초기 일괄처리는 사실 CPU를 효율적으로 사용하지 못한다. 한 번에 한 개의 작업을 처리해주는 방식이기 때문이다.
입출력 장치가 필요한 시점에 CPU는 놀고 있는데, 그러면 효율성이 떨어진다. CPU (내가 고용한 일꾼)를 한시도 쉬지 않게 해줘야 한다. 그럴려면 메모리(RAM - 주기억장치)의 도움이 필요하다.
A라는 프로세스가 입출력이 발생해서 CPU가 놀고 있다면, 메모리에 있는 다른 프로세스B에게 줄 수 있게끔 해야 한다.
즉, 메모리에 여러 개의 프로세스가 올라가 있는 방식이 다중 프로그래밍 시스템이다.
그리고, 여러 개의 처리장치를 장착해서 동시에 여러 작업을 병렬적으로 실행해 처리 속도를 높이는 게 다중처리 시스템이다.
결론적으로 다중처리를 위해서는 다중 프로그래밍 시스템이 필수다.
그리고 시분할 시스템은 CPU가 처리해 줄 수 있는 시간을 작업 수에 맞춰 분할하여 각자에게 일정량만큼씩 분배해 번갈아 처리해가는 것을 말한다. 예를 들어, 빵 100개를 10명한테 나눠 줄 때, 1번사람한테 10개 주고 -> 2번한테 10개 주고.. 10번한테 10개 주는 게 아니라 1~10번 사람한테 빵을 하나씩 주고, 다시 또 하나씩, 하나씩 흩뿌리는 거와 같다고 보면 된다. 어떤 차이가 있냐면, 전자의 방법은 10번 사람이 빵을 받기까지 꽤 많은 시간이 걸린다는 점이다. 근데 후자는 10번까지 우선 빵을 하나씩 받아서 그 빵을 먹는 동안에 다시 또 새 빵을 받게 되어서 빵 먹는데 흐름이 안끊긴다라는 점이다.
시분할 시스템 역시 여러 사람에게 빵을 줘야 하는 거니까 다중 프로그래밍 시스템이 필수다.
대화식 시스템은 시스템과 사용자가 모니터와 입력 장치를 통해서 마치 대화하듯이 일을 처리해 나가는 방식이다.
시분할 시스템을 통해서 바로바로 사용자에게 응답해줄 수 있는 장점을 보기 위해 모니터를 사용하고, 그 다음 요구사항을 위해 키보드/마우스 등을 사용한다고 보면 된다.
운영체제에서 커널은 핵심이고, 관리자이자, 메모리 상주 프로그램이다. 주기억 장치의 용량 문제로 인해 커널과 유틸리티로 나눠서 한정된 용량의 메모리에 운영체제의 커널이 올라간다. for 다중 프로그래밍을 위해서는 쩔 수 없다.
그리고 많은 프로그램들이 있는데, 이 프로그램들이 실행될 때 적용받게 되는 모드가 있다. 커널모드, 유저모드
각각의 프로그램은 이 둘 중 하나의 모드에서 실행된다. 이 두 모드를 왔다갔다 하기 위해서는 시스템 콜이 필요하다.
유저모드일 때는 해당 프로그램들이 유틸리티에 속해서 실행될 때의 모드라고 보면 된다. 커널이 아닌 유틸리티!
커널모드에 속하는 건, 인터럽트 제어/입출력 인터페이스, 입출력 요청을 실제 입출력 하드웨어에 맞는 형식으로 변하게 하는 것, 스레드나 프로세스의 실행 순서를 정하고 동기화와 비동기 호출 및 전원과 관련된 것 등이 있다.
커널이 주기억장치에 올라가는 건 전원이 켜져 부팅되었다는 것을 의미한다. 부팅을 위해 동원되는 부트 프로그램은 ROM이라는 곳에 저장되어 있다.
운영체제는 자원관리를 효율적으로 해야 한다. 그러기 위해서는 각 자원들의 현 상황을 효율적으로 알아야 한다.
파악할 수 있는 첫 번째 방법은 Polling 폴링이다. CPU가 일정한 시간 간격을 두고 각 자원들의 상태를 주기적으로 확인하는 방식이다.
자원들은 폴링 신호를 받으면 자신의 상태/원하는 것을 CPU에게 알려준다. 즉, 자원들은 자신의 상태를 적어놓을 수 있는 곳에 저장시키고 CPU는 폴링 때 그것을 읽어보는 거다. like, 입출력 장치의 버퍼 바이브
폴링 시에 폴링의 간격을 잘 정해야하고, 동시에 각 자원들은 직전 폴링 이후 변환된 자신의 상태를 다음번 폴링 때까지는 알 수 없다는 점이다. 또, 아무 변화가 없어도 CPU는 폴링에 일정량의 시간을 들여야 한다는 문제가 있다.
이에 반해 두 번째로 인터럽트라는 것도 있는데 자원들이 능동적으로 자신의 상태 변화를 CPU에게 알리는 방식이다.
덕분에 따로 시간을 들이지 않고, 자원들은 상황이 발생하면 즉시 알려서 처리를 받을 수 있어서 폴링에 비해 훌륭한 방식이다. 요즘 대부분의 시스템이 채택하고 있다고 한다.
여기서 말하는 자원은 하드웨어 자원, 즉 장치/주변장치를 의미한다. 이로 인한 인터럽트가 하드웨어 인터럽트이다.
이에 반해서 CPU가 스스로 자신에게 인터럽트를 해야 하는 상황도 있다. 이건 소프트웨어 인터럽트인데, 예를 들어 0으로 나누는 명령은 오류가 발생하는 명령인데 이와 같은 명령이나 다른 사용자 주소를 참조할 경우에 CPU가 자신에게 인터럽트를 거는 거다. 트랩Trap 이라고도 부른다.
오류가 아니더라도 입출력을 위해서 커널모드로 가기 위한 시스템 콜도 소프트웨어 인터럽트에 해당한다.
인터럽트의 과정을 좀 더 구체적으로 들어보자면, 장치가 인터럽트 신호를 CPU에게 보내고 이때 CPU는 명령어를 실행 중이었다면, 이 명령어를 마저 완료시키고 인터럽트 신호를 확인한다. 그러면 현재 실행 중이던 프로그램이 인터럽트 후에 다시 재개되려면 현 상태의 정보를 시스템 스택에 저장한다. PC Register의 값 즉, 스레드마다 존재하는 건데 어디 명령어까지 수행됐는지에 대한 것을 저장한다.
여하튼, 인터럽트 처리 루틴의 시작 주소를 통해 실행시키면 인터럽트가 된다.
그 후 처리가 끝나면 이전 저장했던 레지스터 값을 다시 재저장해서 이전 실행 중단된 부분부터 계속해서 이어나간다.
'⭐️ Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] CPU 스케줄링, 프로세스 상태, CPU 스케줄링 기법 (1) | 2022.09.06 |
---|---|
[운영체제] 질문1. 프로세스와 스레드 (0) | 2022.08.27 |
[운영체제] 3. 프로그램과 프로세스, 스레드, PCB, Context Switching (0) | 2022.08.21 |
[운영체제] 2. 메모리계층, 가상메모리, 스와핑, 페이지폴트, 스레싱 (0) | 2022.08.21 |
[운영체제] 1. 운영체제와 컴퓨터, 인터럽트, 시스템콜과 modebit (0) | 2022.08.21 |