본문 바로가기
CS/OS

OS공부

by hyohyohyo 2023. 4. 27.
728x90

1. OS란

사용자가 컴퓨터를 쉽게 사용할 수 있도록 하는 인터페이스이다.

컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고, 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임이다.

반대로 OS랑 비슷은 하지만 소프트웨어를 추가하지 못하는 것을 펌웨어라고 한다

 

2. OS의 역할

1. CPU 스케줄링 및 프로세스 관리 : CPU 소유권을 어떤 프로세스에 할당할지, 프로세스의 생성, 삭제, 자원 할당 및 반환 관리

2. 메모리 관리 : 한정된 메모리를 어떤 프로세스에 얼마만큼 할당해야 하는가

3. 디스크 파일 정리 : 디스크 파일을 어떠한 방법으로 보관할지

4. I/O 디바이스 관리

 

3. 운영체제 구조

GUI(CUI), 시스템콜, 커널, 드라이버로 구성

GUI : 사용자가 전자장치와 상호 작용 가능하게 하는 사용자 인터페이스의 한 형태.

드라이버 : 하드웨어를 제어하기 위한 소프트웨어

커널 : OS의 제일 핵심 요소이자, 시스템콜 인터페이스를 제공하며 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스 & 요청 관리 등 중추적인 역할을 한다.

 

4. 시스템콜

운영체제가 커널에 접근하기 위한 인터페이스이다.

유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출할 때 사용

즉 유저 프로그램이 i/o요청으로 trap발생시, 올바른 요청인지 확인후 유저 모드가 시스템콜을 통해 커널모드로 변환되어 실행된다.

4-1 유저모드와 커널모드 변환으로서의 장점은?

컴퓨터 자원에 대한 직접 접근을 차단 가능, 프로그램을 다른 프로그램으로부터 보호 가능

그래서 운영체제로 요청을 보낼려면 시스템 콜을 통해 커널을 거쳐 운영체제로 전달된다

이 시스템 콜은 추상화 단계이기에, 다른 낮은 영역 처리에 대한 부분을 많이 생각 안해도 된다

4-2 구분법

modebit을 참고해 유저모드와 커널 모드를 구분한다.

1(유저), 0(커널)을 가지며 대표적으로 I/O 디바이스들은 운영체제를 통해서만 작동해야 한다

만약 유저모드로만 해결된다면 공격자가 쉽게 작동 할 수 있는 단점이 있다.

4-3 유저모드, 커널모드

유저모드 : 유저가 접근할 수 있는 영역을 제한저긍로 두며 컴퓨터 자원에 함부로 침범하지 못하는 모드

커널모드 : 모든 컴퓨터 자원에 접근 가능한 모드

 

5. 컴퓨터 요소

보통 CPU, DMA 컨트롤러, 메모리, 타이머, 디바이스 컨트롤 등으로 이루어져 있다.

 6. CPU란

ALU, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치이다.

인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석해 실행하는 장치이다.

커널이 프로그램을 메모리에 올려 프로세스로 만들면 CPU가 이를 처리한다

6-1 ALU

말그대로 +, -, 배타적 논리합, 논리곱 등의 논리 연산등을 처리하는 디지털 회로이다.

6-2 제어장치

프로세스 조작을 지시하는 CPU의 한 부품.

입출력 장치 간 통신을 제어하고, 명령어들을 읽고 해석하며 데이터 처리를 위한 순서를 결정한다

6-3 레지스터

CPU안에 있는 매우 빠른 임시기억 장치이다.

CPU와 직접 연결되어 있어 연산속도가 아주 빠르고, CPU는 자체적으로 데이터를 저장하지 못해 레지스터를 거쳐 데이터를 전달한다.

 

7. CPU 연산 처리

1. 제어장치가 메모리에 계산할 값을 로드한다. 또한 레지스터에도 로드를 한다

2. 제어장치가 레지스터에 있는 값을 계산하라고 ALU에 명령을 한다

3. 제어장치가 계산된 값을 가지고 다시 레지스터에서 메모리로 계산한 값을 저장한다.

7-1 인터럽트

인터럽트는 어떤 신호가 들어올시 CPU를 잠깐 정지시킨다

IO디바이스를 인하거나, 0으로 숫자를 나누는 산술 연산이라거나, 프로세스 오류 등으로 발생

인터럽트 발생시 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수가 실행된다

인터럽트 간 우선순위가 있고, 우선순위에 따라 실행된다

7-2 인터럽트 핸들러 함수

인터럽트가 발생시 이를 핸들링 하기 위한 함수.

커널 내부의 IRQ를 통해 호출된다

7-3 하드웨어 인터럽트, 소프트웨어 인터럽트

하드웨어 인터럽트 : IO 디바이스에서 발생하는 인터럽트. 

하드웨어 인터럽트는 CPU 외부의 디스크 컨트롤러나 주변장치로부터 요구되는 것으로,

운영체제의 처리를 요하는 상황을 알리기 위해 전기적인 신호를 사용해 구현됩니다.

 

소프트웨어 인터럽트: 트랩이라고도 한다.

프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동된다.

소프트웨어 인터럽트는 외부가 아닌 CPU 내부에서 자신이 실행한 명령이나 CPU의 명령 실행에

관련된 모듈이 변화하는 경우 발생합니다. 

프로그램 실행 중 프로그램 상의 처리 불가능한 오류나 이벤트를 알리기 위한 경우 발생한다

 

8. DMA 컨트롤러

