728x90

CPU 스케줄링은 시스템의 성능과 효율성을 최적화하기 위해 여러 프로세스 또는 스레드에 CPU 사용 시간을 어떻게 할당할지 결정하는 과정이다. 이 과정에서 스케줄링 알고리즘을 사용하여 작업의 실행 순서를 결정한다.

 

FIFO(FCFS)는 먼저 도착한 프로세스를 먼저 처리한다. 프로세스가 준비 큐에 도착한 순서대로 CPU를 할당받는다.

프로세스 ID 도착 시간 실행 시간
P1 0 4
P2 1 3
P3 2 2

 

  1. P1은 시간 0에 도착하여 바로 실행을 시작하고, 4시간 동안 실행된다. (0-4)
  2. P2는 시간 1에 도착하지만, P1이 실행 중이므로 대기해야 하며, P1이 완료된 시간 4에 실행을 시작하여 3시간 동안 실행된다. (4-7)
  3. P3는 시간 2에 도착하지만, P1과 P2의 실행을 대기해야 하며, P2가 완료된 시간 7에 실행을 시작하여 2시간 동안 실행된다. (7-9)

SJF(Shortest Job First)는 실행 시간이 가장 짧은 프로세스에게 먼저 CPU를 할당한다. SJF는 비선점형과 선점형(SRTF) 두 가지 변형이 있다.

프로세스 ID 도착 시간 실행 시간
P1 0 6
P2 1 5
P3 2 4

 

  1. 시간 0에 P1이 도착하고, 다른 프로세스가 없으므로 P1이 실행을 시작한다.
  2. 시간 1에 P2가 도착하지만, P1이 실행 중이므로 P2는 대기해야 한다.
  3. 시간 2에 P3가 도착하지만, P1이 여전히 실행 중이므로 P3도 대기한다.
  4. 시간 6에 P1의 실행이 완료되며, 이 시점에서 대기 중인 P2와 P3 중에서 실행 시간이 가장 짧은 P3(실행 시간 4)이 다음으로 실행된다.
  5. 시간 10에 P3의 실행이 완료되고, 마지막으로 P2(실행 시간 5)가 실행된다.

RR(Round Robin)은 프로세스에게 동일한 크기의 시간 할당량(타임 슬라이스)을 순차적으로 할당한다. 타임 슬라이스가 지나면 프로세스는 준비 큐의 끝으로 이동하고, CPU는 다음 프로세스에게 할당된다.

프로세스ID 도착 시간 실행 시간
P1 0 6
P2 2 2
P3 4 4

 

위 표에서 타임 슬라이스가 2일 때,

  1. 시간 0~2: P1이 먼저 시작하여 처음 2초 동안 실행된다.
  2. 시간 2~4: P1의 타임 슬라이스가 끝나고 P2가 도착했으므로, P2가 다음 2초 동안 실행된다.
  3. 시간 4~6: P2가 종료되고, P3가 도착했으므로 P3가 다음 2초 동안 실행된다.
  4. 시간 6~8: P1이 다시 실행되어 남은 2초 동안 실행된다.(총 실행 시간 6초 중 4초가 남았으므로 2초만 실행)
  5. 시간 8~10: P3가 다시 실행되어 다음 2초 동안 실행된다.(남은 시간 2초)
  6. 시간 10~12: P3의 남은 2초가 실행되어 종료된다.

우선순위 스케줄링(Priority Scheduling)은 각 프로세스에 우선순위를 할당하고, 가장 높은 우선순위를 가진 프로세스에게 먼저 CPU를 할당한다. 이 알고리즘도 비선점형과 선점형이 있다.

