[OS] 프로세스 & 스레드

yongkini ·2021년 9월 22일
0

Operating System

목록 보기
1/5

용어 정리

  • 프로그램 : window로 치면 바탕화면에 .exe 확장자를 가진 응용 소프트웨어들을 프로그램이라고 부른다. 이러한 프로그램은 우리가 다운로드를 받으면 하드디스크에 실행 코드로 저장된다. 하지만, 이렇게 실행 코드로 저장된 프로그램은 우리가 실행하지 않으면, 말그대로 코드에 불과한 것이다.
  • 프로세스 : 그리고 이러한 프로그램 중에 현재 실행중인 프로그램 혹은 운영체제의 자원을 받아서(메모리 영역, CPU) 사용중인 프로그램을 프로세스라고 한다(운영체제의 자원을 할당받는 단위라고 할 수 있다). 앞서 말한 프로그램이 하드디스크에 저장된 실행 코드라고 했는데, 이러한 실행 코드를 실제로 실행한 것이 프로세스인 것이다(디스크에 존재하던 프로그램이 메모리에서 실제로 실행된 것). 실제로 윈도우의 작업 관리자에서 볼 수 있는데, 옛날에는 이렇게 멀티 프로세스가 불가능했지만, 지금은 수많은 프로세스들이 '동시에' 돌아갈 수 있게 됐다. 어떻게 동시에 돌릴 수 있지??
    1) Concurrency : 여러 프로세스를 동시에 돌리려면 프로세스가 특정한 방법으로 여러 프로세스를 동시에 실행시켜야하는데, 그 방법중에 하나는 'Context Switching'이다. 전문 요리사에 비유해보면, 전문 요리사에게 점심으로 한식, 중식, 일식이 모두 먹고 싶다하여 4가지 음식을 한꺼번에 시켰다고 해보자. 그러면 1인 식당을 운영하는 전문 요리사는 어쩔 수 없이 모든 요리를 '동시에' 완성시켜서 점심 식사를 대접해야한다. 요리사는 1시까지 시간 맞춰 모든 요리를 완성하기 위해 결국 중식으로 짜장면 소스를 만들면서, 일식으로 초밥을 썰고, 한식으로 비빔밥 고명을 준비한다. 즉, 여러개의 요리를 조금 조금씩 '동시에' 진행하는 것이다. 실제로 요리사의 요리 과정을 보면 따로따로 조금씩 준비하는 것처럼 보이지만, 이러한 과정을 프로세서가 하면, 그 따로따로 조금씩 하는 것이 워낙 빨라서 '동시에' 모든 것을 처리하는 것처럼 느껴지게 된다.
    2) Parallelism : 두번째 방법은 멀티 코어 프로세서를 가진 컴퓨터에서만 가능한 병렬 처리 방식이다. 위에서는 여러개의 프로세스를 조금조금씩 동시에 진행하는 방식으로 멀티 프로세스를 가능하게 했다면, 이 경우에는 아예 각각의 프로세스를 다른 프로세서가 담당하게 하는 방법을 사용한다. 위의 비유를 다시 가져와보면, 1시까지 다양한 요리를 완성하기에 전문 요리사 혼자서는 벅차다는 판단하에 전문 요리사 2명을 데려와서 각각 하나의 요리를 맡아서 진행을 하는 것이다. 이렇게하면 동시에 일을 처리하지만, 각각 하나의 프로세스를 전담해서 진행하게 된다.
  • 특정 프로세스에 대한 중요 정보를 저장하는 자료구조(운영체제의) PCB(Process Control Block) : 프로세스는 CPU를 할당받아 작업을 하다가도 다른 프로세스로 전환이 발생하면, CPU를 내주고, 여태까지 했던 작업(진행상황)을 저장해놓고 CPU를 반환하고, 다시 프로세스 전환이 발생할때까지 기다리게 되는데, 이 때 작업을 저장해놓는 곳이 PCB이다. 그리고 다시 프로세스 전환이 돼서 CPU를 할당받으면 이전에 PCB에 저장했던 부분부터 다시 작업을 시작한다. 이러한 PCB는 프로세스가 만들어지면서 같이 만들어진다.
