운영체제 간단 정리

김민오·2022년 9월 12일
0

운영체제의 역할

  • CPU 스케줄링
  • 프로세스 관리
  • 메모리 관리
  • 디스크 파일 관리
  • 입출력 장치 관리

운영체제의 구조

  • GUI
  • 시스템 콜
  • 커널
  • 드라이버

시스템 콜 : 운영체제가 커널에 접근하기 위한 인터페이스, 유저가 작성한 픞로그램이 운영체제의 서비스를 이용하기 위해 커널 함수를 호출할 때 사용된다.

CPU : 산술논리연산장치, 제어장치, 레지스터로 구성되어 있으며 메모리에 존재하는 명령어를 해석하여 실행한다.

산술논리연산장치 : 논리 연산을 계산하는 디지털 회로이다.

제어장치 : 프로세스 조작을 지시하는 CPU의 부품이다.

레지스터 : CPU 내부에 존재하는 매우 빠른 임시기억장치이다.

메모리 계층

  • 레지스터
  • 캐시(L1, L2)
  • RAM(주기억장치)
  • HDD, SDD(보조기억장치)

캐시히트/캐시미스 : 캐시에서 원하는 데이터를 찾았을 경우 캐시히트, 없다면 다시 주 메모리로가서 데이터를 찾는 것을 캐시미스라고 부른다.

가상 메모리 : 컴퓨터가 실제로 가용할 수 있는 메모리 자원을 추상화하여 사용자들로 하여금 큰 메모리로 보이게 만드는 것이다. 이와 같은 관리 기법으로 사용자는 실제 주소를 의식할 필요 없이 프로그램을 작성할 수 있다.

페이지 : 가상 메모리를 사용하는 최소 크기 단위

프레임 : 실제 메모리를 사용하는 최소 크기 단위

페이지 폴트 : 프로세스의 주소 공간에는 존재하지만 메모리에는 존재하지않는 데이터에 접근했을 경우 발생하는 현상이다. 이 현상이 발생할 경우 운영체제는 해당되는 데이터를 메모리에 올려서 마치 페이지 폴트가 발생하지 않은 것 처럼 작동하게 해준다.

메모리 스와핑 : 가상 메모리에는 존재하지만 실제 메모리에 적재되지않은 데이터 혹은 코드에 접근할 경우 페이지 폴트가 발생한다. 따라서 공간을 보다 효율적으로 사용하기 위해 사용되지 않은 공간은 하드디스크로 내리고 필요한 경우에 메모리로 올린다. 이와 같이 메모리를 효과적으로 사용하는 전략을 스와핑이라고 부른다.

메모리 할당 : 메모리에 프로그램을 할당할 때, 시작 메모리의 위치와 메모리의 할당 크기를 바탕으로 할당하는데 연속 할당과 불연속 할당으로 나뉜다.

메모리 연속 할당 : 메모리에 연속적으로 공간을 할당한다.

  • 고정 분할 방식 : 메모리를 미리 나누어 관리하는 방식이다. 미리 나누기 때문에 융통성이 없으며 내부 단편화가 발생한다.
  • 가변 분할 방식 : 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용한다. 외부 단편화가 발생할 수 있다.

내부 단편화 : 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 발생하는 현상

외부 단편화 : 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 발생하는 현상

메모리 불연속 할당 : 메모리에 불연속적으로 공간을 할당한다.
메모리를 동일한 크기의 페이지로 나누고 프로그램마다 페이지 테이블을 만들어서 이를 통해 메모리에 프로그램을 할당한다.

페이징 : 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당한다.

세그멘테이션 : 세그먼트 단위로 나눈다.

페이지드 세그멘테이션 : 공유나 보안을 의미단위의 세그먼트로 나누고 물리적 메모리는 페이지로 나눈다.

페이지 교체 알고리즘

  • FIFO : First In First Out의 약자로 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법이다.
  • LRU : Least Recentle Used의 약자로 참조가 가장 오래된 페이지를 바꾼다. 오래된 것을 파악하기 위해 각 페이지마다 계수기, 스택을 두어야 한다.
  • NUR : Not Used Recently의 약자로 1은 최근에 참조를 0은 참조되지 않았음을 의미로 삼아 시계 방향으로 돌면서 0을 찾는다면 해당 프로세스를 교체하고 1로 바꾸는 알고리즘이다.
  • LFU : Least Frequently Used의 약자로 가장 참조횟수가 적은 페이지를 교체한다.