프로세스 ID 도착 시간 실행 시간 우선순위
P1 0 6 3
P2 2 2 1
P3 4 4 2
  • 시간 0~2: P1이 가장 먼저 도착하므로 실행을 시작한다. 우선순위는 3이다.
  • 시간 2~4: P2가 도착한다. P2의 우선순위는 1로, 가장 높다. 따라서, P1의 실행이 중단되고 P2가 실행을 시작한다. P2는 실행 시간이 2초이므로 이 기간 동안 완료된다.
  • 시간 4~6: P2의 실행이 완료된 후, P1이 중단되었던 지점부터 실행을 재개한다. 그러나 바로 P3가 도착한다. P3의 우선순위는 2로, 실행 중인 P1보다 높다. 따라서, P1의 실행이 다시 중단되고 P3가 실행을 시작한다.
  • 시간 4~8: P3은 실행 시간이 4초이므로, 이 기간 동안 실행되어 완료된다.
  • 시간 8~14: P3의 실행이 완료된 후, 중단되었던 P1이 남은 실행 시간을 가지고 실행을 재개한다. P1은 남은 4초 동안 실행되어 완료된다.

다단계 큐(Multilevel Queue)스케줄링은 준비 큐를 여러 개의 별도 큐로 분할하고, 각 큐는 자신만의 스케줄링 알고리즘을 가진다. 프로세스는 그들의 특성(예: 우선순위, 프로세스 타입 등)에 따라 적절한 큐에 배치된다.

프로세스 ID 도착 시간 실행 시간
P1 0 6 Q2
P2 2 2 Q1
P3 4 4 Q2

두 개의 큐 (Q1>Q2)일 때,

  1. 시간 0~2: P1이 Q2에 있으며, 시스템에 다른 프로세스가 없기 때문에 P1이 실행을 시작한다.
  2. 시간 2~4: P2가 도착하고 Q1에 배치된다. Q1이 Q2보다 우선순위가 높기 때문에, P1의 실행이 중단되고 P2가 실행을 시작한다.
  3. 시간 4~6: P2의 실행이 완료된다. P1의 남은 실행 시간은 4초이다. 이때 P3가 도착하지만, P1이 먼저 도착했으므로 P1이 계속해서 실행된다.
  4. 시간 6~10: P1의 실행이 완료된다. 이제 P3가 실행을 시작한다.
  5. 시간 10~14: P3의 실행이 완료된다.

다단계 피드백 큐(Multilevel Feedback Queue)스케줄링은 다단계 큐 스케줄링을 확장한 형태로, 프로세스가 다른 큐로 이동할 수 있게 한다. 이는 프로세스의 실행 행위에 따라 동적으로 우선순위를 조정할 수 있게 한다.

프로세스 ID 도착 시간 실행 시간
P1 0 6 Q1
P2 2 2 Q1
P3 4 4 Q1

두 개의 큐(Q1>Q2), 타임 슬라이스 2일때, 

  1. 시간 0~2: P1이 처음 2초 동안 실행된다.
  2. 시간 2~4: P1의 타임 슬라이스가 종료되고, P2가 도착했으므로 P2가 다음 2초 동안 실행된다. 이 시점에서 P2는 완료된다.
  3. 시간 4~6: P2가 완료되고, P3가 도착했으므로 P3가 다음 2초 동안 실행된다.
  4. 시간 6~8: P3의 첫 번째 타임 슬라이스가 종료되고, P1이 다시 실행을 시작한다. P1은 두 번째 타임 슬라이스인 2초 동안 실행된다.
  5. 시간 8~10: P1의 두 번째 타임 슬라이스가 종료되고, P3가 다시 실행을 시작한다. P3는 나머지 2초 동안 실행되어 완료된다.
  6. 시간 10~12: P1이 마지막 2초 동안 실행되어 완료된다.

4BSD(4th Berkeley Software Distribution)는 유닉스 운영 체제의 한 버전으로, 버클리 캘리포니아 대학교에서 개발되었다. 이 운영 체제는 많은 혁신적인 기능을 도입하여 유닉스 기반 시스템의 발전에 큰 영향을 미쳤다. 4BSD 스케줄러는 특히 시분할 시스템에 적합한 CPU 스케줄링 알고리즘을 제공하며, 시스템의 반응 시간과 사용자와의 상호 작용에 초점을 맞춘다. 이 스케줄러는 프로세스의 우선순위를 동적으로 조정하여, 인터랙티브한 작업과 배경 작업 사이의 균형을 잘 맞출 수 있다.

 

