CS 전공지식 - 프로세스와 스레드

KIM HYUNMIN·2024년 9월 23일

CS 기초지식

목록 보기
7/13

1) 프로세스와 컴파일과정
2) 프로세스의 상태
3) 프로세스의 메모리구조
4) PCB
5) 멀티프로세싱
6) 스레드와 멀티스레딩
7) 공유자원과 임계영역
8) 교착상태

프로세스: 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰입니다.

프로세스 컴파일 과정

컴파일 과정은 4가지 단계 전처리과정 -> 컴파일 과정 -> 어셈블리 과정 -> 랭킹 과정으로 나누어진다.

전처리 과정: 전처리기를 통해 소스 코드 파일(.c)을 전처리된 소스 코드파일(.i)로 변환하는 과정이다.

이때 대표적으로 주석제거,헤더 파일 삽입,매크로 치환 및 적용 작업을 수행한다.

컴파일과정: 컴파일러를 통해 전처리된 소스코드 파일을 어셈블리어 파일로 변환하는 과정이다.

이 과정에서 언어의 문법 검사가 이루어지고 static한 영역(Data,BSS영역)들의 메모리 할당을 수행한다.

어셈블리 과정: 어셈블러를 통해 어셈블리어(.s)을 오브젝트 파일(.o)로 변환하는 과정이다.

여기서 오브젝트 파일이란 어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드라 부른다. 오브젝트 코드로 구성된 파일을 오브젝트 파일이라 부르며 이 오브젝트 파일은 특정한 파일 포맷을 가진다.

링킹과정: 링킹과정은 링커를 통해 오브젝트 파일들을 묶어 실행파일로 만드는 과정이다. 이 과정에서 오브젝트 파일들고 ㅏ프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.

링커의 역할은 크게 심볼 해석과 재배치로 나뉜다.

심볼해석

  • 각 오브젝트 파일에 있는 심볼 참조를 어떤 심볼 정의에 연관시킬지 결정화는 과정이다.

    재배치

  • 재배치는 오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소를 알맞게 배치하는 과정이다.

출처: https://bradbury.tistory.com/226

2) 프로세스의 상태

생성(create)
: 프로세스의 생성, fork(),exec() 함수를 통해 생성

준비(ready)
: 프로세스가 cpu를 사용하고 있지 않지만 언제든지 사용할수 있는 상태, 우선순위 가 높은 프로세스 부터 실행

실행(running)
: 프로세스가 cpu를 차지하여 명령어들 실행되는 상태

중단(block)
: 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태 또는 I/O 디바이스에 의한 인터럽트로 이런 현상 발생

대기(waiting)
: 보류라고도 부름, 입출력 완료,시그널 수신 등 어떤 사건을 기다리고 있는 상태.

준비 -> 실행 (Dispatch)
: 준비 큐 맨앞에 있는 프로세스가 프로세스를 점유하는 것을 디스패치라고함.

실행 -> 준비(Timeout)
: 운영체제는 프로세스의 독점을 방지하기 위해 인터럽트 클록을 두어 일정 시간만 점유하도록 제한 한다. (할당된 시간 만료)

실행 -> 대기(Block)
: 할당된 시간 이전에 실행 상태의 프로세스에 입출력 연산 또는 자원 요청 등의 문제로 프로세스를 스스로 넘기는 경우

대기 -> 준비(Wakeup)
: 입출력 작업이 끝나거나 문제가 해결된다면 대기 상태에서 준비 상태가 된다.

3) 프로세스의 메모리구조

동적영역: 스택,힙

정적영역: 데이터영역,코드영역

스택: 지역변수,매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역. 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해서 저장됩니다.

힙: 힙은 동적으로 할당되는 변수들을 담고 malloc(),free() 함수를 통해 관리할수 있으며 동적으로 관리되는 자료 구조의 경우 힙 영역을 사용한다.

데이터 영역: BSS 세그먼트, Data 세그먼트 ,code/test 세그먼트로 나뉘어서 저장된다.

4) PCB

: PCB는 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터를 말한다. 여기서 메타데이는 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터이다. 프로세스가 생성되면 운영체제는 해당 PCB를 생성한다.

프로세스 제어블록 (PCB) 내용

  • 프로세스 식별자
  • 프로세스 상태
  • 프로그램 카운터
  • 레지스터 저장 영역
  • 프로세서 스케줄링 정보
  • 계정 정보
  • 입출력 상태정보,메모리 관리 정보

문맥교환(Context switching)
:운영체제는 현재 실행중인 프로세스 외의 프로세스를 실행하기 위해 메모리 적재된 pcb를 교체하는데 이를 문맥교환, 컨텍스트 스위칭이라고 한다.

출처: https://yanghs6.github.io/posts/1003_process_state/

5) 멀티프로세싱

: 멀티 프로세싱은 다수의 프로세서가 협력적으로 일을 처리하는 것을 의미한다. 프로세스는 실행되는 프로그램이고 프로세서는 cpu를 의미한다.
즉 여러개의 cpu가 여러 프로그램을 처리하고 있다고 말할수 있다.

