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

HeeYeon Kim·2024년 1월 18일

STUDY

목록 보기
2/15
post-thumbnail

모의면접으로 학습하는 CS 스터디
- 운영체제 2주차


프로그램

  • 프로그램 정의
    • 저장장치에 저장된 정적인 상태
    • 어떤 데이터를 사용하여 어떤 작업을 할 지 절차를 적어놓은 명령어들의 집합
    • 예시
      • Windows 의 exe파일


프로세스

  • 프로세스 정의
    • 프로그램이 실행을 위해 하드 디스크에 있던 프로그램이 메모리에 올라온 동적인 상태
    • 하나의 작업 단위

  • 프로세스 특징

    • 운영체제에 의해 관리

    • 운영체제도 프로그램이라 프로세스 형태로 실행됨

      • 컴퓨터 전원 ON -> 부트스트랩이 운영체제 관련 프로세스 실행 -> 일반 프로세스 실행
    • 프로세스 간 접근할 수 없음

    • 서로 독립적인 메모리 공간을 가짐

    • 커널이 프로세스 메모리 위치와 크기 정보, 생명 주기를 관리함

    • 프로세스 간 통신을 위해선 IPC를 이용해야함


  • 프로세스 주소 공간

    • 종류
      • 사용자 공간
        • 프로세스 코드, 데이터, 힙, 스택 영역이 할당되는 공간
      • 커널 공간
        • 프로세스가 시스템 호출을 통해 이용하는 커널 공간
        • 커널 코드, 커널 데이터, 커널 스택 존재
        • 커널 공간은 모든 사용자 프로세스에 의해 공유됨


프로세스 문맥

  • 프로세스 문맥 정의
    - CPU가 프로세스를 실행하면서 필요한 내용들
    - 중단 시 보존되어야 하고 다시 복구되어야하는 프로세스의 모든 실행 정보

  • 프로세스 문맥 종류

    • 하드웨어 문맥

      • CPU의 수행 상태
      • 현재 시점에 프로세스가 명령을 어디까지 수행했는지 판단하는 지표
      • 프로그램 카운터 또는 각종 레지스터의 값

    • 프로세스 주소 공간

      • 코드, 데이터, 스택에 저장되어 있는 내용

    • 커널상의 문맥

    • PCB, 커널 스택 포함

      • 커널 또한 코드, 데이터, 스택으로 구성되어 있음
        • 코드 : 시스템콜, 인터럽트 처리코드, 자원관리를 위한 코드 등
        • 데이터 : PCB
        • 스택 : 어떤 프로세스가 커널의 어떤 함수를 호출했는지에 대한 내용


문맥 교환(Context Switch)

  • 문맥 교환 정의
    • CPU가 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업
    • 실행 중이던 프로세스 -> PCB에 작업 내용 저장
    • 실행 상태로 변경되는 프로세스 -> PCB 내용으로 CPU 세팅

  • 문맥 교환 발생하는 경우
    • 멀티태스킹

      • 실행 가능한 프로세스들이 운영체제의 스케줄러에 의해 조금씩 번갈아 수행
      • CPU를 할당받을 대 문맥교환 발생
    • 인터럽트 처리

      • 인터럽트 처리 시 문맥 교환 발생
        (CPU 사용시간 만료 , I/O Request 등)
    • 사용자 및 커널모드 전환

      • 운영체제에서 사용자 모드와 커널 모드 사이 전환 시 운영체제에 따라 문맥 교환 발생

  • 문맥 교환 발생 과정
    1. 프로세스 P1 사용 시간 끝나서 타임아웃
    2. P1 프로세스 제어 블록에 현재까지의 작업 결과 저장. 준비상태로 변경
    3. 준비 상태이던 프로세스 P2를 실행 상태로 변경
    4. CPU 레지스터가 P2의 PCB 내용으로 변경되어 작업 실행

  • 관련 개념
    • 타임 슬라이스
      • 정의 : 한 프로세스에게 정해진 작업 시간
      • 특징
        • 너무 클 경우 -> 한 프로세스의 작업이 끝난 뒤 다른 프로세스 작업이 이루어질 때까지 긴 시간이 걸려 작업이 끊겨보임
        • 너무 작을 경우 -> 시스템 성능 떨어짐. 문맥 교환에 시간이 걸려 여기에 시간 다 쓰느라 실제 작업을 하지 못함
      • 결론 : 되도록 작게 설정하되 문맥 교환에 걸리는 시간을 고려해야함


