본문 바로가기

CS

[CS] 프로그램 ( Program ), 프로세스 ( Process ), 쓰레드 ( Thread ) 학습 - 작성중

Topic =  꼬리에 꼬리를 무는 프로그램, 프로세스, 쓰레드 개념 정리 - ( 노트 필기에가깝다 )


 

프로그램, 프로세스, 쓰레드의 개념

 

프로그램은 어떤 작업을 실행하기 위한 명령어들의 모음이다. 이 명령어 들은 기기가 수행해야 할 작업들을 소스코드 형태로 작성된다. 프로그램이 실행되면, OS( 운영체제 ) 는 프로그램을 위한 메모리 공간을 할당하고, 프로그램의 코드와 데이터를 메모리에 로드한다. 이렇게 메모리에 로드되어 CPU 에 의해 실행되는 프로그램 작업 단위를 프로세스라고 한다.

 

프로그램에 의해 생성된 프로세스 내에서 CPU 에서 실행되는 컨텍스트, 흐름. 즉, 작업의 실행 단위( Unit of execution )를 쓰레드라고 하며, 쓰레드는 프로세스 안에 1개 이상 존재한다. ➡️ 쉽게, 프로세스 자체가 프로그램이 실행되어 발생하는 작업의 단위이므로, 작업이 진행되는 흐름, 실행단위는 1개 이상 존재하기 떄문이다.

 

과거에는 프로그램 실행 흐름이 프로세스 밖에 없었으나 프로세스보다 작은 실행 흐름인 쓰레드가 등장하면서 현재 운영체제의 실행 흐름은 쓰레드를 최소 단위로 하고 있다, 즉 쓰레드가 명령 실행을 담당하고, 프로세스는 이러한 쓰레드들을 모아놓고 메모리를 할당하고 자원을 공유시키는 하나의 그룹이라고 보면 된다.

 

 

 

프로세스

 

 

메모리

프로세스는 운영체제가 자원을 할당하고 관리하는 기본 단위로, 실행 중인 프로그램에 필요한 코드, 실행 중인 데이터, 할당된 메모리 등의 독립된 정보를 포함한다.➡️ Stack, Heap, Code, Data 등

 

Stack

  • 함수 호출 시 생성되는 지역 변수와 전달되는 인자(매개 변수), 반환 값이 되돌아갈 주소값이 저장되는 영역
  • 함수 호출이 종료되면 저장된 메모리도 해제되. 컴파일 타임에 크기가 결정된다. 

Heap

  • 동적으로 할당된 변수가 저장되는 메모리 영역
  • 프로그래머가 직접 메모리 공간을 할당, 해제하여, 런타임에 크기가 결정된다.

Code

  • 실행할 프로그램의 코드가 저장되는 메모리 영역
  • 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있는다.

Data

  • 전역 변수와 정적 변수가 할당되는 메모리 영역
  • 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있는다.

 

레지스터

프로세스가 실행될 떄, CPU 내의 레지스터에 프로세스의 정보가 로드되어야 한다. CPU에서 실행되기 위해 필요한 프로세스의 현재 상태를 나타내는 정보가 CPU의 레지스터에 임시로 저장된다. CPU 속 레지스터들의 종류는 다음과 같다.

 

  • 프로그램 카운터 - PC ( Program Counter ) = Program Pointer
    • 메모리에서 읽어 들일 명령어의 주소를 저장한다. CPU는 이 주소를 사용하여 다음 명령어를 가져오고 실행한다.
  • 명령어 레지스터 - IR ( Instruction Register )
    • 명령어가 담긴 특정 메모리의 주소를 CPU가 읽어올 때, 해당 명령어를 저장하는 레지스터로, 현재 실행중인 명령어를 저장하는 것이다.  이후 CPU 내의 컨트롤러 ( Control  Unit )가 해당 명령어를 디코딩 하여 *Control signal 들을 내보낸다.
    • 메모리에서 가져온 명령어는 실행될 때까지 IR에서 상주한다.
    • Control Signal은 CPU가 명령어에 따라 적절한 연산이나 데이터 전송을 실행하기 위한 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호이다.
  • 스택 포인터 - SP ( Stack Pointer )
    • 스택 메모리의 최상단 주소를 가리키며, 함수 호출과 반환, 로컬 변수 저장 등에 사용된다.
  • 베이스 레지스터, 리밋 레지스터  - BR ( Base Register ), LR ( Limit Register )
    • 두 레지스터는 프로세스의 메모리 영역을 정의하여 제한하기 위해 함께 사용된다. 베이스 레지스터는 프로세스 메모리의 시작 주소를, 리밋 제리스터는 메모리의 크기를 나타낸다. 
  • 데이터 레지스터 - DR ( Data Register )
    • 연산에 사용되는 데이터를 임시로 저장한다.
  • 어드레스 레지스터 - AR ( Address Register )
    • 메모리부터 데이터를 가져오거나 메모리에 데이터를 저장할 때 참조되는 주소를 저장하는 데 사용된다.
  • 메모리 주소 레지스터 - MAR ( Memory Address Register )
    • 메모리의 주소를 저장하는 레지스터이다. CPU가 특정 주소의 메모리에 데이터를 쓰거나 읽는 과정 ( *System bus 내의 address bus 로 값을 보낼 때 ) MAR 을 거치게 된다.
  • 메모리 버퍼 레지스터 - MBR ( Memory Buffer Register )
    • 메모리와 주고받을 값을 저장하는 레지스터로, System bus 내의 data bus로 값을 보낼 때 거치는 레지스터이다.
  • 범용 레지스터 - GPR ( General Purpose Register )
    • MAR과 MBR은 주소와 데이터 값만 저장하지만, 범용 레지스터는 데이터와 주소 모두를 저장할 수 있다.
  • And .. 위에 언급한 레지스터 외에도 다양한 레지스터가 있지만 프로세스 학습 과정엔 크게 중요하지 않은 것 같아 추후 학습 해보기.

 

