Java구조를 공부하다 보니 스레드 이야기가 많이 나와 이 부분을 알아가기로 했다.
대부분 학부시절 수강한 운영체제 자료를 참고하여 작성하였다.
프로세스란 실행 중인 프로그램의 인스턴스이다.
프로세스는 각자의 메모리를 운영체제로부터 할당받는다. 파일을 여는 것과 네트워크에 연결하는 것 또한 프로세스이다.
프로세스는 독립적으로 실행한다.
스레드란 프로세스 내의 실행 단위이며, 실제로 작업을 수행하는 주체이다.
프로세스는 독립적으로 동시에 실행되는 여러 스레드를 포함할 수 있다.
각 스레드는 pc(프로그램 카운터), 스택, 레지스터 세트를 가지지만 동일 프로세스 내 다른 스레드와 동일한 메모리 공간을 공유한다.
같은 프로세스 내 스레드끼리 통신하고 데이터를 공유할 수 있다.
스레드는 여러 task를 병렬 실행하여 응용프로그램의 성능을 향상시키는 데 유용하다.
메모리에 프로세스가 적재된 모습을 추상화하여 나타냈다.
Stack : 함수가 호출됐을 때 지역변수, 파라미터, 반환값을 저장한다.
Heap : 동적으로 만들어지는 데이터를 저장하는 영역이며 자바의 경우 가비지컬렉터가 자동 해제함
Data : 전역변수, 초기화된 데이터 저장
Code(text) : 컴파일된 코드가 저장되는 영역이며 읽기 전용
스택과 힙은 프로세스 여유 공간 반대쪽 끝에서 시작하여 서로를 향해 확장되므로 스택 오버플로 또는 malloc호출이 실패할 수 있다.
운영체제가 프로세스를 만들어내려면 특정 프로세스를 복제해야 한다.
하나의 프로세스는 또다른 프로세스를 부모-자식 간 계층 관계로 생성한다. (Windows에는 없는 개념)
생성 순서
fork()
라는 시스템 콜을 부르면 자식 프로세스가 생성된다.new : 새로운 프로세스 하나를 자식으로 만들어내면 new 상태가 된다.
ready : 그 다음엔 ready 상태가 된다. 준비 큐에서 운영체제에 의해 CPU에 로드되길 기다리는 상태이다.
running : 스케쥴러 디스패치에 의해 CPU에 로드되어 running 상태로 변경된다.
3-1: 만약 running상태에서 CPU를 너무 많이 점유하면 인터럽트 써서 ready상태로 되돌린다.
waiting : I/O 또는 다른 이벤트가 발생하면 waiting상태로 변경되어 Device queue에서 대기한다.
4-1. 예를 들면 디스크에서 100기가를 읽을 때, 읽기를 끝날 때까지 waiting상태로 대기한다.
terminated : 프로세스가 종료되고 CPU에서 제거된 상태이다.
각 프로세스마다 프로세스 고유의 정보를 저장하는 자료구조
PCB에는 프로세스 관련 모든 정보가 담겨있기 때문에 그 PCB자체가 어떤 특정 프로세스 하나를 대변한다고 할 수 있다.
PCB의 구조는 아래와 같다.
process state - waiting, running, ...
CPU registers, process counter: CPU안팎의 프로세스를 스왑할 때 저장 및 복원함
CPU scheduling information: 우선순위(priority)정보 및 스케쥴링 큐에 대한 포인터 등
Memory management information: 페이지 테이블 또는 세그먼트 테이블 등
Accountig information: 사용자 및 커널 CPU 사용 기간, 계정 번호, 제한 등
I/O status information, etc.: 디바이스 할당, 파일 테이블 열기 등
CPU를 점유하던 프로세스가 인터럽트에 의해 다른 프로세스로 교체할 때, 기존 프로세스의 레지스터 값을 저장하고 새로운 프로세스의 레지스터값을 CPU 레지스터로 로드하는 것
컨텍스트 스위치는 매우 자주 발생하므로 CPU 사용시간에 손실을 발생할 수 있다. 따라서 상태 저장 및 복원(컨텍스트 스위치)의 속도를 매우 빠르게 해야한다.
프로세스를 순서대로 작동시키면 시간에 손실이 발생하기 때문에 고안된 방식
프로세스를 일정 시간 간격으로 아주 빠르게, 짧은 시간 내에 여러 번 switching 해서 프로세스들이 병렬적으로 실행되는 것처럼 보이게 함
강의자료에는 Process state queues라고 적혀있는데 다른데는 다 스케쥴링 큐라고 함...
운영체제는 시스템 내에 모든 프로세스의 상태를 나타내는 큐들을 저장한다.
각 PCB는 현재 상태에 따라 state queue(scheduling queue)에 들어간다.
프로세스 상태가 바뀌면, PCB는 다른 큐로 마이그레이트 된다.
영체제 강의자료
chatGPT
프로세스와 스레드 - http://www.tcpschool.com/java/java_thread_concept
process in memory - https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/3_Processes.html
프로세스 - https://github.com/jeonyeohun/Getting-Ready-For-Interview/blob/main/OperatingSystem/01_Process.md
프로세스 스케쥴링 - https://velog.io/@jfe/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Ch03.-Process#-process-scheduling
학부생 때 운영체제 수업에서 들었던 프로세스 동작 방식은 머릿속에 잘 들어오지 않았었는데, 이렇게 깔끔하게 한 페이지로 정리해 주셔서 프로세스의 생명주기와 스케줄링에 대해 이해할 수 있었습니다.
좋은 글 감사합니다!