본문 바로가기

전공/운영체제

[운영체제,OS] 전공 필기시험 정리

✔️ 운영체제 기능

  • 프로세서, 기억장치, 입출력장치, 파일 등의 자원 관리
  • 스케줄링 기능 제공
  • 사용자와 시스템 간 인터페이스 기능 제공
  • 시스템 오류 검사 및 복구

✔️ 링커와 로더

1. 링커와 로더

링커 

- 컴파일된 목적 프로그램과 라이브러리, 다른 실행 프로그램들을 연결편집기 링커를 이용하여 로드 모듈로 만드는 시스템 소프트웨어

로더

- 프로그램의 실행을 위해 보조기억장치로부터 주기억장치에 프로그램을 적재하는 시스템 소프트웨어

 

2. 로더 기능

  • 할당(allocation)
  • 연결(linking)
  • 재배치(relocation)
  • 적재(loading)

 

3. 로더의 종류

Compile and go loader

번역기가 로더의 기능까지 담당하여 수행하는 방식

  • 프로그램이 크고 한 가지의 언어로만 프로그램 작성이 가능
  • 연결기능은 수행하지 않고 할당, 재배치, 적제 작업을 모두 언어 번역 프로그램이 담당한다.

절대 로더(absolute loader)

  • 대부분의 로더들이 절대 로더를 사용한다.
  • 목적프로그램을 입력받아 주기억장치의 프로그래머가 지정한 주소에 적재하는 기능을 수행하는 로더
  • 할당 및 연결 작업은 프로그래머가 작성할 때 수행하며 재배치는 언어 번역 프로그램이 담당함

직접 연결 로더(direct linking loader)

  • 프로그램에 기억장소 할당 및 프로그램의 연결이 로더에 의해 자동으로 수행되는 로더
  • 로더의 기본적인 기능을 모두 수행하는 로더

동적 적재 로더(dynamic loading loader)

  • 프로그램을 한번에 적재하는 것이 아닌 실행할 때 필요한 부분만 적재하는 로더
  • 호출 시 적재(Load-on-Call)라고도 함

✔️ 페이지 크기 

1. 페이지 크기가 작을 경우

- 페이지 단편화가 감소

- 한 개의 페이지를 주기억장치로 이동하는 시간이 줄어듬

- 불필요한 내용이 주기억장치에 적재될 확률이 적으므로 효율적인 워킹 셋을 유지할 수 있음.

- Locality에 더 일치할 수 있기 때문에 기억장치 효율이 높아진다.

- 페이지 정보를 갖는 페이지 맵 테이블의 크기가 커지고, 매핑 속도가 늦어진다.

- 디스크 접근 횟수가 많아져서 전체적인 입출력 시간은 늘어난다.

 

2. 페이지 크기가 클 경우

- 페이지 정보를 갖는 페이지 맵 테이블의 크기가 작아지고, 매핑 속도가 빨라짐

- 디스크 접근 횟수가 줄어들어 전체적인 입출력의 효율성이 증가

- 페이지 단편화가 증가되고, 한 개의 페이지를 주기억장치로 이동하는 시간이 늘어남

- 프로세스(프로그램) 수행에 불필요한 내용까지도 주기억장치에 적재될 수 있음

 


✔️ 페이지 교체 알고리즘 

  • OPT - Optimal : 앞으로 가장 오랫동안 사용되지 않을 페이지 교체
  • FIFO - First In First Out
  • LRU - Least Recently Used : 가장 오랫동안 사용되지 않은 페이지 교체
  • LFU - Least Frequently Used : 참조 횟수가 가장 작은 페이지 교체
  • MFU - Most Frequently used : 참조 횟수가 가장 많은 페이지 교체
  • NUR - Not Used Recently : 최근에 사용하지 않은 페이지 교체

✔️  Standard RAID Level

  • RAID를 구성하는 디스크의 종류와 크기는 같다고 가정(실제로도 같은 크기, 종류의 디스크를 사용하는 것을 권장함)
  • 성능의 경우 RAID 컨트롤러의 연산으로 인한 성능 저하는 제외하고, Sequential I/O 시만 가정
  • RAID를 구성하는 디스크의 개수는 N으로 표현

1. RAID 0

  • Striping (스트라이핑)이라고도 부르는 방식
  • RAID 0을 구성하기 위해서는 최소 2개의 디스크가 필요(min(N) == 2)
  • RAID를 구성하는 모든 디스크에 데이터를 분할하여 저장
  • 전체 디스크를 모두 동시에 사용하기 때문에 성능은 단일 디스크 성능의 N배. 마찬가지로 용량 역시 단일 디스크 용량의 N배
  • 하지만 하나의 디스크라도 문제가 발생할 경우 전체 RAID가 깨짐. 즉, 안정성은 1/N으로 줄어듦

=> 정리해보면, RAID 0은 성능 및 용량은 최대한으로 사용하는 대신 안정성은 좋지 않다. (실제 서버 환경에서는 거의 사용하지 않음)

 

