Hope Everyone Is Happy

5. 프로세스 본문

※ CS 스터디/운영체제

5. 프로세스

J 크 2023. 9. 19. 00:28
728x90
반응형

본 게시글은  : 면접을 위한 CS 전공지식 노트 (출판사 : 길벗, 주홍철 지음) 을 참조하여 작성하였습니다. + 구글링


◆  프로세스와 스레드 ( Process and Thread )

- 프로세스

     : 컴퓨터에서 실행되고 있는 프로그램 ( CPU 스케줄링의 대상이 되는 작업이라는 용어와 같은 의미 )

     : 프로그램이 메모리에 올라가 인스턴스화 된 것

          ex) 크롬 프로그램을 실행하면 크롬이 메모리에 올라와 인스턴스화 되어 크롬 프로세스로 변환

     : 인스턴스화 후 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행

- 스레드

     : 프로세스 내에서 실행되는 여러 흐름의 단위

     : 프로세스의 특정한 수행 경로

- 컴파일 과정

    : 프로그램을 만드는 과정은 만드는 언어마다 다를 수 있음

    : C언어를 예시로 들면, 컴파일러가 컴파일 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 번역하여 실행할 수 있는 파일 작성

    : 전처리 => 소스 코드의 주석을 제거하고 #include (java 에선 import!) 등 헤더 파일을 병합하여 매크로를 치환

    : 컴파일러 => 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환

    : 어셈블러 => 어셈블리어는 목적 코드 (object code)로 변환

                           이 때, 확장자는 운영체제 마다 다르게 생성  (ex - 리눅스는 .c->.o로 변환)

    : 링커 => 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합, 실행 파일 생성 (.exe 등)

- 라이브러리

    : 라이브러리는 정적 라이브러리와 동적 라이브러리로 분류

    : 정적 라이브러리는 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식

     => 시스템 환경 등의 외부 의존도가 낮지만 코드 중복 등 메모리 효울성이 떨어짐

    : 동적 라이브러리는 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브러리를 사용

    => 메모리 효율성에서의 장점을 지니지만 외부 의존도가 높음


◆  프로세스의 상태

- 프로세스의 상태는 아래 그림과 같이 여러 가지 상태 값을 가짐

- 생성 상태 (Create)

    : 프로세스가 생성된 상태를 의미 fork() or exec() 함수를 통해 생성 => 이 때 PCB가 할당

    : fork => 부모 프로세스의 주소 공간을 그대로 복사, 새로운 자식 프로세스를 생성

             => 주소 공간만 복사하고 부모 프로세스의 비동기 작업 등을 상속하지 않음

    : exec => 새롭게 프로세스를 생성하는 함수

- 대기 상태 (ready)

    : 메모리 공간이 충분하면 메모리를 할당 받고 아니면 아닌 상태로 대ㄱ

    : CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태

- 대기 중단 상태 (ready suspended)

    : 메모리 부족으로 임시 중단된 상태

- 실행 상태 (running)

    : CPU 소유권과 메모리를 할당 받고 인스트럭션을 수행 중인 상태를 의미 ( CPU burst로도 표현 )

- 중단 상태 (blocked)

     : 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태

     : I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생 ( ex. 인쇄 버튼 시 정지 현상 등)

     : C++은 해시 테이블을 unordered_map 으로 구현, 이중 연결리스트는 list로 구현

- 일시 중단 상태 (blocked suspended)

    : 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태

- 종료 상태 (terminated)

    : 메모리와 CPU 소유권을 모두 놓고 가는 상태

    : 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료(abort) 존재

    : 자식 프로세스에 할당된 자원의 한계치를 넘어서거나 부모 프로세스가 종료 등으로 프로세스를 종료할 때 발생


◆  프로세스의  메모리 구조

- 운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 할당

- 위에서 부터 스택, 힙, 데이터 영역(BSS segment, Data segment), 코드 영역으로 분류

- 스택과 힙

    : 스택과 힙은 동적 할당이 되며, 동적 할당은 런타임 단계에서 메모리를 할당 받는 것

    : 지역 변수, 매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역

    : 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해서 저장

    : 힙은 동적으로 할당되는 변수를 저장

    : malloc, free 함수를 통해 관리 가능하며 동적으로 관리되는 자료 구조의 경우 힙 영역 사용

- 데이터 영역과 코드 영역

    : 정적 할당 되는 영역으로 컴파일 단계에서 메모리를 할당하는 것

    : BSS segment와 Data segment, code/text segment로 나뉘어서 저장

    : BSS segment는 전역 변수 or static, const , 0으로 초기화 or 초기화가 되지 않은 변수들이 이 메모리 영역에 할당

    : code segment는 프로그램의 코드가 할당


◆  PCB (Process Control Block)

- PCB는 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터

- 메타데이터

    : 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터

    : 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 사용

    : 일정한 규칙에 따라 콘텐츠에 부여되는 데이터

- 프로세스 제어 블록 이라고도 불리며 프로세스가 생성되면 운영체제는 해당 PCB를 생성

- 프로그램이 실행되면 프로세스가 생성되고 프로세스 주소 값들에 스택, 힙 등의 구조를 기반으로 메모리 생성

- 프로세스의 중요한 정보를 포함하고 있기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리

- PCB의 구조

    : PCB는 프로세스 스케줄링 상태 ,프로세스 ID등의 다음과 같은 정보로 구성

       · 프로세스 스케줄링 상태 : 준비, 일시중단 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태

       · 프로세스 ID : 프로세스 ID, 해당 프로세스의 자식 프로세스 ID

       · 프로세스 권한 : 컴퓨터 자원 or I/O 디바이스에 대한 권한 정보

       · 프로그램 카운터 : 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터

       · CPU 레지스터 : 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보

       · CPU 스케줄링 정보 : CPU 스케줄러에 의해 중단된 시간 등에 대한 정보

       · 계정 정보 : 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보

       · I/O 상태 정보 : 프로세스에 할당된 I/O 디바이스 목록