✅이해를 돕기 위한 레지스터들의 정보로 CPU가 작동하는 간단한 과정

  • Program Counter 가 지닌 현재 실행할 명령어의 메모리 주소로 접근한다.
  • 실행할 명령어의 주소를 명령어 주소 레지스터 MAR 로 전송하고, 메모리 시스템은 해당 주소에서 명령어를 읽어온다.
  • 읽어온 명령어는 명령어 버퍼 레지스터 MBR 를 거쳐 최종적으로 명령어 레지스터 IR 에 저장된다.
  • CPU 내의 컨트롤 유닛은 IR에 저장된 명령어를 디코딩하고, 해당 명령어를 실행하기 위한 Control Signal 들을 생성한다.

 

프로세스 제어 블록 - PCB ( Process Contol Block )

각 프로세스의 정보를 저장하는 데이터 구조로, 운영 체제가 각 프로세스를 관리하기 위해 사용되며 아래의 정보를 포함한다. 프로세스가 생성되면, 메모리에 해당 프로세스의 PCB가 함께 생성되고, 프로세스가 종료되면 삭제된다.

 

PID ( Process ID )

  • 프로세스의 고유 ID

 

Process State

  • 프로세스의 상태 정보 ( create, ready, running, terminate, waiting )

 

PC ( Program Counter )

  • 프로세스가 다음에 실행할 명령어의 주소

 

CPU Register

  • CPU *Register들의 값으로, 프로세스가 중단되었을 때의 레지스터들의 상태가 저장된다. 이값들은 프로세스가 다시 실행될 때 CPU 레지스터로 복원된다

 

CPU Scheduling Inform ( Accounting )

  • 프로세스 우선 순위, 스케줄에 대한 포인터 등 스케줄링과 관련된 정보가 포함된다.

 

Accounting

  • 사용된 CPU 시간, 실행 횟수, 실행완료 시간 등 프로세스의 실행에 대한 통계 정보가 포함된다.

 

Memory Limits

  • 프로세스에 할당된 메모리 주소 공간, *페이지 테이블, *세그먼트 테이블 등의 정보가 포함된다.

 

IO Status ( Input / Output State )

  • 프로세스에 할당된 입출력 장치들과 프로세스를 실행하기 위해 열린 파일 목록 등의 정보가 포함된다.

 

PCB는 프로세스의 중요한 정보가 포함되어 있기 때문에 Window, Linux, Unix 등의 운영체제에서는 커널 공간에 저장되고, 그 외 운영체제에서도 커널이 관리하는 별도의 데이터 구조에 PCB가 저장되며, PCB가 저장되는 저장소를  *Process Table 이라고 한다. 운영체제는 컨텍스트 스위칭 및 프로세스 스케줄링시 PCB를 조작하여 멀티태스킹 및 리소스 할당을 실행한다.

 

*Process Table은 본문 아래 프로세스 생성과정에서 추가 정리.

✅ 레지스터, PCB 정리

  •  각각의 레지스터는 CPU단의 프로세스 상태 정보들을 임시로 저장하는 곳을, PCB는 운영체제가 관리하기 위해 필요한 프로세스의 정보를 포함하고 있는 '메타데이터' 로, 프로세스가 CPU를 할당 받아 작업을 처리하다가 프로세스의 전환이 발생할 경우, 진행하던 작업 상태를 PCB에 저장하고 중지 된다. 이후 중지된 프로세스에 CPU가 다시 할당 되게 될 때, PCB에 저장되어 있던 정보를 CPU에 로드하여 이전에 종료됐던 시점부터 작업을 수행하게 한다.

 

 