I/O 디바이스가 메모리에 직접 접근 가능하게 하는 하드웨어 장치이다.

CPU에만 너무 많은 인터럽트 요청이 들어오기에 이 부하를 막는 보조 일꾼이다.

또한 하나의 작업을 CPU와 DMA컨트롤러가 동시에 하는 것을 방지한다

 

9. 타이머

몇 초 안에는 작업이 끝나야 한다는 것을 정하고, 프로그램에 시간 제한을 다는 역할을 한다.

시간이 많이 걸리는 프로그램이 작동할 때 제한을 걸기 위해 존재

 

10. 디바이스 컨트롤러

컴퓨터와 연결되어 있는 IO 디바이스들의 작은 CPU를 말하고, 옆에 붙어 있는 로컬 버퍼는 각 디바이스에서 데이터를 임시로 저장하기 위한 작은 메모리를 의미

 

11. 메모리(RAM)

CPU는 그저 메모리에 올라와 있는 프로그램의 명령어를 실핼할 뿐이다. 

11-1 메모리 계층

레지스터 : 휘발성

캐시 : L1, L2 : 휘발성

주기억장치(RAM) : 휘발성

보조기억장치(HDD) : 비휘발성

 

12. 캐시

데이터를 미리 복사해 놓은 임시 저장소이자 빠른 장치와 느린 장치의 속도 차이에 따른 병목 현상을 줄이는 메모리이다.

메모리와 CPU 사이의 속도차는 너무 심해, 그 중간에 레지스터를 두어 속도 차이를 해결한다.

이렇게 속도차이를 해결하기 위해 계층 사이 사이에 있는 계층을 캐싱 계층이라 한다.

ex) 캐시메모리와 보조 기억장치에 있는 주기억장치를 보조기억장치의 캐싱 계층이라고도 할 수 있다.

12-1 지역성

캐시를 직접 설정할 때는 어떻게?

=> 자주 사용하는 데이터를 기반으로 설정해야 한다.

=> 근거는?

=> 지역성이다. 지역성은 시간 지역성과 공간 지역성으로 나뉜다.

12-1-1 시간 지역성

최근 사용한 데이터에 다시 접근하려는 특성.

ex) for문에 i는 계속해서 접근을 한다.

12-1-2 공간 지역성

최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성이다.

ex) 배열

12-2 캐시 히트와 캐시 미스

캐시에서 원하는 데이터를 찾으면 캐시 히트, 못찾으면 미스라고 한다

만약 히트를 하게 된다면 해당 데이터를 제어장치를 걸쳐 가져오게 된다

캐시 히트는 위치도 가깝고 CPU 내부 버스를 이용하기에 빠르다.

반면 캐시 미스 발생시 메모리에서 가져오는데, 이는 시스템 버스를 이용하기에 느려진다

12-3 캐시 매핑

캐시가 히트되기 위해 매핑하는 방법

CPU의 레지스터와 RAM간에 데이터를 주고받을 떄를 기반으로 설명한다

레지스터는 램에 비하면 아주 작기에 캐시 계층으로 역할을 해줄려면 매핑을 어떻게 하나가 중요하다

  • 직접 매핑 : 메모리가 1-100, 캐시가 1-10 있을시 1:1~20, 2:1~20 이런식으로 매핑한다. 처리는 빠르지만 충돌은 많다
  • 연관 매핑 : 순서를 일치시키지 안호 관련 있는 캐시와 메모리를 매핑. 충돌은 적지만 속도가 느리다
  • 집합 연관 매핑 : 위 두개를 합친 형태이다. 순서는 일치시키지만 집합을 둬서 저장해 블록화 되어 있어 검색은 더 효율적이다. 예를들어 메모리가 1-100, 캐시가 1-10 이라고 한다면 캐시 1-5에는 1-50의 데이터를 무작위로 저장한다

12-4 웹 브라우저 캐시

그냥 쿠키, 로컬 스토리지, 세션 스토리지 등이 있다.

보통 사용자의 인증 모듈 관련 사항, 커스텀한 정보를 저장해, 중복 요청을 방지한다

12-4-1 쿠키

쿠키는 만료기한이 있는 키-값 저장소이다.

same site 옵션을 strict로 설정 안할시 다른 도메인에서 요청했을 때도 자동 전송이된다. 

또한 4KB까지 저장가능하며, 만료기한을 정할 수 있다.

그래서 쿠키를 설정시 document.cookie로 보지 못하게 httponly 옵션을 걸여야 한다.

12-4-2 로컬 스토리지

만료기한이 없는 키-값 저장소이다

10MB까지 저장이 되며, 웹브라우저를 닫아도 유지되고, 도메인 단위로 저장, 생성된다

다만 HTML5를 지원하는 웹브라우저만 가능하고, 클라이언트에서만 수정 가능하다

12-4-3 세션 스토리지

만료기한이 없는 키-값 저장소이다.

탭 단위로 세션 스토리지를 생성하고, 탭을 닫으면 해당 데이터는 삭제된다.

5MB까지 저장이 되며, 로컬 스토리지처럼 지원되는 웹브라우저만 가능하다.

클라이언트에서만 수정 가능하다

12-5 DB 캐싱 계층

=> redis를 두어 사용

 

13 메모리 관리

운영체제가 해야하는 가장 중요한 일 중 하나는 메모리 관리이다.

한정된 메모리를 극한으로 활용해야한다.

 

14 가상메모리