프로세스의 메모리 공간

  • 정적 할당 영역 vs 동적 할당 영역
    • 정적 할당 영역
      • 프로세스가 실행되기 직전에 위치와 크기 결정
      • 실행되는 동안 변하지 않음
      • 코드 영역, 데이터 영역
    • 동적 할당 영역
      • 프로세스가 실행되는 동안 만들어지는 영역
      • 힙 영역, 스택 영역

  • 각 영역 특징

    • 코드 영역(= 텍스트 영역)
      • 프로그램의 본문 기술
      • 프로그래머가 작성한 프로그램은 코드 영역에 탑재. 읽기 전용으로 처리

    • 데이터 영역
      • 코드가 실행되면서 사용하는 변수나 파일 등 각종 데이터를 모아둠
      • 보통 프로세스의 전역 변수, 정적 변수가 적재됨
      • 데이터는 변하는 값이기 때문에 읽기, 쓰기 가능. 그러나 상수로 선언된 변수는 읽기 전용 처리

    • 힙 영역
      • 동적으로 할당되는 변수의 영역
      • 대부분의 데이터는 데이터 영역에 저장. malloc()함수의 경우 프로그램이 실행되는 동안 할당되므로 힙 영역에 저장

    • 스택 영역
      • 운영체제가 프로세스 실행 위해 부수적으로 필요한 데이터를 모아둔 곳
      • 프로세스 내 함수 호출 시 원래 프로그램으로 되돌아올 위치 또는 지역 변수, 매개 변수, 리턴값이 저장
      • 사용자에게는 보이지 않음


프로세스 제어 블록(PCB)

  • 프로세스 제어 블록 정의

    • 프로세스를 처리하는 데 필요한 다양한 정보가 들어있는 데이터 구조
  • 특징

    • 커널 영역에 생성
    • 프로세스가 끝나면 프로세스 제어 블록도 폐기됨
    • 프로그램이 프로세스로 변경 -> 프로세스 제어 블록이 생성되었다는 뜻
  • 프로세스 제어 블록 구조

    1. 포인터
      • 준비상태, 대기상태는 큐로 운영. 그래서 큐를 구현하기 위해 포인터를 사용

    2. 프로세스 상태
      • 프로세스의 현재 상태를 표기

    3. 프로세스 구분자 (PID)
      • 여러 프로세스를 구분하기 위한 구분자

    4. 프로그램 카운터
      • 다음에 실행될 명령어의 위치를 가리킴

    5. CPU 스케줄링 정보
      • 스케줄링에 필요한 정보
      • 프로세스의 중요도는 다르기 때문에 프로세스 우선순위에 따라 프로세스 제어블록이 큐에 저장되고 우선순위에 따라 실행됨

    6. 각종 레지스터 정보
      • 프로세스 실행 때 누산기나 색인 레지스터 스택 포인터와 같은 중간값들을 저장하여 다음에 실행할 때 사용할 수 있도록 함

    7. 메모리 관리 정보
      • 프로세스가 메모리의 어디에 있는지 나타내는 메모리의 위치정보
      • 메모리 보호를 위한 경계 레지스터, 한계 레지스터 세그먼테이션 테이블, 페이지테이블에 대한 정보

    8. 할당된 자원 정보
      • 프로세스 실행을 위해 사용하는 입출력 자원, 오픈파일 등에 대한 정보
      • 어떤 프로세스가 음악 출력을 위해 사운드 카드에 접근해야한다면 사운드카드에 대한 정보 필요. 이러한 정보를 프로세스 제어블록에 저장

    9. 계정 정보
      • 계정번호, CPU 할당시간, CPU 사용시간

    10. 부모프로세스 & 자식프로세스
      • 부모프로세스를 나타내는 PPID
      • 자식프로세스를 나타내는 CPID