nice는 유닉스 및 유닉스 계열 운영 체제에서 프로세스의 스케줄링 우선순위를 조정하기 위해 사용되는 명령어이다. 프로세스에 'nice 값'을 할당함으로써, 시스템은 해당 프로세스의 우선순위를 조정한다. nice 값이 낮을수록 프로세스는 더 높은 우선순위를 갖게 되어 CPU 시간을 더 많이 받는다. 반대로, nice 값이 높을수록 프로세스의 우선순위는 낮아지고, CPU 시간을 더 적게 할당받게 된다. 이를 통해 시스템 관리자나 사용자는 중요도가 낮은 작업에 더 낮은 우선순위를 지정하여 중요한 작업이 더 많은 시스템 자원을 사용할 수 있도록 할 수 있다.

 

728x90
728x90

32비트 시스템은 한 번에 32비트(4바이트)의 데이터를 처리할 수 있다. 메모리 주소도 32비트로 표현되어, 최대 4GB(2의 32승 바이트)의 RAM을 직접적으로 접근할 수 있다. 32비트 운영 체제와 응용 프로그램은 주로 오래된 컴퓨터나 임베디드 시스템에서 사용된다.

 

32비트 시스템에서는 에서는 대규모 데이터 세트를 처리하거나 고해상도 그래픽을 사용하는 최신 게임과 응용 프로그램의 요구 사항을 충족시키기 어렵다.

 

64비트 시스템은 한 번에 64비트(8바이트)의 데이터를 처리한다. 이로 인해 메모리 주소 공간이 대폭 확장되어, 이론적으로는 16엑사바이트(약 1.8 x 10^19 바이트)까지의 메모리를 지원한다. 실제로는 시스템에 따라 이보다 적은 양의 메모리를 사용할 수 있지만, 현대의 대부분의 애플리케이션과 운영 체제는 64비트를 기반으로 한다.

 

64비트 시스템은 더 많은 메모리를 효율적으로 사용할 수 있으며, 더 큰 데이터 단위를 처리할 수 있다. 이는 특히 대용량 데이터를 다루는 애플리케이션에서 성능의 향상을 의미한다.

 

x86과 x86-64(또는 AMD64, Intel 64로도 알려짐) 아키텍처는 컴퓨터의 CPU 설계를 의미한다. 이들은 프로세서가 데이터를 처리하고 메모리에 접근하는 방식을 정의한다.

 

x86 아키텍처는 32비트 기반이고 978년 인텔이 개발한 Intel 8086 마이크로프로세서에서 유래했다. 최대 4GB 메모리 접근 가능하고 오래된 시스템, 임베디드 시스템, 저성능 요구 사항을 가진 애플리케이션에 적합하다.

 

x86-64 아키텍처는 64비트 확장 버전이고, 2000년대 초 AMD에 의해 처음 소개됨(AMD64), 인텔은 나중에 유사한 기술(EtM64T, 후에 Intel 64로 재명명)을 도입했다. 이론적으로 최대 16엑사바이트(2의 64승 바이트)까지 메모리 접근 가능, 실제로는 시스템에 따라 제한된다. 기존 x86 아키텍처 기반의 소프트웨어를 지원하면서, 더 큰 메모리와 향상된 성능 제공한다. 현대의 대부분 컴퓨터, 고성능 서버, 게임, 고급 계산 작업에 사용된다.

 

RAX는 x86-64아키텍처의 범용 레지스터이다. x86-64는 32비트인 x86 아키텍처의 확장버전이다. RAX의 R은 64를 의미하고 AX는 어큐뮬레이터 레지스터를 뜻한다. 기존의 x86 아키텍처의 범용 레지스터 EAX, EBX, ECX 등 하위 32비트를 사용함과 동시에 확장시킨게 RAX, RBX, RCX 이다.

RAX를 제외한 RBX(Base), RCX(Count), RDX(Data), RSI(Source Index), RDI(Destination Index)같은 이런 범용 레지스터들의 역할은 함수 호출시 인자전달을 하거나 로컬 변수를 저장하거나 스택 포인터를 관리하는 등의 역할을 한다.