프로세스 상태 1. 프로세스 생성부터 준비까지 의 과정 [ 프로세스 생성 → New 상태 → Ready  상태 ]

 

📚프로세스는 New, Ready, Running, Waiting, Terminated 로 상태를 갖을 수 있다. 프로세스가 생성되고, 실행되어 종료되는 과정을 학습해보면서 각각의 상태를 확인해볼 것

 

 

 

Create

 

1.  PCB 생성, 프로세스 식별자 생성 및 할당

  • 새로운 프로세스가 생성될 때, 프로세스의 모든 정보를 담을 수 있는 구조체인 PCB를 생성한다. 이 PCB는 프로세스의 상태, Program Counter, 할당할 CPU 레지스터 값, 메모리 관리 정보,등의 정보를 포함한다. PCB가 생성되면, 운영체제에 의해 프로세스에 고유한 아이디 ( PID ) 를 할당된다.

2. Process Table에 등록

  • PID가 할당되면, 해당 프로세스의 정보 ( PCB ) 는 운영체제가 관리하는 Process Table 에 등록된다.
  • Process Table은 Kernel에 존재하는 PCB의 모음이라고 할 수 있으며, 시스템 내의 모든 활성 프로세스의 정보( PCB 모음 )를 추적하기 위해 운영 체제에서 유지관리 하는 중앙 데이터 저장소 역을 한다.

3. 메모리 주소 공간 할당

  • 운영체제에서 프로세스에 필요한 Data, Code, Stack을 저장하기 위한 자체 주소 공간을 할당한다. 이 주소 공간은 가상이며, 운영 체제에 의해 실제 메모리에 매핑된다. ❓Virtual MemoryPhysical Memory→  추후 메모리 관리 학습 예정

4. 프로세스 코드와 데이터를 메모리에 로드

  • 디스크나 다른 저장 매체에 저장된 프로그램의 실행 파일이 메모리에 복사된다.

5. PCB 값을 통해 프로세스 실행 환경 초기화

  • CPU 레지스터 초기화
    • 운영 체제는 프로세스의 명령을 실행하기 위해, CPU레지스터를 기본값으로 초기화 한다.
  • Program Counter 설정
    • CPU가 실행할 프로세스의 명령 실행 위치를 알린다.
  • 스택 및 힙 포인터와 같은 기타 필요한 리소스를 구성한다.
  • System Flag 및 상태 레지스터의 초기 상태를 설정한다.
    • System Flag 학습해보기.
  • 프로세스 생성 단계가 끝나고, 실행을 위한 준비 상태에 들어간다.

6. 준비 상태로 전환

  • 위 과정이 끝난 프로세스는 스케줄링 큐에 들어가고, 프로세스가 준비상태가 된다. 준비 상태의 프로세스는 CPU가 할당되어 실행되기를 기다린다. 

🟥 1 ~ 6 단계 과정 정리 

생성과정 ( Create )의  1 ~ 3단계까지의 과정으로 프로세스가 생성되고 초기화 되었지만 아직 운영체제에 의해 메모리와 필요한 자원을 할당받지 않은 상태를 프로세스의 상태를 New 라고 하며, 4 ~ 6 단계의 과정으로 자원을 할당 받아 실행 준비가 완료 된 상태를 프로세스의 준비 상태라고 한다.

 

메모리 주소 공간 할당,메모리 로드  추가 정리.

🟪할당은 운영체제가 프로세스 또는 다른 시스템 자원이 사용할 수 있도록 메모리의 특정 부분을 지정하는 작업.

🟪로드는 메모리 할당을 통해 지정된 주소를 프로세스 실행을 위해 필요한 명령어, 데이터, 스택 등이 실제 메모리에 위치하게 만드는 작업.



 

 

프로세스 스케줄링 ( Process Scheduling )

 

스케줄링 큐

❓위 프로세스 생성과정에서 프로세스가 준비 상태에 들어가면, 스케줄링 큐에 들어간다고 했는데, 스케줄링 큐에 들어간 프로세스의 상태는 모두 준비상태인가? 라는 의문이 생겼다 ➡️ No 스케줄링 큐에도 여러 종류가 있다.

  • 알고리즘에 따라 사용되거나 사용되지 않는 큐도 있고, 일시 중단된 큐 ( Suspended Queue ), 차단 또는 대기 큐( Blocked Queue or Wait Queue)도 존재한다

Logn - Term, Short - Term 스케줄링

장기 스케줄링 

  • Job Scheduling 이라고도 알려져 있으며, 새로운 프로세스 풀에서 프로세스를 선택하여 시스템에 동시에 메모리에 있을 수 있는 프로세스 수를 결정하여 허용할 프로세스를 결정한다.

 

