Study/CS 기초

운영체제 - 프로세스와 스레드

김 도경 2024. 10. 19. 20:19

[2024.10.19] 필수 온라인 강의 Part2 운영체제 CH02 프로세스와 스레드

* 기술면접 단골 질문! 암기할 내용!

커널 영역과 사용자 영역의 프로세스
  • 프로세스 = 실행중인 프로그램!!!!!
    - 메모리는 운영체제가 적재되는 커널 / 사용자가 사용하는 게 적재되는 사용자 영역
    - 같은 프로그램도 별도의 프로세스가 될 수 있다

- 여러번 시행하면, 어러개의 프로세스가 된다. 
- 꼭 중복 적재 XX : 가장 메모리로 되는 경우도 있음! 중복 적재 안 되고, 별ㄹ도의 프로세스가 되는 경우가 있다!

 

리눅스 운영체제에서는 ps 명령어를 통해서, 실행중인 프로세스들을 확인할 수 있음

  • 프로그라운드 프로세스 & 백그라운드 프로세스
                 - 대표적으로 나누어지는 프로세스 ( 프로세스의 종류는 정말 다양하게 나눠진다.)
    프로그라운드 : 직접적으로 사용자와 소통을 하는 프로세스
    백그라운드 : 뒷단에서 사용자와 직접적 상호작용X
          - 백그라운드 중에서 더 특별한 프로세스 : 서비스, 데몬 등이 있음
              - 서비스 : 백그라운드 프로세스(사용자와 완전히 전혀!!!!! 상호작용X)

  • 운영체제는 이런 많은 프로세스를 어떻게 관리할까? 프로세스 제어 블록 (PCB)

     - 프로세스들이 동시다발적으로 많이 시행이 됨 : 이걸 관리하려면 프로세스 제어 블록 (PCB)이라고 하는 특별한 자료구조가 필요함
     - 특별한 데이터 덩어리가 필요함
     - 관리를 위해 프로세스들에게 달아놓은 꼬리표라고 생각
    - 운영체제의 커널 영역 내에 할당!!!!!!!!!!!!
    - 실행이 되면 pcb 생성 / 종료시 pcb 폐기

    - 적힌 정보 (굉장히 간단하게)
         - PID (Process ID, 학번/사번 정도로 생각) (PPID(부모 프로세스의 PID)가 같이 명시된 경우도 있음)
                 - 별도의 프로세스는 각각의 PID를 가짐(같은 프로그램이라고 해도 다른 PID)
                 - getpid, getppid라는 시스템콜로 쉽게 알 수 있음
                 - 특정 pid값으로 어떤 프로세스인지도 검색이 가능 : pidof bash , pgrep bash 등의 시스템 콜 사용
         - 레지스터
         - 스케줄링 정보 : 얼마나 자주 할당받아서, 얼마나 빨리 시행?일지 나와있음
         - 메모리 정보 : 메모리 어디에 적재 되어있는가?
         - 사용한 파일 정보
         - 입출력장치 정보

    - 실제로 적히는 정보는 굉장히 복잡하다 : 운영체제마다 다른 정보, 훨씬 더 많은 정보
            - linux kernel - task_struct 구조체 : 리눅스 운영체제가 관리하는 pcd를 볼 수 있음
                 : https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/include/linux/sched.h?h=v6.3.13#n737

    - 문맥 교환 : 여러 프로세스들이 번갈아가며 실행되는 원리
            - 문맥 (context): 실행을 재개하기 위해 기억해야 할 정보
            - PCB를 통해서 정말 많은 프로세스들을 운영체제가 식별하고 자원(CPU, 메모리 등) 을 할당하는데,
               항상!!!! 자원의 개수보다 일반적으로 실행되는 프로세스의 개수가 훨씬 많음
                     -> 번갈아가면서 한정된 자원을 사용해야함!
            - 프로세스 A가 진행되다가 프로세스B가 진행되고, 다시 A차례가 오면 어디까지 진행이 되었는지를 알아야함.
            - 빠를 수록 좋음! 다양한 프로그램이 동시에 시행되는 것처럼 보임
            - 자주 발생할 수록 안 좋음 : 비용이 발생함 : 프로세스 실행의 성능이 저하될 수 있음

    - 커널영역에서는 PCB가 정말 정말 중요하다!!!!!!!!!!!!!!!!!!
            - 프로세스가 실행되면 PCB 생성 / 종료시 PCB 삭제

  • 사용자 영역에서는 4가지의 영역이 하나의 프로세스로 구성이 됨
    *** 시험.기술면접에 굉장히 많이 나옴!!! 각각의 영역이 어떤 영역인지 꼭 알아놓기 ***

    - 구성하고 있는 영역의 크기를 조회하는 명령어 
          1. size 명령어 : 
          2. top 명령어 : 시스템 리소스 모니터링을 할 때 많이 사용되는 명령어
                    - CODE , DATA를 볼 수 있고 그 외에 볼 수 있는 게 많음

    - 코드 영역 (텍스트 영역)
             - 실행 가능한 코드; 기계어로 이루어진 명령어 Read-only
              - cpu는 기계어로 이루어진 명령어를 해석해서 실행 : 그때 어떤 프로세스를 이루는 명령어가 코드 영역에 적재
              - 변경X : 읽고와서 실행 읽고와서 실행 : READ ONLY!!!!
    - 데이터 영역 
             - 프로그램이 실행되는 동안 유지할 데이터 (e.g. 전역 변수)
         * BSS 영역으로 구분이 되기도 함 (세분화시)
                     - BSS 영역: 프로그램 실행 동안 유지할 데이터 중 초기값 없는 데이터 <> 있는 데이터 : 데이터 영역
    - 힙 영역 (heap 영역)
             - 사용자(개발자)가 직접 할당 가능한 공간
             - 메모리 영역을 할당 했다면 해제하자*** ( 직접 해제 하기, 자동으로 해제 하기(가비지 컬렉션))
                      - 다쓰면 직접 해제를 해야한다. 할당받은 영역은 반드시!!!
                      - 해제를 안하면 : 메모리 누수라는 문제가 생김 : memory leac
    - 스택 영역
             - 임시로 저장되는 영역 (e.g. 매개 변수, 지역 변수) : 특정영역을 벗어나면 없어짐

    - 코드 영역과 데이터 영역은 크기가 바뀌지 않음 : 정적 할당 영역
    - 스택영역과 heap 영역은 크키가 계속 바뀜 : 동적 할당 영역
          - 반대되는 주소로 할당이 됨
            : 힙 영역은 낮은 주소에서 높은 주소로 할당 / 스택 영역은 높은 주소에서 낮은 주소로 할당 (주소 중복 방지)