AX 레지스터는 주로 산술 연산, 데이터 이동, 입/출력 명령 등 다양한 목적으로 사용된다. 산술 연산 및 논리 연산 명령어의 결과는 종종 RAX 레지스터에 저장됨과 동시에 연산의 결과값 또한 저장된다.

상위 8비트 AH와 하위 8비트 AL이 합쳐서16비트 AX가 되고, 확장(Extension)이 32비트의 EAX 이다. 이 EAX의 확장이 64비트의 RAX(Register Accumulator Extended)이다.

시스템 호출을 수행할 때, RAX는 호출되는 시스템 호출의 번호를 저장하는 데 사용된다. 시스템 호출이 완료된 후, RAX는 반환값을 담는 데 사용되며, 프로그램이 예외 상황을 만났을 때, RAX는 예외 처리 루틴에서 중요한 정보를 담는데 사용될 수 있다. 또 돌아가야할 리턴 값을 저장할 때 사용하기도 한다. 컴파일러는 RAX를 자주 사용되는 값의 저장 및 연산을 사용하여 성능을 최적화한다.

 

CPU(Central Processing Unit)컴퓨터의 '두뇌'로, 기본적인 산술, 제어, 입력/출력(I/O) 작업과 같은 명령어들을 처리한다. CPU의 32비트와 64비트는 주로 메모리 주소 지정 능력과 데이터 처리 능력에서 차이를 보인다.

 

32비트 CPU메모리 주소 공간이 4GB로 제한된다. 이는 32비트 시스템이 한 번에 처리할 수 있는 주소 범위가 2^32, 즉 4GB까지라는 의미이다. 오래된 시스템이나 가벼운 애플리케이션에 적합하다.

 

64비트 CPU는 씬 더 큰 메모리 주소 공간(2^64)을 지원한다. 이론적으로는 16EB(엑사바이트)까지 지원하지만 실제로는 시스템에 따라 제한될 수 있다. 더 큰 데이터 단위를 한 번에 처리할 수 있어, 복잡한 계산과 대용량 데이터 처리에 더 효율적이다. 최신 운영 체제와 애플리케이션은 대부분 64비트 아키텍처를 사용한다.

 

GPU(Graphics Processing Unit)는 복잡한 그래픽 처리와 대량의 병렬 처리 작업에 특화된 프로세서이다. GPU의 32비트와 64비트는 주로 연산 처리 능력에서 차이를 볼 수 있지만, GPU에서는 이보다는 병렬 처리 능력, 코어의 수, 메모리 대역폭 등이 더 중요한 성능 지표가 된다.

 

CPU 사용이 적합한 경우:

  • 일반적인 컴퓨팅 작업: 웹 브라우징, 문서 작업, 기본적인 소프트웨어 사용 등.
  • 직렬 처리 작업: 한 번에 한 작업씩 처리해야 하는 복잡한 로직이나 계산이 필요한 경우. 예를 들어, 알고리즘 처리, 서버 측 애플리케이션 등.
  • 다양한 종류의 명령어 처리가 필요한 경우: CPU는 다양한 종류의 작업을 처리할 수 있는 광범위한 명령어 세트를 가지고 있다.
  • 멀티태스킹: 여러 프로그램을 동시에 실행하는 환경에서는 CPU가 각각의 프로세스를 관리하고 조정하는 데 중요한 역할을 한다.

GPU 사용이 적합한 경우:

  • 그래픽 처리: 비디오 게임, 3D 모델링, VR(가상 현실) 등 고도의 그래픽 처리가 필요한 작업.
  • 병렬 처리 작업: 동일한 연산을 대량의 데이터에 적용해야 하는 경우. 예를 들어, 이미지나 비디오 처리, 딥러닝, 복잡한 과학적 계산 등.
  • 데이터 분석 및 기계 학습: 대규모 데이터 세트에 대한 복잡한 계산을 빠르게 수행할 수 있어, 빅 데이터 분석, 인공 지능 개발 등에 유용하다.
  • 고성능 컴퓨팅(HPC) 작업: 과학적 시뮬레이션, 기상 모델링, 유전자 연구 등과 같이 막대한 양의 계산이 필요한 경우.
728x90
728x90

 

 