2. RAID 1

  • Mirroring(미러링) 이라고도 부르는 방식
  • RAID 1을 구성하기 위해서는 최소 2개의 디스크 필요(min(N) == 2)
  • RAID 컨트롤러에 따라서 2개의 디스크로만 구성 가능할 수도, 혹은 그 이상의 개수를 사용하여 구성할 수도 있음
  • RAID 1은 모든 디스크에 데이터를 복제하여 기록함. 즉, 동일한 데이터를 N개로 복제하여 각 디스크에 저장함
  • RAID 1의 최대 강점은 안정성이 높은 것. N-1개의 디스크가 고장나도 데이터 사용 가능
  • 안정성이 중요한 시스템에서 사용할 수 있겠으나, 비용 문제로 인해 거의 사용하지 않음


3. RAID 2

  • 현재는 사용하지 않는 RAID Level
  • Bit 단위로 striping을 하고, error correction을 위해 Hamming code를 사용함
  • 1개의 디스크 에러 시 복구 가능(2개 이상의 디스크 에러 시 복구 불가능)


4. RAID 3

  • 현재는 사용하지 않는 RAID Level
  • Byte 단위로 스트라이핑을하고, error correction을 위해 패리티 디스크를 1개 사용함
  • 용량 및 성능이 단일 디스크 대비 (N-1)배 증가함
  • Byte 단위로 스트라이핑하기 때문에 너무 작게 쪼개져 현재는 사용하지 않는다고 함
  • 최소 3개의 디스크로 구성 가능
  • 1개의 디스크 에러 시 복구 가능(2개 이상의 디스크 에러 시 복구 불가능)


5.RAID 4

  • 현재는 거의 사용하지 않는 RAID Level
  • Block 단위로 striping을 하고, error correction을 위해 패리티 디스크 1개 사용
  • 용량 및 성능이 단일 디스크 대비 (N-1)배 증가
  • 최소 3개의 디스크로 구성 가능
  • 1개의 디스크 에러 시 복구 가능(2개 이상의 디스크 에러 시 복구 불가능)
  • Block 단위로 striping 하는 것은 RAID 5, 6과 동일하지만, 패리티 코드를 동일한 디스크에 저장하기 때문에, 패리티 디스크의 사용량이 높아 해당 디스크의 수명이 줄어듦
  • RAID 4의 단점을 개선시킨 것이 RAID 5

 

6. RAID 5

  • 제일 사용 빈도가 높은 RAID Level
  • Block 단위로 striping을 하고, error correction을 위해 패리티를 1개의 디스크에 저장함.

=> RAID 0에서 성능, 용량을 조금 줄이는 대신 안정성을 높인 RAID Level이라 볼 수 있다.

 

7. RAID 6

  • RAID 5에서 성능, 용량을 좀 더 줄이고, 안정성을 좀 더 높인 RAID Level
  • Block 단위로 striping을 하고, error correction을 위해 패리티를 2개의 디스크에 저장
  • 용량 및 성능이 단일 디스크 대비 (N-2)배 증가
  • 최소 4개의 디스크로 구성 가능
  • 2개의 디스크 에러 시 복구 가능(3개 이상의 디스크 에러 시 복구 불가능)

=> RAID 5에서 성능, 용량을 조금 줄이는 대신 안정성을 높인 RAID Level이라 보면 되고, 조금 더 안정성을 높여야 하는 서버 환경에서 주로 사용함


✔️  데드락(Dead Lock)

1.데드락(Deadlock)

운영체제에서 데드락(교착상태)이란, 시스템 자원에 대한 요구가 뒤엉킨 상태입니다.

즉, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.

 

2. 데드락(Deadlock)의 발생조건

데드락이 발생하기 위한 조건은 크게 4가지로 말할 수 있습니다.

  • 상호 배제
    • 한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.
    • 자원을 배타적으로 점유하며 다른 프로세서들이 자원 사용이 불가하다.
  • 점유 대기
    • 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다.
  • 비선점
    • 이미 할당된 자원을 강제로 빼앗을 수 없다(비선점).
  • 순환 대기 / 환형 대기
    • 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.
    • 프로세스와 자원들이 원형을 이루며, 각 프로세스는 할당된 자원을 가지면서 상대방 프로세스의 자원을 상호 요청하는 경우
    • 점유 대기 조건과 비선점 조건을 만족해야 성립하는 조건

 

3. 데드락(Deadlock)의 해결법

  •  예방(prevention) 
  •  회피(avoidance) 
  •  탐지(detection)하여, 데드락에서 회복하기

1) 데드락 예방(Prevention)

데드락의 발생조건 4가지 중 하나라도 발생하지 않게 하는 것이 데드락을 예방하는 방법

  • 자원의 상호 배제 조건 방지 : 한 번에 여러 프로세스가 공유 자원을 사용할 수 있게 한다.
  • 점유 대기 조건 방지 : 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할 때까지 작업을 보류해서, 나중에 또다른 자원을 점유하기 위한 대기 조건을 성립하지 않도록 한다.
  • 비선점 조건 방지 : 이미 다른 프로세스에게 할당된 자원이 선점권이 없다고 가정할 때, 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 한다.
  • 순환 대기 조건 방지 : 자원을 순환 형태로 대기하지 않도록 일정한 한 쪽 방향으로만 자원을 요구할 수 있도록 함

2)  데드락 회피(Avoidance)