단기 스케줄링

  • CPU Scheduling 이라고도 알려져 있으며, 스케줄링 에서 스케줄 알고리즘에 따라 프로세스를 선택하고 다음에 실행할 프로세스를 결정한다.

 

➡️ 프로세스 스케줄링은 운영체제에서 CPU를 사용할 수 있는 ( 준비 상태의 ) 프로세스를 선택하고, CPU를 할당하는 작업을 말한다.

 

프로세스 스케줄링의 주 역할

프로세스 스케줄링은 시스템 처리량을 최대화하고, 응답 시간을 최소화 하며, 프로세스가 준비 큐에서 대기하는 시간을 줄이는 등 효율적인 방식으로 CPU와 다른 자원들이 가능한 적게 사용 상태에 있도록 한다.

 

이 같이 효율적인 방식으로 CPU 자원을 활용하기 위해서 스케줄링은 다양한 알고리즘으로 작동한다.

 

선점과 비선점 스케줄링

알고리즘 작동 카테고리는 여러가지 있지만, 크게 선점, 비선점적 스케줄링으로 구분할 수 있다.

 

비선점 스케줄링

  • 현재 실행 중인 프로세스가 스스로 종료하거나, I/O 작업을 수행해야 할 때 까지 다른 프로세스가 실행되지 않는다
  • Windox 3.x 버전부터 사용 안됨

 

선점적 스케줄링

  • 운영체제가 언제든지 실행 중인 프로세스를 중단하고 다른 프로세스를 실행할 수 있다.
  • Window 등 최신 운영 체제에서 사용되는 스케줄링 알고리즘 작동 방식.

프로세스 스케줄링 알고리즘

선입선출 ( FCFS - First - Come First - Served ) - 비선점적 스케줄링

  • 특정 옵션이 없는 스케줄링 알고리즘으로, 프로세스는 준비 큐에 들어온 순서대로 실행된다.
  • 예를 들어, 1시간 짜리 A프로세스가 30초 짜리 B프로세스보다 먼저 도착할 경우 30초 짜리 B 프로세스가 실행 완료되기까지 1시간 30초가 걸리게 되는 문제가 발생하는 등 효율적이지 못한 알고리즘.

 

최단작업 / 최단작업 우선 ( SJN - Shortest Job Next / SJF - Shorted Job First ) - 비선점적 스케줄링

  • 버스트 시간이 가장 짧은 프로세스가 먼저 실행된다.
    • ✅버스트 시간 = 프로세스가 중단 없이 CPU 에서 실행을 완료하는 데 필요한 시간
  • 평균 대기 시간을 최소화 한다.
  • 기아 현상 발생 가능
    • A프로세스의 버스트 시간이 10초, B프로세스가 20초 걸릴 것으로 보여지므로 A 프로세스가 먼저 실행된다. A 프로세스 실행 도중 C 프로세스가 준비 큐에 들어왔는데 버스트 시간이 12초라고 한다. 최단 작업 우선 실행이기 때문에 B프로세스는 C 뒤로 밀려나게 된다. 이렇게 지속적으로 새로운 프로세스가 들어오는데 B프로세스 보다  버스트 시간이 짧을 경우 프로세스 B가 실행이 되지 않게 되는 문제가 발생한다. 이를 기아 현상이라고 한다.
    • ➡️ 에이징 기법 = 프로세스가 후순위로 밀려날 경우 버스트 시간에 가중치를 갖게 되어 특정 프로세스가 후순위로 밀릴 때 마다 점점 우선순위에 가까워 지도록 하는 방식.

 

 

Round-Robin ( RR ) 스케줄링 - 선점적 스케줄링

  • RR스케줄링은 시분할 시스템의 한 형태로, 단순하고 공평한 스케줄링 방법이다.
  • 프로세스 각각에 동일한 크기의 시간 할당량을 순서대로 할당하고. 할당된 시간 동안만 프로세스를 실행 시킨다.
  • *인터럽트 클록 ( Interrupt Clock ) 을 두어 프로세스의 점유 시간을 지정하는 것이다
    • 인터럽트 클록 - 본문 아래 [ 프로세스 상태전이 ] 에서 다룰 것

 

위 3개 외에도 SRTF 스케줄링, MQ 스케줄링, MFQ 스케줄링, RM 스케줄링, EDF 스케줄링 등 스케줄링 알고리즘에는 여러 방식이 존재하며 운영체제는 상황에 따라 여러가지 스케줄링 알고리즘을 조합하거나, 효율적인 알고리즘을 선택한다.

프로세스 준비단계 이해를 위해 스케줄링을 비선점적 스케줄링과 선점적 스케줄링의 차이까지만 학습해도 프로세스 진행과정을 이해하는데 어려움이 없을 것 같아 간단하게만 정리해보기로 함.

 

