사용자가 컴퓨터를 쉽게 다룰 수 있게 해주는 인터페이스로 한정된 메모리나 시스템 자원을 효율적으로 분배해 주며 다음과 같은 역할을 합니다
유저 프로그램이 맨위에 있고 그 다음 순서대로 GUI , 시스템콜 , 커널 , 드라이버 , 하드웨어가 존재합니다. 여기서 GUI와 시스템콜 , 커널 , 드러이버가 운영체제를 지칭합니다.
운영체제가 커널에 접근하기 위한 인터페이스이며 유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용합니다. 예를들어 유저 프로그램에서 파일 입출력을 할때 유저 모드에서 파일을 읽지 않고 커널 모드로 들어가 파일을 읽고 다시 유저 모드로 돌아가 나머지 유저 프로그램의 로직을 실행합니다. 이 과정으로 컴퓨터 자원에 대한 직접 접근을 차단할 수 있고 , 다른 프로그램으로 부터 보호할 수 있습니다.
시스템 콜이 작동될 때 modebit를 이용해 유저모드인지 커널모드인지 구분을 합니다. modebit는 1 또는 0의 값을 가지는 플래그 변수입니다.
CPU는 산술논리연산장치 , 제어장치 , 레지스터로 구성되어 있는 컴퓨터 장치로 , 인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석하여 실행하는 장치입니다.
제어장치가 계산할 값을 메모리와 레지스터에 로드합니다. 그 다음 제어장치가 레지스터에 있는 값을 계산하라고 산술논리장치에게 명령을 합니다. 제어장치가 계산된 값을 다시 레지스터에서 메모리로 계산된 값을 저장합니다.
어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키는 것을 말합니다. 키보드나 마우스 등 IO디바이스에 의한 인터럽트나 0으로 나누는 산술 연산에서의 인터럽트 , 프로세스 오류 등으로 발생합니다. 인터럽트가 발생하면 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수를 실행합니다. 인터럽트 간에는 우선순위가 있고 , 우선순위에 따라 실행되며 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉩니다.
키보드를 연결하거나 마우스를 연결하는 등 IO 디바이스에서 발생하는 인터럽트입니다.
트랩(trap)이라고도 하며 , 프로세스 오류 등 프로세스가 시스템콜을 호출할 때 발생합니다.
I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치로 , CPU에 너무 많은 인터럽트 요청으로 인한 CPU 부하가 발생할 수 있는 것을 막아주며 , CPU의 일을 부담하는 컨트롤러입니다.
전자회로에서 데이터나 상태, 명령어를 기록하는 장치이며 보통 RAM을 일컬어 메모리라 부릅니다. CPU는 계산을 담당하고 메모리는 기억을 담당합니다.
메모리 계층은 레지스터 , 캐시 , 메모리 , 저장장치로 구성되어 있습니다.
계층이 위로 올라갈수록 가격은 비싸지는데 용량은 작아지고 속도가 빨라지는 특징이 있습니다. 계층을 둔 이유는 경제성과 캐시때문입니다.
캐시는 데이터를 미리 복사해 놓는 임시 저장소이며 빠른 장치와 느린 장치사이에 속도 차이로 인한 병목 현상을 줄이기 위한 메모리입니다. 실제로 메모리와 CPU 사이의 속도 차이가 크기 때문에 중간에 레지스터 계층을 두어 속도 차이를 해결합니다. 이렇게 속도 차이를 해결하기 위해 계층과 계층사이에 있는 계층을 캐싱 계층이라고 합니다.
캐시 계층을 두는 것 말고 캐시를 직접 설정할 때가 있는데 , 자주 사용하는 데이터를 기반으로 설정합니다. 자주 사용하는 데이터에 대한 근거는 시간 지역성과 공간 지역성으로 나뉩니다.
최근 사용한 데이터에 다시 접근하려는 특성을 말합니다.
최근 접근한 데이터의 주변이나 가까운 지역에 접근하는 특징을 말합니다.
캐시에서 원하는 데이터를 찾았다면 캐시히트라고 하며 , 해당 데이터가 캐시에 없다면 주 메모리로 가서 데이터를 찾는 것을 캐시 미스라고 합니다. 캐시 히트를 하게되면 제어장치를 통해 가져오는데 위치가 가깝기 때문에 빠릅니다. 하지만 캐시 미스같은 경우 메모리에서 가져와야 하기 때문에 느립니다.
만료기간이 있는 키-값 저장소입니다. 쿠키를 설정할 때 스크립트로 조회할 수 없게 httponly 옵션을 거는 것이 중요하며, 클라이언트 또는 서버에서 만료기한 등을 정할 수 있으며 보통 서버에서 만료기간을 정합니다.
만료기한이 없는 키-값 저장소입니다. 웹 브라우저를 닫아도 유지되고 도메인 단위로 저장 , 생성됩니다. HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없으며 클라이언트에서만 수정 가능합니다.
만료기한이 없는 키-값 저장소입니다. 탭 단위로 세션 스토리지를 생성하며, 탭을 닫을 때 해당 데이터가 삭제됩니다. HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없으며 , 클라이언트에서만 수정할 수 있습니다.
컴퓨터가 실제로 사용 가능한 메모리 자원을 추상화하여 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말합니다. 이때 가상적으로 주어진 메모리를 가상 주소 ( logical address ) 라고하며 , 실제 메모리상에 있는 주소를 실제 주소 ( physical address ) 라고 합니다. 가상주소는 메모리관리장치( MMU ) 에 의해 실제 주소로 변환됩니다. 프로세스 주소 정보는 페이지 테이블
에 관리됩니다.
페이지 테이블에 있는 리스트를 보관하며 CPU가 페이지 테이블까지 가지않도록 해 속도를 향상시킬 수 있는 캐시 계층입니다.
가상 메모리에 존재하지만 실제 메모리인 RAM에 없는 데이터를 가지고 올때 페이지 폴트가 발생하는데, 이때 메모리에서 사용하지 않는 데이터를 하드디스크에 저장하고 , 해당 데이터를 불러오는 것을 말합니다.
프로세스 주소 공간엔 존재하지만 RAM에는 없는 데이터에 접근할 때 발생합니다. 페이지 폴드가 발생했을 때 먼저 CPU는 물리 메모리 공간을 확인해 해당 페이지가 없으면 트랩을 발생시켜 CPU의 동작을 일시 정지 시킵니다. 그 다음 운영체제가 가상 메모리와 물리 메모리에 페이지가 존재하는지 확인하고 없다면 스위핑을 합니다. 그런다음 페이지를 불러오고 페이지 테이블을 최산화 하여 CPU를 재개합니다.
메모리의 페이지 폴트율이 높은 것을 의미하며 , 컴퓨터의 심각한 성능 저하를 발생시킵니다. 페이지 폴트가 발생하면 CPU 이용률이 낮아지게 되고 운영체제는 가용성을 위해 더 많은 프로세스를 메모리에 올리되는 악순환이 반복됩니다. 이를 해결하기위해 지역성의 원리를 통해 미리 메모리를 로드하는 작업 세트와 페이지 폴트 빈도를 상한선과 하한선으로 조절하는 PFF가 있습니다.
메모리를 순차적으로 공간에 할당하는 것을 말합니다.
메모리를 미리 나누어 관리하는 방식으로 , 미리 나누어져 있기 때문에 융통성이 없으며 내부 단편화가 발생합니다.
내부 단편화 : 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 현상
매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용하며 , 외부 단편화가 발생할 수 있습니다. 가변 분할 방식의 종류로는 밑의 세가지가 있습니다.
외부 단편화 : 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 현상
메모리를 비연속적으로 할당하며 현대 운영체제가 사용하는 방법입니다. 메모리를 동일한 크기의 페이지로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당하는 것입니다.
동일한 크기의 페이지로 나누어 메모리를 서로 다른위치에 할당합니다. 홀의 크기가 균일하지만 주소 변환이 복잡해집니다.
페이지 단위가 아니라 의미 단위인 세그먼트로 나누는 방식입니다. 공유와 보안 측면에서 좋지만 홀의 크기가 균일하지 않습니다.
공유나 보안을 의미 단위인 세그먼트로 나누고 , 물리적 메모리는 페이지로 나누는 것을 말합니다.
먼 미래에 참조되는 페이지를 현재 페이지와 바꾸는 것을 말합니다. 불가능한 방법이지만 다른 알고리즘과 성능 비교를 위해 사용합니다.
가장 먼저온 페이지를 교체 대상으로 놓는 방법을 의미합니다.
참조가 가장 오래된 페이지를 바꿉니다. 오래된 것을 파악하기 위해 페이지마다 계수기와 스택을 두어야 하는 문제점이 있습니다.
일명 clock 알고리즘이며 0과 1 비트를 사용해서 가장 오래된 페이지를 찾습니다. 시계 방향으로 돌면서 참조되지 않은 비트인 0을 찾으면 해당 프로세스를 교체합니다.
참조가 가장 적은 페이지를 교체합니다.
프로세스는 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케줄링의 대상이 되는 작업입니다. 프로세스 내부에는 최소 한개의 스레드가 있는데 , 스레드 단위로 스케줄링합니다.
프로세스가 생성된 상태이며 PCB가 할당됩니다.
메모리 공간이 충분하다면 할당받고 아니면 대기하고 있으며 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태입니다.
CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태입니다. 이를 CPU burst가 일어났다고도 표현합니다.
어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태입니다.
메모리와 CPU 소유권을 모두 내려놓고 가는 상태입니다.
지역변수 , 매개변수 , 함수가 저장되고 컴파일 시 크기가 결정되며 동적
인 특징을 갖습니다. 스택 영역에서 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데 , 이때 스택과 힙의 메모리 영역이 겹치면 안되기 때문에 사이 공간을 비워놓습니다.
동적 할당할 때 사용되며 런타임 시 크기가 결정되고 동적
인 특징을 가집니다.
전역변수와 정적 변수가 저장되고 초기화 되지 않은 변수가 0으로 초기화되어 저장되는 BSS 영역과 0이 아닌 다른 값으로 할당된 변수가 저장되는 Data 영역으로 나뉩니다.
프로그램에 내장되어 있는 소스 코드가 들어가는 영역이고 수정 불가능한 기계어로 저장되어 있으며 정적
인 특징을 갖습니다.
운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터를 말하며, 프로세스가 생성되면 운영체제는 해당 PCB를 생성합니다. 프로세스가 생성되면 프로세스의 주소 값들이 메모리 구조를 기반으로 할당되며 , 메타데이터들은 PCB에 저장됩니다. 이는 프로세스의 중요한 정보를 가지고 있어 사용자가 접근하지 못하는 커널 스택 앞부분에 저장됩니다.
PCB를 교환하는 과정으로 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생됩니다. 컨텍스트 스위칭이 일어날 때 마다 유휴 시간이 발생하며 , 이뿐만 아니라 캐시미스라는 비용도 발생합니다.
프로세스가 가지고 있는 메모리 주소가 그대로 그대로 있으면 잘못된 주소 변환이 생기며 , 캐시클리어 과정을 하게 되는것을 말합니다.
여러개의 프로세스로 동시에 두 가지 이상의 일을 수행할 수 있는 것을 말하며 , 프로세스나 메모리중 일부에 문제가 발생해도 다른 프로세스를 이용해 처리할 수 있어 신뢰성이 높은 강점이 있습니다.
프로세스간의 데이터를 주고받고 공유 데이터를 관리하는 메커니즘을 말합니다. IPC 의 종류로는 공유 메모리 , 파일 , 소켓 , 파이프 , 메세지 큐가 있으며 메모리가 완전히 공유되는 스레드보다는 속도가 떨어집니다.
프로세스의 실행 가능한 가장 작은 단위로 , 프로세스는 여러 스레드를 가질 수 있습니다. 코드 힙, 스택, 데이터를 각자 생성하는 프로세스와 달리 , 스레드는 스택을 제외한 모든 영역을 공유합니다.
프로세스 내 작업을 여러 스레드로 처리하는 기법이며 스레드는 서로 자원을 공유하기 때문에 효율성과 동시성이 높습니다. 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어진 프로세스에 영향을 줄 수 있습니다.
각 프로세스나 스레드가 함께 접근할 수 있는 자원이나 변수를 의미하며 , 이 공유자원을 두 개 이상의 프로세스가 읽거나 쓰는 상황을 경쟁 상태 ( Race Condition ) 라고 합니다. 접근의 타이밍이나 순서가 결과값에 영향을 미칠 수 있습니다.
둘 이상의 프로세스나 스레드가 접근순서에 따라 결과가 달라지는 코드 영역을 말하며 임계 영역을 해결하기 위해 뮤텍스 , 세마포어 , 모니터가 있으며 이 방법들은 상호 배제 , 한정 대기 , 융통성을 만족합니다.
공유 자원을 lock을 통해 잠금 설정하고 사용한 후 unlock을 통해 잠금 해제하는 방식입니다. 잠금 설정하면 다른 프로세스나 스레드가 접근할 수 없으며 잠금 해제되면 접근할 수 있습니다.
일반화된 뮤텍스로 간단한 정수와 wait 함수와 signal 함수로 공유 자원의 접근을 처리합니다. wait 함수는 자신의 차례가 올 때까지 기다리는 함수이며 , signal 함수는 다음 프로세스에게 순서를 넘겨주는 함수입니다. 이때 0과 1의 값만 가지는 바이너리 세마포어와 여러 자원에 대한 접근을 제어하는 카운팅 세마포어가 있습니다.
바이너리 세마포어는 일반 뮤텍스와 비슷하지만 뮤틱스는 잠금 매커니즘이고 세마포어는 신호 매커니즘입니다.
공유자원에 안전하게 접근할 수 있게 공유 자원을 숨기고 접근에 대한 인터페이스를 제공하며 모니터 큐를 통해 공유 자원의 작업을 순차적으로 처리합니다. 세마포어보다 구현하기 쉬우며 상호배제가 자동으로 됩니다.
두 개 이상의 프로세스들이 서로 가진 자원을 기다리며 중단된 상태입니다.
현대 운영체제는 교착 상태가 발생하기 드물며 , 이를 처리하는 비용이 더 커서 사용자가 작업을 종료하는 방법을 사용하고 있습니다.
스스로 CPU 소유권을 포기하는 방식이며 , 강제로 프로세스를 중지하지 않습니다. 따라서 컨텍스트 스위칭으로 인한 부하가 적습니다.
가장 먼저 온 것을 가장 먼저 처리하는 알고리즘입니다. 길게 수행되는 프로세스때문에 준비 큐에서 오래 기다리는 현상인 Convoy effect 가 발생하는 단점이 있습니다.
실행시간이 가장 짧은 프로세스를 먼저 실행하는 알고리즘입니다. 긴 시간을 가진 프로세스가 실행되지 않은 Starvation 현상이 일어나며 평균 대기시간이 가장 짧습니다. 하지만 실제 실행 시간을 알 수 없기 때문에 과거 이력을 토대로 추측합니다.
SJF에서 긴 시간을 가진 프로세스는 실행되지 않는 단점을 개선한 알고리즘으로, 오래된 작업일 수록 우선순위를 높이는 방법인 aging
을 이용합니다.
현대 운영체제가 사용하며 사용중인 프로세스를 강제 중지하고 다른 프로세스에게 CPU 소유권을 할당하는 방식입니다.
현대 컴퓨터가 쓰는 우선순위 스케줄링의 일종으로 각 프로세스마다 동일한 시간을 주고 그 시간안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘입니다. 일반적으로 전체 작업 시간은 길어지지만 평균 응답 시간은 짧아지는 특징이 있습니다.
SJF 와 비슷하지만 중간에 더 짧은 작업이 들어오면 수행중인 작업을 중지하고 해당 프로세스를 수행합니다.
우선순위에 따른 준비 큐를 여러 개 준비하고 , 큐마다 다른 스케줄링 알고리즘을 사용합니다. 큐 간의 프로세스 이동이 되지않아 스케줄링 부담이 적지만 유연성이 떨어집니다.