Safe state : 시스템의 프로세스들이 요청하는 모든 자원을, 데드락을 발생시키지 않으면서도 차례로 모두에게 할당해 줄 수 있는 상태

Safe sequence :  특정한 순서로 프로세스들에게 자원을 할당, 실행 및 종료 등의 작업을 할 때 데드락이 발생하지 않는 순서

회피 알고리즘 : 자원을 할당한 후에도 시스템이 항상 Safe state에 있을 수 있도록 할당을 허용하자는 것이 기본 특징

 

🔑 은행원 알고리즘(Banker’s Algorithm)

다익스트라가 제안한 기법으로, 어떤 자원의 할당을 허용하는지에 관한 여부를 결정하기 전에, 미리 결정된 모든 자원들의 최대 가능한 할당량을 가지고 시뮬레이션 해서 Safe state에 들 수 있는지 여부를 검사한다. 즉 대기중이 다른 프로세스들의 활동에 대한 교착 상태 가능성을 미리 조사하는 것

은행원 알고리즘의 경우, 이처럼 미리 최대 자원 요구량을 알아야 하고, 할당할 수 있는 자원 수가 일정해야 하는 등 사용에 있어 제약조건이 많고, 그에 따른 자원 이용도 하락 등 단점도 존재


3) 데드락 탐지(Detection) 및 회복(Recovery)

  • 탐지 기법
    • Allocation, Request, Available 등으로 시스템에 데드락이 발생했는지 여부를 탐색합니다. 즉, 은행원 알고리즘에서 했던 방식과 유사하게 현재 시스템의 자원 할당 상태를 가지고 파악합니다.
    • 이 외에도 자원 할당 그래프를 통해 탐지하는 방법도 있습니다.
  • 회복 기법
    • 단순히 프로세스를 1개 이상 중단시키기
      • 교착 상태에 빠진 모든 프로세스를 중단시키는 방법 : 계속 연산중이던 프로세스들도 모두 일시에 중단되어 부분 결과가 폐기될 수 있는 부작용이 발생할 수 있음
      • 프로세스를 하나씩 중단 시킬 때마다 탐지 알고리즘으로 데드락을 탐지하면서 회복시키는 방법 : 매번 탐지 알고리즘을 호출 및 수행해야 하므로 부담이 되는 작업일 수 있음
    • 자원 선점하기
      • 프로세스에 할당된 자원을 선점해서, 교착 상태를 해결할 때까지 그 자원을 다른 프로세스에 할당해 주는 방법
  • 데드락을 탐지 기법을 통해 발견했다면, 순환 대기에서 벗어나 데드락으로부터 회복하기 위한 방법

✔️  메모리 관리 기법

1. 메모리 관리 (memory management)

다중 프로그래밍 시스템에서 다수의 프로세스를 수용하기 위해 주 기억장치를 동적으로 분할하는 작업

 메모리 관리 단위의 종류

  • 프레임(frame)
  • 페이지(page)
  • 세그먼트(segment)

 2. 메모리 관리 요구조건

1) 재배치(Relocation)

다수의 프로세스들이 스왑인(swap in), 스왑아웃(swap out) 시 다른 주소 공간으로의 프로세스 재배치 필요 

재배치 고려한 프로세스 주소 지정 요구조건

2) 보호(Protection)

다른 프로세스들의 간섭으로부터 보호

메모리 참조 검사: 실행 중 해당 프로세스에 할당된 메모리 공간 만 참조되었는지 확인 필요

메모리 보호 : 처리기(하드웨어)적인 검사 요구

3) 공유(Sharing)

 주기억장치의 같은 부분을 접근하려는 여러 개의 프로세스들을 융통성 있게 허용

필수적인 보호 기능을 침해하지 않는 범위에서 제한된 접근을 통한 공유

4) 논리적 구성(Logical organization)

일반적으로 프로그램 이미지는 모듈 단위로 구성

운영체제 및 하드웨어의 모듈 단위 처리 시 이점

  • 모듈의 작성과 컴파일이 독립적으로 이루어짐
  • 비교적 적은 overhead로 모듈마다 서로 다른 보호 등급 적용가능
  • 프로세스 간 모듈 공유 기법 제공

대표적인 논리적 메모리 관리 기술 : 세그먼테이션(Segmentation)

5) 물리적 구성(Physical organization)

주기억 장치와 보조 기억 장치 사이의 정보 흐름 구성 

정보 흐름 구성 책임자 : 시스템

  • “사용 가능한 주기억장치 용량 < 프로그램 및 데이터 크기”인 경우 처리 ( Overlay 기법 이용)
  • 다중 프로그래밍 환경: 사용 가능한 공간의 양과 위치 정보 파악 가능

 

3. 메모리 분할 

1) 연속 메모리 관리(contiguous memory management)

프로그램 전체가 하나의 커다란 공간에 연속적으로 할당되어야만 함 => 단일 연속 메모리 관리

  • fixed partitioning
  • dynamic partitioning

2) 불연속 메모리 관리(non-contiguous memory management)

프로그램의 일부가 연속이 아닌 서로 다른 주소 공간에 할당될 수 있는 기법

  • 고정크기: 페이징 (paging)
  • 가변크기: 세그먼테이션 (segmentation)

 