ECF(Exceptional Control Flow)를 알기 전에 여러가지 기초 지식이 많이 요구된다. 이를 알지 못하면 ECF를 이해하기 힘들기 때문이다.

 

컴퓨터 구조의 가장 안쪽에 CPU, 메모리, 프린터, 램카드 등의 하드웨어들이 있다. 이 묶음을 자원들이라고 하고 이를 application에 할당하는게 OS이다.(자원관리) OS안에는 cpu를 관리하는 프로세스 관리, 메모리 관리, I/O관리를 하는 것은 커널에 해당한다. 쉘은 사용자가 명령을 내리면 그 명령을 해석하여 결과를 반응하여 보여준다.(명령어 해석기)

패킷은 네트워크상에서 전송될 데이터들의 덩어리이다. 사용자 데이터와 제어정보로 나뉘는데 사용자 데이터는 페이로드라고 한다. 제어정보는 소스와 목적지에 대한 네트워크 주소, 순서 정보, 오류 감지 코드로 분류된다.

프로세스 문맥은 어떤 상태에서 수행되고 있는지, 규명하기위해 필요한 정보이다. 시분할로 프로세스를 한 번씩 실행시킬 때, 어디까지 실행됐는지, 메모를 해놔야 한다. 이 때 프로세스 컨텍스트를 사용한다. 프로세스 문맥은 하드웨어 문맥, 프로세스의 주소공간, 커널상의 문맥으로 분류된다. 프로세스의 제어권을 넘겨주는 것은 컨텍스트 스위칭이라고 한다.

그럼 CPU의 제어권을 넘겨 커널모드로 진입하게 하는 것은 무엇일까? 주로 인터럽트, 트랩에 의한 시스템콜이다.

 

시스템 콜(System Call)은 사용자 프로그램이 운영 체제의 커널 서비스를 요청할 때 사용하는 인터페이스이다. 운영 체제는 하드웨어 자원을 관리하고, 다양한 기본 서비스를 제공하는 소프트웨어의 집합이다. 사용자 프로그램은 직접적으로 하드웨어 자원에 접근할 수 없으므로, 시스템 콜을 통해 안전하게 이러한 자원과 서비스를 요청하고 사용한다.

 

시스템 콜의 주요 기능

  • 프로세스 관리: 프로세스 생성, 실행, 종료, 스케줄링 등의 관리 작업을 수행한다.
  • 파일 시스템 조작: 파일 생성, 삭제, 읽기, 쓰기, 열기, 닫기 등의 파일 시스템 관련 작업을 수행한다.
  • 장치 관리: 하드웨어 장치에 대한 접근 및 제어를 수행한다.
  • 정보 유지: 시스템 날짜 및 시간 설정, 시스템 데이터 조회 등의 작업을 수행한다.
  • 통신: 프로세스 간 통신(IPC)이나 네트워크 통신을 위한 메커니즘을 제공한다.

시스템 콜의 작동 방식

  1. 시스템 콜 요청: 사용자 프로그램은 특정 작업을 수행하기 위해 시스템 콜을 호출한다. 이 때, 필요한 매개변수를 제공한다.
  2. 커널 모드 전환: 시스템 콜이 호출되면, CPU는 사용자 모드에서 커널 모드로 전환된다. 커널 모드에서는 운영 체제가 전체 시스템 자원에 대한 전체 제어 권한을 가진다.
  3. 시스템 콜 처리: 운영 체제 커널은 요청된 시스템 콜에 따라 필요한 작업을 수행한다.
  4. 사용자 모드로 복귀: 작업이 완료되면, 시스템은 사용자 모드로 다시 전환되고, 프로그램은 시스템 콜 결과를 받아 계속해서 실행된다.

프로그램 카운터의 연속된 값 예를 들어 l(k)에 대응하는 a(k), a(k+1)이 있을 때 a(k) - > a(k+1) 이렇게 다음으로 넘어가는게 제어이동이라고 한다. 이런 제어이동의 배열은 제어흐름이라고 한다.

