process Concept
운영체제는 모든 종류의 프로그램을 Process의 형태로 실행한다.
Process는 프로그램이 실행중인 것을 정의로 한다.
Program Code는 text Section이라고 하며 모든 실행중인 프로세스는 Program Counter과 process Register를 갖는다.
프로그램이 실행될때 메게변수, 리턴값, 지역변수 같은 임시적인 데이터를 Stack에 저장하게 된다.
전역변수는 Data Section에 저장되며 Heap은 프로그램 실행중 동적으로 할당되는 메모리가 저장되도록 관리한다.
Data Section에는 프로그램의 전반에 걸쳐 저장되는 데이터가 저장되는 별도의 공간이다.
프로그램은 디스크에 저장된 수동적(Passive) entity라고도 하고 실행되면 능동적(Active) entity라고 할수 있다
프로그램은 여러개의 프로세스를 생성할수 있다.
위 그림은 프로그램 실행시 메모리의 구조를 나타낸 그림으로 text에는 프로그램의 코드가, Data에는 전역변수, 나머지는 실행중 구동에 필요한 메모리 양만큼 heap과 Stack 에서 야금야금 잡아먹게 된다.
Process State
- New : 생성
- Running : 실행중
- Waiting : 진행중 입출력 I/O 기다림
- Ready : CPU에 할당되어 즉시 실행가능한 상태
- Terminated: 종료
Waiting 상태에서 바로 Running상태로 가지 않고 Wating 상태 일동안 타 프로세스를 실행 중이기 때문에 IO Waiting이 끝나면 타 프로세스가 끝날때까지 Ready 상태로 대기하다가 때가 되면 Running으로 돌아간다.
Process Control Block(PCB)
Process Control Block(task control black)은 프로세스와 관련된 정보가 저장되어있는 자료구조이다.
해당 정보에는 다음과 같은 정보가 저장되어 있다.
- Process State
- Program Counter : 다음 실행할때 읽어야할 메모리의 위치
- CPU Register : 프로그램에 대한 CPU Register 값
- Program Schedulling Info: 프로세스 우선 순위나 큐 값
- Memory-menagement info: 해당 프로그램이 사용하는 메모리의 영역에 대한 정보
- Accounting Info: 프로세스가 CPU를 얼마나 점유했는지
- I/O State Info: 관련된 I/O디바이스의 프로세스에 대한 정보, 관계 파일 정보
Thread / Process Scheduling
프로세스의 독립된 실행경로로 하나의 프로그램에 여러개의 프로세스를 병행하면서 프로그램을 구동하기도 한다.
CPU의 효율적인 사용을 위해 CPU에 올리는 프로세스를 빠르게 바꿔 끼워준다.
Process Schduler는 이용 가능한 프로세스(Ready상태인 프로세스) 중 골라서 CPU의 다음 실행번으로 이용한다.
이러한 Process Scheduling을 위하여 Process Scheduler를 사용하는데 여기에는 Ready Queue와 Wait Queue가 존재하여 빠르게 프로세스들을 진행해준다. 이 나열의 방법은 Scheduling Algorithm에 따라 달라진다.
Wait Queuesms I/O에서 나오는 입출력을 기다리는 Queue이다
Process들은 여러 Queue를 오가며 일을 진행한다.
위에 그림은 CPU에서 Wait Queue로 들어가는 다양한 경로에 대해 설명하고 있다. Waiting Queue로 집입하는 이유는 I/O 요청, 제한시간 초과, Child Process, interrupt가 있다.
그러면 Wait Queue에 들어가는 동안 CPU는 위에서 설명했다시피 가른 업무을 보고 있다. 이때 Process가 switch되는동안에 Operating System에서 CPU를 어떻게 관할하는지 보여주고 있다. PCB를 Save하고 Reload하면서 CPU에 여러 프로세스들을 깔아 끼우고 있는 모습이다. 해당 과정을 수도 없이 반복하면서 상당한 Resource가 사용되지만 그럼에도 불구하고 더 좋은 CPU Utilization을 발휘할수 있는 것이 위와 같은 방법으로 CPU을 운영하는 것이다.
Context Switch
현재 프로세스가 가지고 있는 정보 즉 Context가 원하는 정보들은 Process Control Block을 바꿔주는 것을 Context Switch라고 한다.
그래서 이러한 Context Switching 을 하는 동안은 Overhead(사용 불능한 상태)가 되기 때문에 시스템 입장에서는 굉장히 부담이 될수밖에 없기 때문에 OS가 복잡할수록 PCB 내용이 많을수록 더 많은 비용이 들기 마련이다.
그래서 이러한 비용부담을 덜기 위해 Hardware적으로 대책을 마련했다.
- Multiple sets of register: 별도의 여러개의 Register Set을 CPU내에 개설하여 별도의 메모리 Read를 거치지 않고도 Context Switching을 할수 있도록 하는 방법
- 일부 CPU 모든 Register를 한번의 Instruction으로 집어쳐 버리는 경우도 있다.
Mobile MultiTasking
과거 초기의 mobile OS의 경우에는 한번에 하나의 Process만을 지원하기도 했다.
현대의 경우 IOS의 경우에는 Foreground에 나타난 app Process을 우선적으로 실행하되 제한적인 Background Process만을 실행 허용 하고 있다. 왜냐하면 Mobile OS는 자원이 제한적이기 때문에
Android의 경우Foreground뿐만 아니라 Background에서도 계속 Service되고 있기 때문에 다만 이 Service들은 UI를 사용하지 않고 적은 메모리 사용량을 사용하는것만 적절히 실행 시켜주고 있는 것이다.
Process Creation
Parent Process가 Children Process를 만들게 되면 자연스럽게 트리 형태의 Process Structure를 만들게 된다.
일반적으로 Process들은 PID를 통해 구분하게 되는데 이때 Parent Process와 Children Process 사이에는 3가지 옵션으로 Resource를 공유할 수 있다.
- Parent Process와 Child Process가 완전히 리소스를 공유하는것
- Child Process가 Parent Process의 일부를 공유하는 것
- 둘이 어떠한 리소스도 공유하지 않는 것
그리고 실행옵션도 다음과 같이 제공된다.
- Parent Process와 Child Process가 동시에 실행되도록 하는 것
- Parent Process가 Child Process를 끝날때까지 기다리는 것
Parent Process와 Chilren Process간의 관계
Children Process가 생성될때 Children Process는 다음과 같이 생성될수 있다.
- Parent Process를 완전히 복사해오는 경우
- Children Process 실행하자마자 다른 프로그램으로 Load하는 경우
UNIX같은 POSIX System의 경우 Children Process가 부모를 그대로 Copy라는 Fork() 과정을 거친다. exec()은 Fork()된 Process를 새로운 프로그램으로 Load하게 해준다 이때부터는 Children Process만의 기능을 수행한다.
그동안 Parent Process는 Wait되어서 Children Process가 Terminate될때까지 기다린다.
Process Termination
프로세스를 종료함. Exit()로 종료하며 만약 Exit()한 Process가 Children Process라면 Parent Process에게 상태정보를 넘겨주고 모든 관련 메모리를 Free() 시커버린다.
한편, 본인의 순순히 종료하는 것이 아니라 강제로 종료 Abort() 시켜버리는 버리는 경우도 있는데 보통 다음 3가지 경우로 인해 Parent Process는 Children Process를 강제종료 시켜버린다.
- Children Process가 할당된 리소스를 벗어난는 경우, 예를 들어 Children Process가 주어진 시간 이상으로 CPU를 점유하고 있다면 Parent Process가 나서서 강제종료 시켜버릴수 있다.
- Children Process에게 주어진 일이 더이상 필요 없을 경우
- 부모가 종료되면서 자식도 같이 종료어야 하는 경우
위의 3번의 경우 Parent Process 하위의 Children Process들이 죄다 종료되어야하는 상황이 발생하는데 이러한 발생을 Cascading Termination이라고 한다. 강제 종료 되는 Children Process들의 Children Process도 싸그리 강제 종료 되어야한다.
물론 OS에 따라 다를수도 있다.
Children Process가 종료될때까지 기다리는 코드
pid = wait(&status); waitpid() // 특정 pid가 종료될때까지 기다리는 함수
status에 Children Process가 종료될때까지 Wait()된다. 만약 다자녀일 경우 그중 하나만 종료할때까지 기자리는 코드의 예이다.
부모가 Children Process를 종료될때까지 기다리지 않는 경우를 Zombie(좀비)라고 하며
Children Process를 강제 종료 하지 않고 Parent Process가 종료되면 그 Children Process를 orphan(고아)이라 한다.
Android Process Importance Priority
Mobile OS의 경우 부족한 Memory를 보완하기 위해 Process의 우선순위를 정해 메모리가 넉넉치 않을때 중단 시켜버린다. 그 우선순위는 다음과 같다.
- Foreground Process
- Visible Process
- Service Process
- Background Process
- Empty Process
이렇게 중요도의 우선순위를 두어 차례로 메모리를 반납시킨다.
Chrome Browser Multiprocessor Architecture
크롬 브라우져의 경우 3가지 종류의 Processor를 생성한다.
- Browser Process: UI, IO, Network 관리 프로세스
- Randerer Process: HTML 발급, Sandbox로서 특정 범위 내에서만 Security 유지를 위해 프로세스 접근을 방지함
- Plug-in 외부 확장 프로그램에 대한 Process
Interprocess Communication
Processes들은 서로 간에 independent하면서 Cooperating 하다.
Cooperating Process는 다른 Process와 서로 영향을 주고 받는다. 일반적으로 그 이유는
- Infomation Sharing : 정보 공유
- Computation Speedup : 기능향상
- Modularity : 모듈화
- Convenience : 편의성
이를 위해 Interprocess communication (IPC)가 요구되는데 IPC의 종류에는
- Shared memory
- Message passing
이 있다.
위 두 방식의은 마치 게시판과 우편으로 비유될 수 있다.
Procucer- Consumer Problem
Process 간의 통신에 있어서 Producer가 생산한 정보를 Cusumer가 소비하기 까지 저장할 buffer가 필요한다. 이때 제한된 용량의 메모리를 Bounded-Buffer 딱히 제한이 없는 Buffer를 Unbounded-Buffer라고 한다.
1:03:11 까지의 내용
'공부 학습' 카테고리의 다른 글
운영체제 3주차 - 2 (1) | 2021.03.16 |
---|---|
시스템프로그래밍 2주차 (0) | 2021.03.15 |
시스템 논문 리뷰 1 (0) | 2021.03.15 |
운영체제 2주차 - 3 (0) | 2021.03.09 |
컴퓨터 네트워크 1주차 - 1 (0) | 2021.03.08 |