프로세스 생성과 상태
프로세스가 어떻게 생성? 어떤 상태를 거치면서 시행되는지

 

프로세스는 다양한 상태를 가지고 있다 : 진행중/ 응답없음 / 일시 중단됨 등등

 - 운영체제는 상태를 통해 프로세스를 관리함

  • 대표적인 프로세스 상태
             - 생성 상태 (new) : 이제 막 pcb를 할당받아서 생성이 된 상태
             - 준비 상태 (ready) : 당장이라도 자원을 할당받아 실행이 가능하지만 차례가 오지 않은 상태
             - 실행 상태 (running) : 지금 자원을 할당받아 실행중
             - 대기 상태 (blocked) : 주로 입출력장치 사용을 요청받았을때 (준비와 다른 건 지금 당장 실행 불가, 이벤트를 기다림)
             - 종료 상태 (terminated) : 프로세스의 실행이 끝나서 자원 반납중

             - 디스패치 : 자원을 할당받아 이용하는 것
             - 타이머 인터럽트 ; 자원 사용 시간이 끝났다면, 타임 아웃되어 준비상태가 됨, 사용시간만 사용 가능 : 기다려야함

  • 리눅스 프로세스(태스크) 상태 확인
            -  R: Running: 실행 상태
            -  S: Sleeping: 대기 상태
            -  W: Waiting: 준비 상태
            -  S: Stopped: 종료 상태
            -  Z: Zombie: 프로세스 종료 후 자원이 반환되었지만 커널 영역에 프로세스가 남아있는 상태 
                       - 좀비프로세스를 제거한다!라는 말을 함 : 최대한 없애는 게 정말 중요

  • 프로세스가 어떤 식으로 관리 되는가 : 많은 운영체제에서는 계층적으로 관리를 하게 됨
    - Linux, Unix, MacOS 등등에서 사용
    - 최초의 프로세스에서 프로세스를 생성 : 최초의 프로세스는 부모 프로세스가 되는 것
    - 자식 프로세스 중엔 서비스 프로세스, 데몬도 포함
    - tree형태의 계층적 구조를 띄무
    - pstree명령어로 확인이 가능

    - fork-exec : 계층적 구조로 프로세스가 생성되는 원리 (시스템 콜)
          - fork와 exec가 다른 시스템 콜인데, 세트처럼 같이 실행이 됨
    fork exec
    복사본 만들기 새로운 코드로 대체 (덮어쓰기)
    - fork (복사) 를 하면 부모프로세스에서 자식프로세스로(별도의 PID가 다른) 프로세스를 생성
          - PID는 다르지만, 동일한 코드/데이터로 이루어짐
          - fork만 해서 사용하는 경우도 있음 : 같은 작업을 두번 실행하고자 할때
    - exec (옷갈아입기) : 새로운 코드로 덮어쓰기 해라
          - 부모에게 복제본을 만들었는데, 자식에서 exec를 하면 새로운 코드와 새로운 데이터
             : pid는 유지가 된 채, 완전히 다른 프로세스가 됨. 하지만 자식 프로세스임
    - 부모가 fork를 해서 자식을 만들어 내고, 자식은 exec를 해서 새로운 프로세스가 됨

    - 예시 ) bash 프로세스에서 자식 bash (fork, 새로운 메모리 영역 할당)를 만듬
                 - 두개는 별개의 PID를 가짐
                자식 프로세스에서 exec를 통해 ls라는 내용으로 덮어쓰기 한다면,
                    - bash 프로세스의 자식 프로세스로 ls가 실행되게 됨