메모리 관리 기법 중 하나로, 컴퓨터가 실제로 이용 가능한 메모릴 자원을 추상화 하여 이를 사용하는 사용자들에게 매우 큰 메모리로 보이게 만드는 것이다.

이 때 가상적으로 주어진 주소를 가상 주소라고(logical address) 하며, 실제 메모리 상에 있는 실제 주소를 실제 주소라고(physical address) 한다.

그래서 가상 주소는 메모리 관리장치(MMU)에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 된다.

가상 메모리는 가상 주소와 실제 주소가 매핑되어 있고, 프로세스의 주소 정보가 들어있는 페이지 테이블로 관리가 된다

이 때 속도를 높이기 위해 TLB를 사용한다.

14-1 가상 메모리 등장 배경

  • 초창기 컴퓨터에서는 사용 가능한 RAM의 용량이, 가장 큰 실행 애플리케이션의 주소 공간보다 커야 했음. 그렇지 않을 경우 "메모리 부족" 오류에 의해 해당 애플리케이션을 실행할 수 없었음.
  • 이후 컴퓨터에서는 프로그래머가 애플리케이션의 일부분만 기억장치에 올려 실행하도록 지정할 수 있게 하는 오버레이 기법을 사용하여 메모리 부족 문제를 해결하고자 했음. 하지만 이 역시 전반적인 메모리 부족 문제를 해결할 수 없었음. 오버레이를 사용하는 프로그램은 그렇지 않은 프로그램보다는 메모리를 덜 사용했지만, 애초에 시스템이 프로그램을 위한 충분한 메모리를 갖추고 있지 않은 경우에는 결국 똑같은 메모리 부족 오류가 발생했음.
  • 여기에서 더 발전한 가상 메모리 기법은 애플리케이션을 실행하는 데 얼마나 많은 메모리가 필요한지에 집중하지 않고, 대신 애플리케이션을 실행하는 데 최소한 얼마만큼의 메모리가 필요한가에 집중하여 문제를 해결하고자 함.
    • 이렇게 접근하는 방식이 가능한 이유는, 메모리 접근은 순차적이고 지역화되어 있기 때문임.
    • 그렇다면 이렇게 애플리케이션의 일부분만 메모리(기억장치)에 올려진다면, 메모리에 올라가지 않는 나머지는 어디에 위치해야 할까? ⇒ 정답은 보조 기억장치, 즉 디스크!
    • 가상 메모리의 핵심은 보조 기억장치다.

출처 https://ahnanne.tistory.com/15

 

[운영체제] 가상 메모리(Virtual Memory System)

들어가기 전.. 메모리(memory)란? 메모리란 프로그램과 프로그램 수행에 필요한 데이터 및 코드를 저장하는 장치임. 메모리는 크게 내부 기억장치인 주기억장치와 외부 기억장치인 보조 기억장치

ahnanne.tistory.com

14-2 가상 메모리란?

가상 메모리는 메모리가 실제 메모리보다 많아 보이게 하는 기술로, 어떤 프로세스가 실행될 때 메모리에 해당 프로세스 전체가 올라가지 않더라도 실행이 가능하다는 점에 착안하여 고안되었음.

그렇다 애플리케이션을 실행하면 실행에 필요한 일부만 메모리에 올라가게 한다. 그리고 나머지는 디스크에 남는다.

이를 가능하게 해주는 것이 MMU인데, 이는 가상주소를 실제 주소와 매핑해주고 메모리를 보호해준다

그래서 CPU가 접근할려고 하면 MMU에서 번역이 되어 접근하게 된다

그러나 메모리를 일일이 가상 주소에서 물리적 주소로 번역하게 되면 작업 부하가 너무 높아지므로, MMU는 RAM을 여러 부분(페이지, pages)로 나누어 각 페이지를 하나의 독립된 항목으로 처리한다

페이지 및 주소 번역 정보를 기억하는 작업이 가상 메모리를 구현하는 데 있어 결정적인 절차이다

 

14-3 Demanding Paging

요구 페이징은 CPU가 요청할 때 프로세스의 데이터를 메모리에 올리는 것을 의미함. 즉, 처음부터 모든 데이터를 메모리로 적재하지는 않음.

14-4 TLB

TLB는 가상 메모리 주소를 물리적 주소로 변환하는 속도를 높이기 위해 사용하는 캐시로, 최근에 일어난 가상 메모리 물리 주소의 변환 테이블을 저장해둠. CPU가 가상 주소를 가지고 메모리에 접근하려고 할 때 우선은 TLB에 접근하여 가상 주소에 해당되는 물리 주소를 찾고, 만약 TLB에 매핑이 존재하지 않는다면 MMU가 페이지 테이블에서 해당되는 물리 주소로 변환한 후 메모리에 접근하게 됨.

=> 그래서 RAM에 2번 방문하지 않아도 된다. => 디스크에 가서 번역하고... 번역한 실제주소를 다시 가져와야 하니...
14-5 스와핑

만약 가상 메모리에는 존재하지만 시렞 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생한다.

이때 메모리에 당장 사용하지 않는 영역을 하드 디스크로 옮기고 디스크의 일부분을 마치 메모리 처럼 불러와 사용하는 것을 스와핑이라한다.

그래서 마치 페이지 폴트가 일어나지 않은 것처럼 한다

14-6 페이지 폴트

프로세스의 주소 공간에는 존재하지만 지금 RAM에는 없는 데이터에 접근하는 경우