✅ 프로세스 스케줄링에 따라 프로세스가 CPU를 할당 받아 실행되는 것을 알게 되었다. CPU 내에서 실행되는 프로세스가 P1 프로세스, P2 프로세스로 변하는 것을 확인할 수 있는데, 이 작업이 컨텍스트 스위칭이다. → 본문 아래 [ 컨텍스트 스위칭 ] 에서 다룰 것

 

 

 

프로세스 상태전이 - 실행 부터 종료까지의 과정

 

 

 

Admitted ( New → Ready )

  • Job Schedulier 에 의해서 프로세스 생성을 승인 받는 것이다.

Dispatch ( Ready → Running )

  • 준비 상태에 있는 준비 큐의 맨 앞에 위치한 프로세스가 프로세서 ( CPU  )를 할당받아 실행되는 것이다.

Interrupt ( Running → Ready )

  • timeout, 예기치 않은 이벤트가 발생하여 현재 실행중인 프로세스에 문제가 생긴 경우나, 인터럽트 핸들러 ( 인터럽트 클록 등의 S/W Interrupt, H/W Interrupt 으로, 의도적으로 인터럽트를 발생시키는 것 ) 으로 인해 준비상태로 전환되는 것이다.
    • 인터럽트 클록이란 프로세스가 실행되는 동안의 시간을 정확하게 추적하여 CPU 시간을 배분할 때, 퀀텀 ( Quantum )으로 불리는 매우 작은 시간 단위 후에 인터럽트 클록을 발생시켜 현재 실행중인 프로세스를 중단시키고, 다음 실행할 프로세스 또는 아래서 다룰 '쓰레드' 를 스케줄러가 선택할 수 있도록 한다.
    • 일정 시간이 지나도 결과를 반환하지 않으면 클록이 인터럽트를 발생시켜 운영체제가 제어권을 갖게 한다. 운영체제가 제어권을 가지면 실행중이던 프로세스는 준비 상태로 전환된다.

I/O 이벤트 요청 ( Running → Waiting )

  • 실행 프로세스가 지정 시간 전에 입출력 연산 등이 필요하거나 새로운 자원 요청과 같은 문제가 발생하면 스스로 프로세스를 양도하고 대기 상태가 된다.

I/O 이벤트 입력 ( Waiting → Ready )

  • I/O 입력이 끝나면 준비 상태로 전환된다.

Exit  ( Running → Terminated )

  • 프로세스가 마지막 명령의 실행을 마치면 종료되고 운영체제에 프로세스 삭제를 요청한다.

 

 

 

 

Running

 

 

 

프로세스의 Running 상태는 프로세스가 CPU를 할당받아 실제로 명령어를 실행하는 단계이다. 실행 상태에는 프로세스 마다각자 설계된 방식대로 아래의 작업들이 실행될 수 있다. 

명령어 실행

  • 생성, 준비 단계까지 걸치고 스케줄러에 의해 선택된 프로세스가 CPU를 할당 받으면, 프로세스의 Program Counter가 가리키는 명령어부터 실행을 시작한다. 명령어가 실행될 때마다 Program Counter는 업데이트 된다.

데이터 처리

  • 프로세스 실행 중에 변수의 값을 변경하거나, 계산 결과를 저장하는 등 메모리 내 데이터를 읽거나 쓰고 하는 작업들을 얘기한다.

시스템 호출

  • 파일 시스템 접근, 네트워크 통신, I/O 요청 등을 위해 운영 체제의 커널에 서비스를 요청할 수 있다. 이러한 요청은 시스템 호출을 통해 이루어지며, 프로세스는 *커널 모드로 전환되어 시스템 호출을 처리한다
유저 모드 커널 모드, System call


운영체제에서 유저 모드와 커널 모드의 구분은 자원에 대한 접근 권한과 관련되어 있다. 커널이 하드웨어와 유저 앱 사이의  중간자 역할을 하여 유저 앱이 하드웨어에 직접 접근하지 않고, 커널에 요청을 보내, 요청 결과에 따라 처리가 이루어진다. 즉, 유저 앱 단에서의 프로세스 동작을 유저모드로, 하드웨어 단에서 작동하는 프로세스의 동작을 커널 모드라고 한다.

[ 유저 모드 ]
➡️ 사용자가 접근할 수 있는 영역을 제한하여 프로그램의 자원에 직접 접근할 수 없는 상태이다.

[ 커널 모드 ]
➡️ 운영체제의 권한을 가진 모드로 네트워크 통신, I/O 요청, 파일 시스템 접근 등 시스템의 모든 부분에 접근이 가능한 상태이다.

[ System Call ]
유저 모드에서 실행되는 프로세스가 운영체제의 커널 서비스를 필요로 하여, 커널 모드의 기능이나 자원을 이용하고자 할 때와 커널 모드의 작업이 완료되어 다시 유저 모드로 전환될 때 사용되는 인터페이스 

 

 

