운영체제(1) - 운영체제란?(1)
‘운영체제’를 공부하여 정리한 내용입니다.
1. OS(운영체제)가 할 일
컴퓨터 시스템의 구성요소
- 하드웨어: CPU, 메모리 및 입출력(I/O) 장치
- 응용 프로그램
OS는 하드웨어를 제어하고 응용 프로그램간의 하드웨어 사용을 조정한다.
- 컴퓨터에는 메모리, CPU 시간 등의 자원이 존재한다.
- OS는 이러한 자원을 적절히 나눠주어 모든 프로그램이 조화롭게 잘 돌아갈 수 있도록 도와준다.
사용자 관점
- 시스템 사용을 위해, 내부 컴퓨터 자원이 어떻게 공유되는지 사용자가 신경쓰지 않을 수 있도록 해준다.
- 다른 사람들과 함께 시스템을 공유하여 사용하는 경우는, 사용자들끼리 자원을 공유해야 하는데, 이 또한 OS가 매니징해준다.
- 여러가지 네트워크 혹은 프린트 서버가 연결되어 있는 경우, 이들의 자원 이용과, 개인의 사용 용이성을 위한 자원 이용을 OS가 관리해준다.
시스템 관점
- OS: Resource allocator
- Resource: CPU 시간, 메모리 공간, 파일 저장 공간, 입출력장치(모니터, 키보드 등)
- 프로세스들은 자원에 대해서 계속 요청하기에 이 요청을 적절히 처리 해주어야 한다. (때로는 공평하게, 때로는 우선순위에 따라)
- 사용자들이 많은 경우, 더욱 중요하다.
- OS: Control program
- 컴퓨터의 부적절한 사용을 방지
OS의 정의
- 정확한 정의는 없고, 그저 컴퓨터 시스템을 유용하게 만드는 과정에서 벌어지는 문제를 해결하기 위한 방법을 제공하는 프로그램이라고 생각하면 된다.
- 컴퓨터 시스템을 유용하게 만든다는 것이 와닿지 않는다면, 그냥 한 컴퓨터에서 여러 프로그램이 동시에 동작하게 해서 우리가 프로그램을 여러 창을 켜놓고 사용할 수 있는 이유도 OS 덕분이라고 생각하면 어떤 유용성인지 감이 올 것이다. 배우다 보면 참 대박이다 싶다.
OS는 기본적으로 컴퓨터에서 항상 실행되는 프로그램이다.
- 컴퓨터를 켜면 우선 OS는 계속 켜져 있는 것을 알 수 있다.
- 다른 프로그램은 껐다 켰다가 하는데
- 그게 OS를 기반으로 위에서 프로그램이 켜지는 것이기 때문이다.
- 이렇게 계속 켜져 있는 프로그램을 우리는 커널이라고 한다.
2. 컴퓨터 시스템의 구성
흥미로운 것을 위주로 정리해보겠다.
컴퓨터는 기본적으로 공유 메모리에 대한 접근을 제공하는 공통 버스를 통해 여러개의 장치 제어기와 하나 이상의 CPU로 구성되어 있다.
- CPU와 장치 제어기들은 이 메모리 접근권을 얻기 위해 경쟁한다.
- 메모리 제어기가 이 역할을 한다.
OS가 실행되기까지의 과정을 한번 확인해보자
- 컴퓨터가 구동을 시작하기 위해서는 실행할 초기 프로그램이 필요하다.
- 이를 우리는 부트스트랩 프로그램(Bootstrap program) 이라고 부른다.
- 이건 주로 ROM (주로 펌웨어라고 불린다)에 저장되어 있고 혹은, ROM에는 작은 부트스트랩 로더 프로그램이 있고, 이 로더가 실질적인 부트스트랩 프로그램을 디스크의 처음 섹터 인 MBR(Master Boot Record) 에서 가져온다.
- ROM은 수정하려면 ROM과 하드웨어 칩을 변경해야 하기에 소프트웨어적으로 업데이트가 안된다. 그래서 업데이트의 용이성을 위해서 후자의 방법을 주로 사용한다.
- 이 부트스트랩 프로그램은 시스템의 대부분을 초기화한다. 그 후 여러개의 파티션으로 나뉘어져 있는 하드디스크의 파티션 중에서 OS와 장치드라이버가 저장되어 있는 부트파티션으로 넘어가서 OS의 커널(계속 실행되는 프로그램)을 메모리에 적재하고 실행시킨다. (부트스트랩 프로그램은 이 OS가 어느 파티션에 있는지 알고 있다.)
- 부트파티션의 첫번째 섹터 부트 섹터라고 불리며, 이를 먼저 불러오고 나머지 서브 시스템 등을 로드하게 된다.
- 그 후 모든 프로세스의 부모가 될 ‘init’과 같은 첫번째 프로세스를 실행하고 event가 발생하기를 기다린다.
인터럽트
- 인터럽트의 경우는 컴퓨터구조(4)-프로세서(3)에서 소개한 예외의 설명과 거의 유사하다.
- 사실 조금 더 설명할 수 있겠지만, 중요한건 Vectored interrupt가 있다는 것이고 OS가 이 방법을 사용한다는 것이다.
- 참고로 인터럽트 처리가 끝나면 다시 원래 자리로 돌아오는 작업에도 여러가지 이슈가 걸려있는데, 이는 추후 내용이 나올 것이다.
- 추후에 여유가 있다면 이 부분에 대해서도 좀 더 자세히 다뤄보겠다.
저장장치 구조
- 이 내용도 컴퓨터구조(1) - 컴퓨터 추상화 및 관련 기술(2)에서 계층적인 구조를 가진다고 언급한적이 있다.
- 이 부분에 대해서는 이번에는 넘어가도록 하겠다.
- 그러니 나머지 중요한 내용을 짚고 넘어가겠다.
- 우리가 주로 생각하는 실행파일 자체는 보조 기억장치에 저장되어 있다.
- 그리고 이 실행파일이 실행될 때는 로더가 이를 주로 DRAM으로 이루어지는 RAM(메인 메모리)에 올려서 프로세스가 되어 동작하기 시작한다.
- 중요한 점은 프로그램은 사실 명령어들의 리스트로 이루어지기 때문에 우리는 이를 메모리에 저장하는 상태로 사용하고 이를 순서대로 읽는 방식으로 프로그램을 동작시킬 수 있다는 것이다.
- 이 부분에 대해서 명확히 감이 오지 않는다면, 컴퓨터구조를 공부하는 것을 추천한다.
입출력 구조
- 저장 장치는 여러 형태의 입출력장치 중 하나이다.
- 디바이스 드라이버
- 입출력 연산을 돕는 부분으로, 장치제어기의 적절한 레지스터(각자 로컬 버퍼가 있다)에 필요한 값을 적재하는 역할을 한다.
- 각 장치제어기는 모두 저마다의 디바이스 드라이버를 가진다.
- 각각 하는 일은 다를 수 있지만, OS에서 일관성 있게 접근하기 위해서, 모두 같은 인터페이스를 제공한다.
- 장치 제어기가 작업을 시작하고 완료하면, 인터럽트를 이용해서 디바이스 드라이버에게 통보한다.
- 디바이스 드라이버는 제어를 운영체제에게 반환하고 이때 데이터를 같이 반환한다.(필요에 따라)
- 작은 데이터를 보낼 때마다는 장치 제어기가 데이터를 저리하는 동안 CPU의 제어는 디바이스 드라이버가 가지고 있게 된다.(기다린다.)
- 이렇게 해도 되는 이유는 이 장치 제어기가 필요한 경우가 OS의 입장에서 봤을 때는 간헐적이고 작은데이터만 주고맏는 경우일 때만 가능하다.
- 말했듯이, 작은 데이터를 간헐적으로 보낼때는 위에서 말했던 인터럽트 구동방식에 별로 문제가 없다. 다만 문제는, 큰 데이터를 보낼 때이다.
- 그래서 큰 데이터를 보낼 때는 블럭 단위로 메모리에 전달할 수 있는 DMA(Direct Memory Access)를 사용해서 메모리를 보내고(블럭 단위로)
- 이 작업이 블럭단위로 마칠때마다 인터럽트가 발생한다.
- 전체 데이터를 작은 버퍼 단위보다는 큰 단위로 나누어 작업하는 것이다. 다만 일이 잘 되고 있는지 계속 확인하기 위해 블럭 단위를 보낼 때마다 인터럽트를 발생시키는 것이다.
- 블럭 단위의 데이터가 전송되고 있는 동안에는 CPU가 다른 작업을 수행하기 수월하다.
Leave a Comment