본문 바로가기
Computing Science/운영체제

[Computer Science] 운영체제 - 프로세스, 스레드

by code_pie 2024. 1. 2.

 

커널 이란?

 

 

https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%84%90_(%EC%BB%B4%ED%93%A8%ED%8C%85)

운영체제의 일부로써 하드웨어와 프로세스의 운용을 위한 소프트웨어 (운영 체제의 기능 가운데 운영 체제를 구성하는 프로세서와 운영 체제의 제어로 수행되는 프로그램에 대하여 자원 할당을 수행하는 부분)

  • 운영 체제의 복잡한 하드웨어 내부를 일관되고 추상적으로 볼 수 있도록 인터페이스 제공
  • CPU를 얼만큼씩 어떠한 일에 쓸 것인가 등의 스케쥴링을 한다.

- 커널은 디스크에 파일로써 존재하는 프로그램이며 시스템이 기동 될 때 boot 프로그램에 의해 구동되며 메모리에 상주된다. 기본적으로 프로세스와 파일 관리를 수행하며 그 밖에 입출력 장치관리, 메모리 관리 및 시스템 호출 인터페이스기능을 수행한다. 커널은 메모리, 디스크, 네트워크카드, 비디오 카드 등과 같은 모든 하드웨어를 관리한다. 그리고 응용 프로그램이 이러한 하드웨어를 접근하는 것을 가능하게 해주는 통로가 된다. 응용프로그램의 요청을 받아서 하드웨어 수행을 하고 그 결과를 다시 응용프로그램이 받게 된다.

1. 프로세스 관리

- CPU나 메모리 자원을 사용해 여러개의 프로세스가 동시에 수행되는 것처럼 동작되게 해 준다. (시분할해 짧은 시간 동안 수행을 돌아가면서 해줌)

 

더보기

운영 체제의 기능 ‘CPU 관리’ 스레드는 각 프로세스에 한 개 이상 존재하고 그 프로세스가 포함하고 있는 수행부를 한 개씩 수행하는 역할을 한다. 운영체제 상에서 스레드의 개수는 프로세스가 개수 이상이 된다. 여러 개의 스레드가 동시에 CPU를 사용하려고 요청하는데, 이를 정리하고 효율적으로 CPU를 사용할 필요가 있다. 이를 프로세스/스레드 관리 혹은 CPU관리라 한다.

 

멀티 태스크 운영체제일 경우에 여러 개의 어플리케이션이 마치 동시에 동작되는 것처럼 보이는데, 이는 프로세스/스레드라 불리는 것에 의해 수행되고 있는 것을 시분할로 조금씩 번갈아 가며 CPU가 수행을 해주기 때문이다.

이것을 관리하는 것이 운영체제이다. 프로그램이 수행된다는 의미는 디스크에 있는 파일이 메모리 상으로 로드가 되고 CPU가 그 명령어를 수행하는 것을 의미한다. 컴퓨터에서는 기본적으로 여러 개의 프로세스가 실행되고 있다. 프로세스가 실행이 된다는 의미는 해당 명령어가 CPU에 의해서 수행이 된다는 것인데, 이를 수행해 주는 역할을 하는 객체가 ‘스레드’이다.

 

여러 개의 스레드가 동시에 수행이 되는데 기존에 수행되고 있던 것은 수행을 멈추고 다음 스레드에게 CPU사용권을 넘겨줘야 한다. (빠르게 실행 돼 동시에 실행되는 것처럼 보이는 것 뿐, 실제로는 순차적으로 수행이 된다)

이를 위해서 현재 수행되고 있는 레지스트리나 CPU내의 값의 정보를 남겨둬야 하는데, 이 상태를 ‘콘텍스트’라고 하고 이것을 남기고 다음 환경으로 복원하는 과정을 ‘문맥 교환 (Context Switching)’이라고 한다.

 

2. 메모리 관리

- 여러가지 프로그램들이 사용하려는 메모리를 효율적으로 사용하도록 관리

3. 네트워크 입출력 관리

- 네트워크 데이터의 입출력을 받아 어플리케이션으로 올려주기도 하고 어플리케이션의 데이터를 네트워크 장치를 통해 송수신 하기도 한다.

4. 파일 시스템 관리

- 기록된 데이터를 물리적인 장치에 저장하거나 읽어주는 기능을 한다. 파일단위로 삭제하거나 액세스 할 수 있다. 이때 물리적 장치에는 이 파일의 내용이 연속되어 저장되어 있지는 않은데, 이를 물리적 장치로 엑세스 하는 기능을 가진다