I(k)와 I(k+1)이 나란히 있는 경우는 점진적인 순서라고 하고, 이 둘이 인접하지 않고 jump, call, return에 의해 갑작스런 변화가 발생할 때가 있다. 저런 명령어들은 꼭 프로그램을 작성하면서 필요하여, 예외적인 제어 흐름이 발생할 수 밖에 없는데, 컴퓨터는 이런 예외적인 제어 흐름에도 반응할 수 있어야 한다.

패킷들은 네트워크 어댑터에 도착하고 메모리에 저장되어야한다. 프로그램은 디스크로부터 데이터를 요청하고, 데이터가 준비됐다는 말이 나올 때까지 대기한다. 하드웨어에서 검출된 이벤트는 예외 핸들러로 갑작스런 제어이동을 발생한다. ECF는 운영체제가 입출력, 프로세스, 가상메모리를 구현하기 위해 사용한다. trap, system call을 이용하여 응용프로그램이 호출한다.

예외상황 - 예외적인 제어흐름의 한가지 형태

하드웨어와 소프트웨어의 예외상황 분류는 불필요함

예외의 분류:

  • 인터럽트 : 비동기적으로 하드웨어 장치로부터 발생하는 신호 혹은 외부 이벤트가 발생했음(트랩은 인터럽트의 종류지만, 동기적)을 알리는 신호이다. CPU가 현재 처리 중인 작업을 잠시 중단하고, 긴급하게 처리해야 하는 작업이다. 보통 하드웨어 장치에서 프로세서로 시스템 콜을 보내 커널모드로 전환되게 한다.(어보트는 인터럽트의 종류지만, 시스템 콜과 직접적인 관련이 없다.)
  • ​ 트랩 : 특정 명령어 실행에 의해 CPU의 제어 논리가 운영 체제의 커널 기능을 요청하기 위해 의도적으로 생성하는 예외이다. 프로그램 실행과 동기적이다. 명령 스트림에 대해 잘 정의된 시점에서 발생하고 시스템 콜, 디버깅을 목적으로 사용한다. 운영 체제가 프로그램을 대신하여 파일 읽기를 수행한다. (0으로 나누기, 잘못된 메모리 접근에 대한 처리)
  • ​ 폴트 : 핸들러로 인해서 복구가 가능하고 수정될 수 있는 예외이다. 프로세서가 명령을 실행하려고 할 때 오류 조건을 감지하고, 메모리 접근 중 페이지 폴트와 같은 오류가 발생 했을 때 발생한다. 페이지 폴트는 프로그램이 현재 물리 메모리 접근 할 때 일어난다. 가상 메모리의 적절한 부분을 물리 메모리로 로딩 함으로써, 프로그램은 폴트가 전혀 발생하지 않은 것처럼 실행을 재개할 수 있다. (세그먼트 폴트, 페이지 폴트)
  • 어보트 : 복구할 수 없는 오류 조건을 나타낸다. 하드웨어 실패 또는 하드웨어가 감지하고 복구할 수 없는 메모리 시스템의 불일치와 같은 하드웨어 또는 시스템 환경의 심각한 문제를 지시한다. (ASSERT)

 

예외가 발생하면, 프로세서는 적절한 예외 핸들러로 제어를 이전해야 한다.

자세한 내용은 Process, Thread를 다룰 때 추가로 포스팅할 예정이다.

 

