목차
📂content
1. 프로세스의 개념
- 프로세스 : 실행중인 프로그램
- 프로세스의 문맥
- 문맥 : 이 프로세스가 어떤 상태에 있는 가. 이때 상태가 문맥. 그래서 문맥은 시간의 흐름에 따라 바뀐다. 현재 상태는 꼭 현재에 의해 결정되는 것은 아니고 과거에 의해 결정될 수도 있다.
- 운영체제가 매우 중요하게 생각함.
- 스택을 보면 현재 함수가 몇 개가 호출했고, 몇 개가 실행되고 있는지 알려줌.
- pcb : 각각의 프로세스를 운영체제가 관리하면서 가지고 있는 자료구조
2. 프로세스의 상태
- cpu가 하나 밖에 없기 때문에 cpu에서 기계어를 실행하고 있는 프로세스는 매 순간 하나이다. 이 프로세스를 running 상태에 있다고 한다.
- cpu를 쓰고 싶은데 하나밖에 없으니까 누군가는 기다려야하는데 그 상태에 있는 프로세스들을 ready 상태에 있다고 한다.
- cpu를 당장 줘봐야 기계어 실행이 불가한 프로세스가 있다. 이런 상태를 blocked 상태라고 한다.
- 운영체제는 pcb를 통해서 각 프로세스의 상태가 어떤지 일일이 관리하고 있다.
- 키보드 컨트롤러에게 인터럽트 들어옴
→ 키보드를 기다리는 프로그램을 blocked 상태에 두지 않고 작업이 끝났으니까 ready상태로 바꾼다.
→ 키보드에 입력된 내용을 메모리에 카피를 해서 cpu를 얻을 수 있게 해준다. - 공유데이터(오래 걸리는 작업 중 하나) : 프로세스끼리 같이 쓰는 데이터. 동시에 여러 프로세스가 쓰면 문제가 생김. 프로세스 하나가 쓰면 다른 프로세스가 기다렸다가 내놓으면 사용해야한다.
- 그래서 blocked 라는 것은 꼭 하드웨어가 오래 걸려서 그런 것은 아니다.
여러 큐를 두어서 프로세스의 상태가 어떤지를 운영체제가 pcb를 통해서 관리한다.
+) 프로세스 상태도
- 생성중인 상태(new), 종료중인 상태, 종료됨 ⇒ 아직 프로세스가 아님
- 종료될때 뒷처리가 남을 때 terminated라고 함.
- 온전하게 프로세스가 되면 ready라고 하고, 이는 cpu만 주면 바로 실행이 된다. 그래서 ready상태는 메모리 상태에 올라가 있다.
- 오래 걸리는 작업이 끝나면 인터럽트를 걸어서 ready로 바꾸어서 다시 줄을 세운다.
- 본인의 일을 다해서 종료될 때
3. process control block
- priority : 모든 프로세스가 다 대등한 것은 아니기 때문에 시스템과 관련된 것은 우선권이 더 높고 그런 것이 pcb에서 관리된다.
- 실제로 하드웨어에 cpu를 보면 program counter와 register가 있는데, 각각의 프로세스마다 문맥(어디까지 수행했는가, 프로그램 counter에 얼마의 값을 가지고 있고, register에 어떤 값을 넣고 있는가)의 정보를 pcb에 프로그램 abc의 cpu register 값들을 따로 보관한다.
- cpu 안에 있는 레지스터 값(왼)이고pcb 안에 있는 program counter와 레지스터(오)는 커널 메모리 안에 들어있는 값.
그럼 이걸 왜 가지고 있는 걸까?
4. 문맥 교환
- cpu를 얻었다가 뺏겼다가 하기 때문에 매번 cpu를 뺏길때는 그 프로세스가 어디까지 수행됐는지(즉 문맥을 어딘가에 저장해야함) 알아야 다음번에 cpu를 얻었을 때 그 문맥의 바로 다음 지점을 실행할 수 있다.
- 만약에 cpu가 프로세스 a에서 b로 넘어간다고 하면, a가 현재 기계어를 실행하면서 기계어 어디를 실행했는지, register에 어떤 값을 넣어야 하는지 정보를 저장한다.
- b에게 cpu가 넘어오면 b는 pcb에 저장되어있는 정보를 읽어와서 실제 cpu 안에 있는 register에 복원을 시키고 cpu를 넘겨준다. 그래야 그 다음부터 일을 한다.
- cpu를 빼앗기는 프로세스의 문맥을 저장하고, cpu를 새로 얻는 프로세스의 문맥을 복원시켜주는 과정이 필요. 저장은 어디에 하고 관리는 어디? pcb에서 한다.
- (1)은 문맥교환이 아니다. 프로그램 a가 cpu를 가지고 실행하다가 인터럽트가 들어왔다. 그래서 cpu가 커널로 넘어갔다.
- 문맥교환이라는 것은 사용자프로세스 a로부터 사용자 프로세스 b로 넘어가는 것을 말한다. 넘어가는 과정에는 반드시 운영체제 커널의 개입이 있다. 그렇지만 사용자 프로세스 a로부터 운영체제 커널로 cpu가 넘어가는 것을 문맥교환이라고 하지 않는다. 그래서 사용자 프로세스 a → 운영체제 → 사용자 프로세스 a는 문맥교환이라고 하지 않는다. 다시 a가 실행될 뿐이다.
- a가 실행되다가 다른 프로세스에게 인터럽트가 들어옴. 인터럽트 들어온 것을 확인하고 끝난 프로세스를 ready que에 집어넣는 일을 커널이 한다. 그렇지만 끝나고 다시 a에게로 넘어옴. ⇒ cpu를 빼앗긴 것이 다른 프로그램때문이지만 다시 a에게로 넘어와서 문맥교환이 아님.
- 사용자 프로세스 a로부터 다른 사용자 프로세스 b로 넘어가면 100%문맥교환. timer interrupt가 들어오면 ready que에 있는 다른 프로세스에게 cpu를 넘겨준다.
- i/o같이 오래 걸리는 일을 할 때 본인이 직접 할 수 없으니까 커널에게 요청을 함. 커널은 i/o에게 요청하고 어짜피 얘는 오래 할 것 같아서 다른 프로그램에게 넘김.
5. 프로세스를 스케줄링하기 위한 큐
- 운영체제는 프로세스들을 큐에 넣고 관리한다.
6.
- fork a child : 프로세스가 자식 프로세스를 만들 수 있다.
- 자식프로세스를 만들면 자식프로세스를 실행하면 자신도 같이 실행된다. 프로세스가 자식을 낳는다는 것은 복제를 생성한다는 것
📑 출처
http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077
감사합니다😊
'🎥Etc > [kocw]운영체제' 카테고리의 다른 글
[Ch3]프로세스 관리5 (1) | 2023.06.25 |
---|---|
[Ch3]프로세스 관리3,4 (0) | 2023.06.25 |
[Ch3]프로세스 관리1 (0) | 2023.06.25 |
[Ch2]컴퓨터 시스템의 구조4 (0) | 2023.06.23 |
[Ch2]컴퓨터시스템의 구조3 (0) | 2023.06.23 |