프로세스 : 컴퓨터에서 실행되고있는 프로그램이다.

스레드 : 프로세스 내 작업의 흐름이다.

컴파일 과정 : 전처리 -> 컴파일러가 어셈블리어로 변환 -> 어셈블러가 목적코드로 변환해줌 -> 목적 코드 생성 -> 링커가 라이브러리와 함께 링킹 -> 실행이 가능한 파일이 만들어짐.

정적 라이브러리 : 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식이다. 외부 의존도가 낮으며 메모리 효율성이 떨어지는 단점이 있다.

정적 라이브러리 : 프로그램 실행 시 필요한 경우에만 DLL이라는 함수 정보를 통해 참조하며 메모리의 효율성이 높아지지만 외부 의존도가 높아진다.

프로세스 상태

  • 생성 : 프로세스가 생성된 상태, fork()와 exec() 함수를 통해 생성할 수 있다.
  • fork() : 부모 프로세스의 주소 공간을 그대로 복사하여 새로운 자식 프로세스를 생성한다. 주소 공간을 복사하지만 부모 프로세스의 비동기 작업까지 상속하지는 않는다.
  • exec() : 프로세스를 새로 생성하는 함수이다.
  • 대기 : 메모리 공간이 충분하다면 메모리를 할당받고 그렇지 않다면 대기를 한다. CPU 스케줄러로부터 소유권이 넘어오기를 기다린다.
  • 대기 중단 : 메모리가 부족할 경우 일시적으로 중단되는 상태이다.
  • 실행 : CPU 소유권과 메모리를 할당받아 명령을 수행 중인 상태이다.
  • 중단 : 이벤트가 발생한 후 기다리며 프로세스가 차단된 상태이다. 입출력 장치에서 인터럽트로 인해 발생하는 경우가 그 예이다.
  • 일시 중단 : 중단된 상태에서 프로세스 실행 시 메모리가 부족할 경우 일시적으로 중단된다.
  • 종료 : 메모리가 CPU 소유권을 모두 놓고 가는 상태이다. 자식 프로세스에 할당된 자원의 한계치를 넘거나 프로세스가 종료되거나 사용자가 kill과 같은 명령어로 프로세스를 종료할 경우에도 발생한다.

프로세스 메모리 구조

  • 스택 : 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 동적인 특징을 갖는다. 함수 재귀호출 시 동적으로 크기가 커질 수 있는데, 이때 힙과 스택간의 메모리 영역이 겹칠 수 있기 때문에 둘 사이 간 공간을 비워놓는다.
  • 힙 : 동적 할당 시 사용되며 런타임 시 크기가 결정된다.
  • 데이터 영역 : 전역변수, 정적변수가 저장이되며 정적인 특징을 갖는 프로그램 종료 시 사라지는 변수가 들어있는 영역이다. BSS 영역은 초기화 되지않은 변수가 0으로 초기화되어 저장되는 곳이며 Data 영역은 0이 아닌 다른 값으로 할당된 변수들이 저장된다.
  • 코드 영역 : 프로그램 내부의 소스코드가 들어가는 영역이다. 수정이 불가능하며 정적인 특징을 지닌다.

Process Control Block : 프로세스에 대한 메타데이터를 저장한 데이터를 말한다. 프로세스 생성 시 운영체제는 해당 프로세스에 대한 PCB를 생성한다. 프로세스가 생성될 때는 프로세스 주소 값과 스택, 힙 구조를 기반으로 메모리가 할당된다. 그리고 이 프로세스의 메타데이터들이 PCB에 저장되어 관리된다. 프로세스의 핵심 정보들이 들어가있기때문에 커널 스택의 앞부분에서 관리된다.

메타데이터 : 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터를 칭한다.

컨텍스트 스위칭 : PCB를 교환하는 과정이다. 프로세스에 할당된 시간이 끝나거나 인터랩트가 생길 경우 발생한다.