페이지 폴트와 그로 인한 스와핑은 이런 과정을 걸친다

  1. CPU는 물리 메모리를 확인해 해당 페이지가 없으면 트랩을 발생해 OS에 알린다
  2. OS는 CPU의 동작을 잠시 멈춘다
  3. OS는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인하고, 없으면 프로세스를 중단하고 현재 물리 메모리에 비어 있는 프레임이 있는지 찾는다. 물리 메모리에도 없다면 스와핑이 발동
  4. 비어 있는 프레임에 해당 페이지를 로드, 페이지 테이블을 최신화
  5. 중단 되어 있던 CPU 다시 시작

당연히 자주 발생 시 성능 저하가 있다.

페이지 폴트를 최소화 시키기 위해 페이지 교체 정책이 존재한다. 

  • 메모리가 꽉 차 있을 때, 페이지 중 하나를 RAM에서 저장 매체로 내리고, 새 페이지를 RAM에 올리는데, 이때 어떤 것을 내릴지 결정하는데 페이징 교체 정채깅다.

14-7 페이지

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

14-8 프레임

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

 

15 스레싱(thrashing)

메모리의 페이지 폴트율이 높은 것을 의미 => 성능 bad

메모리에 너무 많은 프로세스가 동시에 올라가면 스와핑이 너무 많이 일어난다.

당연히 CPU이용률이 줄어드는데, 그럼 OS는 '어? 저거 지금 노나보네 더 일을 시켜야지' 라는 생각으로 더 많은 프로세스를 메모리에 올려 악순환이 된다.

이를 해결할려면 메모리를 늘리거나, SDD를 쓰거나 그것도 아니라 운영체제 자체에서 해결하는 방법은 작업 세트와 PFF가 있다. 

15-1 작업 세트

프로세스의 과거 사용 이력인 지역성을 통해 결정된 페이지 집합을 만들어서 미리 메모리에 로드하는 것이다.

15-2 PFF

Page Fault Frequency는 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 만드는 방법이다. 

만약 상한선에 도달한다면 프레임을 늘리고, 하한선에 도달한다면 프레임을 줄인다.

 

16 메모리 할당

시작 메모리 위치, 메모리의 할당 크기를 기반으로 메모리를 프로그램에 할당.

연속 할당불연속 할당으로 나뉜다.

16-1 연속 할당

메모리에 연속적으로 공간을 할당하는 것이다

프로세스 A, B, C가 순차적으로 공간에 할당된다.

이는 메모리를 미리 나누어 관리하는 고정 분할 방식과 시점 프로그램의 크기에 맞게 분할하는 가변 분할 방식이 있다.

16-1-1 고정 분할 방식

메모리를 미리 나누어 관리하는 방식

메모리가 미리 나뉘어 있기에 융통성이 없고 내부 단편화가 발생한다

16-1-2 가변 분할 방식

매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용한다

내부 단편화는 일어나지 않지만 외부 단편화가 발생한다

  • 최초 적합 : 위쪽이나 아래쪽부터 시작해 홀을 찾으면 바로 할당
  • 최적 적합 : 프로세스의 크기 이상인 공간 중 가장 작은 홀부터 할당
  • 최악 적합 : 프로세스의 크기와 가장 차이가 많이 나는 홀에 할당

16-1-3 내부 단편화

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

  • 프로세스가 사용하는 메모리 공간에 남는 부분
  • 프로세스가 요청한 양보다 더 많은 메모리를 할당할 때 발생하며, 메모리 분할 자유 공간과 프로세스가 사용하는 공간의 크기 차이를 의미한다.

16-1-4 외부 단편화

메모리를 나눈 크기보다 프로그램이 커서 못들어가는 현상. 예를 들어 100을 55, 45 로 나누었는데 프로그램이 70이면 못들어 간다.

  • 메모리 공간 중 사용하지 못하게 되는 부분
  • 메모리 할당 및 해제 작업의 반복으로 작은 메모리가 중간 중간 존재할 수 있다. 이렇게 사용하지 않는 메모리가 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황이다.
  • 외부 단편화를 해결하기 위해 압축을 이용하여 프로세스가 사용하는 공간을 한쪽으로 몰 수 있지만, 작업 효율이 좋지는 않다.

16-1-5 홀

할당할 수 있는 비어 있는 메모리 공간

 

17 불연속 할당

참고 https://steady-coding.tistory.com/524

 

[운영체제] 페이징과 세그멘테이션

cs-study에서 스터디를 진행하고 있습니다. 메모리 메인 메모리 (Main Memory, Physical Memory, 주기억장치) CPU가 직접 접근할 수 있는 기억 장치로, 프로세스가 실행되려면 프로그램 코드를 메인 메모리

steady-coding.tistory.com

현대 운영체제가 쓰는 방법으로 불연속 할당인 페이징 기법이 존재한다.

메모리를 동일한 크기의 페이지(보통 4KB)로 나누고, 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당하는 것이다.

페이징 기법 말고도 세그멘테이션, 페이지등 세그멘테이션이 존재한다

17-1 페이징

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

홀의 크기가 균일하지 않은 문제가 없어지지만 주소 변환이 복잡해진다

외부 단편화는 사라진다.(물리 메모리 남는 곳에 적절하게 분배하니)

그러나 내부 단편화는 발생한다. (아주 작게 크기를 하면 사라지지만 비효율이다.)

  • 페이지: 고정 사이즈의 가상 메모리 내 프로세스 조각
  • 프레임: 페이지 크기와 같은 주 기억 장치의 메모리 조각

