### Process 1
Process is a program in execution (실행중인 프로그램)
프로세스의 문맥(context)
특정 시점에 봤을 때 어디까지 수행했는지를 알 수 있는, 프로세스의 현재 상태를 나타내는데 필요한 모든 요소 = 프로세스의 문맥(context)
문맥: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter, 각종 레지스터
프로세스의 주소 공간
- code, data, stack
프로세스 관련 커널 자료 구조
- PCB(Process Control Block)
- Kernel stack
프로세스가 실행될때마다 PCB를 하나씩 갖고 있음
PCB : 프로세스를 관리하는 블록
커널은 여러 프로세스들이 공유하는 코드
어떤 프로세스가 시스템콜을 하느냐에 따라서 커널 스택을 나누고 있다 (커널 스텍을 프로세스마다 별도로 둠)-> 정보가 꼬이는 곳을 막기 위함
cpu는 프로세스들이 번갈아가며 실행되기 때문에 cpu를 다른 프로세스가 실행한 후에 다시 프로세스를 점유했을 때 이어서 작업하기 위해서는 프로세스의 현재 상태를 나타내는 프로세스의 문맥(context)를 알아야 함
프로세스의 현재 문맥(context)를 알고 있지 않다면
다음번에 cpu를 잡았을 때 이어서 처리하지 못할 것이다
프로세스의 상태 (Process State)
CPU가 하나라면, 실행중인 프로세스도 한개
- New: 프로세스가 생성중인 상태
- Running : CPU를 잡고 instruction을 수행중인 상태
- Ready : CPU를 기다리는 준비 상태 (CPU가 주어지면 바로 프로그램이 실행 가능함)
- Blocked (wait, sleep) : CPU를 주어도 당장 instruction을 수행할 수 없는 상태, process 자신이 요청한 event(예:I/O)가 즉시 만족되지 않아 기다리고 있는 대기 상태 / 오래 걸리는 작업 때문에 다른 곳에서 작업하고 있는 것
- Suspended(stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태, 프로세스는 통째로 디스크에 swap out 된다 / 예) 사용자가 프로그램을 일시 정지시킨 경우(break key - 리눅스에서의 ctrl+Z), 시스템이 여러 이유로 프로세스를 잠시 중단시킴(메모리에 너무 많은 프로세스가 올라와 있을 때 - 중기 스케줄러 )
- Terminated : 수행(execution)이 끝난 상태 / 수행이 끝나고 종료중인.. 정리중인 상태
Blocked는 자신이 요청한 event가 만족되면 Ready 상태가 됨
Suspended는 외부에서 resume해줘야 Active 상태가 됨
Suspended는 메모리에서 디스크로 아예 swap out 된 것,
Suspended Blocked 상태 : I/O작업중인게 있어서 Blocked 상태인데 Swap out 됨
메모리에서만 없어진거라 device의 I/O작업은 실행이 가능해서 I/O 작업이 끝나면 Suspended Ready 상태로 갈 수는 있다.
프로그램의 메모리 주소공간 전체를 물리적인 메모리에 전체를 올리고 실행하지는 않는다
만약 어떠한 부분을 실행하려고 하는데 그 부분이 메모리에 올라와있지 않고, 디스크(swap area)에 내려가 있다면
그런 상황에도 CPU를 주어도 당장 instruction을 수행할 수 없기 때문에 Blocked 상태
PCB
PCB는 프로세스를 관리하기 위해 프로세스당 유지하는 정보이고, 운영체제가 자신의 데이터 영역에 두고 있음
프로세스 하나당 PCB가 하나씩 있다
PCB는 커널에 주소공간의 데이터 영역에 프로세스마다 갖고 있다.
1) OS가 관리상 사용하는 정보
- Process state, Process ID
- scheduling information, priority
2) CPU 수행 관련 하드웨어 값
- Program counter, registers
3) 메모리 관련
- Code, data, stack의 메모리 위치 정보
4) 파일 관련
- Open file descriptors... (리소스와 관련된 정보)
"프로세스가 실행과정에서 입출력장치나 파일을 사용하면 PCB에 그 내용이 명시된다..
어떤 입출력 장치가 이 프로세스에 할당 되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록된다"
운영체제는 커널 영역에 적재된 PCB를 보고 프로세스를 관리한다.
강민철, 『혼자 공부하는 컴퓨터 구조+운영체제』, 한빛미디어(2022), 289-290.
문맥 교환 (Context Switch)
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- 하나의 사용자 프로그램에서부터 다른 사용자 프로그램으로 CPU가 넘어가는 것
- CPU를 내어주는 프로세스 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
=> 실행하던 위치부터 실행할 수 있게끔
timer interrupt가 들어오면 사용자 모드 -> 커널 모드로 바뀌고 운영체제 커널이 다른 프로세스로 CPU를 넘기게 된다
프로세스를 스케줄링하기 위한 큐
큐 라고 하지만 자료구조 큐와는 다르다.. 선입선출 자료구조가 아니다 (-> 우선순위)
Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
Ready queue : 현재 메모리 내에 있으면서 준비상태인 프로세스의 집합
Device queues : I/O device의 처리를 기다리는 프로세스의 집합
프로세스들이 다양한 queue에 줄서서 서비스를 받게 됨
운영체제가 관리한다 (queue에 PCB 형태로 있다)
-------
CPU는 Ready queue에 있는 것을 실행
실행중인 프로세스가 타임아웃 인터럽트가 발생하면 CPU를 내어주고 Ready queue 로 들어간다
어떤 프로세스가 공유데이터를 접근하고 있으면
다른 프로세스가 공유데이터를 접근하려고 할 때 접근을 막아주는 것이 경우에 따라 필요하다.
이미 그 데이터를 쓰고 있는 프로세스가 그 데이터를 내어놓지 않으면 사용하면 안되기 때문에
Resource queue에 뒤에 가서 줄을 선다 . .
그런 상황에도 그 프로세스는 blocked 상태가 된다.
오래 기다리는 작업 (공유데이터, I/O작업)이 필요하면 프로세스는 blocked 상태가 되고
오래 걸리는 작업이 공유데이터 때문인지, 디바이스(디스크, 키보드) 때문인지
종류에 따라서 해당하는 queue에 가서 줄 서 있게 되고 (=blocked 상태)
그 작업이 완료가 되면 Ready queue에 넘어와서 CPU를 얻을 수 있게 된다.
queue는 운영체제 커널이 커널 주소 공간의 데이터 영역에서 자료구조로 queue를 만들어놓고 프로세스의 상태를 바꿔가면서
ready 상태 있는 애들 중에서 cpu를 주고 blocked 상태는 cpu를 안주는 식으로 운영을 하게 된다.
스케줄러 (Scheduler)
무슨 일을 할지 스케줄 짜주는거
Long-term scheduler (장기 스케줄러 or job scheduler)
- memory(및 각종 자원)을 어떤 프로세스에게 줄지
- 시작 프로세스(new 상태의 프로세스) 중 어떤 것들을 ready queue로 보낼지 결정
- degree of Multiprogramming (=메모리에 올라가있는 프로그램의 수) 를 제어
=> 메모리에 많은 프로그램이 올라가도, 너무 적게 올라가도 컴퓨터 전체의 성능이 안좋아진다
- time sharing system에는 보통 장기 스케줄러가 없다 (무조건 ready로 올려둔다)
=> 지금의 시스템들은 time sharing system을 주로 사용한다.
=> 따라서 프로그램을 시작하면 모두 ready 상태로 올려서 메모리는 준다.
=> 그렇다면 메모리에 올라가있는 프로그램의 수를 어떻게 제어하는가?
=> Medium-Term Scheduler를 사용해서 조절한다.
Short-Term scheduler (단기 스케줄러 or CPU scheduler)
- 어떤 프로세스를 다음번에 running 시킬지 (프로세스에 CPU를 주는 문제) 결정
- 단기로 스케줄링이 일어난다. (millisecond 단위)
Medium-Term Scheduler (중기 스케줄러 or Swapper)
- 메모리에 너무 많은 프로그램이 동시에 올라가 있으면 Swapper가
일부 프로그램을 골라서 메모리에서 통째로 디스크로 쫓아낸다.
- 프로세스에게서 memory를 뺏는다
- degree of Multiprogramming (=메모리에 올라가있는 프로그램의 수) 을 제어
---------------
지금의 시스템은 장기 스케줄러가 없어서
일단 프로세스를 다 메모리에 올려두고
중기 스케줄러가 프로그램이 너무 많이 메모리에 올라가 있을 때
프로세스를 메모리에서 디스크로 쫓아내서
degree of Multiprogramming을 제어하게 된다.
### Process 2 & 3
동기식 입출력 : 사용자 프로세스가 입출력 작업을 요청한 후에 아무것도 하지 않고(=다음 실행을 하지 않고) 기다림, 타이머 인터럽트가 발생하면 다른 프로그램에게 CPU를 줌 / 블로킹
비동기식 입출력 : 사용자 프로세스가 입출력 작업을 요청한 후에 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에게 즉시 넘어감. 현재 프로세스의 다음 instruction을 실행 / 논블로킹
Thread
스레드: 프로세스 내부의 CPU 실행 단위
스레드: 프로세스를 구성하는 실행의 흐름 단위
최근 많은 운영체제는 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다.
스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만으로 실행된다.
리눅스는 프로세스와 스레드 간에 명확한 구분을 짓지 않는다
프로세스, 스레드라는 용어 대신 태스크(task) 라는 이름으로 통일하여 명명한다
강민철, 『혼자 공부하는 컴퓨터 구조+운영체제』, 한빛미디어(2022), 308-309.
code, data, stack으로 구성된 주소공간이 프로세스마다 만들어진다
프로세스 하나를 관리하기 위해 운영체제 내부에 PCB를 두고 있다
PCB는 프로세스의 상태를 나타낸다. 현재 어느 부분을 실행하는지 PCB의 프로그램 카운터가 코드영역을 가리킨다
프로세스 하나에 여러개의 스레드를 가질 수 있다
각 스레드마다 하나의 PCB에 프로그램 카운터(PC)와 registers, stack을 별도로 갖고있는다
스레드마다 별도로 갖고 있는 것: CPU 수행과 관련된 것
프로세스가 하나이다보니, 각 스레드는 메모리 주소공간과 PCB(프로세스 상태)를 공유한다
Thread의 구성 (thread마다 별도로 가짐)
- program counter
- register set
- stack space
Thread가 동료 thread와 공유하는 부분 (=task)
- code section
- data section
- OS resources
Thread를 lightweight process 라고도 한다
전통적인 개념의 heavyweight process는 하나의 thread를 갖고 있는 task이다.
Thread 이용시 장점
- 빠른 응답성 제공 : 다중 스레드로 구성된 태스크 구조에선 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running) 되어서 빠른 처리를 할 수 있다.
- 자원 절약 : 같은 일을 하는 프로세스를 여러 개 띄워두게 되면 각각이 메모리에 주소공간(코드,데이터,스택)이 올라가야하기 때문에 메모리 낭비가 심하다. -> 하나의 프로세스 안에 스레드만 여러개 두게 되면 자원 절약, 성능 향상의 효과가 있음
- CPU가 여러 개 달린 컴퓨터인 경우, 스레드를 사용하면 병렬성을 높일 수 있다.
1) Responsiveness 응답성
2) Resource Sharing 자원 공유
3) Economy - overhad가 적다. (creating과 CPU switching을 프로세스간에서 하는 것보다 스레드끼리 하는게 오버헤드가 적다)
4) Utilization of MP Architectures - CPU를 여러개 있을 때 얻을 수 있는 장점 / MP - Multi Processor (CPU 여러개) / 병렬적으로 효율적으로 실행할 수 있음
-----------------
프로세스는 메모리 주소공간에 code, data, stack이 있고
각 프로세스마다 PCB가 있다
스레드는 프로세스 안에서 독자적으로 가져야 하는 정보만 별도로 가지게 된다.
PCB에 Program counter와 registers를 Thread마다 별도로 갖고 있고,
주소공간에서 code와 data는 공유하고, Stack영역만 Thread마다 별도로 갖고 있다.
스레드의 구현
Kernel Threads - 프로세스 안에 스레드가 여러개 있다는 것을 운영체제가 알고, 커널의 지원을 받음.
User Threads - 프로세스 안에 스레드가 여러개 있다는 것을 운영체제는 모른다. 커널의 지원을 받지 않고 사용자 수준에서 Thread를 구현
User Program이 라이브러리의 지원을 받아서 스스로 여러 개의 Thread들을 관리한다 / 커널은 모름, 커널이 볼 때는 일반적인 프로세스처럼 보인다.
프로세스가 내부에서 CPU 수행 단위를 여러개 두면서 관리를 하는 것이기 때문에 구현상에서 약간의 제약점은 있을 수 있다
real-time thread - 리얼타임 기능을 지원하는 스레드
'운영체제' 카테고리의 다른 글
[OS 7주 스터디🍀] 6. Process Synchronization (0) | 2024.08.04 |
---|---|
[OS 7주 스터디🍀] 5. CPU Scheduling (1) | 2024.07.28 |
[OS 7주 스터디🍀] 4. Process Management (0) | 2024.07.17 |
[OS 7주 스터디🍀] 2. System Structure & Program Execution (0) | 2024.07.13 |
[OS 7주 스터디🍀] 1. Introduction to Operating Systems (0) | 2024.07.13 |