Inter Process Communication : 프로세스 간 데이터를 주고 받거나 공유 데이터를 관리하는 메커니즘이다.

공유 메모리 : 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스 간 통신이 가능할 수 있도록 공유 버퍼를 생성한다.

소켓 : 동일한 컴퓨터의 다른 프로세스 혹은 네트워크를 통해 다른 컴퓨터의 네트워크 인터페이스를 통해서 전송하는 데이터이다.(TCP, UDP)

익명 파이프 : 프로세스간 FIFO 방식으로 읽을 수 있는 파이프를 기반으로 데이터를 주고받는다, 단방향 방식이며 쓰기 전용의 파이프를 만들어서 동작한다. 부모 자식 프로세스 사이에만 사용 가능하며 네트워크상에서는 사용 불가능하다.

명명 파이프 : 파이프 서버와 다수의 파이프 클라이언트 간 통신을 위한 이중 파이프이다. 단일 컴퓨터 내의 다른 프로세스 간 혹은 네트워크 상에서 다른 컴퓨터와도 통신을 수행할 수 있다.

메시지 큐 : 메세지를 큐 자료 구조 형태로 관리한다.

공유 자원 : 시스템 안에서 프로세스, 스레드가 같이 접근할 수 있는 자원 혹은 변수등을 의미한다. 만약 공유 자원을 다수의 프로세스가 동시에 읽거나 쓰려고 할 경우 경쟁 상태가 발생하게 된다.

임계 영역 : 공유 자원에 접근 시 순서와 같은 요인으로 인해 결과가 달라지는 영역이다. 임계 영역 문제를 해결하기 위한 방법으로 세마포어, 뮤텍스, 모니터가 있다.

뮤텍스 : 공유 자원을 사용하기 전에 설정하고 사용 후에는 해제하는 잠금이다. 잠금이 설정될 경우 다른 스레드는 이 코드 영역에 접근할 수 없다. 뮤텍스는 잠금 혹은 잠금 해제의 상태 하나만을 가진다.

세마포어 : 정수 값과 함수로 공유 자원에 대한 접근을 처리한다. 뮤텍스를 일반화한 방법이다. 프로세스가 공유 자원에 접근할 경우 세마포에서 wait을 시도하고 프로세스가 공유 자원을 해제한다면 세마포어에서 signal을 수행한다. 프로세스가 세마포어 값을 수정중일때는 다른 프로세스가 동시에 세마포어 값에 수정하는 것이 불가능하다.

모니터 : 둘 이상의 스레드 혹은 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 접근에 대한 인터페이스만 제공한다.

교착 상태 : 둘 이상의 프로세스가 서로가 가지고 있는 자원을 기다리며 중단된 상태이다. 교착 상태의 원인으로는 한 프로세스가 자원을 독점하고 있어 다른 프로세스들이 접근 불가하거나(상호 배제) 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태(점유 대기) 다른 프로세스의 자원을 강제적으로 가져올 수 없는(비선점)것도 원인이 될 수 있으며 프로세스가 서로의 자원을 요구하는(환형 대기) 케이스도 있다.

교착 상태 해결 방법

  • 자원 할당 시 교착 상태가 일어나지 않도록 설계를 한다.
  • 은행원 알고리즘 : 총 자원과 현재 할당한 자원의 양을 기준으로 안정과 불안정 상태를 판정하고 안정 상태로 갈 수 있도록 자원을 할당한다.
  • 교착 상태 발생 시 사이클을 탐색하여 이에 관련된 프로세스들은 하나씩 제거한다.
  • 사용자가 작업을 강제로 종료시킨다.

함수 호출 스택
함수의 호출과 관계되는 지역 변수와 매개변수는 메모리의 스택 영역에 저장된다. 이 스택 영역은 함수의 호출과 함께 할당되며 함수의 호출이 끝나면 소멸한다. 즉 함수 호출 시
스택 영역에 함수의 매개변수, 호출이 끝난 뒤 돌아가야 할 반환 주소 값, 함수에서 선원된 지역 변수가 저장된다.(이 정보들을 스택 프레임이라고 부르기도한다.)

profile
https://github.com/gimhema, https://gimhema.tistory.com/

0개의 댓글