[OS] process and thread

써니·2023년 7월 19일
0

OS

목록 보기
2/2
post-thumbnail

1. 프로세스와 쓰레드

Program vs Process

ProgramProcess
저장장치 (HDD, SSD)에 저장된 명령문의 집합체 (App/ Application, .exe )실행 중인 프로그램 = 하드디스크에 저장된 프로그램이 메모리 (RAM)에 올라갔을 때
“수동적 존재” = 하드디스크/저장장치만 사용
“능동적 존재 “ =

- 메모리 사용

- OS의 CPU 스케줄링 알고리즘에 따라 CPU도 사용

- 필요에 따라 입출력 작업
  • Code : 자신을 실행하는 코드 저장
  • Data : 전역 변수와 정적(static)변수 저장
  • Stack : 지역 변수와 함수 호출 시 필요한 정보 (매개변수와 돌아갈 주소) 저장
  • Heap : 동적 메모리 할당 시 사용
    • ex) c 언어 - malloc() free()



코드 → 메모리 → 프로세스 과정

  • code
    #include <stdio.h>
    void main()
    {
    	int a = 1;
    	int b = 2;
    	int c = a + b
    	}
    • .c file → 컴파일
      1. c언어는 compile언어이므로 컴파일이 되어야 실행가능

      2. 전처리기 : 매크로로 정의한 숫자를 치환, 필요한 파일 로딩
        ⇒ 파일 확장자 : .i

      3. 컴파일러 : compile - C언어 ⇒ assembly language (명령어 : 기계어 = 1: 1)
        ⇒ 파일 확장자 : .s

      4. Assembler : Assembly language ⇒ machine language(0,1)
        ⇒ 파일 확장자 : .o

      5. Linker : linking - 여러 library나 다른 source code들 연결

        ⇒ 파일 확장자 : .exe

    • exe. 파일 실행 → 하드 디스크에 있는 해당 파일이 메모리에 올라감 ⇒ “Process”





CPU 관점) OS의 전략에 따른 Process의 관리

  • CPU : 0,1로 이루어진 Machine language만 실행 ⇒ Assembly Language로 고려해보기 (for 가독성)
    1. CPU 내의 Control Unit이 숫자 5와 7을 memory에 저장
    2. 방금 메모리에 저장한 값을 **edx , eax Register**로 가져옴
    3. Control Unit이 “Register에 저장된 5와 7을 더하라”는 명령을 하면
    4. ALU(산술논리연산장치)가 연산을 한 뒤, eax Register에 저장
    5. Control Uniteax Register에 저장된 12를 가져와 memory에 저장




Uni-Programming vs Multi-Programming vs Multi-Processing

Uni-ProgrammingMulti-ProgrammingMulti-Processing
1 process on memorymultiple process on memoryCPU managing multiple processes
pov of memorypov of memorypov of CPU
Time sharing process
  • Swapping : memory에 있는 data를 다른 저장장치로 보내고 다른 저장장치에서 memory올리는 것




PCB (Process Control Block)

  • Process가 만들어지면 OS는 해당 process의 정보를 갖고 있는 PCB를 만들고 저장
  • Linked List 형태로 저장 (각 데이터가 다음 데이터를 연결)
    • Process 종료 시 Linked List에서 해당 Process의 PCB 제거
    • 이전의 PCB가 방금 제거된 PCB를 가리키도록 수정하여 Linked List 구조 유지

      출처 : https://yoongrammer.tistory.com/52
      PCB저장 데이터
      Pointer
      - 부모와 자식 process에 대한 pointer, 할당된 자원에 대한 pointer 등

      - process의 한 상태에서 다른 상태로 전환될 때 저장하는 pointer 보유 ( for 효율적인 접근)
      Process State
      현재 process의 5가지 상태 (생성, 준비, 실행, 대기, 완료)
      PID (Process ID)Process를 식별하기 위한 숫자
      Program Counter
      다음에 실행될 명령어의 주소를 포함하는 Program Counter

      시분할 처리로 여러 프로세스를 짧은 시간씩 번갈아 실행하기 때문에, 해당 프로세스로 다시 전환됐을 때 실행할 명렁어를 알아둬야 함)
      Registers
      process가 실행될 때 사용했던 Register 값들이 저장

      (Program Counter와 마찬가지로 CPU를 뺏기고 다시 시작할 때 이전에 사용하던 값을 복구하기 위한 용도)
      Memory Limitsprocess가 memory에 있는 위치 정보, memory 침범을 막기 위한 경계 register값 등
      Open File Lists=CPU 스케쥴링 정보 : 우선순위, 최종 실행시간, CPU 점유시간 등이 저장





