본문 바로가기

운영체제

1. 프로세스와 쓰레드

인프런의 [그림으로 쉽게 배우는 운영체제] 강의를 듣고 정리한 내용이다.

간단하게 들은 내용을 정리한 것으로, 더 자세한 내용을 원한다면 위 강의를 구매하는 것을 추천한다.

짧은 강의 형태로 단시간에 운영체제를 배우고 싶은 사람, 쉽게 운영체제를 배우고 싶은 사람에게 적합하다고 생각한다.

 

✏️ 프로그램(Program)

  • 하드 디스크와 같이 저장장치에 저장된 명령문의 집합체 (.exe)

 

✏️ 프로세스(Process)

  • 프로세스 = 실행 중인 프로그램
  • 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행 중인 프로그램
  • 능동적인 존재
  • Code, Data, Heap, Stack 영역으로 구성
    • Code 영역 - 자신을 실행하는 코드
    • Data 영역 - 전역, 정적 변수 저장
    • Heap 영역 - 동적으로 메모리를 할당하는데 쓰임(프로그래머)
    • Stack 영역

 

✏️ 컴파일 과정

파일(.c) → 전처리기(.i) → 컴파일(.s) → 어셈블러(.o) → 링커 → (.exe)

 

✏️ 프로그래밍프로세싱

📌 멀티프로그래밍과 멀티프로세싱이 공존

  • 유니프로그래밍 - 메모리에 단 하나의 프로세스가 올라가 있는 것(메모리 관점)
  • 멀티프로그래밍 - 메모리에 여러 개의 프로세스가 올라가 있는 것(메모리 관점)
  • 멀티프로세싱 - CPU가 여러 개의 프로세스를 처리하는 것(CPU 관점)