멀티 프로세스

  • 멀티 프로세스 정의
    • 2개 이상의 프로세스가 동시에 실행되는 것

      • 동시에 : CPU Core 갯수에 따라 1개면 동시성, 여러개면 병렬성을 의미

        • 동시성 : 여러 프로세스들이 짧은 시간동안 번갈아 가면서 연산하게 되는 시분할 시스템으로 실행
        • 병렬성 : 각각의 core가 각각의 process로 연결
  • 특징
    • 각 CPU는 독립적으로 작동 가능
    • IPC 이용하여 통신
    • 문맥 교환 비용이 큼
      • 독립된 메모리 영역을 할당받기 때문에 공유하는 메모리가 없음
      • 그래서 오버헤드 발생 문제 존재
    • 동기화 작업이 필요하지 않음


프로세스 상태

  • 활성 상태 vs 비활성 상태
    • 활성 상태 : 생성, 준비, 실행, 대기, 완료 상태
    • 비활성 상태 : 휴식 상태, 보류 상태

  • 프로세스 5가지 상태 : 생성 -> 준비 -> 실행 -> (대기) -> 완료

    1. 생성

      • 프로세스가 메모리에 올라와 실행 준비를 완료한 상태
      • 프로세스 제어 블록이 생성
      • 프로세스 제어 블록과 함께 준비상태로 옮겨짐
    2. 준비

      • 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
    3. 실행

      • CPU를 얻어 실제 작업을 수행하는 상태
      • 프로세스 제어 블록을 CPU에 전달
      • 실행할 프로세스를 선정하는 일은 CPU 스케줄러가 수행
      • 주어진 시간 동안 못 끝냈으면 다시 준비상태로 돌아옴
      • 준비와 실행 상태를 왔다갔다함
    4. 완료

      • 주어진 시간 동안 작업 마치면 완료 상태
      • 프로세스 제어 블록이 폐기됨

  • 오늘날 운영체제 효율 성 고려. 한가지 상태를 더 만듬 -> 대기상태

  • 대기상태

    • 작업의 효율성을 위해 입출력 요청했을 시 해당 프로세스를 대기 상태로 변경
    • 실행 상태에서 입출력 요구가 들어오면 대기 상태로 변경
    • 입출력 완료될 때까지 기다림
    • 완료되면 인터럽트 발생. 인터럽트로 프로세스를 찾아 프로세스 제어블록을 준비 상태로 이동시킴

  • 비활성 상태

    • 휴식 상태

      • 프로세스가 작업을 일시적으로 쉬고 있는 상태
      • 사용하던 데이터가 메모리에 그대로 있고 프로세스 제어 블록도 유지됨
      • 멈춘 지점에서부터 재시작할 수 있음
    • 보류 상태

      • 프로세스가 메모리에서 잠시 쫓겨난 상태

      • 스왑 영역에 보관

      • 쫓겨나는 경우

        • 메모리가 꽉 차 일부 프로세스를 메모리 밖으로 내보낼때
        • 프로그램에 오류 있어서 실행 미뤄야할때
        • 바이러스 같이 악의적인 공격하는 프로세스라 판단될 때
        • 매우 긴 주기로 반복되는 프로세스라 밖으로 쫓아내도 문제 없을 때
        • 입출력 기다리는 프로세스의 입출력이 계속 지연될 때
      • 종류

        • 보류 대기 상태 : 대기상태에서 보류상태로 옮겨진 상태
        • 보류 준비 상태 : 준비상태에서 보류상태로 옮겨진 상태
        • 만약, 보류 대기 상태에서 입출력이 완료될 경우 보류 준비 상태로 옮겨짐