Process State

  • CPU의 시분할 시스템 ⇒ process의 5가지 상태
출처 : https://medium.com/@sohailk1999/five-state-process-model-6e83d7428c8c
status설명
생성/ NewPCB 생성 후 memory에 program 적재를 요쳥한 상태 (적재 승인 후 준비 상태)
준비 / ReadyCPU를 사용하기 위해 기다리는 상태
실행 / Running
- 준비 상태의 process가 cpu scheduler에 의해 CPU 할당 받아 실행 중인 상태

- 실행 상태의 process의 수 == CPU 개수

- 부여된 시간 초과시 CPU scheduler가 할당된 CPU 탈환 → 다시 준비 상태
대기 / Waiting
- process가 입출력 요청 시 완료될 때까지 기다리는 상태

- 입출력 작업 완료 시 대기 상태에 있던 process에게 CPU 할당 기회 부여
완료 / Terminated
- Process가 종료된 상태

- Process가 사용했던 data & PCB 메모리에서 제거





Context Switching

  • Process를 실행하는 중에 다른 process를 실행하기 위해 실행 중인 process의 상태를 저장하고 다른 process의 상태 값으로 교체하는 작업

  • cause of Context switching

    1. CPU 점유시간 초과
    2. I/O 요청
    3. 다른 종류의 Interrupt가 있을 때 발생
  • if) Process A → Process B

    • PCB의 내용 변경! : Process state, Program Counter, Registers , Memory Limits
      • 실행중인 process의 작업 내용을 PCB에 저장

        • 현재 CPU의 register값 등을 PCB A에 저장
      • 실행될 process의 PCB 값으로 CPU가 다시 세팅





Process 생성과 종료

  • 0번 Process 생성 과정 : OS 부팅 후 딱 1번 실행
    1. .exe 파일 실행
    2. OS가 해당 프로그램의 Code 영역과 Data 영역을 memory에 load, 빈 Stack & 빈 Heap을 만들어 공간 확보
    3. 해당 Process를 관리하기 위한 PCB를 만들어 값을 초기화

⇒ 나머지 프로세스는 새로 생성하지 않고 0번 process를 복사해서 사용 : fork() 함수 이용

  • ∵ process 복사하여 이용하는 것이 생성하는 것보다 빠름

  • 0번 process를 복사 ⇒ 부모 process(0번) & 자식 process

    • 부모 process의 code영역, data 영역, stack 영역, PCB의 내용 전부 복사
    • 복사한 0번 process와 다르게, 원하는대로 작동하도록 **exec())함수 이용** ⇒ 부모를 복사한 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어씀
  • 부모 process & 자식 process
    
    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
    	int pid;
    	pid = fork();    // 자식 process에게는 0, 부모 process에게는 0이 아닌 값 반환
    	
      // 이 후 2개의 process는 cpu scheduling에 따라 실행, 
      //어느 것이 먼저 실행될지는 OS의 결정에 따름
    	
    	if (pid == 0) // 자식 process
    	{
    		// InternetBrowser 프로그램에서 코드와 데이터 영역을 가져와 자식 process를 덮어씀
    		execlp("InternetBrowser", "0", NULL); 
    		exit(0); // InternetBrowser 프로그램 실행에 실패하면 exit()함수 호출 후 종료
    	}
    	else // 부모 process
    	{
    		wait(NULL);// 자식 process에게서 exit()신호를 받으면 자식 process를 완전히 종료 시킴
    		printf("인터넷 브라우저 닫힘"); 
    		exit(0);
    	}
    }
    • execlp() : 인자로 들어온 프로그램에서 코드와 데이터 영역을 가져와 자식 process를 덮어씀 (from parent’s copied data to the program’s data)
      • 실패 시에만 -1 반환하고 성공하면 반환 x
      • 위 예시의 경우 인터넷 브라우저를 실행하면 exit()은 실행하지 않고 실패시에만 exit()함수가 호출
    • wait() : context switching을 거쳐 부모 process에게 cpu가 할당되어도 자식 process에게서 exit()신호가 올 때까지 다른 코드를 실행하지 않고 기다리는 system 함수
    • exit() : 자식 process가 부모 process에게 정상종료를 알리는 함수
      • 부모 process는 자식 process의 exit status를 읽고 자식 process 정리
    • zombie process : 자식 process가 정상적으로 종료되지 못해 memory에 계속 살아있는 상태
      • 부모 process가 자식 process보다 먼저 종료
      • 자식 process가 비정상적으로 종료돼, exit() 신호를 주지 못해서 exit status를 읽지 못함