17-1-1 페이지 테이블

위 사진은 페이징 테이블의 매핑을 나타낸다.

물리 메모리는 고정 크기의 프레임으로, 가상 메모리는 고정 크기의 페이지로 분리되어 있다.

개별 페이지는 순서에 상관 없이 물리 메모리에 있는 프레임에 매핑되어 저장된다.

즉, 모든 프로세스는 하나의 페이징 테이블을 가지고 있으며, 여기에는 메인 메모리에 적재되어 있는 페이지 번호와 해당 페이지가 위치한 메인 메모리의 시작 주소가 있다.

이를 통해 하나의 프로세스를 나눈 가상 메모리 페이지들이 각각 실제 메인 메모리의 어디 프레임에 적재되어 있는지 알아낼 수 있다.

17-2 세그멘테이션

페이지 단위가 아닌 의미 단위인 세그먼트로 나누는 방식이다.

프로세스를 이루는 메모리는 코드 영역, 데이터 영역, 스택 영역, 힙 영역으로 이루어 지는데, 코드와 데이터로 나누거나 코드 내의 작은 함수를 세그먼트로 놓고 나눌 수도 있다.

이는 공유와 보안 측면에서 장점을 가지지만 홀 크기가 균일하지 않은 단점이 있다.

세그먼트 테이블도 존재하지만 페이징 테이블이랑 역할이 동일하다

내부 단편화는 사라진다.

외부 단편화가 발생한다

17-3 페이지드 세그멘테이션

프로그램을 의미단위인 세그먼트로 나누어 공유나 보안 측면에 강점을 두고, 임의의 길이가 아닌 동일한 크기의 페이지 다누이로 나누는 것을 의미한다

 

18 페이지 교체 알고리즘

메모리는 한정되어 있어 스와핑이 발생한다.

스와핑은 많이 일어나지 않도록 설계 되어야 하는데, 그래서 페이지 교체 알고리즘 기반으로 스와핑이 발생한다

18-1 오프라인 알고리즘

이론상 최고의 알고리즘

=> 그러나 현실상 미래에 사용되는 프로세스를 알 수 없기에 의미가 없다

=> 다른 알고리즘에 대한 비교 기준으로 상한 기준을 제공한다

18-2 FIFO

가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법

18-3 LRU

참조가 가장 오래된 페이지를 바꾼다

다만 오래인것을 확인하기 위해 각 페이지마다 계수기, 스택을 두어야 한다

18-4 NRU

(not used recently)

LRU에 비해 조금 발전되었는데

clock알고리즘이라고도 하며 0과 1의 비트를 두고, 1은 최근에 참조, 0은 아닌 것이다. 시계 방향으로 돌면서 0을 찾으면 그 부분을 교체하고 1로 바꾼다

18-5 LFU

가장 참조 횟수가 적은 페이지 교체


프로세스와 스레드

1 프로세스와 스레드

프로세스는 컴퓨터에서 실행되고 있는 프로그램 == CPU 스케줄링의 대상이 되는 작업

스레드는 프로세스 내 작업 흐름

 

프로그램이 메모리에 올라오면 프로세스가 되는 인스턴스화가 일어나고, 이후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행한다

2 프로세스와 컴파일 과정

프로세스는 프로그램이 메모리에 올라가 인스턴스화 되는 것을 말한다

프로그램을 만드는 과정은 언어마다 다르다. 컴파일 언어인 C기반으로 해보자

컴파일러가 컴파일 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 번역하여 실행할 수 있는 파일을 만든다

2-1 전처리

소스코드의 주석을 제거하고 #include 등 헤더 파일을 병합해 매크로 치환

2-2 컴파일러

오류처리, 코드 최적합 등을 해 어셈블리어로 변환

2-3 어셈블리

목적 코드로 변환된다. ex) .o

2-4 링커

프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 겷팝해 실행 파일을 마든다

.exe or .out이라는 확장자를 갖는다

라이브러리는 정적, 동적 라이브러리로 나뉜다

정적 라이브러리는 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식으로 사용

동적 라이브러리는 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브러리를 쓰는 방법이다.

 

3 프로세스 상태

https://many258.github.io/study/os-process/

3-1 생성 상태

프로세스가 생성된 상태이다

fork() or exec() 함수를 통해 생성된다. => 이때 PCB 할당

3-1-1 fork()

fork()는 부모 프로세스의 주소 공간을 그대로 복사해, 새 자식 프로세스를 생성한다

주소 공간만 복사하기에 부모 프로세스의 비동기 작업등을 상속하지 않는다

3-1-2 exec()

exec()은 새롭게 프로세스를 생성하는 함수이다.

3-2 대기 상태(Ready)

메모리 공간이 충분한다면 메모리를 할당 받고 아니면 아닌 상태로 대기하고 있는다.

즉 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태이다.

3-3 대기 중단 (Ready Suspend)

메모리 부족으로 일시 중단된 상태

3-4 실행 상태 (Running)

CPU 소유권과 메모리를 할당받고 명령을 수행중인 상태.

CPU burst가 일어났다고도 한다

3-5 중단 상태 (Blocked)

어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태이다

I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생한다

3-6 일시 중단 상태 (Blocked Suspend)

대기 중단과 유사하다. 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시중단된 상태

3-7 종료 상태 (Terminated)

메모리와 CPU 소유권을 모두 놓고 가는 상태

자연스러운 종료도 있지만 부모 프로세스가 자식 프로세스를 강제 종료 시키는 것도 있다.

