--미완--[운영체제] 프로세스와 스레드 process & thread


프로그램 Program

  • 작업의 과정, 작업에 필요한 어떤 데이터들의 집합
  • 명령어의 집합과 데이터의 묶음

프로세스 Process

  • 컴퓨터에서 실행되고 있는 컴퓨터 프로그램
  • 수행되어야 할 작업(Task)들, 스케쥴링의 대상이 됨
  • 메모리에 적재되어 프로세서에 의해 실행중이거나 실행대기중인 프로그램

프로세서 Processor

HW : CPU를 의미, 컴퓨터 내에서 프로그램을 수행하는 HW 유닛, ALU와 처리 Register를 내장하고 있어야 한다. SW : 모든 데이터 처리 시스템을 의미

  • 논리회로, 명령어 처리
  • 여러개의 프로세서를 사용하는 것을 멀티 프로세싱 이라고 한다.

프로세스 제어블록 PCB (Process Control Block) = Process Descriptor 기술자

프로세스에 대한 정보가 저장되는 자료구조

  • PID(Process Identification) - 운영체제가 각 프로세스를 식별하기 위해 부여한 프로세스 식별번호
  • 프로세스 상태 - 프로세스를 빠르게 교체하면서 실행하기 때문에 실행 중이거나 대기 중과 같은 상태
  • 프로그램 카운터 - 기계어를 한 단위씩 읽어서 처리하는 cpu가 프로세스를 실행하기 위해 다음으로 실행할 명령어(기계어)가 저장된 메모리 주소를 가리키는 값인 PC
  • 스케쥴링 우선순위 - 운영체제가 cpu에서 여러개의 프로세스를 실행하는 순서를 결정하는 정보
  • 권한 - 프로세스가 접근할 수 있는 자원을 결정하는 정보
  • 프로세스의 부모와 자식 프로세스 - 최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층 관계는 트리를 형성한다. 이때 각 프로세스의 자식 프로세스와 부모 프로세스에 대한 정보
  • 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터
  • 프로세스에 할당된 자원들을 가리키는 포인터
  • 실행 문맥 - 프로세스가 마지막으로 실행한 레지스터 내용. 운영체제에 의해 계속 교체되었다가 다시 실행될 때 중단된적 없고 마치 연속적으로 실행된 것 처럼 하기 위해 가지는 정보.

프로세스 상태

상태 전이

  • Ready - 사용자가 프로그램을 생성하면 프로세스가 생성되고 이는 준비 큐에 들어간다.

  • Run - 프로세서가 사용가능한 상태가 되면 (스케쥴링방식에 따라) 준비 큐에 들어있던 프로세스를 Run 상태로 변경한다. 이때 dispatch/dispatcher 가 이 일을 수행한다.

  • Wait - 특정 프로세스가 프로세서를 독점하지 못하도록 interrupt clock이 주기적으로 발생하여 할당된 시간이 경과하면 OS가 해당 프로세스를 강제로 준비상태로 변경시킨다.

    • Time Runout(run -> ready) - 작업을 끝내지 못하고 ready상태로 되돌아가는 것.
    • Block(run -> wait) - 작업중에 입출력 연산이나 자원 요청이 필요할때 스스로 프로세서를 양도하고 wait 상태로 상태전이를 하기도 한다.
    • Wake up(wait -> ready) - block으로 인해 wait상태였던 프로세스가 block이 된 원인이 사라지게 되면 Ready 상태로 다시 변경된다.

프로세스 메모리

  • code : 프로세서가 실행하는 코드

  • data : 프로세스 실행 중 동적으로 할당 받는 영역, 전역/정적 변수 저장
  • stack : 코드 내 호출된 함수의 복귀 주소와 지역변수 등의 일시적 데이터 저장
  • heap : 코드 영역과 별도로 유지되는 자유영역

스레드 Thread

  • 프로그램 또는, 특히 프로세스 내에서 실행되는 흐름의 단위
  • 둘이상의 스레드를 동시에 실행하면 Multithread
  • 프로세스 내에서 스레드 끼리는 프로세스 내에서 할당된 자원을 공유 가능하다.

    데이터 공유

  • 프로세스 : 프로세스간의 통신 / 공유메모리를 통해서
  • 스레드 : 프로세스 내부에서 stack을 제외한 코드영역과 데이터영역을 공유한다. 데이터 영역의 변수를 통해 통신, 동기화 문제 주의, context switching 시, stack영역만 switching 하면 되므로 프로세스 교체보다 빠르다.

의문점들

  • 프로그램 실행 절차(실행, 로더, 레지스터 등등등)
    1. 사용자가 프로그램을 실행한다.
    2. 파일로 저장되어 있던 프로그램이 메모리에 Loader에 의해 적재된다.
    3. 처음으로 실행해야 할 기계어 코드가 저장된 메모리주소를 CPU의 명령주소(IP:Instruction Pointer)레지스터에 저장한다.
    4. CPU는 IP레지스터가 가리키는 메모리주소에서 실행할 명령어를 CPU로 가져와 IR(Instruction Register)에 저장한다.
    5. IR에 저장된 명령을 실행하고 IP에 그 다음 실행할 명령어가 있는 주소를 지정한다.
    6. 위 과정을 반복한다.
  • 디스패치?, 디스패쳐? Dispatch?
  • 상태전이에 Ready, Run, Wait만 있는게 아니였는데-> 이거 정리& 복습
  • 프로세스의 코드도 메모리에 올리나…? java, c++이것도?
  • stack, heap 이거 복습
  • 멀티프로세싱에서 독립된 영역을 할당받는거 자체가 무거운 행위? 무리가 간다고 함
  • 멀티스레드에서 자원동기화가 문제고 디버깅에 어려움이 있음
  • 다른 프로세스 2개가 같은 자원을 쓸수는 없나?
  • 프로세스 내에 2개의 스레드가 같은 자원을 쓸 수는 없나?
  • context switching?

참고

태양정복 스터디 발표자 김OO ppt






© 2019.04. by h-dyeon

Powered by theorydb