process와 thread

Gisele·2021년 3월 14일
0
post-thumbnail

Process 프로세스

프로세스란?


실행되고 있는 컴퓨터 프로그램. 프로그램은 작업을 수행하는 명령어들의 집합을 의미한다. stack에 임시데이터(함수 호출, 로컬변수)가 저장되고, heap에는 코드에서 동적으로 만들어지는 데이터가 저장된다. DATA는 초기화되지 않은 변수(BSS)와 초기값이 있는 전역변수(DATA)가 있다.

프로세스 처리방식

  • 동시성 : 한개의 CPU가 여러가지 프로세스를 번갈아가며 작업하는 것. cpu의 클럭수를 늘려 효율성을 높임
  • 병렬성 : cpu의 갯수를 늘려 각각의 cpu가 다른 작업을 처리하게끔 하는 것.

배치처리 시스템

자동으로 다음 응용 프로그램이 실행될 수 있도록. 순차실행하므로 실행 시간이 긴 프로그램이 많에 있으면 다른 프로그램 응답시간이 길어진다.

시분할

응용 프로그램이 CPU를 점유하는 시간을 잘게 쪼개어 실행할 수 있도록 하는 시스템. 응답시간이 짧다

멀티 태스킹

단일 CPU에서 여러 응용 프로그램이 동시에 실행되는 것처럼 보이도록하는 시스템. 10ms~20ms 단위로도 실행 응용 프로그램이 바뀌므로 사용자에게 동시에 실행되는 것처럼 느껴진다. 시분할 시스템의 기본 기술과 같다.

멀티 프로세싱

여러 CPU에 하나의 프로그램을 병렬로 실행해서 실행속도를 극대화함

멀티 프로그래밍

단위시간당 CPU 활용도를 높이는 기술. 응용프로그램은 실행되는 동안 온전히 CPU를 쓰지 않고 중간에 다른 작업을 하는 경우가 있다. (프로그램 실행중에 파일을 읽거나 프린트하는 경우 등) 이렇게 다른 작업을 하는 동안 다른 프로그램을 cpu에서 실행한다.

context switching


CPU에 실행할 프로세스를 교체하는 기술이다. PCB는 프로세스 상태 정보를 의미한다. PC, SP, 메모리, 스케줄링 정보등을 가지고 있다. 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서 메인 메모리에 저장하고, 다음 실행항 프로세스 PCB 정보를 메인 메모리에서 읽어와 CPU에 넣고 실행한다

IPC(Inter PRocess Communition)

프로세스는 다른 프로세스의 공간에 접근할 수 없다. 프로세스 데이터나 코드가 바뀌면 위험하기 때문이다. 환경변수와 프로세스 핸들 테이블 상속이 가능하지만 독립적인 관계이다. 성능을 높이기 위해 여러 프로세스를 만들어 동시에 실행하는데 프로세스간 상태 확인 및 데이터 송수신이 필요하다. 프로세스간 공간은 완전히 분리되어 있기 때문에 프로세스 간 통신(IPC)을 수행해야 한다. 그리고 IPC에는 다양한 기법이 있다.

PIPE

커널 공간의 메모리를 사용하는 기법이다.
기본적으로 단방향 통신을 하고, fork()로 자식 프로세스를 만들어, 부모 자식간 통신을 할 때 사용된다.

Message Queue

커널 공간의 메모리를 이용한다. 큐이므로 FIFO 정책으로 데이터 전송. key 값을 알면 다른 프로세스의 데이터를 읽을 수 있다. 파이프와 달리 부모/자식이 아니라 어느 프로세스 간에라도 데이터 송수신이 가능하고, 단방향, 양방향 모두 가능하다.

공유메모리

커널 공간에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식이다. 공유메모리 key를 가지고 여러 프로세스에 접근 가능하다.

signal

UNIX에서 30년 이상 사용된 전통적인 기법이다. 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생했는지를 알려주는 기법. 프로세스 관련 코드에 관련 시그널 핸들러를 등록해서 해당 시그널을 처리한다.

socket

기본적으로 클라이언트와 서버 등 두 개의 다른 컴퓨터 간의 네트워크 기반 통신기술이다. 하나의 컴퓨터 안에서, 두 개의 프로세스 간에 통신 기법으로 사용 가능하다.

Thread 스레드



프로세스 내에서 실행되는 흐름의 단위. 프로세스처럼 동작하지만 그것보다는 구조가 작다. 프로세스의 서브셋.

  • 하나의 프로세스에 여러개의 스레드를 생성할 수 있다.
  • 스레드들은 동시에 실행 가능하다
  • 프로세스 안에 있으므로, 프로세스의 데이터에 모두 접근 가능하다.
  • 스레드에는 각기 실행이 가능한 스택이 존재한다.

장점

  • 사용자에 대한 응답성 향상
  • 프로세스 안에 있으므로 프로세스의 데이터에 모두 접근가능하기 때문에 스레드간 자원 공유를 위해 번거로운 작업이 필요없다
  • 작업이 분리되어 코드가 간결하다

단점

  • 스레드 중 한 스레드만 문제가 있어도 전체 프로세스가 영향을 받음
  • 스레드를 많이 생성하면 모든 스레드를 스케줄링해야 하므로 Context Switching이 많이 일어나, 성능 저하

스레드 동기화

  • 작업들 사이에 실행 시기를 맞추는 것
  • 여러 스레드가 동일한 자원(데이터)에 접근할 때 각 스레드 결과에 영향을 줌
  • 스레드가 실행되는 도중 context switching이 일어나 작업을 마치지 못한 상태에서 다른 스레드가 실행되기 때문
  • Mutual exclusion(상호배제) : 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막는 것
import threading

g_count = 0

def thread_main() :
    num = 0
    global g_count
    look.acquire() # mutual exclusion - 파이썬에서 제공하는 함수
    for i in range(100000) : 
        g_count = g_count + 1
    lock.release()
lock = threaing.Lock()
threads = []        

for i in range(50):
    th = threading.Thread(target = thread_main)
    threads.append(th)

for th in threads :
    th.start()    

for th in theads : 
    th.join()    

print('g_count =',g_count)    

Semaphore 세마포어

  • Locking Machanism
    • Mutex(binary semaphore) : 임계구역에 하나의 스레드만 들어갈 수 있음
    • Semaphore : 임계 구역에 여러 스레드가 들어갈 수 있음
  • 세마포어는 counter를 두어서 동시에 리소스에 접근할 수 있는 허용 가능한 스레드 수를 제어
    • S : 세마포어 값 - 초기 값만큼 여러 프로세스가 동시에 임계 영역 접근 가능
    • P : 검사(임계 영역에 들어갈 때) - S값이 1이상이면 임계 영역 진입 후 S값 1차감, S가 0이면 대기
    • V : 증가(임계 영역에서 나올 때) - S값을 1더하고, 임계 영역을 나옴

교착상태(Deadlock)

  • 무한대기상태
  • 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태
  • 프로세스, 스레드 둘 다 이와 같은 상태가 나타날 수 있다
  • 여러 프로세스가 동일 자원 점유를 요청할 때 발생

기아상태(Starvatin)

  • 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태
  • 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원 할당이 안되는 경우를 주로 의미함

📑 reference

  • [패스트캠퍼스 컴퓨터공학 운영체제 - 이준희]
profile
한약은 거들뿐

0개의 댓글