프로세스 컨텍스트 스위칭 Context Switching - 프로세스의 동시성, 병렬성

 

멀티 태스킹 - 동시성

멀티 태스킹이란 여러 프로세스들의 동시성을 보장하며 실행하는 것으로 이를 멀티 프로세싱, 아래에서 정리할 멀티 쓰레딩, 멀티코어의 병렬성 등의 방법으로 보장한다.

 

프로세서의 병렬성

  • 프로세서 ( CPU ) 내에 존재하는 핵심 처리 장치인 코어를 활용해 실제 계산 및 작업을 수행하도록 하여 동시에 작업을 분담하여 실행하게 하는 것이다.

 

멀티 프로세싱 

  • 하나의 프로세서 ( CPU  )는 하나의 프로세스만 실행시킬 수 있다. 떄문에 하나의 작업이 시작되면 종료될 때 까지 기다려야 하는데, 프로세서 하나가 여러 프로세스의 작업을 돌아가며 일부분씩 수행하게 된다. 이로 인해 사용자는 여러 프로세스 작업들이 동시에 진행되는 것 처럼 보여진다.

 

프로세스 컨텍스트 스위칭?

프로세스 컨텍스트 스위칭이란, 운영체제가 CPU를 한 프로세스에서 다른 프로세스로 전환할 떄 발생하는 과정이다. 이 과정을 통해 멀티태스킹을 가능하게 하며, CPU 시간을 공평하게 사용하여 동시성을 보장한다.

 

프로세스 컨텍스트 스위칭 과정

1. 인터럽트 발생 또는 I/O요청 입력완료, 시스템 콜 발생 ( Running → Ready )

  • 인터럽트, I/O 요청 완료, 시스템 콜 등에 의해 프로세스가 Running 상태에서 Ready 상태가 되었을 때, 운영 체제의 스케줄러가 Context Switching 주체가 되어 진행된다.

2. 상태가 전환된 프로세스의 상태 저장

  • 실행중이던 프로세스의 Program Counter, Stack Poninter 등의 Registers이 포함된 정보들을 PCB에 저장한다.
  •  ➡️다시 프로세스가 실행될 때 이전에 실행되던 코드에서, 이전에 보유하고 있던 함수 등의 메모리 정보와 동일한 상태에서 시작해야 하기 때문.

3. 실행된 다음 프로세스 상태 복원 및 프로세스 실행

  • 다음 실행할 프로세스의 PCB에 저장된 프로세스의 정보를 CPU 레지스터에 이전에 중단된 상태로 복원하고 해당 프로레스가 실행된다.

🟥 프로세스를 작업 흐름의 단위로 사용할 경우의 문제점 1. - 프로세스 컨텍스트 스위칭은 무거운 작업이다.

  • PCB 저장 및 복원 비용
    • 컨텍스트 스위칭으로 프로세서가 한 프로세스에서 다른 프로세스로 전환될 때 발생하는 현재 프로세스의 상태를 저장하고, 다음 프로세스의 상태를 불러오는 작업들은 CPU 작업이 필요하므로, CPU 자원 소모의 오버헤드가 발생한다.
  • 프로세스 스케줄링 비용
    • 컨텍스트 스위칭은 스케줄러에 의해서 진행된다. 이 작업에서도 CPU 스케줄링 알고리즘에 따라 프로세스를 선택하는 과정에서도  CPU 자원 소모가 발생한다.
  • CPU 캐시 메모리 로드 및 페이징 따른 비용
    • 캐시 메모리
      • CPU는 처리 속도를 높이기 위해서 캐시 메모리를 사용한다. 컨텍스트 스위칭이 일어나면 캐시 메모리에 따라 변경된 프로세스의 데이터와 명령어를 캐시에 다시 로드해야 할 수 있다. 이전 프로세스와 관련된 데이터가 캐시에서 제거되고, 새로운 프로세스의 데이터로 캐시가 채워지는 과정에서 Cashe Miss 가 발생할 수 있어 CPU가 추가적인 메모리 접근을 해야하므로, 추가적인 CPU 자원을 소모가 발생하게 된다.
    • 페이징
      • 가상 메모리 ( Virtual Memory )를 사용하는 시스템에서는 프로세스 컨텍스트 스위칭 시 가상 주소를 물리적 주소 ( Physical Memory - 실제 메모리 ) 로 변환하는 데 시간과 CPU 자원의 소모가 발생하게 된다.
    • ➡️ 캐시 메모리와 가상메모리, 페이징, 세그먼트 개념은 OS 메모리로 통틀어서 학습 시 추가로 학습해보기.

 

 