4. 고정 분할

시스템 생성시 주기억장치가 고정된 파티션들로 분할

프로세스는 균등크기의 파티션 또는 그보다 큰 파티션으로 적재 

-강점 : 구현이 간단함, 운영체제의 오버헤드가 적음

-약점 : 내부단편화 발생, 최대 활성 프로세스가 고정됨

 

5. 동적 분할

-파티션들이 동적으로 생성되며, 각프로세스는 자신의 크기와 일치하는 크기의 파티션에 적재된다.

-강점 : 내부단편화가 없다. 주기억장치를 효율적으로 사용할 수 있다.

-약점 : 외부 단편화를 해결하기 위한 메모리 집약이 요구된다. 처리기 효율이 나빠진다.

 

6. 단순 페이징

-주기억장치는 균등크기의 프레임으로 나뉜다. 각 프로세스는 프레임들과 같은 길이를 가진 균등페이지들로 나뉜다. 프로세스의 모든 페이지가 적재되어야 하며 이 페이지를 저장하는 프레임들은 연속적일 필요는 없다.

-강점 : 외부 단편화가 없다

-약점 : 적은 양의 내부 단편화가 생긴다.

 

 

7. 단순 세그먼테이션

-각 프로세스는 여러 세그먼트(모듈별로, 클래스별로)들로 나뉜다. 프로세스의 모든 세그먼트가 적재되어야 하며 이 세그먼트를 저장하는 동적 파티션들은 연속적일 필요는 없다.

세그먼테이션은 동적분할과 유사하지만 가상메모리나 오버레이 같은 방법을 사용하지 않는다면 모든 프로그램의 세그먼트들은 실행을 위해 전부 메모리에 적재되어야 하며 그 외에도 프로그램이 하나 이상의 파티션을 차지할 수 있다는 점과 파티션이 연속적일 필요가 없다는 것이다. 

-강점 : 내부단편화가 없고 메모리 사용 효율이 개선됨, 동적분할에 비해 오버헤드가 적음

-약점 : 외부 단편화 발생

 

2) 세그먼테이션과 페이징의 차이점

-페이징이 프로그래머한테 투명한데 비해 세그먼테이션은 보통 프로그래머가 각 세그먼트를 지정할 수 있으며 프로그램과 데이터를 편의대로 나누기 위한 수단으로 제공된다.
-구조적 프로그래밍을 위해서 프로그램 또는 데이터는 더 세분화된 여러 세그먼트들로 나뉠 수 있다. 이런 세그먼트 기법을 사용하는 데 있어 가장 불편한 점은 프로그래머가 세그먼트 최대 크기를 알아야 한다는 것이다.(페이징은 몰라도됨)
 

8. 외부단편화 및  내부단편화 

-외부단편화 : 고정 분할과 같이 고정된 파티션들로 분할 했을 때 그 분할된 파티션보다 메모리에 올라가는 작업이 차지하는 메모리가 작을 경우 비효율적으로 낭비되는 메모리가 생겨나는 것

 

-내부단편화 : 파티션들을 프로세스가 차지하는 메모리 크기에 맞게 적재 시키는 동적 분할에 발생하는데 예를 들어 15MB의 메모리에 5MB의 크기의 작업을 메모리에 적재 시키고 2MB의 크기의 작업을 메모리에 적재시킨 후 6MB의 크기의 작업을 메모리에 적재 시키면 상대적으로 작업량이 적은 2MB가 먼저 종료되고 4MB의 메모리가 남았지만 딱 3MB의 작업이 메모리에 할당되고 싶어도 할당할 수 없는 상태를 말한다.

 

9. 배치 알고리즘

프로세스를 주기억장치로 적재하거나 스왑인 하려고 할 때 충분한 크기의 사용 가능한 메모리 블록이 두 개 이상 있다면 운영체제는 어떤 블록에 할당 할 것인지를 결정해야한다.

 

1) 최적적합

-요청된 크기와 가장 근접한 크기의 메모리를 선택한다.

2) 최초적합

-메모리의 처음부터 검사해서 크기가 충분한 첫 번째 사용 가능한 메모리 블록을 선택한다.

 

3) 순환적합

-가장 최근에 배치되었던 메모리 위치에서부터 검사를 시작해 크기가 충분한 다음 위치의 사용 가능한 메모리 블록

을 선택한다.

 

4) 최악적합

-요청된 크기와 가장 용량 차이가 큰 메모리를 선택한다.

 

 


프로세스 스케줄링 기법

0. 스케줄링 알고리즘의 평가 기준 

CPU Utilization(이용률, %): CPU가 수행되는 비율

 

Throughput(처리율, jobs/sec): 단위시간당 처리하는 작업의 수(처리량)

 

Turnaround time(반환시간): 대기열 도착 ~ 실행 종료, 프로세스의 처음 시작 시간부터 모든 작업을 끝내고 종료하는데 걸린 시간이다.(CPU, waiting, I/O 등 모든 시간을 포함한다.) 

 

Waiting time(대기시간):  프로세스가 대기열에서 대기한 시간, CPU를 점유하기 위해서 ready queue에서 기다린 시간을 말한다.(다른 큐에서 대기한 시간은 제외한다.)

 