자식 프로세스의 할당된 자원 한계치를 넘거나 부모 프로세스가 종료되거나 사용자가 kill하는 경우가 있다

 

4 프로세스 메모리 구조

스택, 힙, 데이터 영역(BSS), 코드 영역으로 나누어 진다

스택은 윗 주소 부터 할당해 내려가고, 힙은 아래 주소부터 할당해 올라간다

4-1 스택과 힙

스택과 힙은 동적 할당이 되며, 런타임 단계에서 메모리를 할당한다

스택은 지역변수, 매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역

함수가 호출 될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해 저장 (ex 재귀함수)

힙은 동적으로 할당되는 변수들을 담는다.

4-2 데이터 영역과 코드 영역

여기는 정적 할당 영역이다.

BSS는 Bss segment, Data segment, code/text segment로 나뉘어 저장된다

그래서 Bss segment는 static, const로 선언되어 있고 0으로 초기화 or 아무 초기화 안된 변수들이 저장된다

Data segment 전역변수, static, const, 0이 아닌 값으로 초기화된 변수가 할당

 

5 PCB

운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터를 말한다

프로세스 제어 블럭이라고도 한다

프로세스가 생성되면 운영체제는 해당 PCB를 생성

프로그램이 실행되면 프로세스가 생성되고, 프로세스 주소 값들에 앞서 설명한 스택, 힙 등의 구조를 기반으로 메모리가 할당

그리고 이 프로세스의 메타데이터들이 PCB에 저장되어 관리

그래서 프로세스의 중요한 정보를 포함하고 있기에 일반 사용자가 접근하지 못하게 커널 스택의 가장 앞부분에서 관리

5-1 구조

PCB는 프로세스 스케줄링 상태, 프로세스 ID등의 정보로 이루어져 있다

  • 프로세스 스케줄링 상태 : 준비, 일시 중단 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
  • 프로세스 ID : 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
  • 프로세스 권한 : 컴퓨터 자원 or I/O 디바이스에 대한 권한 정보
  • 프로그램 카운터(PC) : 프로세스에서 실행해야 할 다음 며령어의 주소에 대한 포인터
  • CPU 레지스터 : 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
  • CPU 스케줄링 정보 : CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
  • 계정 정보 : 프로세스 실행에 사용된 CPU 사용량, 실행한 유저 정보
  • I/O 상태 정보 : 프로세스에 할당된 I/O 디바이스 목록

5-2 컨텍스트 스위칭

PCB를 교환하는 과정을 의미한다

한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생한다.

이 컨텍스트 스위칭이 아주 빠르게 일어나서 여러 프로세스가 동시에 도는 것처럼 보인다

https://applefarm.tistory.com/139

간단하다 A가 실행하다 멈추고, A의 PCB를 저장하고 B를 로드해 실핸한다

그리고 다시 B의 PCB를 저장하고 A의 PCB를 로드한다

이렇게 컨텍스트 스위칭을 할시 중간 idle time이 발생하게 되는데, 이거에 더불어 캐시미스라는 비용이 더든다

5-2-1 캐시미스

컨텍스트 스위칭 발생시 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘 못된 주소 변환이 되기에 캐시 클리어가 일어나고, 이 덕에 캐시 미스가 발생한다

5-3 스레드에서 컨텍스트 스위칭

스레드에서도 일어난다.

스레드는 스택 영역을 제외한 모든 메모리를 공유하기에, 더 비용이 적고 시간도 적게 걸린다

 

6 멀티 프로세싱

여러개의 프로세스, 즉 멀티프로세스를 통해 동시에 두가지 이상의 일을 처리하는 것을 말한다.

이를 통해 하나 이상의 일을 병렬 처리가 가능하며, 특정 프로세스에 문제가 발새오디도 다른 프로세스를 이용해 처리가 가능하므로 신뢰성이 높은 강점이 있다.

6-1 웹브라우저

웹 브라우저는 멀티 프로세스 구조를 가지고 있다.

  • 브라우저 프로세스 : 주소 표시줄, 북마크 막대, 뒤로가기 버튼, 앞으로 가기 버튼등을 담당하며 네트워크 요청이나 파일 접근 같은 권한 담당
  • 랜더러 프로세스 : 보이는 부분의 모든것을 제어
  • 플러그인 프로세스 : 웹 사이트에서 사용하는 플러그인 제어
  • GPU 프로세스 : GPU를 이용해 화면 그리는 부분을 제어

6-2 IPC

멀티 프로세스는 IPC가 가능하며 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘이다.

IPC의 종류로는 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐가 있는데 물론 스레드 보다는 느리다.

6-2-1 공유 메모리

여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록, 공유 메모리를 생성해서 통신하는 것

공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유 가능하다

IPC 방식 중 어떤 매개체를 통해 데이터를 주고받는 것이 아닌 메모리 자체를 공유해 가장 빠르지만 동기화가 필요하다

보통 하드웨어 관점에서 공유 메모리는 CPU가 접근 가능한 큰 램덤 접근 memory RAM을 가리키기도 한다

공유 공간이 존재해 시스템 호출이 필요하지 않기 때문에 커널 의존성도 낮고 속도도 빠르다는 장점이 있다

하지만 단점으로는 공유 공간에 대한 제한이 존재한다.

6-2-2 파일

디스크에 저장된 데이터 or 파일 서버에서 제공한 데이터를 말한다

6-2-3 소켓