🟥 프로세스를 작업 흐름의 단위로 사용할 경우의 문제점 2 - 프로세스 간의 데이터 공유도 어렵다.

  • ➡️ 프로세스 간의 데이터 및 자원 공유 시에는  IPC ( Inter - Process Communication ) 가 필요하다.

 

프로세스 간의 통신 - IPC

 

✅ 프로세스의 독립성으로 인해 각 프로세스는 다른 프로세스의 데이터에 직접적으로 접근할 수 없으며, IPC를 거쳐야 한다.

 

IPC ?

프로세스 간 통신 ( Inter - Process Communication - IPC )로 프로세스들 사이에 서로 데이터를 주고 받는 행위 또는 그에 대한 방법이나 경로를 뜻하며, 주로 운영체제에 의해 제공되어 활용되지만, 일부 기타 환경 ( 자바 RMI, CORBA 등 )에 의해 제공되기도 한다.

 

프로세스의 독립성

  • 프로세스 자체가 프로그램 실행을 위해 자원을 할당 받는 단위로, 프로세스 생성 시 각각의 프로세스는 독립적인 메모리 공간을 할당받는다. 이로인해 특정 프로세스의 오류나 실행 실패가 다른 프로세스에 영향을 미치지 않도록 하고, 한 프로세스에서 다른 프로세스의 메모리에 임의로 접근하여 데이터를 변경하거나 손상시킬 수 없도록 한다.

 

IPC 매커니즘

IPC 작업은 무겁다는 설명이 많은데, 간략하게 어떻게 더 무거운지 간단하게 알아보자.

 

파이프 ( Pipe )

  • 한 프로세스의 출력을 다른 프로세스의 입력으로 연결하는 등의 단방향 통신 채널로, 파일 시스템에 의해 여러개의 프로세스가 공통으로 사용하는 임시 공간 ( Pipe ) 이 커널 공간에 생성되고, 유저 공간의 하나의 프로세스가 커널 공간의 파이프에 메시지를 입력하면, 다른 프로세스가  커널 공간에 접근해서 파이프의 데이터를 읽는 방식으로 진행된다. 파이프의 특징으로는 단방향 통신 채널이기 때문에 메시지를 입력한 프로세스는 자기가 입력한 메시지를 확인할 수 없다는 점이다.
  • 위 과정에서 데이터가 전송될 때, 커널 버퍼를 통해 메시지가 전송되면서,  유저 공간에서 커널 공간으로 데이터 복사가 이루어지고, 커널 공간에서 다시 유저 공간의 프로세스에 데이터 복사가 이루어진다. 이 과정에서 데이터 복사 오버헤드가 발생하게 된다.
  • 커널 수준에서의 자원 관리를 위해 데이터 전송 및 동기화가 필요할떄 컨텍스트 스위칭, 시스템 콜을 통해서 진행되므로, 컨텍스트 스위칭, 시스템 콜 오버헤드를 발생시킨다.

➡️ 커널 공간의 관여를 필요로 하며, 동기화를 위해 컨텍스트 스위칭, 시스템 콜을 발생시킨다.

 

↩️ 프로세스 간의 동기화를 위한 다양한 IPC 방식, 매커니즘이 존재하지만, 이번 글에서는 간단하게 IPC 작동 매커니즘 을 확인해보고, IPC 가 어떤 오버헤드를 발생시키는지만 확인하고 넘어가기로 했다. 추후 IPC 매커니즘을 학습해볼 것.

 

 

 

쓰레드

 

쓰레드의 등장배경

멀티 태스킹과 CPU 코어의 증가로 동시에 여러 프로세스 작업이 가능해졌지만, 하나의 프로세스가 동시에 여러 작업을 효율적으로 처리하지 못하는 문제가 있었다. 이러한 한계를 극복하고, 프로세스의 컨텍스트 스위칭과 데이터 공유를 위한 IPC 작업으로 인해 발생하는 오버헤드를 최소화하기 위해 쓰레드와 멀티 쓰레딩 개념이 등장하게 되었다.

 

쓰레드란 ?

쓰레드는 프로세스가 할당 받은 자원을 이용하여 실제로 작업을 수행하는 프로세스 내부 여러 흐름의 각각 독립적인 실행 단위로, 동일한 프로세스 내의 다른 스레드와 동시에 작업을 수행할 수 있다,  ➡️멀티 쓰레딩

 

프로세스, 쓰레드 메모리 구조

쓰레드는 프로세스에 할당된 Data, Code, Heap 메모리 공간과 프로세스 리소스를 공유하며 독립적인 쓰레드 ID와 Stack 영역을 가진다. 하나의 프로세스 안에는 1개의 메인 쓰레드가 존재하고 추가적인 작업 쓰레드를 가질 수 있다.

 