예외 처리 과정

  1. 예외 감지: 예외 처리의 첫 단계는 예외가 발생했음을 감지하는 것이다. 이 감지는 CPU의 정상적인 명령 실행 과정의 결과로 발생한다. 예를 들어, 응용 프로그램이 0으로 나누려고 하면, CPU는 나눗셈 연산을 실행하려고 할 때 이를 감지한다.
  2. 예외 분류: 예외가 감지되면, 시스템은 여러 범주 중 하나(인터럽트, 트랩, 폴트, 어보트)로 분류한다. 이 분류는 시스템이 예외를 어떻게 처리할지 결정하기 때문에 중요하다.
  3. 컨텍스트 저장: 프로세서가 예외 핸들러의 실행을 시작하기 전에, 예외가 처리된 후에 복원할 수 있도록 현재 컨텍스트(CPU의 상태)를 저장해야 한다. 이것은 보통 레지스터, 프로그램 카운터 및 기타 중요한 상태 정보를 저장하는 것을 포함한다.
  4. 예외 처리 루틴: 프로세서는 인터럽트 벡터 테이블 또는 예외 테이블이라고 하는 사전에 정의된 테이블을 사용하여 예외를 해당 핸들러의 메모리 주소에 매핑한다. 그런 다음 프로세서는 프로그램 카운터를 핸들러의 주소로 변경하여 핸들러 루틴에 제어를 효과적으로 이전한다.
  5. 핸들러 실행: 예외 핸들러가 실행되고 예외를 처리하기 위해 필요한 모든 작업을 수행한다. 이것은 잘못된 프로그램을 종료하거나, 프로세스에 시그널을 보내거나, 오류를 수정하고 작업을 다시 시도하거나, 디버깅 목적으로 오류를 기록하는 것을 포함할 수 있다.
  6. 예외에서 복귀: 예외가 처리된 후에는 시스템이 정상적인 실행 흐름으로 돌아가야 한다. 예외가 트랩이나 인터럽트였다면, 시스템은 예외를 발생시킨 명령 바로 다음 명령으로 돌아갈 수 있다. 폴트가 수정되었다면, 시스템은 폴트가 발생한 명령을 다시 시도할 수 있다. 어보트였다면, 시스템은 프로그램으로 전혀 돌아가지 않고 대신 종료할 수 있다.
  7. 컨텍스트 복원: 마지막 단계는 저장된 컨텍스트를 복원하여 프로세스나 프로그램이 예외가 발생하지 않은 것처럼 계속 실행될 수 있도록 하는 것이다. 이것은 예외가 감지될 때 저장된 정보로부터 CPU 상태를 복원하는 것을 포함한다.

시그널은 소프트웨어 단에서 이벤트를 통지하지만 인터럽트는 하드웨어 단에서의 이벤트 처리를 할 때 발생한다. 둘이 비슷해 보일 수 있지만, 운영체제의 컨텍스트에서 서로 다른 메커니즘을 가리킨다. (ctrl+C로 배시 창 나가기, kill PID)

 

시그널은 다양한 이유로 발생할 수 있다. 예를 들어, 사용자가 프로세스를 종료하려고 할 때(SIGINT), 프로세스가 접근할 수 없는 메모리에 접근하려고 할 때(SIGSEGV), 알람 타이머가 만료되었을 때(SIGALRM) 등

 

시그널이 발생하면 그 자체로 시스템 콜을 발생시키는 것은 아니다. 그러나 시그널 처리 과정에서 프로세스는 특정 시그널에 대응하기 위해 시스템 콜을 사용할 수 있다. (시스템 콜을 활용한 시그널 핸들러 설정) 그리고, 시그널을 명시적으로 보내는 행위 kill() 같은 것은 시스템 콜을 통해 이루어진다.

시그널 자체는 시스템 콜을 직접적으로 발생시키지는 않지만, 시그널 처리 메커니즘은 시스템 콜과 밀접하게 관련되어 있으며, 프로세스는 시그널을 처리기 위해 시스템 콜을 사용할 수 있다.

인터럽트는 하드웨어 이벤트 또는 소프트웨어 명령에 의해 발생하며, 시스템 전체에 영향을 줄 수 있다. 반면, 시그널은 특정 프로세스에게 전달되는 비동기적 이벤트나 예외 상황을 나타낸다.

인터럽트는 주로 운영 체제의 인터럽트 핸들러가 처리하며, 시그널은 대상 프로세스가 직접 처리한다.

인터럽트는 시스템의 반응성과 동시성을 높이는 데 초점을 맞추고 있으며, 시그널은 프로세스에게 비동기적인 사건이나 예외 상황을 알리는 데 사용된다.

728x90

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

하이퍼바이저, 애뮬레이션, QEMU  (0) 2024.03.26
Pint OS_Project 1 구현  (1) 2024.03.26
Context Switching, Semaphore와 Mutex  (2) 2024.03.25
CPU Scheduling, 4BSD, nice  (1) 2024.03.25
32bit and 64bit, RAX, CPU vs GPU  (1) 2024.03.24

+ Recent posts