5. 장치 드라이버 장치용 인터페이스를 제공

- 컴퓨터에 연결된 장치들을 드라이버라는 매개체를 통해서 제어하는데, 이러한 장치 드라이버의 인터페이스를 커널에서 제공

6. 시스템 콜 인터페이스

- 어플리케이션에서 시스템으로 어떤 명령을 주고 싶으면 시스템콜이라는 것을 하는데, 이 시스템콜은 인터페이스를 통해서 전달이 된다. 이 콜이 불리면 시스템은 특정 역할을 하게 된다. (디스크 엑세스라든가 네트워크 관련 요청들이 모두 시스템 콜에 해당)

 

# 프로세스

프로세스는 서로 완벽히 독립적인 공간을 가진다. 각자가 자기만의 스택과 데이터 영역을 가지고, 보호받는다. 프로세스는 시작할 때 운영체제에서 PCB와 메모리 공간을 할당받고 초기화하는 과정이 필요하다. 다른 프로세스의 영역을 들여다볼 수 없기 때문에 프로세스끼리 통신하기 위해서 프로세스 간 통신을 활용하거나 공유 메모리를 생성해 데이터를 주고 받는 등의 번거로운 과정을 거쳐야만 한다.

반면 한 프로세스가 비정상적으로 종료해도 다른 프로세스에는 영향이 거의 없다.

 

PCB

 

프로세스 제어 블록(Process Control Block, 줄여서 PCB)은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조이다. 작업 제어 블록(Task Control Block, 줄여서 TCB) 또는 작업 구조라고도 한다. "PCB는 운영 체제가 프로세스를 표현한 것이다."

 

운영체제 마다 다르지만, PCB에는 다양한 정보가 포함되어 있다

(포인터, 프로그램 카운터, 프로세스 번호, 프로세스 상태, CPU 레지스터들, CPU스케쥴러들, 회계 정보, I/O상태 정보, Swapping 상태 정보) 

 

# 영역 관리

시스템 운영에 필요한 메모리, 운영체제가 커널 영역에 올라가 있는데 만약 사용자가 운영체제가 올라가 있는 커널 영역에 마음대로 접근할 수 있다면 시스템이 안정성에 문제가 생길 수 있으므로, 사용자가 함부로 커널 영역에 접근할 수 없도록 메모리를 유저영역과 커널 영역을 나누어 사용한다.

 

- 유저 메모리 영역 관리

  • 프로세스 별로 독립된 영역을 가지게 되는 곳을 유저 메모리 공간이라고 한다.
  • 커널 메모리 공간은 모든 프로세스가 공유하여 사용한다.
  • 프로세스 별로 독립적인 유저 메모리 영역을 관리하기 위해 VAD라는 관리 테이블이 존재한다.
  • VAD에는 프로세스에서 가상 메모리 할당함수로 할당한 메모리나, 파일을 매핑함으로써 생성한 메모리 등과 같은 모든 유저 메모리의 할당 정보를 바이너리 트리 형태로 갖고 있다.

# 유저영역

1. 코드영역 : 프로그램의 코드가 올라가는 영역으로 여기서 코드는 컴파일된 기계어 코드를 뜻함

2. 데이터 영역 : 전역 변수와 정적 변수 등이 할당되는 영역 (전역변수? 정적 변수?)

3. 힙 영역 : 동적으로 메모리를 할당하여 사용하는 공간

4. 스택 영역 : 지역 변수와 매개변수가 저장되는 영역

# 핸들 테이블

*핸들 : 구체적인 어떤 대상을 구분하기 위해 붙여진 유일한 번호(운영 체제가 부여하는 중복되지 않는 정수 값)

- 핸들 테이블은 프로세스에서 사용하는 모든 핸들들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간 (핸들 테이블은 커널의 주소를 배열 형태로 보유하고 있음)

A가 다른 항목 B의 어드레스를 보유하고 있을 때 A를 B의 포인터라고 한다.

# 독립적인 메모리 공간

- 프로세스 단위로 관리되는 자원 중 가장 중요한 구별점은 가상 메모리이다. 페이징 기법을 이용하여 프로세스 마다 별도의 고유한 메모리를 사용할 수 있게 하고 있다.

- 프로세스는 실행 되기 위해 실행에 필요한 메모리 공간과 추가적인 메모리 공간을 가지고 있어야 한다. 이 공간은 각 프로세스마다 구별되어야 하며, 프로세스가 접근하고자 하는 파일, I/O장치들에 대해서도 프로세서 단위로 할당 받아 관리되어야 한다.