독립적인 Stack 영역을 가지는 이유?

  • 메모리의 Stack 영역은 함수 호출시 전달되는 인자, 반환될 주소값, 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간인데, 해당 메모리 공간이 공유가 될 경우 각각의 실행 흐름 ( 쓰레드 ) 서로의 함수 호출에 간섭이 생겨 쓰레드 간의 함수 호출에 충돌이 발생하기 때문이다.

독립적인 Registers 를 가지는 이유?

  • 까먹었으면 Register를 다시 읽고 오자.
  • 쓰레드가 프로세스내 각각의 독립적인 실행 흐름이므로, 쓰레드 자체도 쓰레드 스케줄링에 의해 CPU의 할당을 받아 명령어 실행이 어디까지 실행이 되었는지에 대한 실행 코드 정보를 Program Counter에 저장하는 등 Register 값들을 독립적으로 저장해야 하기 때문이다.

 

TCB ( Thread Control Block )

 

프로세스가 PCB를 갖고 있는것과 마찬가지로 쓰레드도 TCB를 갖는다. TCB 는 해당 쓰레드를 포함하고 있는 프로세스의 PCB 내부에서 관리된다.

 

➡️쓰레드의 존재를 모를때도 PCB 내부에서는 실행되던 흐름이 저장되어지고 있었다. 때문에 TCB, PCB를 구분하기 보단, 단순하게 TCB는 프로세스 안의 실행 흐름에 대한 정보만을 일컫는구나, 하고 넘어가자

 

 

멀티 쓰레딩

 

쓰레드 스케줄링

프로세스 스케줄링과 마찬가지로, 쓰레드 스케줄링은 운영체제에서 TCB를 통해 다중 쓰레드를 관리하며, CPU를 사용할 수 있는 쓰레드를 선택하고, CPU를 할당하는 작업을 말한다.

 

 

쓰레드 컨텍스트 스위칭

어쩄든 하나의 연산 장치에는 한가지 연산이 가능하므로, 쓰레드가 멀티 쓰레딩으로 실행될 때, 위와 같이 하나의 프로세스 안에서 쓰레드 컨텍스트 스위칭으로 동시성을 보장한다. 프로세스 컨텍스트 스위칭과 눈으로 보는 실행 과정은 비슷해 보이지만 각각의 컨텍스트 스위칭에 드는 비용에 큰 차이가 있다, 그 차이에 대해서 정리해보자.

 

먼저 프로세스 컨텍스트 스위칭 시 필요한 작업들을 다시 정리해보면 다음과 같다

  • 1. 프로세스 컨텍스트 스위칭 시 할당된 가상 메모리 주소를 매핑된 실제 물리 메모리 주소로 변환하는 작업이 필요하다.
  • 2. 기존 프로세스의 캐시 메모리를 초기화한다.
  • 3. 기존 프로세스의 Code, Data, Heap, Stack 영역의 상태 저장 및 새로운 프로세스의 데이터로 복구한다.

 

✅ 쓰레드는 스택을 제외한 Code, Data, Heap 영역을 공유한다. 따라서  컨텍스트 스위칭은 프로세스 컨텍스트 작업의 1번 작업은 하지 않아도 된다.  하나의 프로세스 안에서 전환되기 때문에 페이지 테이블 교환 등의 작업도 필요없다. 쓰레드 간 컨텍스트 스위칭 시에는 Program Counter, Registers, Stack Pointer 등의 비교적 간단한 정보들만을 저장하고, 로드하기 때문에 쓰레드 컨텍스트 스위칭의 오버헤드는 프로세스 컨텍스트 스위칭에 비해 상당히 낮다. 

 

쓰레드 간 데이터 공유

 

쓰레드는 프로세스 내의 코드, 전역변수, heap 등의 자원을 공유하는데, 이 메모리 자원들은 쓰레드 개수와 상관없이 하나씩만 존재한다. 

 

 

추가적인 학습 후 추가 예정...

Todo 1. 쓰레드 동기화 기법 2. 쓰레드 풀, 3.교착상태? 4. 쓰레드 안정성

 

 

 

 


 

[ A. 오늘 복습한 내용 / B. 다음에 학습할 내용 ]

A.

 

B. 부모 프로세스, 자식 프로세스

 

B. System bus

 

B. 메모리 구조 학습

 

B. Virtual  Memory, Phycial Memory, Text Segment, Data Segment, Stack Segment

 

B. User Mode, Kernel Mode

 

B. System Flag

 

B. CPU - Pipeline, Pipeline Stall??

 

B. IPC 매커니즘들

 

 


 

[느낀 점]

1. CS는 맨 처음엔 이해하기가 어려운데 실마리 하나가 잡히면 꼬리를 이어나갈게 보이면서 이해가 확 되기 시작하는게 재미있다

 

2. 일과 알고리즘, CS 학습, 프로젝트를 동시에 하기에는 어려울 것 같다

 


[Reference]