PCB에 저장되는 정보
  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
  • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
  • 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터
  • CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
  • 스레드 : 위에서 프로세스가 운영체제의 자원을 할당받아 각자의 메모리 영역에서 작업을 하는 것이라면, 스레드는 프로세스가 할당받은 영역 내에서 이뤄지는 프로세스의 실행 단위라고 할 수 있다. 다시 요리사로 비유해보면, 프로세서가 요리사였고, 프로세스가 하나의 요리를 만드는 과정이라고 할 때, 스레드는 하나의 요리가 만들어지는 과정 하나하나라고 할 수 있다. 다시 말해, 중식을 만드는 과정(프로세스)안에 짜장면 소스를 만들기 위해 야채 썰기, 면 삶기, 야채 썰기 등등이 스레드라고 할 수 있다. 그리고 이러한 스레드는 중식을 만드는 과정 안에서 공존하기 때문에 서로 자원을 공유해서 쓴다. 각각의 프로세스는 운영체제로부터 받은 자원을 공유하지 않고, 독립된 메모리 영역에서 사용하는 반면, 스레드는 그러한 독립된 메모리 영역 내의 자원을 공유한다. 하지만, 이렇게 공유하면서 사용하는 것이 항상 좋지만은 않은데, 그 이유는 멀티 스레드가 이뤄지면, 예를 들어, 인기투표를 하는 프로그램이라고 할 때, 여러명의 유저가 동시에 특정 유저에게 찬성표를 던질 때, 먼저 버튼을 누른 유저의 스레드가 그 다음 유저의 인터랙션에 영향을 미쳐서 30명이 찬성을 눌렀는데, 10명의 찬성만 반영되는 등의 문제가 발생할 수 있다.
  • 멀티 프로세스 & 멀티 스레드

    • 멀티 프로세스 : 위에서 말했듯이 프로세스는 운영체제의 자원을 할당받아 각각 독립된 영역에서 이뤄지는 단위이다. 이렇게 되면 장점이 각각 독립된 영역이기 때문에 하나의 프로세스에 문제가 생겨도, 다른 프로세스에는 그 영향이 미치지 않는다. 예를 들어, 구글 크롬이 멀티 프로세스로 구현된 것인데, 여러개의 탭창에서 하나의 페이지에 문제가 생겨도 다른 탭에 있는 페이지에는 문제가 생기지 않게 된다. 하지만, 이러한 장점에 의해서 프로세스간의 통신에는 IPC(Inter-Process Communication)라는 별도의 통신 방법을 사용해서 데이터를 공유해야하기에 자원이 소모된다(+context switching 비용이 큼).
    • 멀티 스레드 : 스레드는 프로세스와 달리 프로세스의 영역 내에서 프로세스가 가진 heap, data, text 영역을 공유하기 때문에 프로세스처럼 별도의 자원없이도 통신이 가능하다. 또한, 이렇게 같은 영역 내에 있기 때문에 context switching 비용이 적다. 결과적으로 메모리 공간과 시스템 자원의 소모가 상대적으로 줄어들게 된다. 하지만, 이러한 멀티 스레딩에도 단점이 있는데, 위와 같이 효율성을 내는 장점을 위해서 자원을 공유하다보면 동시에 특정 자원에 접근하는 두개의 스레드 혹은 여러개의 스레드가 생길 수 있는데, 그러한 상황에서는 다른쪽에서 특정 자원에 수정을 했음에도 동시에 접근한 다른 스레드에서 또 수정을 하거나, 조회를 하는 경우 이상한 결과가 나올 수 있다. 이를 방지하기 위해서 동기적 설계를 해줘야하는데, 이에 따라 지연되는 시간이 생길 수 있고(병목현상), 이는 성능 저하로 연결된다.
    • 멀티 스레드 vs 멀티 프로세스
      : 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다. 반면 멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재한다. 이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 시스템에 따라 적합/부적합이 구분된다. 따라서 대상 시스템의 특징에 따라 적합한 동작 방식을 선택하고 적용해야 한다.
      출처 : 한재엽님 깃헙 블로그
    profile
    완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

    0개의 댓글