Response time(응답시간): 대기열 도착 ~ 첫 번째 출력, 일반적으로 대화형 시스템에서 입력에 대한 반응 시간

 

실행 시간(Burst Time) : 프로세스를 처리하는데 드는 시간

 

정규화 반환 시간(Normalized Turn-around Time) : 실행 시간 대비 반환 시간 (반환 시간/실행 시간)

 

오버헤드(Overhead) : 부가적인 처리시간

 

1. 비선점 스케줄링

1) 특징

1. 할당된 CPU를 다른 프로세스가 강제로 빼앗아 사용 할수 없음

2. 프로세스가 CPU 할당받으면 끝날 때 까지 사용하므로 응답시간 예측 용이

3. 모든 프로세스에 대한 요구를 공정하게 처리함

4. 일괄 처리 방식에 적합

 

2) 종류

FCFS(First Come First Service) : 먼저 오면 먼저 처리함

SJF(Shortest Job First) : 실행시간이 가장 짧은 프로세스 먼처 처리함

HRN(Hightest Responese-ratio Next) : 우선순위 계산하여 우선순위 순으로 처리

 

2. 선점 스케줄링

1) 특징

1.하나의 프로세스가 CPU를 할당받아 실행하고 있을 때 우선순위가 높은 다른 프로세스가 강제로 CPU를 뺏앗아

  사용 할 수 있는 기법

2.우선순위가 높은 프로세스를 빠르게 처리할 수 있음

3.주로 빠른 응답시간을 요구하는 시스템에 사용

 

2) 종류

SRT(Shortest Remaining Time) : 비선점 기법인 SJF 알고리즘을 선점형태로 변경한 기법

 현재 실행중인 프로세스의 남은 시간과 새로 도착한 프로세서의 실행시간중 짧은 프로세서에게 CPU할당

RR(Round Robin) : 시분할 시스템을 위해 고안된 방식, 대화식 시스템에 유용함.

먼저 온 순서대로 CPU 할당을 받지만 주어진 시간 내에 프로세스가 끝나지 않을 경우 다음 프로세스에게 넘어감

MLQ(Multi Level Queue) : 레디 큐를 여러 개로 분할하여 관리하는 스케줄링 기법

큐가 여러 개 있으니, 프로세스가 들어왔을 때 어떤 큐에게 보내야되는지 결정하는 메커니즘이 필요

  1. 실시간 프로세스
  2. 시스템 프로세스
  3. 대화형 프로세스
  4. 배치 프로세스

- 빠른 응답을 필요로 하는 대화형 작업과 그렇지 않는 작업으로 나눠서 프로세스를 레디큐에 프로세스를 넣는다. 전자를 전위 큐, 후자를 후위 큐라고 불리기도 한다.

- 전위 큐에서는 응답 시간이 빠르다는 점으로 보통 라운드 로빈 알고리즘을 사용한다. 후위 큐에서는 응답 시간보다 계산 위주이기 때문에 FCFS 알고리즘을 사용해 컨텍스트 스위칭을 줄여 오버헤드를 줄이도록 한다.

장점

  • 응답이 빠름

단점

  • 여러 개의 준비큐와 스케줄링 알고리즘 때문에 추가 오버 헤드가 발생함
  • 우선순위가 낮은 프로세스는 기아를 겪을 수도 있음

멀티 레벨 피드백 큐(Multi Level Feedback Queue)

- 기존에는 프로세스들이 영구적으로 하나의 큐에만 할당되었지만, 멀티 레벨 피드백 큐에서는 프로세스가 다른 큐로도 이동이 가능하다

장점

  • 프로세스의 다양한 성격을 반영해 구현할 수 있다는 장점이 있다.
  • 우선순위가 낮은 큐에서 오래 기다린다면 우선순위가 높은 큐로 프로세스를 이동시켜서 기아 문제를 해결 할 수 있다.

단점

  • 설계와 구현이 매우 복잡하다.

작업 시간이 빠른 프로세스는 더 빠른 서비스가 가능하도록 제공하고, 작업이 긴 프로세스는 문맥 교환 없이 CPU작업에만 열중할 수 있도록 FCFS 방식을 채택하도록 만들 수도 있다.


인터럽트

1. 인터럽트란

프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 중단하고 발생된 상황을 처리한 후 다시 실행중인 작업으로 복귀하는 것

 

2.  외부 인터럽트

  • 전원 이상 인터럽트(Power fail interrupt) : 말그대로 정전, 파워 이상 등
  • 기계 착오 인터럽트(Machine check interrupt) : CPU의 기능적인 오류
  • 외부 신호 인터럽트(External interrupt)
    - 타이머에 의한 인터럽트 : Preemptive개념을 생각하면 된다. 자원이 할당된 시간이 다 끝난 경우
    - 키보드로 인터럽트 키를 누른 경우 : 대표적으로 Control + Alt + Delete
    - 외부장치로부터 인터럽트 요청이 있는 경우 : I/O 인터럽트 아님!! 다른 개념이다
  • 입출력 인터럽트(I/O Interrupt)
    - 입출력장치가 데이터 전송을 요구하거나 전송이 끝나 다음 동작이 수행되어야 할 경우
    - 입출력 데이터에 이상이 있는 경우