동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크를 통해 전송하는 데이터를 의미(TCP,UDP)

6-2-4 익명 파이프

프로세스간 FIFO 방시으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고 받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어 작동하는 방식이다. => 오직 부모 자식 프로세스 간에만 사용 가능하고, 다른 네트워크 상에서는 불가능

6-2-5 명명된 파이프

파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 or 양방향 파이프를 말한다.

클라이이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용 가능하다.

컴퓨터와 프로세스끼리 or 다른 네트워크 상의 ㅁ컴퓨터와도 통신 가능하다

그래서 서버용 파이프와 클라이언트용 파이프로 구분해 작동하며 하나의 인스턴스를 열거나 여러개의 인스턴스를 기반으로 통신

6-2-6 메시지 큐

메시지를 큐 데이터 구조 형태로 관리하는 것을 의미

커널의 전역변수 형태 등 커널에서 전역으로 관리되며 다른 IPC 방식에 비해 사용방법이 직관적이고 간단해 다른 코드의 수정 없이 단지 몇 줄 코드 추가로 간단히 ㅈ버근하는 장점이 있다.

그래서 공유 메모리 대안으로 사용되기도 한다.

다만 메시지를 전달하기 위해 커널을 들리는 방식이다.

 이 과정에서 User Level과 Kernel Level을 넘나들게 되어 매번 system call이 호출

 

7 스레드

프로세스의 실행 가능한 가장 작은 단위이다.

당연하게도 프로세스는 여러개의 스레드를 가질 수 있다.

스레드는 코드, 데이터, 힙 영역을 공유한다. 그 외는 각각 생성된다

 

8 멀티 스레딩

프로세스 내 작업을 여러 스래드, 멀티 스레드로 처리하는 기법

스레드끼리 서로 자원을 공유하기에 효율성이 높다.

또한 동시성에도 큰 장점이 있다. => 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보이는 것.

그러나 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점이 있다.

 

9 공유 자원

시스템 안에서 각 프로세스, 스레드가 함꼐 접근할 수 있는 모니터, 프린터, 파일, 데이터 등의 자원이나 변수등을 의미

이 공유 자원을 두개 이상의 프로세스가 동시에 일걱나 쓰는 상황을 경쟁 상태라고 한다,

동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태이다

 

10 임계 영역

임계 영역(critical section)은 둘 이상의 프로세스, 스레드가 공유 자원에 접근 할 때 순서 등의 이유로 결과가 달라지는 코드 영역이다

임계 영역을 해결하기 위한 방버은 크게 뮤텍스, 세마포어, 모니터 세가지가 있으며, 이 방법 모두 상호배제, 한정 대기, 융통성이라는 조건을 만족한다.

이 방법에 토대가 되는 것은 lock이다.

10-1 상호 배제

한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.

10-2 한정 대기

특정 프로세스가 영원히 임계 영역에 못들어가면 안된다

10-3 융통성

한 프로세스가 다른 프로세스의 일을 방해해서는 안된다

10-4 뮤텍스

프로세스나 스레드가 공유자원을 lock()을 통해 잠금 설정하고 사용한 후에 unlock을 통해 잠금 해제하는 객체이다.

잠금이 설정되면 다른 프로세스나 스레드는 그 영역에 들어가지 못하고 해제는 그 반대이다.

뮤텍스는 잠금, 잠금 해제라는 상태만을 가진다.

10-5 세마포어

프로세스나 스레드가 공유자원에 접근하면 세마포어에서 wait작업을 수행하고, 프로세스나 스레드가 공유 자원을 해제하면 signal 작업을 수행한다.

세마포어는 조건 변수가 없고, 프로세스나 스레드가 세마포어 값을 수정할 때 다른 프로세스나 스레드는 동시에 세마포어 값을 수정 x

10-5-1 바이너리 세마포어

0과 1만을 가지는 세마포어 이다.

사실상 뮤텍스랑 바이너리 세마포어라고 부를 수 있으나 뮤텍스는 잠금을 기반으로하는 잠금 메커니즘이고, 세마포어는 신호를 기반으로 상호 배제를 하는 신호 메커니즘이다.

10-5-2 카운팅 세마포어

여러개의 값을 가지는 세마포어로서 여러 자원에 대한 접근을 제어한다

10-6 모니터

둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근 가능하도록 공유 자원을 숨기고, 해당 접근에 대한 인터페이스만 제공한다

그래서 모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.

그래서 세마포어보다 구현하기는 쉽고, 상호 배제가 자동인 반면, 세마포어는 상호배제를 명시적으로 구현해야하는 차이가 있다.

 

11 교착 상태

출처 https://cocoon1787.tistory.com/858

두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태

11-1 원인

  • 상호 배제 : 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능하다
  • 점유 대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
  • 비선점 : 다른 프로세스의 자원을 강제적으로 가져올 수 없다
  • 환형 대기 : A가 B의 자원을 요구하고, B가 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황

위 4가지가 전부 만족해야 데드락이 발생한다

11-2 해결 방법

  1. 자원 할당시 애초에 조건이 성립하지 않도록 설계
  2. 교착 상태 가능성이 없을 때만 자원을 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 은행원 알고리즘 사용
  3. 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한개씩 지움
  4. 그냥 무시 => 매우 드물게 데드락이 나오거 이를 처리하는 비용이 더 커서 그냥 작업을 종료한다 => 현대 OS 채택

11-3 예방