- 컨텍스트 스위칭 (context switching)

    : PCB를 교환하는 과정

    : 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생

    : 컴퓨터는 많은 프로그램을 동시에 실행하는 것처럼 보이지만 어떠한 시점에서 실행되고 있는 프로세스는 코어당 한개

    : 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문

    : 하지만 현대 컴퓨터는 멀티 코어의 CPU를 가지기 때문에 한 시점에 한 개의 프로그램만 돌지 않음

      ex) 싱글 코어 기준 컨텍스트 스위칭

     :  한 개의 프로세스 A가 실행 -> 중지- > A의 PCB 저장 후 프로세스 B를 로드 하여  실행

     : 컨텍스트 스위칭이 일어날 때 앞의 그림처럼 유휴시간(idle time)이 발생

     : 캐시미스 => 컨텍스트 스위칭 시, 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 발생

                       => 캐시클리어 과정 발생 => 캐시미스 발생

     : 스레드에서 컨텍스트 스위칭 발생 시 스레드는 스택 영역을 제외한 모든 메모리를 공유

          => 비용과 시간이 더 적게 소요


◆  멀티프로세싱

- 멀티 프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것

- 이를 통해 하나 이상의 일을 병렬로 처리 가능

- 특정 프로세스의 메모리 혹은 프로세스 일부에 문제가 발생되더라도 다른 프로세스로 처리 가능

- 웹 브라우저 : 멀티프로세스 구조

    : 브라우저 프로세스 => 주소 표시줄, 북마크 막대, 뒤로가기 버튼, 앞으로 가기 버튼 등을 담당하여 네트워크 요청이나 파일 접근 같은 권한을 담당

    : 렌더러 프로세스 : 웹 사이트가 보이는 부분의 모든 것을 제어

    : 플러그인 프로세스 : 웹 사이트에서 사용하는 플러그인을 제어

    : GPU 프로세스 : GPU를 이용해서 화면을 그리는 부분을 제어

- IPC ( Inter Process Communication )

    : 멀티프로세스는 IPC (Inter Process Communication)가 가능

    : 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘

    : 예시 - 클라이언트는 데이터를 요청하고 서버는 클라이언트 요청에 응답

    : 종류는 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐 존재

    : 모두 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐

- 공유 메모리 (Shared Memory)

    : 여러 프로세스가 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신

    : 기본적으로는 각 프로세스의 메모리를 다른 프로세스가 접근 불가

    : 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유

    : IPC 방식 중 어떠한 매개체를 통해 데이터를 주고 받는 것이 아닌 메모리 자체를 공유

    : 불필요한 데이터 복사의 오버헤드등이 발생하지 않아 가장 빠르며 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화 필요

- 파일 : 디스크에 저장된 데이터 or 파일 서버에서 제공한 데이터로 이를 기반으로 프로세스끼리 통신

- 소켓 : 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터

          => TCP, UDP등 존재

- 익명 파이프 (unamed pipe)

     : 프로세스간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고 받음

     : 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식

     : 부모, 자식 프로세스 사이에만 사용 가능하며 다른 네트워크 상에서는 사용이 불가

- 명명된 파이프 (named pipe)

    : 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 or 양방향 파이프

    : 클라이언트/서버 통신을 위한 별도의 파이프를 제공

    : 여러 파이프를 동시에 사용 가능

    : 컴퓨터의 프로세스 끼리 or 다른 네트워크상의 컴퓨터와도 통신 가능

    : 아래 그림처럼 보통 서버용 파이프와 클라이언트용 파이프로 구분해서 작동

- 메시지 큐

    : 메시지를 큐데이터 구조 형태로 관리

    : 커널에서 전역변수 형태 등으로 전역적으로 관리되며 다른 IPC 방식에 비해서 사용방법이 매우 직관적이며 간단

    : 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근할 수 있는 장점

    ex) 공유 메모리를 통해 IPC를 구현할 때 쓰기 및 읽기 빈도가 높은 경우, 동기화 때문에 기능 구현이 복잡

                => 대안으로 메시지 큐 사용


◆  스레드와 멀티스레딩

- 스레드

    : 프로세스의 실행 가능한 가장 작은 단위, 프로세스는 여러 스레드를 가짐

    : 코드, 데이터, 스택, 힙을 각각 생성하는 프로세스와 달리 스레드는 코드, 데이터, 힙을 서로 공유

- 멀티 스레딩

    : 프로세스 내 작업을 여러 개의 스레드, 멀티 스레드로 처리하는 기법

    : 스레드끼리 서로 자원을 공유하기 때문에 효율성 보장

       ex) 웹 요청을 처리할 때 새 프로세스 생성 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비

    : 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않은 빠른 처리가 가능

    : 동시성에도 큰 장점

         => 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것

    : 하지만 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있는 단점 존재

      ex) 멀티스레드의 예시,  웹 브라우저의 렌더러 프로세스

               => 이 프로세스 내에는 메인 스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드가 존재


위의 글과 관련하여 추가적인 내용이나 피드백은 언제나 환영입니다 :)

 

'※ CS 스터디 > 운영체제' 카테고리의 다른 글

7. CPU 스케줄링  (0) 2023.11.07
6. 스레드  (0) 2023.11.06
4. 메모리 관리  (0) 2023.09.13
3. 메모리 계층  (0) 2023.09.12
2. 컴퓨터의 요소  (0) 2023.09.10