ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제] 프로세스와 프로세스 관리 (20210104 스터디)
    개발공부/운영체제 2021. 1. 4. 05:26

    프로세스(process)란? 
     - CPU에 의해 실행 혹은 실행 가능한 상태의 프로그램
     - 하나의 프로그램을 실행하기 위해 할당된 시스템 자원으로 커널에 의해 정의
     - 라이프 사이클이 있음 : 탄생 - 실행 - 대기 - 잠자기 - 기다리기 - 실행 -...- 죽음
     - 반면  프로그램 : 하드디스크 등의 저장 매체에 저장, 실행파일의 형태
     - 프로그램 코드가 메모리에 적재되어 있는 상태를 말한다.
     - 필요한 모든 자원을 할당 받은 상태이다. *자원: 코드 및 데이터 공간, 스택공간, 힙 공간
     - 관리 : 누가? 운영체제 커널

               어떻게? 커널 영역에 프로세스 테이블을 만들고, 프로세스의 목록 관리

               종류 프로세스 생성, 종료, 정보 보기, 프로세스 통신, 프로세스 일시 중단, 프로세스 실행 개시, CPU를 프로세스에게 할당

     프로그램과 프로세스 (pg.4)
     - 한 프로그램에서 여러 개의 프로세스 생성이 가능하다. 
       프로세스들은 독립적인 메모리 공간에서 활동

     프로세스 주소 공간과 프로세스 모양 (pg.5)
      프로세스의 주소 공간은 프로세스의 코드, 데이터 등이 적재되고 실행 중에 사용할 수 있는 프로세스의 사적인 메모리 공간으로 0번지에서 연속적으로 주소가 구성되어 있다. 이 주소 공간의 개념은 사용자의 관점에서 보는 바이며, 코드, 정적 데이터, 스택, 힙이 저장되는 용도이다. 주소 공간의 크기는 CPU가 엑세스할 수 있는 전체 크기로 각 프로세스는 작성한 사용자의 관점에서 자신이 전체 메모리를 다 사용하고 있다고 착각하게 하며, 또한 프로세스의 코드와 데이터가 연속적인 주소에 존재한다고 착각하게하지만, 프로세스마다 주소 공간이 별도로 주어진다. 하지만 프로세스 주소 공간은 가상 주소 공간이므로, 가상 주소가 실제 주소로 매핑되므로, 실제 주소에서는 충돌하지 않는다. 주소공간은 사용자 공간, 커널공간으로 나뉘어지며, 사용자 공간에는 사용자 코드, 데이터, 사용자 스택, 힙이 저장되고, 커널공간에는 커널 코드, 커널 데이터, 커널 스택이 저장된다.

     프로그램이 실행되는데 필요한 공간(pg.6)
     1. 프로그램 코드
     2. 데이터 공간 : 전역 변수 공간, 정적 데이터 공간
      - 프로그램에서 고정적으로 만든 저장 공간으로 프로그램이 실행하기전에 할당되며, 프로그램이 종료되는 순간까지 사용한다.
     3. 스택 : 함수가 실행될 때 필요한 공간
      - 매개변수, 함수 안에 선언된 지역변수들, 리턴값등이 저장되며 함수는 호출될 때 스택 영역에서 위쪽으로 공간 할당을 받는다. 함수가 return하면 할당된 공간을 반환한다.
     4. 프로그램 실행 도중 동적으로 필요한 공간 : maloc
     +pg.7 프로세스 주소 공간 그림있움
     
     사용자 공간과 커널 공간(pg.8)
     - 커널공간의 의미 : 사용자 코드가 실행하다가 시스템 호출을 통해 커널 코드를 실행하게 되어도 동일한 매핑 테이블을 사용한다. 사용자 역역과 커널 영역을 하나의 가상 주소 영역으로 다룬다는 의미로 프로세스가 사용자 코드가 시스템 호출을 통해 커널 코드를 실행할 때, 프로세스가 커널 모드에서 실행되고 있다고 한다.
     - 프로세스들은 각각의 사용자 공간을 가지고 커널 공간을 공유한다.
     - 결론 : 프로세스마다 각각 사용자 주소 공간이 있으며, 시스템 전체에는 하나의 커널 주소 공간이 있다. 프로세스의 주소 공간에 커널 주소 공간이 공유된다.
     + pg9. 커널 공간 공유 그림 있음
     
     프로세스 실행 과정 (pg.10)
     (단일 프로세서 시스템의 경우, 한 번에 하나의 프로세스만 실행될때.)
     - 각 프로세스는 자신의 가상 주소가 매핑된 실제 메모리 영역 실행
      각 프로세스의 가상 주소는 0번지부터 시작하여 겹쳐지지만 실제 메모리 상에서는 충돌이 나지 않는다. 의도적으로 여러 프로세스가 동일한 실제 메모리로 매핑하는 경우도 있다.
     - 시스템 호출이 일어나서 커널 코드 실행
      커널 코드의 가상 주소로 이루어진다. 커널 코드의 가상 주소도 실제 주소로 바뀌어 메모리 엑세스
      커널 내부의 코드와 데이터 공유한다. 모든 프로세스들은 하나의 커널 코드를 실행한다.

     프로세스의 각 영역의 크기의 예측(pg.12)
     - 코드 영역의 크기 : 컴파일 후, 크기가 알려진다. 로딩 시에 알고 있음.
     - 데이터 영역의 크기 : 컴파일 후, 크기가 알려진다. 로딩시에 알고 있다.
     - 스택 영역의 크기 : 컴파일 후 알 수 없다. 하지만 함수마다 실행에 필요한 공간의 크기는 알 수 있다. 로딩시에 알 수 없으며, 실행중에도 프로세스가 종료할 때까지 필요한 양을 알 수 없다.
     - 힙 영역의 크기 : 컴파일 후 알 수 없으며, 로딩시에 알 수 없다. 동적 메모리를 할당 받는 코드가 프로세스의 실행 경로에 따라 다르게 실행되기 때문이다. 동적 메모리를 할당받는 크기나 횟수가 프로세스의 실행 경로에 따라 다르게 실행되기 때문이기도 하다.

     프로세스 상태도(state diagram) (pg.13) 
     프로세스가 생성되어 소멸되는 과정 그림.

     프로세스 제어 블록과 프로세스 테이블 (pg.14)
     - 프로세스 제어 블록 (Process Control Black, PCB)
      한 프로세스에 관한 정보를 저장하는 구조체로 프로세스당 하나의 프로세스 제어 블록을 갖는다. 프로세스가 종료되면 사라지며, 커널에 의해 저장되고 읽혀지는 등 관리된다.
     - 프로세스 테이블 
      현재 생성된 모든 프로세스들의 제어 블록을 담은 표이다. 시스템(운영체제)에 한 개만 있으며, 구현 방식은 운영체제마다 다르다.
     - 프로세스 테이블과 프로세스 제어 블록의 위치 : 커널 영역, 커널 코드에서만 액세스가능
    + pg.15에 이상한 그림 있어여 ㅠ

     프로세스 제어 블록의 저장 정보 (pg.16)
     (운영체제마다 프로세스 제어 블록에 저장되는 요소와 프로세스 상태등이 다르다.)
     1. 프로세스 번호(PID) : 정수, 유일한 번호, 프로세스를 구분하는 번호이다.
     2. 프로세스 상태 정보 (Process State)
     3. PC(Program Counter) : 선택되면 실행을 시작할 프로세스 내 코드의 주소 (모드에 따른 사용자 공간 or 커널 공간의 코드 주소)
     4. Registers : 실행이 중지되었을 때의 CPU 레지스터들 값
     5. 스케줄링 정보 : 우선 순위 값, 스케줄 큐에 대한 포인터 등
     6. 열어놓은 파일 디스크립트들의 배열 
     7. 메모리 관리 정보 : 페이지 테이블, base register, limit register
     8. 회계 정보 : CPU의 사용 시간, 시간 제한, 프로세스의 총 경과시간 등..

    멀티태스킹과 운영체제 

     (pg. 18) 1세대) 운영체제가 없던 시절에는 운영체제의 개념이 없었으며, 개발자가 직접 펀치카드에 프로그램 작성, 입력, 실행을 했다. 컴퓨터는 한번에 한 개의 작업만 실행하며 셋업 하는 동안 많은 시간을 idle 상태로 보낸다.
     (pg. 19) 2세대) 배치 운영체제, 컴퓨터의 idle 시간을 줄여 컴퓨터의 활용률을 향상시켰다. 개발자와 운영자가 구분되었으며, 개발자는 펀치카드를 입력 데크에 두고 결과를 기다리며 배치 운영체제는 자동으로 테이프 장치에 대기중인 프로그램을 한 번에 하나씩 로딩하고, 실행했다. + 그림있음
     (pg. 20) 멀티프로그래밍 운영체제) 동시에 여러 개의 프로그램을 로딩하여 실행한다. 1960년대 중반, CPU등 하드웨어 속도 개선 및 컴퓨터 가격의 증가로 CPU 의 idle 시간을 줄여 더 많은 사용자 프로그램 실행이 필요했다.
     멀티프로그래밍의 프로그램은 CPU작업 + I/O 작업의 반복으로 구성되어 있으며 작업동안 CPU는 idling 하면서 대기한다. 프로그램 실행 도중 I/O가 발생하여 대기 중일 때, 다른 프로그램을 로딩하여 실행한다. 미리 여러 프로그램을 메모리에 로딩할 필요가 있으며, 메모리가 수용할 개수 만큼 프로그램을 로딩한다.
     + 작업 처리 과정(pg. 21)
     + 배치와 멀티프로그래밍의 차이점(pg. 22)
     + pg.22)의 배치와 멀티 프로그램의 처리 시간 비교(pg. 23)
     + 멀티프로그래밍 도입으로 인한 이슈들(pg. 24)
      - 큰 메모리, 태스크에 메모리 로딩 및 관리, 각 태스크의 메모리 보호, CPU 태스크 스케줄링, 컨텍스트 스위칭, 인터럽트 개념 도입, 교착 상태 해결
     + 멀티프로그래밍을 위한 메인 메모리 구조 (pg. 25~27) 

     시분할 멀티프로그래밍(Time Sharing Mul)(pg. 28)
     - 멀티프로그래밍 운영체제의 연구와 거의 동시에 연구가 시작되었다.
     - 배치 처리와 멀티프로그래밍 방식의 문제점은 여러 작업을 모아서 이들을 한 번에 하나씩 순서대로 처리하므로 대화식 배치 처리가 아니고, 사용자의 즉각적인 대응이 불가능해 응답시간이 느리고, 대기시간이 길어진다.
     - 1959년 MIT, John McCarty 로 부터 시작 됨.
     - 빠른 프로그래밍 디버깅을 위해 시작되었고, 사용자에게 빠른 응답을 제공하는 대화식 운영체제를 제안했으며, 원격으로 메인 컴퓨터에 접속하는 방식으로 시작되었다.
     + (pg. 29) 시분할 운영체제를 가진 시스템

    프로세스 관리
     프로세스 계층 구조(pg. 31~32)
     - 프로세스는 일반적으로 부모 자식 관계의 계층 구조를 갖는다.
     - 윈도우에서 프로세스 모두 동등, 계층 관계가 아니며, PID 0 프로세스가 시스템에서 최초의 프로세스이다. 
     - 프로세스의 생성 : 프로세스를 생성하도록 요청하는 최종적으로 프로세스이다. 
       프로세스를 생성하는 코드는 시스템 호출(fork(),clone()등)에 의한 커널 코드이며, 생성하는 프로세스가 부모 프로세스가 된다.
       리눅스의 경우 PID 0 - swapper/idle 프로세스, PID1 - init 프로세스(부팅 후 생성되는 모든 프로세스의 조상), PID 2 - kthreadd 프로세스(커널 모드에서 커널 코드로만 실행되는 모든 커널 프로세스의 조상)
     명령어(pg. 33)
      현재 실행중인 프로세스 리스트 : ps -eaf // pstree (0번 프로세스의 자식들 모두 보기)
     - 프로세스 생성(pg. 34)+ 
      프로세스가 만들어지는 경우
      1. 시스템 부팅 시
      2. 로그인 시에 자동으로 필요한 포르세스 생성(bash 등)
      3. 새로운 프로세스를 생성하게 하는 사용자의 명령(vi a.c)
      4. 배치 작업 실행 시
      5. 현재 실행 중인 프로세스가 시스템 호출 함수를 통해 새 프로세스를 생성할 때
      결론적으로 프로세스 생성은 다른 프로세스가 한다. 경우는 다르지만 최종적으로 프로세스를 생성하는 코드는 커널에 있다. -> fork() 시스템 호출
     - 프로세스 생성 과정(pg. 35)
     1. PID 번호 할당
     2. PCB 구조체 생성
     3. 프로세스 테이블에서 항목 할당
     4. 프로세스 테이블에 PCB 연결
     5. 새로운 프로세스를 위한 공간 마련(코드와 데이터, 스택, 힙)
     6. 마련된 공간에 프로세스의 코드와 데이터, 스택, 힙 등의 바이너리 데이터 적재 혹은 초기화 
     7. 생성된 프로세스의 정보를 PCB에 초기화
     8. 생성된 프로세스를 ready 상태로 표시하고 ready 큐에 넣어서 언젠가 스케줄 되도록함
     
     fork() 시스템 콜 (pg. 36)
     - 현재 프로세스를 복사하여 새로운 프로세스를 생성
      새로운 프로세스 : 부모 프로세스의 모든 환경, 메모리, PCB등을 복사하며, 부모와 동일한 모양의 주소공간을 가지는 자식 프로세스를 생성한다. 하지만 완전히 독립적인 자식 프로세스를 생성한다.
      텍스트 블록은 물리 메모리에서 공유하며 나머지는 공유되지 않는다.
     - 리턴값은 부모에게 자식의 PID를 자식에게는 0을 리턴한다.
     + (pg. 37) fork() 예제코드
     + (pg. 38) fork() 실행과정

     execlp()(pg. 39)
      실행 파일을 로딩하여 현재 프로세스의 이미지 위에 단순히 덮어 쓰고, 새로운 프로세스의 생성과정을 거치지 않는다. 생성하는 프로세스의 PID를 그대로 가지며, 보통 fork()를 통해 생성한 새 프로세스에 execlp() 한다
     + (pg. 40) fork() + exec() 활용 자식 프로세스 만들기
     + (pg. 41) fork() + exec() 실행과정
     + (pg. 42) fork() + exec() 활용 자식 프로세스 만들기2

     프로세스 종료와 좀비프로세스(pg. 43)
     - 프로세스의 종료 
      C언어에서 main() 함수의 종료 or 다른 프로세스에 의해 강제 종료(kill)
      프로세스가 종료되면 차지하고 있던 메모리와 자원 모두 반환
      PCB는 즉각 프로세스 테이블에서 제거되지 않음 
      부모 프로세스가 wait(), 혹은 CloseHandle() 시스템 호출을 통해, 죽은 자식이 남긴 정보를 읽게 되면, 자식 프로세스의 PCB가 완전히 제거
     - 좀비 프로세스 : 종료할 때 리턴한 정보(main 함수에서 리턴값)를 부모 프로세스가 읽지 않을 때, 죽었지만 PCB만 남아 완전히 제거되지 못한 상태를 말한다.

     환경 변수 PATH(pg. 44)
     - 환경 변수 (environment variable) 
      사용자가 실행하는 모든 프로세스들이 동작하는 방식에 영향을 미치기 위해 만든 변수들로 프로세스가 실행하는 컴퓨터의 환경의 일부분이다. 
     시스템에서 사용되기로 정해진 환경 변수들은 다음과 같다.
      HOME (현재 사용자의 홈 디렉토리 경로명 저장)
      PWD (현재 작업 디렉토리 경로명 저장)
      PATH (실행 파일들의 경로명 지정)
      TERM (터미널의 종류 지정)
     쉘에서 env 명령으로 환경변수 보기가 가능하다. 
     쉘에서는 $HOME, $PATH로 읽기가 가능하며 C프로그램에서는 코드가 필요함
     + (pg. 45) 실행 파일의 경로명 지정
     + (pg. 46) 환경변수 읽기(readenv.c)
     + (pg. 47) pid, ppid, gid, 환경변수, return 값등 실습
     + (pg. 48) 좀비 프로세스 만들기 실습

Designed by Tistory.