3. 내부 인터럽트

  • 잘못된 명령이나 잘못된 데이터를 사용할때 발생하며 Trap이라 부른다.
  • 프로그래 검사 인터럽트(Program check interrupt)
    - Division by zero
    - Overflow/Underflow
    - 기타 Exception
  • 소프트웨어적이 내용이나 분류상 인터럽트가 아니다!

 

4. 소프트웨어 인터럽트(SVC : SuperVisor Call)

  • 사용자가 프로그램을 실행시키거나 감시프로그램(Supervisor)을 호출하는 동작을 수행하는 경우
  • 소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.

 

5. 인터럽트 동작 순서

  1. 인터럽트 요청
  2. 프로그램 실행 중단 : 현재 실행중이던 Micro operation 까지 수행한다.
  3. 현재의 프로그램 상태 보존 : PCB(Process Control Block), PC(Program Counter) 등
  4. 인터럽트 처리루틴 실행 : 인터럽트를 요청한 장치를 식별한다.
  5. 인터럽트 서비스 루틴 실행 : 인터럽트 원인을 파악하고 실질적인 작업을 수행한다. 처리기 레지스터 상태를 보존한다. 서비스 루틴 수행 중 우선순위가 더 높은 인터럽트가 발생하면 또 재귀적으로 1~5를 수행한다.
  6. 상태복구 : 인터럽트 발생 시 저장해둔 PC(Program counter)를 다시 복구한다.
  7. 중단된 프로그램 실행 재개 : PC의 값을 이용하여 이전에 수행중이던 프로그램을 재개한다.

 

5. 인터럽트 우선 순위

전원 이상(Power fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) > 명령어 잘못 > 프로그램 검사(Program Check) > SVC(SuperVisor Call)

(일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선 순위가 높고 내부 인터럽트 보다 외부 인터럽트가 우선 순위가 높다.)

 

1) 소프트웨어적인 방법(Polling)

인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾고, 이에 해당하는 인터럽트 서비스 루틴을 수행한다.

속도가 따른 장치에 높은 등급을 부여한다.

우선순위 변경이 쉽다.

많은 인터럽트가 있을 경우 하드웨어 적인 방법에 비해서 우선순위 판단 속도가 느리다.

회로가 간단하고 융통성이 있으며, 별도의 하드웨어가 필요 없다.

 

2) 하드웨어적인 방법(Vectored Interrupt)

인터럽트를 요청할 수 있는 장치와 CPU사이에 장치번호를 식별할 수 있는 버스를 직렬/병렬로 연결한다.

인터럽트 벡터는 인터럽트를 발생한 장치가 분기할 곳에 대한 정보이다.

소프트웨어적인 방법에 비해 비경제적이다.

회로가 복잡하고 융통성이 없으나, 별도의 소프트웨어가 필요없이 하드웨어로 처리되므로 속도가 빠르다.

하드웨어적인 방법은 아래 2가지로 나뉜다.

 

 Daisy Chain★

인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.

우선순위가 높은 장치를 상위에 두고 우선순위 차례대로 배치한다.

 

 병렬(Parallel) 우선순위 부여 방식

인터럽트가 발생하는 모든 장치를 하나의 직렬 회선으로 연결한다.

각 장치별 우선순위를 판별하기 위한 Mask register에 bit를 설정한다.

Mask register상 우선순위가 높은 서비스 루틴 수행중 우선순위가 낮은 bit들을 비활성화 시킬 수 있다.

반대로 우선순위가 높은 인터럽트는 낮은 인터럽트 수행 중에도 우선 처리된다.

 


프로세스와 스레드

💡 프로세스란

  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스

 

💡 하나의 프로세스는 크게 코드영역(code), 데이터 영역(date), 스택 영역(stack), 힙 영역(heap) 4가지로 이루어져 있습니다.

Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)

Data : 전역 변수, 정적 변수, 배열 등 (초기화된 데이터)

stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)

Heap : 동적 할당 시 사용 (new(), mallock() 등)

 

 cpu는 프로세스 1을 어느 정도 하고 저장하고 프로세스 2를 진행하고 다시 돌아가며 여러 프로세스를 왔다 갔다 하는 콘텍스트 스위칭(Context Switching) 이 일어납니다.

반복이 많아지게 되면 CPU의 부담이 늘어나고, 중복된 자원들이 비효율적으로 관리됩니다. 그럴 때 사용하는 것이 바로 멀티스레드입니다.

먼저 스레드(Thread)란, 

한 프로세스 내에서 동작되는 여러 실행의 흐름으로
프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개를 동시에 실행시킬 수 있는 것을 말합니다.

 

스레드는

  • 한 프로세서 내의 주소 공간이나 자원들을 대부분 공유 
  • 기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성되며, 이를 메인 스레드라고 부르며, 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행됩니다.
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며 이를 멀티 스레드라고 합니다.

💡 멀티스레드의 구조를 보면 다음과 같이 Code, Data, Heap영역을 공유하고 있으며,  Stack만 스레드 별로 가지게 됩니다. 

 

💡 다른 자원들은 공유하지만 굳이 스택만 분리해서 사용하는 이유는? 