✏️ PCB(Process Control Block)

  • 프로세스의 정보 저장
  • 연결 리스트 자료구조 형태로 저장 → 운영체제는 프로세스 종료 시 연결 리스트에서 해당 프로세스의 PCB 제거(연결 리스트 
  • PCB의 구조
    • 포인터 - 부모와 자식 프로세스에 대한 포인터와 할당된 자원에 대한 포인터 저장. 효율적인 접근을 위해 사용.
    • 프로세스 상태 - 생성, 준비, 실행, 대기, 완료 상태 저장
    • 프로세스 ID - 프로세스를 식별하기 위한 숫자가 저장됨
    • 프로그램 카운터 - 다음에 실행될 명령어의 주소를 포함
    • 레지스터 정보 - 프로세스가 실행할 때 사용했던 레지스터 값 저장. 프로그램 카운터와 마찬가지로 CPU를 뺏기고 다시 시작할 때 이전에 사용했던 값을 복구하기 위한 용도
    • 메모리 관련 정보 - 프로세스가 메모리에 있는 위치 정보, 메모리 침범을 막기 위한 경계 레지스터 값 등이 저장됨
    • CPU 스케줄링 정보 - CPU 스케줄링에 필요한 우선순위, 최종 실행시간, CPU 점유시간 등이 포함

 

✏️ 프로세스 상태

  • 프로세스는 시분할 처리를 위한 다섯 가지 상태를 가지고 있음
  • 생성(New), 준비(Ready), 실행(Running), 대기(Waiting), 완료(Terminated) 상태가 있음
    • 생성(New) - PCB 생성, 메모리에 프로그램 적재를 요청한 상태
    • 준비(Ready) - 프로그램 적재를 승인받은 상태. CPU를 사용하기 위해 기다리고 있음.(추후 CPU 스케줄러에 의해 할당 받음)
    • 실행(Running) - 준비상태에 있는 프로세스가 CPU 스케줄러에 의해 CPU를 할당받아 실행되는 상태. 실행상태에 있는 프로세스의 수는 CPU의 개수만큼. 부여된 시간만큼만 CPU 사용 가능하며, 시간이 오버되면 CPU 스케줄러는 CPU를 뺏음. (준비상태로 - 인터럽트)
    • 대기(Waiting) - CPU는 매우 빠르나, 입출력 작업은 매우 느린 작업. 입출력 작업이 다 끝날 때까지 CPU를 가만히 내버려두는 것은 매우 비효율적인데, 이때 입출력 요청을 한 프로세스를 대기상태로 두고 다른 프로세스에게 CPU를 할당. 후 대기 상태에 있던 프로세스에게 CPU를 할당시켜 효율적으로 일함
    • 완료(Terminated) - 프로세스가 종료된 상태로, 프로세스가 사용했던 데이터를 메모리에서 제거하고 생성된 PCB도 제거

 

 

✏️ 컨텍스트 스위칭

  • 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해, 현재 실행 중인 프로세스를 저장하고 다른 프로세스의 상태 값으로 변경하는 작업(다른 프로세스의 PCB 내용대로 CPU 세팅)
  • PCB의 값이 변경됨 - 프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보
  • 프로세스 A의 할당 시간 초과 → 프로세스 A의 일 중단 → 현재 CPU의 레지스터 값 등을 PCB A에 저장 → PCB.B를 참조해 CPU의 레지스터 값 조정 → 프로세스 B의 실행 → 프로세스 B의 할당 시간 초과 → 프로세스 B의 일 중단 → PCB B에 현재 상태 저장 → 프로세스 A 실행
  • 메모리의 모든 프로세스들은 컨텍스트 스위칭을 함
  • CPU 점유 시간이 다 되었거나 I/O 요이 있거나 다른 종류의 인터럽트 발생 시 컨텍스트 스위칭 발생

 

✏️ 프로세스의 생성과 종료

  • 프로세스 생성 과정 - OS는 해당 프로그램의 코드 영역과 데이터 영역을 메모리에 로드하고, 빈 스택과 빈 힙을 만들어 공간을 확보. 이 프로세스를 관리하기 위한 PCB를 만들어 값을 초기화.
  • 0번 프로세스는 운영체제 부팅과 동시에 생성 (딱 한번 생성) - 부모 프로세스
  • 나머지 프로세스들은 생성 대신 0번 프로세스를 복사하여 사용(fork()) - 새로 생성보다 복사가 더 빠르기 때문; 자식 프로세스
    • 자식 프로세스는 부모 프로세스의 코드 영역, 데이터 영역, 스택 영역과 PCB의 내용을 전부 복사
    • fork() 함수 실행 후 exec() 함수를 실행하면, 부모를 복사한 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어쓰게 됨 -  부모 프로세스와 다른 프로세스 실행
    • exit() - 부모 프로세스에게 자식 프로세스의 작업이 종료됐음을 알림. 메모리에 계속 살아있는 상태를 좀비 상태라고 일컬음.

 

 

✏️ 쓰레드

  • 운영체제가 작업을 처리하는 단위는 프로세스
  • 사용자가 운영체제에게 작업을 요구하면, 그만큼 프로세스의 수가 늘어나며, PCB, 코드, 데이터, 스택, 힙 영역의 수도 늘어남. → 메모리를 너무 많이 차지함
  • 쓰레드는 프로세스 내 존재하는 것으로, 한 개 이상 존재 가능하며, 스택 외 PCB, 코드, 데이터, 힙 영역을 공유함.
    • 쓰레드는 각각 쓰레드 ID와 스택을 가짐
    • 쓰레드를 관리하기 위한 TCB(Thread Control Block)이 있음
    • 구글의 크롬 - 프로세스 한개 생성, 탭 생성 - 쓰레드 생성
  • 안정성 - 프로세스는 독립적. 쓰레드는 프로세스 내에 있기에 프로세스에 문제가 생기면 쓰레드 모두에 문제가 생김. 프로세스 방식이 쓰레드 방식보다 더 우수함.
  • 프로세스 간 통신은 IPC 통신을 하는데, 이는 오버헤드가 크고 속도가 느림

'운영체제' 카테고리의 다른 글

3. 프로세스 동기화  (0) 2022.05.14
2. CPU 스케줄링  (0) 2022.05.07
0. 운영체제 들어가기  (0) 2022.05.06
23. Disk Management & Scheduling 1, 2  (3) 2022.04.23
22. File System Implementations 1 & 2  (0) 2022.04.09