멀티프로세스는 IPC 가 가능하다.
IPC(Inter Process Communication )
: IPC는 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘을 뜻한다.(ex. 서버와 클라이언트가 요청하고 응답하는 것)

IPC종류

  • 공유메모리: 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신 할 수 있도록 공유 메모리를 생성해서 통신하는 것(하드웨어적인 면에서 RAM을 나타냄)

  • 파일: 파일은 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터를 말한다

  • 소켓: 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미하며 TCP와 UDP가 있다.

  • 익명파이프: 프로세스 간에 FIFO 방식으로 읽히는 임시공간인 파이를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식을 말한다.

  • 명명파이프: 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프를 말한다.

  • 메세지큐: 메시지를 큐 데이터 구조 형태로 관리하는 것을 의미한다.

6) 스레드와 멀티스레딩

스레드: 프로세스의 실행 가능한 가장 작은 단위.
스레드는 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 heap,data,code 영역을 공유한다.

멀티 스레딩: 멀티 스레딩은 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유 하기 때문에 효율성이 높다.

멀티스레드의 장점

  • 응답성: 프로그램의 일부분이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.
  • 경제성: 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 즐어든다.
  • 멀티프로세서의 활용: 다중 cpu 구조에서는 각각의 스레드가 다른프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다.

단점

  • 문맥교환,동기화 등의 이유 때문에 싱글 코어 멀티 스레딩은 스레드 생성 시간이 오히려 오버헤드로 작용해 단일 스레드보다 느리다.
  • 공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 동기화가 필요하다.

7) 공유자원과 임계영역

공유자원: 공유자원은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터,프린터,메모리,파일, 데이터 등의 자원이나 변수 등을 의미한다.

경쟁상태: 이 공유 자원을 두개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁상태라고 한다. (ex. 공유 데이터 접근, 자원 예약, 상태업데이트)

임계영역: 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역을 임계영역이라고 한다. 공유자원을 여러 프로세스가 동시에 접근할 때, 잘못된 결과를 만들 수 있기 때문에, 한 프로세스가 임계구역을 수행할 때는 다른 프로세스가 접근하지 못하도록 해야한다.

이러한 경쟁상태와 임계영역은 동기화 메컨니즘을 사용하여 해결할수 있다.

  1. locking(잠금)
    -임계구역을 말 그대로 잠그는 메커니즘이다. 하나의 프로세스, 쓰레드가 임게구역을 사용하고 있으면 문을 잠궈서 다른 프로세스, 쓰레드가 들어오지 못하게 한다. 사용중인 프로세스,쓰레드가 사용을 완료하면 다음 프로세스, 쓰레드가 들어갈수 있는 방식이다.

  2. mutex(상호 배제)
    -상호배제의 약자로 뮤텍스는 공유자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금이다. 잠금이 설정되면 다른 프로세스, 쓰레드는 잠긴 코드 영역에 접근할수 없다. 또한 뮤텍스는 하나의 상태만 (잠금,잠금해제) 가진다.

3.semaphore(세마포어)
-세마포어는 일반화된 뮤텍스이다. 간단한 정수 값과 두가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리한다.

프로세스가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스가 공유자원을 해제하면 세마포어에서 signal() 작업을 수행한다. 세마포어에서는 조건 변수가 없고 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없다.

8) deadlock(교착상태)

교착상태: 일련의 프로세스들이 서로가 가진 자원을 기다리며 block 되어 더이상 진행이 될수 없는 상태이다.

교착상태는 시스템 자원에 대한 요구가 엉킨 상태로, 두 프로세스가 사용하는 자원을 서로 기다리고 있을 때 발생한다.

교착상태 발생 4가지 조건

  • 상호배제: 한프로세스가 자원을 독점하고 잇으며 다른 프로세스들은 접근이 불가능
  • 점유대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
  • 비선점: 다른 프로세스의 자원을 강제적으로 가져올수 없음
  • 환형대기: 프로세스 a는 프로세스b의 자원을 요구하고 , 프로세스 b는 프로세스 a의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황

교착상태 해결 방법

  • 예방: 교착상태가 발생할 수 있는 요구조건을 만족시키지 않게 함으로써 교착상태를 방지한다, 자원 낭비가 심한 기법이다.
  • 회피: 교착상태가 발생할 가능성을 배제하지 않고 교착상태가 발생하면 적절히 피해나가는 방법이다. (은행원 알고리즘)
  • 탐지: 시스템에 교착 상태가 발생했는지 점검하여 교착상태에 있는 프로세스와 자원을 발견한다.
  • 회복: 교착상태를 발견했다면 회복기법을 진행한다.교착상태를 일으킨 프로세스를 종료하거나 교착상태의 프로세스에 할당된 자원을 선점하여 프로세스나 자원을 회복한다.
profile
Linux,Window,Network,docker,kubernets

0개의 댓글