프로세스 간 통신

  • 프로세스 간 통신(IPC) 정의

    • 프로세스들 사이에서 데이터를 주고 받는 방식
    • 종류
      • Message Passing
      • Shared Memory

  • Message Passing

    • 정의

      • 커널 영역에 메시지 전달을 위한 채널을 만들어 메시지 형태로 정보를 Send/Receive 하는 방법
    • 종류

      • Direct Communication : 통신하려는 프로세스 이름을 명시적으로 표시해 메세지 직접 전달
      • Indirect Communication : mailbox 또는 port 이용해 간접 전달
    • 모델 : 파이프 vs 메세지큐 vs 소켓

      • 파이프

        • 파이프를 이용한 통신

        • 단방향 통신으로 한쪽 방향으로만 데이터가 전송되는 구조.

        • 양방향 통신 구현하려면 두개의 파이프 이용해야함

        • 이름 없는 파이프 vs 이름 있는 파이프

          • 이름 없는 파이프: 서로 관련 없는 프로세스 간 통신에 이용
          • 이름 있는 파이프 : 대부분 이에 해당됨. 부모-자식 또는 부모가 같은 자식프로세스 같이 서로 관련 있는 프로세스 간 통신에 사용

    • 메세지큐

      • 큐 사용하는 방식. FIFO 방식

      • 먼저 들어온 메세지를 먼저 수신하지만 특정 메시지가 수신될 수도 있음

      • 메시지 또는 패킷 단위로 동작

      • 부모 - 자식 간이 아니더라도 어느 프로세스 간의 데이터 송수신 가능

      • 양방향 통신 가능. 메세지 형태는 사용자 정의 가능

      • 비동기 방식이라 방대한 처리량이 있으면 나중에 처리 가능


    • 소켓

      • 여러 컴퓨터에 있는 프로세스끼리 통신(네트워킹) 할 때 사용
      • 양쪽 PC에서 포트 번호를 확인. 해당 포트를 이용해 소켓 찾아 데이터를 주고받음
      • 네트워크 소켓 이용해 클라이언트 - 서버 구조로 데이터 통신 진행
      • 양방향 통신 가능

    • 장점

      • 커널에서 데이터를 주고받음을 컨트롤할 수 있어 별도의 동기화 로직 필요없음

    • 단점

      • 커널 통해서 데이터를 주고받기 때문에 Shared Memory 방식보다 느림

  • Shared Memory

    • 정의

      • 서로 다른 프로세스 간 일부 주소 공간 공유

    • 장점

      • 메모리에 직접 접근해 Message Passing 모델보다 속도가 빠름

    • 단점

      • 프로세스 A가 공유 메모리에 데이터를 전달해도 프로세스 B는 알수 없음.
      • 그래서 데이터를 읽어야 하는 시점을 모름
      • 별도의 동기화 기술 필요


fork() 명령어

  • fork() 정의

    • 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
  • 특징

    • 커널에서 제공
    • 실행중인 프로세스 -> 부모 프로세스
    • 새로 생성된 프로세스 -> 자식 프로세스
    • 부모 프로세스 영역의 대부분이 자식프로세스로 복사되나 변경사항 존재
      • 프로세스 구분자
      • 메모리 관련 정보
      • 부모 프로세스 구분자, 자식 프로세스 구분자 변경
        • 자식 프로세스 기준 : 부모프로세스 구분자 표시, 자식 프로세스는 -1로 표시
  • 장점

    • 프로세스 생성 속도가 빠름

      • 하드디스크에서 새로 가져오는 것이 아닌 기존 메모리에서 복사하는 것
      • 그래서 자식 프로세스의 생성 속도가 빠름

    • 추가 작업 없이 자원 상속 가능
      • 부모 프로세스가 사용하던 모든 자원을 추가 작업 없이 자식프로세스에 상속 가능

    • 효율적인 시스템 관리
      • 부모-자식 프로세스가 서로 구분자로 연결되어 있어서 자식프로세스 종료하면 자식이 사용하던 자원을 부모가 정리할 수 있음


0개의 댓글