교착상태 예방 방법은 교착상태가 애초에 일어나지 않도록 방지하는 방법으로 교착상태의 발생조건 4가지 중 하나를 부정함으로써 교착상태를 예방하는 방법.

1. 상호 배제 부정

여러 개의 프로세스가 동시에 공유자원을 사용할 수 있음

2. 점유 대기 부정

프로세스가 실행되기 전에 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나, 자원이 점유되지 않은 상태에서만 자원 요청을 받도록 함

3. 비선점 부정

모든 자원에 대한 선점을 허용

4. 순환 대기 부정

자원을 선형으로 분류하여 고유 번호를 할당하고, 각 프로세스는 현재 점유한 자원의 고유번호보다 앞이나 뒤 한쪽 방향으로만 자원을 요구하도록 함

그러나 이렇게 교착상태 발생조건을 방지해서 데드락을 예방하는 방법은 시스템 처리량이나 자원 사용의 효율성을 떨어트리는 단점이 있다.

11-4 회피

교착상태가 발생할 가능성이 있는 자원 할당(Unsafe allocation)을 하지 않고 안전한 상태(Safe state)에서만 자원 요청을 허용하는 방법입니다. 하지만 교착상태 회피를 하기 위해서는 아래와 같은 가정이 필요합니다.

  • 프로세스 수 고정
  • 자원의 종류와 수 고정
  • 프로세스가 요구하는 최대 자원의 수를 알아야 함
  • 프로세스는 자원 사용 후 반드시 반납

보통 은행원 알고리즘, 자원 할당 그래프 알고리즘을 사용

11-5 탐지

시스템에 데드락이 발생했는지에 대한 여부를 탐색하고 회복 기법 알고리즘에 활용하는 것을 의미

교착상태가 탐지되었다면 회복 기법을 통해 교착상태를 복구한다.

그러나 탐지 기법은 지속적으로 교착상태를 확인하는 작업이 필요하기 때문에 오버헤드(성능 저하)가 발생

11-6 회복

교착상태 회복 기법은 교착상태가 발생했을 때 해결하는 기법을 의미합니다.

1. 사용자 처리

교착상태에 있는 프로세스 중 하나의 프로세스를 사용자가 강제 종료

2. 시스템 처리

  1. 프로세스 중지 
    • 교착상태에 속해있는 모든 프로세스를 중지
    • 교착상태가 해결될 때까지 한 프로세스씩 중지
  2. 자원 선점
    • 프로세스들로부터 자원을 빼앗아 교착상태가 해결될 때까지 다른 프로세스들에게 자원을 할당

 


CPU 스케줄링 알고리즘

1 CPU 스케줄러

CPU 스케줄링 알고리즘에 따라 프로세스에서 해야하는 일을 스레드 단위로 CPU에 할당

그래서 프로그램이 실행될 때 CPU 스케줄링 알고리즘이 어던 프로그램에 CPU 소유권을 줄지 결정한다

그래서 최대한 CPU 이용률은 높게, 주어진 시간에 많은 일을 하게, 준비 큐에 있는 프로세스는 적고, 응답 시간은 짧게 하는 것이 목표

 

2 비선점형 방식

프로세스가 스스로 CPU 소유권을 포기하는 방식이며, 강제로 프로세스를 중지하지 않는다 => 한번 할당받으면 프로세스 끝날 때까지 CPU를 안뺏긴다

따라서 컨텍스트 스위칭으로 인한 부하가 적다

2-1 FCFS

가장 먼저 온것을 가장 먼저 처리하는 알고리즘 => 길게 수행하는 프로세스 덕에 준비 큐에 오래 기달리는 현상 (convoy effect) 발생 가능

2-2 SJF

실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘

긴 시간을 가진 프로세스가 실행하지 못하는 starvation발생 가능

평균 대기 시간이 가장 짧다만 실제로는 실행 시간을 알 수 없어 과거 실행했던 것을 토대로 예측

2-3 우선순위

sjf는 긴 시간을 가진 프로세스는 실행되지 않아 오래된 작업일 수록 우선순위를 높여 단점을 보완

 

3 선점형 방식

현대 운영체제가 쓰는 방식으로 지금 사용하고 있는 프로세스를 알고리즘에 의해 중단 시켜 버리고 강제로 다른 프로세스에 CPU 소유권을 할당하는 방식

3-1 Round Robin(RR)

현대 컴퓨터가 사용하는 스케줄링인 우선순위 스케줄링의 일종이다.

각 프로세스는 동일한 할당 시간을 주고, 그 시간안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 아록리즘이다.

또한 로드 밸런서에서 트래픽 분산 알고리즘으로도 사용되고 있다.

3-2 SRF

SJF는 중간에 실행 시간이 더 짧은 작업이 들어와도 기존 짧은 작업을 모두 수행하고 그 다음 짧은 작업을 이어가는데, 

SRF는 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행한다

3-3 다단계 큐

다단계 큐는 우선순위에 따른 준비 큐를 여러개 사용하고, 큐마다 라운드 로빈이나 FCFS등 다른 스케줄링 알고리즘을 적용한 것을 말한다.

큐 간의 프로세스 이동이 안되므로 스케줄링이 적어지나 유연성이 떨어진다.

ex) 높은 우선순위는 FCFS로 중간 우선순위는 SJF로, 낮은 우선순위는 RR로 하는 식으로...

 

 

 

 

 

 

 

 

 

 

 

 

'CS > OS' 카테고리의 다른 글

세마포어 vs 뮤텍스  (0) 2023.04.03

댓글