# 디스 패칭의 단위

- 프로세스는 하나의 프로그램이 운영체제로부터 CPU의 자원을 일정 기간 동안 할당 받아 명령어를 실행하는 것이며, 운영체제는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해서 CPU의 사용시간을

각각의 프로세스에 골고루 나누어 주어야 한다. 하나의 프로세스에서 여러 개의 디스패칭 단위가 실행될 수 있도록 하고 있으며, 이러한 디스패칭* 단위를 스레드라고 부른다.

*디스패칭 : CPU를 할당 하는 것, 예전에는 디스패칭의 단위가 프로세스 였지만 현재는 동시에 처리를 위해 스레드로 바뀜.

컨텍스트 : 프로세서 안에 있는 레지스터, 플래그 등의 현재 값/상태들의 집합을 말함

레지스터 CPU 또는 MPU에 내장되어, 데이터를 일시적으로 보관하는 임시 기억장치

=> 일련의 플립플롭들이 클럭을 공유토록 만들어진, n 비트 저장 장치

1) 실행(Run)상태 : 프로세스가 프로세서를 차지하여 서비스를 받고 있는 상태

2) 준비(Ready)상태 : 실행될 수 있도록 준비되는 상태

3) 대기(Waiting)상태 : CPU의 사용이 아니라 입출력의 사건을 기다리는 상태

# 스레드

하나의 프로그램에서 복잡한 동시 작업을 요구하기 시작하면서 이를 위해 하나의 프로그램이 여러개의 프로세스를 만들어야 했는데, 프로세스 특성상 하나의 프로그램이 동시작업을 수월하게 하기는 어렵다. 프로세스 생성과 동시에 PCB와 메모리 공간을 할당받고 초기화하는 과정이 필요하며, 다른 프로세스와 통신하기 위해서 프로세스 간 통신을 활용하거나 공유 메모리를 생성해 데이터를 주고 받는 번거로운 과정이 필요하다. 그래서 이를 해결하기 위해 만든 프로세스보다 더 작은 실행 단위 개념이 스레드다. 하나의 프로세스에서 여러개의 스레드가 메모리를 공유하여 작동할 수 있으며, 생성과 속도가 빠르고, 적은 메모리를 점유하며, 정보 교환이 쉽고 Context Switcing 부하가 적지만 자원 선점과 동기화 문제가 있다.

(스레드 하나의 프로그램이 동시 작업을 요구해서 프로세스를 여러개로 나눈 가장 작은 실행 단위 개념)

- 스레드는 스택은 따로따로이지만, 코드 영역과 데이터 영역은 하나를 공유한다. 데이터 영역에 속하는 변수를 통해서 쉽고 빠르고 편하게 통신할 수 있다. 단, 스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료한다면 같은 프로세스에 소속된 다른 스레드들까지 모두 강제로 종료된다. 또한 스레드를 강제로 종료할경우 해당 스레드와 같은 자원을 공유하던 다른 스레드에 영향을 줄 가능성이 있다.

- 쓰레드의 사용은 System Call을 요청한 쓰레드만 블록되어 성능의 향상을 가져올 수 있다. 이에 비해 프로세스는 Call의 작업 종료 시 까지 전체가 블록이 된다. => 스레드 단위로 블록 되기 때문에 작업 활용도 상승

*큐(Queue)

선입선출(First In First Out; FIFO)의 자료구조. 대기열이라고도 한다. Queue라고도 하는데, Queue라는 단어 자체가 표 같은 것을 구매하기 위해 줄서는 것을 의미한다.

*스택(stack)

모든 원소들의 삽입(insert)과 삭제(delete)가 리스트의 한쪽 끝에서만 수행되는 제한 조건을 가지는 선형 자료구조(linear data structure)로서, 삽입과 삭제가 일어나는 리스트의 끝을 top이라 하고, 다른 한쪽 끝을 bottom이라 한다. 스택은 종종 pushdown stack이라고도 하는데, 스택의 top에 새로운 원소를 삽입하는 것을 push라 하고, 가장 최근에 삽입된 원소를 의미하는 스택의 top으로부터 한 원소를 제거하는 것을 pop이라 한다. 이와 같은 스택 연산은 항상 스택의 top에서 발생하므로 top 포인터의 값을 1씩 증가 또는 감소시킴으로써 수행된다.

