공부하기전, 지금까지 내가 알고 있었던 OS
OS의 존재는 알고있었지만, 어떤 일을 하는지는 정확히 모르겠다. 딱히 OS가 무슨 일을 하는지 느껴본 적이 거의 없어서 그런 것 같다. 그래도 C의 malloc, free를 해본 게 내가 OS를 느껴본 것 같다.
예로 사용자 (SW)가 원하는 만큼의 공간을 할당받고 싶다면, 힙에가서 시작하는 첫 주소를 OS가 다시 주는 것으로 하드웨어(칩)을 관리하는 것이 OS라고만 알고 있다.
그러면 정확히 OS란 뭘까?
앞서 말했듯이, OS는 하드웨어와 응용 프로그램 사이에 있다.
또한, 컴퓨터 시스템은 하드웨어, 소프트웨어 및 데이터로 구성되어 있고, OS가 이런 자원들이 적절히 잘 사용되도록 방법을 제공하는 것이다.
사용자 관점은 사용되는 인터페이스에 따라 달라진다.
OS는 대부분 사용의 용이성을 위해 설계되고, 자원의 이용에는 전혀 신경을 쓰지 않는다. 사용자가 독점하도록 설계됨
resource allocator, control program으로 본다.
CPU시간, 메모리 공간, 저장장치 공간 등 자원을 관리하고 부적절한 사용을 방지하기 위해 프로그램 수행을 멈추기도 한다.
CPU는 다른 구성요소인 장치 컨트롤러와 연결을 하는데, 사용되는 통로가 bus라고 불린다.
각 장치 컨트롤러마다 장치 드라이버가 있으며, CPU와 장치 컨트롤러는 병렬로 실행되어 메모리 사이클을 놓고 경쟁한다.
하드웨어는 언제든 시스템 버스를 통해 CPU에 인터럽트를 발생시킬 수 있고, CPU는 하던 일을 중단하고, 고정된 위치로 실행을 옮긴다.
고정된 위치는 인터럽트를 위한 서비스 루틴이 시작되어야 하는 시작 주소를 가짐
인터럽트 서비스 루틴이 실행되고, 완료되면, CPU는 인터럽트 되었던 연산을 재개한다.
인터럽트는 매우 빈번하게 발생하기 때문에, 처리속도가 빨라야 한다.
인터럽트가 요청되면, 인터럽트를 유발한 장치를 위한 인터럽트 서비스의 주소를 제공하기 위해, 이 주소의 배열을 담은 인터럽트 벡터가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 인식된다.
인터럽트 구조는 인터럽트된 모든 정보를 저장해야 인터럽트를 처리한 후 이 정보를 복원할 수 있다.
그래야 인터럽트 서비스를 한 후, 인터럽트에 의해 중단되었던 연산이 인터럽트가 발생하지 않은 것처럼 다시 시작된다.
위 세가지 기능은 CPU 및 인터럽트 컨트롤러 하드웨어에 의해 제공
1
CPU에는 2개의 인터럽트 요청 라인이 있다.
마스크 불가능 인터럽트에서는 CPU에 의해 꺼질 수 있고, 마스킹 가능한 라인은 장치 컨트롤러가 서비스를 요청하기 위해 사용된다.
2
인터럽트 체인을 사용
3
인터럽트 기법은 우선순위를 구현해놨음.
마스킹하지 않아도 우선순위가 낮은 것을 연기 가능
CPU는 메모리에서만 명령을 실행할 수 있어서 프로그램을 실행하기 위해선 메모리에 프로그램을 올려야 한다.
RAM이라고 불리며, 휘발성이다.
RAM은 비싸고 용량이 작기때문에, 프로그램의 데이터가 항상 RAM에 있는 것이 아님. 원래는 디스크에 존재
필요할때마다 RAM에 꺼내쓰는 것
위와 같은 문제를 해결하기 위해, DMA가 사용되고, 디스크에서 메모리로 데이터 블록 전체를 전송한다.
또한, 위와 같은 동작을 할때, CPU는 다른 작업을 할 수 있다.
프로세서가 2개 이상인 것, 처리량이 증가됨
하지만, 10개가 있다고 10배 효율적인건 아님. 어느 정도의 오버헤드가 발생하기 때문에 10배의 효과를 내고 싶다면 15개를 쓰던가 해야함
컴퓨터는 전원을 켜거나 재부팅을 할 때 초기 프로그램, 부트스트랩 프로그램을 실행해야 한다.
부트스트랩 프로그램은 OS를 적재하는 방법과 해당 시스템 실행을 시작하는 방법을 알아야 한다. 그렇게 하기 위해 부트스트랩 프로그램이 OS 커널을 찾아 메모리에 적재해야 한다.
커널이 실행되면, 시스템과 사용자에게 서비스를 제공할 수 있다.
그리고 인터럽트가 발생하면,system call을 요청된다.
복귀하지 않을 경우를 대비하여, 타이머라는 기능도 있다. 어느 정도 시간이 지나면 복귀하도록 해줌
실행중인 프로그램 = 프로세스
컴파일러, 문서편집 프로그램, SNS 다 프로세스
프로세스는 일을 수행하기 위해 CPU같은 자원을 필요로 하고, 그 과정에서 적절한 명령과 시스템 콜을 실행하여 원하는 정보를 얻고, 종료시 OS는 재사용 가능한 자원을 회수한다.
프로그램 그 자체가 프로세스가 아니다.
프로르갬은 디스크에 저장된 파일의 내용과 같이 수동적 개체지만 프로세스는 다음 수행할 명령을 지정하는 Program counter를 가진 능동적인 개체이다.
한 프로세스는 한 시스템 내의 작업의 단위이다. 이러한 시스템은 프로세스의 집합으로 구성되고, 프로세스 중 일부는 OS 프로세스이며, 나머지는 사용자 프로세스들이다.
OS는 프로세스 관리와 연관해 이런 활동에 대한 책임을 가진다.
1. 사용자 프로세스와 시스템 프로세스의 생성과 제거
2. CPU에 프로세스와 스레드 스케줄하기
3. 프로세스의 일시 중지와 재수행
4. 프로세스 동기화를 위한 기법 제공
5. 프로세스 통신을 위한 기법 제공
메모리는 엄청 큰 범위를 갖는 Byte의 배열이다.
각 바이트는 자신의 주소를 가진다.
주메모리인 RAM에 CPU가 직접 접근할 수 있다.
데이터를 처리하거나 write read할떄, CPU가 작업을 하려면 무조건 메모리에 있어야한다. (Disk controller, DMA가 일을 함)
또한, 절대 주소로 매핑되어야 한다.
메모리의 어느 부분이 사용되고 있는지 알아야함
필요에 따라 메모리 공간을 할당, 회수 해야함
어떤 프로세스들 메모리에 적재하고 내릴 건지
OS는 파일을 물리적 매체로 매핑하며, 저장장치를 통해 이들 파일에 접근한다.
파일관리를 위해 OS가 하는 일
1. 파일의 생성 및 제거
2. 디렉터리 생성 및 제거
3. 파일과 디렉터리를 조작하기 위한 프리미티브의 제공
4. 파일을 보조저장장치로 매핑
5. 안정적인(비휘발성) 저장 매체에 파일을 백업
메인 메모리는 휘발성이기 때문에 내용을 저장하기 위해선 Disk, 보조 저장 장치가 있어야 한다.
정보가 사용됨에 따라, 더 빠른 장치인 캐시에 일시적으로 복사된다.
따라서 특정 정보가 필요한 경우, 캐시를 먼저 조사해야 한다.
있다면, 바로 사용하고/없다면, 메모리에서 가져와서 사용해야 하며 캐시에 이 정보를 넣는다.
주 메모리를 위한 고속 캐쉬가 있고, 하드웨어를 통해 구현된 캐쉬도 존재한다.
주메모리는 보조 메모리를 위한 빠른 캐쉬라고 볼 수 있다.
보조 메모리의 데이터를 사용하기 우해 주메모리에 복사되어야하고, 안전하게 보관하기 위해 보조 메모리로 이동되기 전에 반드시 주 메모리에 있어야 한다.
다중 처리 환경에서 캐시 값에 유의해야함
캐시 일관성 문제가 생길 수 있음
리스트는 커널 알고리즘에 의해 직접 사용된다.
스택은 OS가 함수를 호출할 경우 종종 사용된다.
함수를 호출할 때, 인수,로컬 변수 및 리턴 주소 등이 스택에 푸쉬되고 함수로부터 복귀할 때 이들 항을 스택으로부터 팝한다.
CPU에서 수행을 기다리는 task들이 큐로 구성됨 (connect request)
CPU 스케줄링 알고리즘의 일부로 균형 이진 탐색 트리를 사용 (O(logn))
대량의 자원의 가용성을 표시할 때 사용, 디스크 드라이브 같은 곳