LIFO(Last In First Out) / 후입 선출이라는 스택의 특성과도 연관이 있습니다.
왜냐하면?  코드와 데이터 힙 영역을 공유하는 것에는 큰 문제가 없지만,
스택 영역은 스택이 쌓이면 위에서부터 프로세스가 섞인 채로 순서대로 나오게 되므로
더 복잡해지기 때문에 원활한 실행 흐름을 위해 스택은 따로 독립적으로 존재하게 됩니다. 

2. 멀티 프로세스와 멀티스레드

📌 멀티프로세스

하나의 컴퓨터에 여러 CPU 장착 → 하나 이상의 프로세스들을 동시에 처리(병렬)

장점 : 안전성이 높음 (독립된 구조기 때문에)

단점 : 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을수록 오버헤드 발생. Context Switching으로 인한 성능 저하

 

📌 멀티스레드

장점

- 프로그램의 응답 시간이 단축됩니다.

- 시스템의 처리율이 향상됩니다.

- 시스템의 자원 소모 감소합니다.

- 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단합니다.

 

단점

- 여러 개의 스레드를 이용하는 경우, 미묘한 시간차나 잘못된 변수를 공유함으로써 오류 발생 가능

   👉🏼 따라서 스레드 간에 통신할 경우에는 충돌 문제가 발생하지 않도록 동기화 문제를 해결해야 합니다.

- 프로그램 디버깅이 어렵습니다.

- 단일 프로세스 시스템에서는 효과를 기대하기 어렵습니다.


[ Byte Ordering이란 ]

Byte Ordering이란 데이터가 저장되는 순서를 의미합니다. Byte Ordering의 방식에는 빅엔디안(Big Endian)과 리틀엔디안(Little Endian)이 있습니다.

  • Big Endian
    • MSB가 가장 낮은 주소에 위치하는 저장 방식
    • 네트워크에서 데이터를 전송할 때 주로 사용됨
    • 가장 낮은 주소에 MSB가 저장되므로, offset=0인 Byte를 보면 양수/음수를 바로 파악할 수 있다.
  • Little Endian
    • MSB가 가장 높은 주소에 위치하는 방식
    • 마이크로프로세서에서 주로 사용된다.
    • 가장 낮은 주소에 부호값이 아닌 데이터가 먼저 오기 때문에, 바로 연산을 할 수 있다.

 

 

 

[ 메모리란 ]

메모리는 컴퓨터에서 작업을 수행하기 위해 처리 대상이나 결과 등을 저장하기 위한 공간입니다. 프로그램을 실행하기 위한 정보들은 메모리에 저장되어 처리됩니다.

 

[ 프로세스와 쓰레드의 차이 ]

  • 프로세스
    • 정의: 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
    • 특징
      • 운영체제로부터 독립된 메모리 영역을 할당받는다. (다른 프로세스의 자원에 접근 X)
      • 프로세스들은 독립적이기 때문에 통신하기 위해 IPC를 사용해야 한다.
      • 프로세스는 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있다.
  •  쓰레드
    • 정의: 프로세스 내에서 할당받은 자원을 이용해 동작하는 실행 단위
    • 특징
      • 쓰레드는 프로세스 내에서 Stack만 따로 할당 받고, Code, Data, Heap 영역은 공유한다.
        (Stack을 분리한 이유는 Stack에는 함수의 호출 정보가 저장되는데, Stack을 공유하면 LIFO 구조에 의해 실행 순서가 복잡해지기 때문에 실행 흐름을 원활하게 만들기 위함이다.)
      • 쓰레드는 프로세스의 자원을 공유하기 때문에 다른 쓰레드에 의한 결과를 즉시 확인할 수 있다.
      • 프로세스 내에 존재하며 프로세스가 할당받은 자원을 이용하여 실행된다.

 

 

[ 컨텍스트 스위칭(Context Switching)이란? ]

Context Switching이란 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정입니다. Context Switching는 현재 실행중인 프로세스의 상태(Context)를 먼저 저장하고, 다음 프로세스를 동작시켜 작업을 처리한 후에 이전에 저장된 프로세스의 상태를 다시 복구합니다. 여기서 인터럽트란 CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요함을 CPU에게 알리는 것을 말합니다.

 

 

[ 멀티 프로세스 VS 멀티 쓰레드 ]

  • 멀티 프로세스
    • 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 1개의 작업을 처리하도록 하는 것
    • 특징
      • 1개의 프로세스가 죽어도 자식 프로세스 이외의 다른 프로세스들은 계속 실행된다.
      • Context Switching을 위한 오버헤드(캐시 초기화, 인터럽트 등)가 발생한다.
      • 프로세스는 각각 독립적인 메모리를 할당받았기 때문에 통신하는 것이 어렵다.
  • 멀티 쓰레드
    • 하나의 프로그램을 여러 개의 쓰레드로 구성하여 각 쓰레드가 1개의 작업을 처리하도록 하는 것
    • 특징
      • 프로세스를 위해 자원을 할당하는 시스템콜이나 Context Switching의 오버헤드를 줄일 수 있다.
      • 쓰레드는 메모리를 공유하기 때문에, 통신이 쉽고 자원을 효율적으로 사용할 수 있다.
      • 하나의 쓰레드에 문제가 생기면 전체 프로세스가 영향을 받는다.
      • 여러 쓰레드가 하나의 자원에 동시에 접근하는 경우 자원 공유(동기화)의 문제가 발생할 수 있다.