Thread

  • Process : OS가 작업을 처리하는 단위 ⇒ Process 내 Thread
  • Thread : Process가 할당받은 자원을 이용하는 실행 단위 / Process의 특정한 수행 경로 / Process 내 실행되는 여러 흐름의 단위
    • Main thread : Process 내 존재하는 최소 1개 thread

    • 독자적인 Stack memory & register 보유

    • Code, Data, Heap 공유

    • Process 내의 주소공간/자원들 공유

    • TCB (Thread Control Block) 로 관리

    • 1 thread가 process 자원을 변경하면 다른 sibling thread(이웃 thread)도 그 변경 결과를 즉시 볼 수 있다

    • memory를 공유하기 때문에 동기화 , deadlock 등의 문제 발생 가능

    • 관련 library : POSIX PthreadsWindows threadsJava threads

      ProcessThread
      정의실행 중인 programProcess의 실행 단위
      생성/종료시간많은 시간 소요적은 시간 소요
      Context Switching많은 시간 소요적은 시간 소요
      상호작용IPC 사용공유 memory 사용
      자원소모많음적음
      메모리 내 독립성각각 독립적
      안정성 굳!프로세스 내 stack/register 독립적, 이외 공유









multi-processing vs multi-threading

Multi - ProcessingMulti - Threading
정의응용 프로그램 1 = 여러 개의 process응용 프로그램 1 = 여러 개의 thread
장점
process에 문제가 발생하면 그것의 자식 proecss만 죽음

(다른 영향 x)
1. System 자원 소모 감소 (자원 효율성 증대)

(process를 생성하여 자원 할당하는 system call이 줄어들어 자원을 효율적으로 관리할 수 있음)

2. System 처리량 증가 (처리 비용 감소)

( Thread 간 data 교환이 간단해지고 system 자원 소모 감소, Thread 사이 작업량이 작아 Context switching이 빠름)

3. Program 응답 시간 단축

(Process 내 stack 이외 모든 memory를 공유하므로 통신의 부담 적음)
단점
1. Context Switching 과정에서 cache memory 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드 발생

- process 사이에 공유하는 memory가 없음 → Context Switching발생 시 cache에 있는 모든 data를 모두 reset하고 다시 cache 정보를 불러와야 함

2. Process 간 IPC 통신할 때, process 간 변수 공유 불가

- process가 각각 독립된 memory 영역을 할당받았기 때문

1. 주의 깊은 설계 필요

2. 까다로운 디버깅

3. single process system 은 큰 효과 X

4. process 밖에서 thread 각각 제어 불가

5. 자원 공유의 문제 발생 (동기화 문제)

6. Thread 1개의 문제가 전체 Process에 영향





User Level Thread & Kernel Level Thread (https://www.crocus.co.kr/1404)

  • 스케줄러가 컨텍스트 스위칭 하는 단위는 커널 스레드이고 컨텍스트 스위칭을 당하며 저장되는 정보가 PCB임을 알고 있어야한다.
  • User Level Thread : programming 과정에서 Thread를 code에 적는 것
  • Kernel Level Thread : OS가 관리하는 thread들







주제와 관련한 cs 질문

  • context switching과 시분할 시스템에 대해서 설명하시오.

    • 시분할 시스템은, 입출력 처리가 끝날 때까지 대기해야 했던 cpu의 사용률을 높일 수 있도록 고안된 시스템

      • 메모리에 적재된 여러 프로그램들을 짧은 시간씩 할당하여 처리함으로써, cpu가 대기했어야하는 시간에 다른 작업을 하게 하여 cpu 사용률을 높임
    • Process를 실행하는 중에 다른 process를 실행하기 위해 실행 중인 process의 상태를 저장하고 다른 process의 상태 값으로 교체하는 작업을 context switching이라고 함

      • 실행중인 process의 작업 내용을 (현재 CPU의 register값 등) 실행 중인 process의 PCB에 저장하고, 실행될 process의 PCB 값으로 CPU가 다시 세팅됨




  • 좀비 프로세스가 생기는 이유에 대해서 설명하시오

    • 부모 프로세스와 자식 프로세스 관계의 프로세스는 부모 프로세스가 자식 프로세스를 온전히 종료시켜야한다.
    • 자식 프로세스가 성공적으로 종료될 경우 exit()신호를 부모 프로세스에 보냄으로써 부모 프로세스가 자식 프로세스를 종료시킬 수 있는데, 만약 부모 프로세스가 자식 프로세스보다 먼저 종료되거나, 자식 프로세스가 비정상적으로 종료되어 exit()신호를 보내지 못할 경우 메모리에 계속 남아있게 되면서 좀비 프로세스가 생성되게 된다

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

글 잘 봤습니다, 감사합니다.

답글 달기