스레드

 

스레드 = 프로세스를 구성하는 실행 흐름의 단위
    - CPU랑 SW개발, 프로그램 언어등 여러곳에서 사용 됨, 여기서는 소프트웨어(SW) 에서 말함
    - 실행흐름을 더 추가하면, 동시에 실행이 가능 : 실행흐름으로의 스레드
    - 구성 요소 : 각기 다른 스레드 ID, 프로그램 카운터, 레지스터, 스택
- 각기 다른 프로그램 실행 흐름을 가지고 있음, 각각으로 실행흐름을 지칭할 수 있음

- linux : task라고 함

멀티 프로세스와 멀티 스레드
    • 멀티 프로세스와 멀티 스레드
      - 차이점 : 자원 공유 여부
              - 프로세스 간에는 기본적으로 자원을 공유하지 않음
              - 스레드 간에는 프로세스의 자원을 공유
      - 스레드의 경우 : 공유 자원이 문제가 생기면 모두가 문제가 생김
      - 이 차이를 가장 잘 알 수 있는 것 : 웹브라우져 탭 : 멀티탭
           - 새창열기를 하면 각각의 탭을 프로세스로 만들 수 있고, 스레드로 만들 수 있음
                - 한 탭을 강제종료 하면 각각의 탭은 하나의 탭이 문제라도, 모든 브라우져가 아니라 하나의 탭만 종료하면 됨
                - 스레드의 경우 한 탭이 문제가 생기면 다같이 강제종료가 됨

      - 멀티프로세스는 자원 공유를 안하기에 메모리등의 자원의 소모가 굉장히 크다.

    • 프로세스 간에도 자원 공유를 가능하다!!!! : 프로세스간의 통신 (IPC; Inter-Process Communication)
         - 공유 메모리를 통한 통신
         - 파이프를 통한 통신
         - 네트워크 소켓을 통한 통신

'Study > CS 기초' 카테고리의 다른 글

운영체제 - 가상 메모리 관리  (3) 2024.10.21
운영체제 - 동기화와 교착상태  (2) 2024.10.21
운영체제 - CPU 스케줄링  (2) 2024.10.19
운영체제 거시적으로 보기  (7) 2024.10.19
컴퓨터 구조 전체 보기  (4) 2024.10.15