[OS] Process Description and Control 3장
3장 : 프로세스를 관리하는 방법
4장 : 멀티쓰레딩
--> OS가 프로그램을 어떻게 관리하는지에 대해 배워보자~
프로세스란?
프로그램이 파일 형태로 하드디스크에 들어있다가, 실행을 하면 메모리 안으로 들어가는데,
이때 메모리 안에 들어가서 실행을 시작한 프로그램을 '프로세스'라고 부른다.
프로세스 == Task
Process Elements
프로그램이 컴파일이 돼서, 바이너리 코드의 실행 파일이 되면 '프로그램 코드'와 'Data'라는 2가지 영역을 가지게 된다.
프로그램이 시작 되면, 2가지 영역이 더 붙는다. 'Stack' : 지역변수 저장 장소, 'PCB' : 실행할 떄 필요한 정보 저장
Process
- PCB (Process Control block) : OS가 프로세스를 관리하기 위해 필요한 여러가지 정보를 저장하는 곳
- Program code
- Data : 프로그램 작성시 선언한 전역변수를 저장할 공간. 프로그램 시작~ 끝 항상 존재한다.
- Stack : 지역변수를 저장. 해당 함수 호출~리턴 에만 생겼다가 사라진다.
Dispatcher
OS 프로그램이다.
A->B->C 에서 사이사이에서, 프로그램을 바꾸는 역할을 하는 OS 코드이다.
다음에 실행할 프로그램을 고르는 역할을 ㅎ나다.
프로그램을 실행하다가, 중단하고, 다음 프로그램을 실행시키는 역할을 하는 프로그램이다.
CPU를 한 사람이 독점하지 않고 여러 사람이 골고루 나눠가지도록 하는 역할을 한다.
Process Control Block (PCB) 에 들어있는 3가지 정보
1. Process ID
- Process ID ( 몇 번 프로세스인지?)
- Parent Process ID (parent process의 ID?)
- User Identifier (어떤 유저가 만든 프로세스 인지?)
2. Processor State Information
- User-Visible Registers
- Control & Status Registers
- Program counter
- Program status word
- Stack Pointers
3. Process Control Information
- scheduling and state information ( process 실행과 관련된 대표적인 정보)
- resource ownership and utilization (자원 사용과 관련된 대표적인 정보)
I/O interrupt 가 발생하면 Process의 상태는 Blocked에서 Ready로 전이한다.
UNIX 시스템의 운영체제 실행 방식은 User process 안에서 OS가 실행되는 방식.
Windows 시스템의 운영체제 실행 방식은 OS가 별도의 process로 실행되는 방식.
single- threaded – process model ( 한 프로세스 안에 쓰레드 하나 -> Stack 하나)
PCB : Process ID, Processor state information, process control information 이렇게 들어있고
User Address Space : Program Code + data 영역
** Stack 은 지역변수, Data는 전역변수임
멀티쓰레드가 되면 이 PCB에 있던 정보가 PCB와 TCB로 나눠진다.
multi- threaded – process model ( 한 프로세스 안에 쓰레드 여러개 -> Stack 여러 개)
PCB : Process ID, Processor Control Information 中 resource ownership and utilization (자원 관련 정보)
TCB : Thread ID, Processor State Information, Processor Control Information 中 scheduling and state information
** 실행과 관련된 정보가 TCB로 들어와야한다!!! 티실티실!!!!
User Address Space : Program Code + data 영역
** Stack 은 지역변수, Data는 전역변수임
** 따라서 쓰레드는 전역변수를 share한다!
멀티 쓰레드의 좋은점
1. Child Process 만들 때
Single Thread(프로세스 기반 시스템)에서는 전체 프로그램을 copy 했는데,
Thread 에서는 program code와 data를 share 하니까, Stack 영역만 copy 하면 된다.
따라서 thread가 시간이 더 적게 걸린다.
2. 프로세스 하나 종료하는 것보다 쓰레드 하나 종료하는게 더 빠르다 (만드는게 빠르니까 종료도 빠르지~)
3. switch 가 빠르다
Process 기반 시스템은 Process->Process switching 할 때 PCB에 있는 모든 정보를 저장해야하는데,
Thread는 Thread->Thread Switching 할 떄 TCB에 있는 정보만 저장하면 된다. (참고로, PCB 쪼개서 TCB PCB 만든거니까 정보의 양이 더 적겠징~)
4. 쓰레드는 통신이 가능해!!
Process 기반 시스템은 process들끼리 통신하려면 OS에게 도움을 요청해야해서, A->OS->B 해서, process switching이 더 필요했는데,
Thread는 Data 영역을 공유하니까, 전역변수를 사용할 수 있으므로, OS 없이 전역변수를 통해 통신이 가능하다!
따라서 쓰레드는 시간이 더 적게 걸리고 효율적이다!
User-level thread
유저 레벨에서 멀티쓰레딩을 지원한다.
커널 레벨에서 멀티쓰레딩 지원 X
- 모든 thread management가 (user level) application에서 행해진다.
- 커널은 쓰레드의 존재를 모른다!
- 쓰레드 switching해도 커널은 모른다!
- scheduling 해도 커널은 모른다!
생성, scheduling, switching, 소멸 --> 이게 유저 레벨에서 이루어진다.
Kernel-level thread
커널에서 멀티쓰레딩을 지원한다.
생성, scheduling, switching, 소멸 --> 이게 커널 레벨에서 이루어진다.
Combined Approaches for Threads (합친거...!)
쓰레드 생성은 user level에서 하고, (user가 원하는 만큼 쓰레드 만듦)
쓰레드 라이브러리에서 적당한 갯수의 쓰레드를 만든다.
유저 레벨에서도 스케줄링/관리 하고, 커널 레벨에서 멀티 쓰레딩 지원한다.
KLT(커널 레벨 쓰레드)의 장점!!
커널에서 멀티쓰레딩을 지원하면, 커널에서 여러개의 쓰레드를 동시에 실행 가능하다.
- 즉, 한 process에서 여러개의 쓰레드가 나오므로, 사용자의 입장에서 보면
내 프로그램의 여러부분이 동시에 진행되는것이 보인다.
- Thread blocked되면 커널이 다른 Thread를 실행하면 되니까,
Process 입장에서 보면 내 프로세스의 Thread1이 blocked되고 Thread2가 실행되는 거니까
이 프로세스가 계속 실행중이라고 느껴진다.
커널 루틴 그 자체가 멀티 threaded될 수 있다.
- 이게 뭔소리냐면, 커널은 OS의 일부잖아.
근데 OS는 프로그램이니까 커널도 프로그램이란 말이지?
그래서 커널 레벨 쓰레드인건, OS프로그램 자체를 멀티 쓰레딩으로 작성했다는 뜻이야.
즉, OS의 여러부분들이 동시에 실행될 수 있다는 거지.
CPU가 10개이면, OS의 프로세스의 여러 쓰레드들이 동시에 10개의 CPU에서 실행가능하다는 뜻이지.
따라서 실행을 빨리 한다는 장점이 있는거야!
결국, 쓰레드를 많이 만들어서, switching에 대한 비효율을 극복할 수 있다~ 이거지!
Windows 시스템의 transition 상태는 suspend 상태이다.
Windows 시스템의 dynamic priority 는 thread의 상태 정보 이다.
Linux 시스템의 task는 일부를 공유한 task를 만들지만, 각각 하나의 proces이므로,
그냥 program code와 data를 공유하는 process 이다.
kernel running 상태와 user running 상태의 차이점?
kernel running 상태는 kernel stack을 쌓아가면서 kernel program의 code를 실행하는 것이다.
user running 상태는 user stack을 쌓아가면서 user program의 code를 실행하는 것이다.