스레드는 CPU가 독립적으로 처리하는 하나의 작업 단위를 뜻합니다. 보통 코어 개수와 스레드 개수는 동일하며, 4코어 4스레드 CPU의 경우 한번에 4개의 코어에서 4가지 작업(스레드)를 동시에 처리할 수 있습니다. 인텔 일부 CPU는 하이퍼스레딩(HT)* 기술을 통해 1코어당 2스레드를 갖습니다.

 

*하이퍼스레딩

물리적인 코어는 1개지만 운영체제 상에서 CPU가 2개로 인식 되도록 하여 데이터가 분산되어 처리됨

페이징

- 가상 메모리는 용량이 주기억장치보다 큰 프로그램이나 동시에 실행될 프로그램이 여러 개라서 주기억장치 공간이 부족할 때, 문제를 해결하기 위해 실행할 프로그램을 일정한 크기의 작은 단위로 나눈 것을 페이지(page)라 한다. 주기억장치를 동일한 크기로 나눈 것을 페이지 프레임(page frame)이라고 한다.

가상 메모리 운영체제의 메모리 관리에서 가장 작은 데이터 단위이다

최근 듀얼 코어라고 하면 동시에 명령어를 2개 수행할 수 있기 때문에 동시라는 말이 성립이 된다. 하지만 현재 멀티스레드를 말하는 개념은 여러 개의 스레드를 하나의 프로세스 내에서 수행한다는 의미이다.

1) 준비 (Ready) 상태 : 스레드가 실행을 위하여 대기하고 있는 상태로 스케쥴러에서는 이 대기열에 있는 스레드 중 우선순위가 가장 높은 스레드를 선택하여 다음번에 실행되도록 한다.

2) 스탠바이 (Standby)상태 : 스케쥴러에 의해 다음 번에 실행되도록 결정된 쓰레드의 상태로써, 만약 이 상태에 있는 스레드의 우선순위가 현재 실행되고 있는 스레드의 우선순위보다 높을 경우에는 실행되고 있던 스레드를 밀어내고 CPU를 선점하게 된다. 스레드의 우선순위가 현재 실행되고 있는 스레드의 우선순위보다 낮을 경우에는 현재 실행되고 있는 스레드에 할당된 시간을 다 소비할 때까지 기다리게 된다. 이때의 한 쓰레드에 할당되는 시간의 기준을 ‘퀀텀타임’이라 한다.

3) 실행 (Running) 상태 : 스탠바이에 있던 스레드가 CPU를 사용할 수 있게 되는 단계로, 커널에서는 해당 쓰레드로의 콘텍스트 전환을 수행한 후 쓰레드가 수행할 수 있도록 해준다. 그리고 이렇게 실행되고 있는 쓰레드는 다른 쓰레드에 의해 선점되거나 쓰레드가 할당받은 시간(퀀텀타임)을 다 소비할 때까지 이 단계에서 계속 실행되어지며, 실행 과정 중 자신의 루틴에 의해 대기 상태가 되거나 종료될 수도 있다.

4) 대기 (Waiting) 상태 : 쓰레드가 WaitForSingleObject()나 Sleep()과 같은 동기화 객체에 의해 자발적으로 대기하거나 시스템에 의해 일시 정지된 상태로, 대부분의 쓰레드는 대부분의 시간을 이 상태에서 머무르게 된다.

5) 전이 (Transition)상태 : 대기 상태 중 해당 스레드의 커널 스택이 디스크로 페이지 아웃되어 바로 준비 상태로 가지 못하는 경우로 해당 스레드의 커널 스택이 메모리로 페이지 인된 후에야 준비 상태로 가게 된다.

6) 종료 (Terminated)상태 : 스레드 스스로 또는 다른 스레드에 의해 종료되는 경우로 모든 스레드의 자원이 시스템으로부터 제거되게 된다.

멀티 스레드의 특징

  • 장점 : 두 개 이상의 쓰레드를 사용하는 것은 사용자에 대한 응답성을 향상시키고 동시에 작업을 완료시키기 위해 필요한 데이터를 처리할 수 있는 장점이 있다. 프로세서가 한 개인 컴퓨터의 경우, 멀티 스레드에서 사용자 이벤트 사이의 짧은 시간 간격을 이용하여 백그라운드에서 데이터를 처리해 동시에 작업을 처리하는 효과를 볼 수 있다.
  • 단점 : 쓰레딩에는 응용 프로그램을 디자인할 때 고려해야 할 리소스 요구 사항과 잠재적 충돌이 있다.

반응형