[ 데드락(DeadLock) 이란? ]

데드락(DeadLock) 또는 교착상태란 한정된 자원을 여러 프로세스가 사용하고자 할 때 발생하는 상황으로, 프로레스가 자원을 얻기 위해 영구적으로 기다리는 상태입니다. 예를 들어 다음과 같은 상황에서 데드락이 발생할 수 있습니다.

자원 A를 가진 프로세스 P1과 자원 B를 가진 프로세스 P2가 있을 때, P1은 B를 필요로 하고 P2는 A를 필요로 한다면 두 프로세스 P1, P2는 서로 자원을 얻기위해 무한정 기다리게 됩니다.

 

[ 멀티 쓰레드 프로그래밍 작성 시 유의점 ]

멀티 쓰레드 프로그램을 개발한다면, 다수의 쓰레드가 공유 데이터에 동시에 접근하는 경우에 상호 배제를 제거해 교착 상태를 예방하고 동기화 기법을 통해 동시성 문제가 발생하지 않도록 발생하지 않도록 주의해야 합니다.

 

[ 세마포어(Semaphore) vs 뮤텍스(Mutex) 차이 ]

뮤텍스는 Locking 메커니즘으로 락을 걸은 쓰레드만이 임계 영역을 나갈때 락을 해제할 수 있습니다. 하지만 세마포어는 Signaling 메커니즘으로 락을 걸지 않은 쓰레드도 signal을 사용해 락을 해제할 수 있습니다. 세마포어의 카운트를 1로 설정하면 뮤텍스처럼 활용할 수 있습니다.

 

[ CPU의 메모리 I/O 도중 생기는 병목 현상 해결 방법 ]

이러한 문제를 해결하기 위해 메모리를 계층화하여 병목현상을 해결하고 있습니다. 자주 접근하는 데이터의 경우에는 캐시에 저장하여 접근 속도를 향상 시킴으로써 부하를 줄이고 있습니다.


[ 가상메모리와 페이지폴트 ]

 

가상메모리는 RAM의 부족한 용량을 보완하기 위해, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 할당하는 방식입니다. OS는 프로세스들의 내용(페이지) 중에서 덜 중요한 것들을 하드디스크에 옮겨 놓고, 관련 정보를 페이지 테이블에 기록합니다. CPU는 프로세스를 실행하면서 페이지 테이블을 통해 페이지를 조회하는데, 실제메모리에 원하는 페이지가 없는 상황이 발생할 수 있습니다(Valid bit를 통해 확인). 이것을 페이지 폴트라고 하는데 프로세스가 동작하면서 실제메모리에 필요한 데이터(페이지)가 없으면 가상메모리를 통해서 해당 데이터를 가져오게 됩니다. 가상메모리는 하드디스크에 저장되어 있기 때문에, 페이지폴트가 발생하면 I/O에 의한 속도의 저하가 발생합니다.

 

[ 페이지 교체 알고리즘과 LRU(Least Recently Used) ]

LRU(Least Recently Used)는 페이지를 교체하기 위한 알고리즘 중 하나입니다.

페이지를 교체하는 이유는 가상메모리를 통해 조회한 페이지는 다시 사용될 가능성이 높기 때문입니다. 페이지 교체를 위해서는 실제메모리에 존재하는 페이지를 가상메모리로 저장한 후에, 가상메모리에서 조회한 페이지를 실제메모리로 로드해야 됩니다. 그렇다면 어떤 실제메모리의 페이지를 가상메모리로 희생시킬 것이냐에 대한 문제가 발생하는데, 이때 사용하는 알고리즘 중 하나가 LRU(Least Recently Used) 알고리즘 입니다.

LRU 알고리즘은 실제메모리의 페이지들 중에서 가장 오랫동안 사용되지 않은 페이지를 선택하는 방식입니다. 그 외에도 먼저 적재된 페이지를 희생시키는 FIFO(First In First Out) 알고리즘이나 LRU 알고리즘을 응용하여 페이지에 Second-Change를 주는 LRU Approximation 등이 있습니다.

 

 

 

 

출처: https://mangkyu.tistory.com/92 [MangKyu's Diary:티스토리]

출처: https://devuna.tistory.com/21?category=890707 [튜나 개발일기:티스토리]

출처: https://raisonde.tistory.com/entry/인터럽트Interrupt의-개념과-종류 [지식잡식]

https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-6.-CPU-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81

https://kimcoder.tistory.com/305

https://rshday.tistory.com/15

https://sunday5214.tistory.com/9

http://mm.sookmyung.ac.kr/~bigrain/class/2011/mmso/StallingsOS6e-Chap07.pdf

https://chanhuiseok.github.io/posts/cs-2/

'전공 > 운영체제' 카테고리의 다른 글

[OS과제] SYS  (0) 2022.04.26
메모리 1 - 구조 / 종류 / 관리 / 정책 / 단편화  (0) 2022.02.23
파일 시스템  (0) 2021.12.14
[2장] 운영체제 개요  (0) 2020.06.29