[운영체제 정리]

Operating System Concepts 3장 Processes

호호호진 2024. 12. 17. 17:22

Procsess란 실행중인 프로그램이다. 

 

독립된 실행 단위는 cpu를 할당 받는다. 

 

각 프로그램 안에는 쓰레드가 있는데 얘네도 독립된 실행단위라서 cpu 할당 받음

 

여러개의 프로그램을 올려놓는 멀티 프로그래밍 => Time sharing(시분할) 사용

 

리눅스의 프로세스

 

  • 1. 모든 프로세스의 조상격 프로세스를 init(systemd) 프로세스라고 한다.

 

  • 2. 그 자식으로 login 프로세스 => authentication(인증) 본인 확인을 한다.

 

  • 3. 인증이 되면 shell process를 띄워준다. => 그러면 사용자는 shell이랑 커뮤니케이션을 한다. 그러면 사용자는 prompt로 명령어를 쓴다. 프롬프트에서 나오는 %나 $는 “명령을 받을 준비가 됬다”라는 의미. 프롬프트에서 sort.o를 실행

 

  • 4. 그 자식 프로세스를 만들기 위해 fork()를 만든다. fork()는 부모의 코드를 똑같이 가져온 복제본이다. 그래서 shell이 sort.o process로 변신한 후 프로세스가 끝나면 prompt로 다시 돌아온다.

 

‘>’ (redirect) 기호는 원래는 모든 stderr,stdout에서는 터미널로 출력하는데 이 방향을 바꾸겠다. ex) 파일로 이 의미는 리눅스에서는 입출력장치도 파일로 본다.

  • 즉!  프로세스가 input, output을 할 수 있는 곳은 모두 파일

 

% cat f1 | ws 이렇게 되있을 때 ‘|’가 파이프 라이닝 cat의 아웃풋이 ws의 인풋이 됨

 

Process Concept 

p.106

static - 전역변수 (data)

 

dynamic - 지역변수와 동적자료 (heap & stack)

 

(formal parameter도 지역변수)

 

activation record는 함수가 할당됬을 때 할당되는 공간을 의미한다. (프언 내용) 

  • 지역변수와 return address를 포함한다.
  • 함수가 호출될 때 할당되는 공간
  • activation record가 할당될 때 스택형태로 할당되기 때문에 지역변수 할당공간을 stack 영역이라고 부른다.

 

activation record에는 return값으로 pc값을 저장해주면 control을 그 주소에 따라 바꽈준다. => activation record containing function parameters, local variables, and the return address is pushed onto the stack

 

 

Process State

5개의 상태가 있다.

  • New : 프로세스가 생성된다.
  • Ready : 명령어를 실행할 준비가 된 상태.(ready 상태인 프로세스가 많을 때 시분할 방식을 사용한다.)
  • Running : 프로세스가 실행되고 있음.
  • Waiting : (sleep) 상태라고도 함. 프로세스가 어떤 이벤트가 발생할 때까지 대기
  • Terminated : 프로세스가 실행을 멈춤

 

Process Control Block(PCB)

  • 프로세스에 대한 정보를 포함하고 있는 블록
  • pid를 가지고 있음
  • fork() 함수가 pid를 반환한다.

 

Process Scheduling

  • 대기열을 (Queue)라고 한다.
  • 대기열에 들어와 있는 레디 상태인 프로세스들을 어떻게 관리할 지를 process scheduling이라고 한다.
  • 컴퓨터안에서도 프로세스마다 우선순위(priority)가 다르다.

 

Figure 3.5

  • ready큐에는 레디인 프로세스가 대기중
  • 하나가 선택되어 CPU로 감
  • Time slice expired => Time out 걸렸다
  • scheduling을 한다는 것은 결국 pc값을 바꾼다는 의미

 

 

Run 상태에서 빠져나오는 방법은 세가지

  • terminate 됨. wait상태로 됨. timeout으로 ready상태가 됨

 

Dispatch

  • ready상태인 a를 run상태로 만들어 줄때 저번에 실행했던 상태를 복원시키는 과정을 dispatch라고 한다. 이때 복원할 데이터는 cpu의 register에 저장한다.

 

Context Switch

A -> B -> A A가 timeout 걸렸을 때 A의 상태(register 값)를 PCB(process control block)에 저장해놓고 A가 다시 시작할때 restore한다. 

  • timeout, 즉 interrupt 됬을때 현재 상태를 save, scheduler가 다음에 어떤 process를 실행시킬 지 판단, 그 정한 process를 dispatcher가 실행 이 때 B의 상태는 restore됨 그리고 커널 모드 -> 유저모드가 됨

 

Process Creation

  • 프로세스는 프로세스가 생성한다.
  • pid로 마이너스 값이 오면 에러가 났다는 뜻이다.
  • 부모에는 자식의 pid 자식에는 0을 반환시킴
  • 자식에서는 exec() 시스템 콜로 이진파일을 메모리로 불러옴
  • 부모는 자식프로세스가 끝날 때까지 wait상태
  • 그렇게 하지 않으려면 &를 넣는다. (유인물 참고)

 

Process Termination

  • 무한 루프를 돌게 되면 Abort(강제종료)
  • 무한 재귀호출이면 스택 오버플로우

 

유인물 필기

1번

PCB를 리눅스에서는 프로세스 discriptor라고 한다.

  • thread_info : 프로세스의 실행 문맥을 저장
  • mm_struct: 메모리 관리 정보, 스택, 힙
  • tty_struct : (TeleTYpewriter)터미널을 관리한다. 자기가 로그인한 터미널을 알 수 있다.

 

2번

1. 사용자 모드에서 System Call 호출하면 libc 표준라이브러리에 있는 함수로 넘어간다.

2. libc에서 eax에 어떤 System Call인지 알기 위해 System Call Number을 저장하고 int x80(십진수 128);으로 intterupt를 발생시킨다.

3. 커널 모드로 전환되고 Interrupt table을 참조하여 해당 System Call 핸들러를 실행한다.

4. 시스템 호출 핸들러는 요청된 작업을 수행한다.

5. 작업이 완료되면 결과를 반환하고 사용자 모드로 돌아온다.

 

4-5번

하드웨어에서 발생하는 인터럽트는 32번부터다 그래서 PIC가 인터럽트를 감지하고 IRQ(Int Request Queue)에 interupt가 들어가있고 이게 OS로 넘어올때 +32를 해준다.

 

6번

  • 커널모드에서 handler를 처리하고 나서 다시 user모드로 돌아가기 직전에 PCB의 signal_struct를 보고 1인 시그널이 있는지 확인하고 있으면 처리지침을 실행하는데 default action은 0번 이다. 그래서 이 예외를 처리하고 싶다면 처리지침을 sigaction()함수로 바꿔준다. 

7번

  • core 덤프에서 core는 메모리를 의미하며 프로세스를 종료할 때 메모리상태를 파일에 저장한다. => abort한다는 것을 의미한다.
  • sigaction(8,”fexhandler”)함수는 시그널 처리를 지정하거나 변경시킬 수 있다
  • INT 32번에 해당하는 타이머는 시계역할을 해서 OS가 시간을 알 수 있게 한다. ex) sleep(2)를 하면 프로세스를 2초 동안 waiting 상태로 만듦

preemption => 할당된 시간이 끝나면 권한을 다음 프로세스로 넘겨준다.