프로그램은 파일 시스템에 실행 파일 형태로 저장되어 있다가, 실행시키면 메모리에 올라가서 프로세스가 된다.
address translation
: virtual memory와 physical memory 사이의 변환이 필요하다
(1) virtual memory : 논리적 주소. 프로세스만의 독자적인 공간
(2) physical memory : 물리적 주소. 당장 실행되는 프로세스는 물리 메모리에 올라간다.
(3) swap area : 가상 메모리를 거친 프로세스 중 당장 실행되지 않는 프로세스들이 가는 곳
가상 메모리의 구조 (운영체제 커널도 하나의 프로그램! 동일 구조)
: stack + data + code (각 단계의 주소는 모두 0번부터 시작된다 )
(1) stack : 함수 호출과 리턴 정보 저장
(2) data : 전역 변수. 프로그램 시작 후 종료될 때까지 남아있는 정보들을 저장
(3) code : 실행 파일의 code (CPU에서 수행할 기계어) 저장
PCB
: 모든 하드웨어/프로세스들을 관리하기 위한 자료구조
stack
: 이 함수가 커널로 들어오기 전 누구에 의해 호출되었는지를 구별하기 위해 각 프로세스마다 kernel stack을 별도로 둔다.
사용자 정의 함수와 라이브러리 함수
: 프로세스의 address space - code에 들어있다.
: PC 주소만 바꿔주는 형식으로 사용
커널 함수
: 운영체제 안에 들어있는 함수. 즉 커널 코드 안에 들어있다.
: 커널 함수의 호출을 시스템 콜 이라고 한다.
: kernel address space - code에 들어있다.
: CPU 제어권을 운영체제에게 넘겨준 후 커널 모드로 사용
user mode
: CPU mode bit = 1
: 사용자 정의 함수, 라이브러리 함수 사용할 때 (= 제한된 기계어 실행할 때)
kernel mode
: CPU mode bit = 0
: 커널 함수 사용할 때 (= 시스템 콜 발생했을 때)
실행 중인 프로그램
운영체제는 PCB를 이용해 프로세스의 상태들을, queue를 이용해 프로세스들을 관리한다.
Running
: 실행 중인 프로세스. 즉 CPU를 잡고 명령을 수행 중인 상태
Ready
: CPU를 사용할 준비가 된 프로세스. 즉 CPU를 기다리는 상태
Blocked (wait, sleep)
: CPU를 주어도 당장 명령을 수행할 수 없는 상태
: 프로세스 자신이 요청한 event (I/O 등)이 만족되지 않아 기다리는 상태
중기 프로세스 추가되면 상태 추가됨
Blocked와 Suspended
- 공통 : 둘다 CPU를 뺏긴 상태
- 차이
: Blocked는 CPU가 없을 뿐 일을 하는 상태로, 자신이 요청한 event가 만족되면 Ready가 된다
: Suspended는 일을 아예 못하는 정지된 상태로, 외부에서 resume해 주어야 Active된다.
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보.
운영체제 커널에 위치하며, 구조체로 유지된다.
모든 프로세스의 우선순위는 동일하지 않다!
: 우선순위 관리 정보도 PCB에서 관리한다.
문맥 교환
: 왜 PCB에서도 register 값을 가지고 있는가? = CPU를 뺏길 때 어디까지 수행했는지 저장해야 다음 CPU 돌려받았을 때 이어서 작업할 수 있으니까.
: 즉 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
: CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장한다
: CPU를 새롭게 얻는 프로세스의 상태를 해당 프로세스의 PCB에서 읽어온다
(1)은 문맥교환이 아니다.
: 사용자 프로세스에서 커널모드로 들어간다고 문맥 교환이라고 보지 않음!
: CPU를 A때문에 뺏긴게 아니니까. 프로세스 A에서 프로세스 A로 돌아가니까 문맥 교환 X
: 문맥 교환 없이 CPU만 넘겨주는 경우도 context의 일부 저장 필요. 커널도 레지스터 써야하니까! 단, 전부 저장할 필요 없으니 부담 적다
(2)는 문맥교환이다.
: 사용자 프로세스가 바뀌었다.
: 다른 사용자에게 CPU를 넘겨줄거니까 기존 문맥은 save하고 새로운 문맥을 load해야한다.
Job queue
: 현재 시스템 내에 있는 프로세스들
Ready queue
: 현재 메모리 내에 있는 당장 CPU를 잡아도 되는 프로세스들
Device queue
: I/O device 처리를 기다리는 프로세스들. 즉 I/O 때문에 blocked 된 프로세스들
long-term scheduler (= 장기 스케줄러 = job scheduler)
: 메모리 스케줄러. 프로세스에 memory 및 각종 자원을 주는 문제
: 시작 프로세스 중 어떤 프로세스를 ready queue로 보낼지 결정
: degree of Multiprogramming 제어
: time sharing system은 보통 장기 스케줄러 없이 무조건 ready 상태로 둔다
short-term scheduler (= 단기 스케줄러 = CPU scheduler)
: 어떤 프로세스를 다음에 running으로 둘 것인지? 즉 프로세스에 CPU를 주는 문제
: 충분히 빨라야 한다! Millisecond 단위
medium-term scheduler (= 중기 스케줄러 = Swapper)
: 장기 스케줄러 안두는 대신에 사용하는 스케줄러. 프로세스에게서 memory를 뺏는 문제
: 메모리가 부족하면 프로그램 성능 나빠지니까 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다
: degree of Multiprogramming 제어
: 중기 스케줄러 사용하면서 프로세스에 Suspended 상태 추가된다
degree of Multiprogramming : 메모리에 올라가있는 프로그램의 수
같은 코드 실행해도 stack, PC, register 값이 달라지니까 각각 프로세스 만드는게 비효율적이다. 이때 여러 프로그램을 띄워도 하나의 프로세스를 만드는 스레드를 사용한다.
스레드는 각각의 PC와 Stack를 가지고 별도로 관리한다.
즉 프로세스에서 CPU 활용 부분만 별도로 쓰고, 나머지는 공통으로 쓰는 것을 스레드라고 한다.
동일 프로세스에서 스레드로 CPU 넘어가는 건 문맥교환의 오버헤드가 없어 효율적이다.
프로세스 내에서 공통으로 쓰는 부분을 task라고 한다.
부모 프로세스가 자식 프로세스를 만든다. 즉 프로세스가 또다른 프로세스를 만든다
프로세스의 트리(계층 구조) 형성
fork하는 순간 완전 동일한 프로세스 하나가 새로 생성된다.
부모 프로세스의 pid > 0, 자식 프로세스의 pid = 0
프로세스의 자원
: 프로세스는 자원을 운영체제로부터 받거나, 부모와 공유한다.
자원의 공유
(1) 부모와 자식이 모든 자원을 공유하는 모델
(2) 일부를 공유하는 모델
(3) 전혀 공유하지 않는 모델
수행 (Execution)
(1) 부모와 자식은 공존하며 수행되는 모델
(2) 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
주소 공간 (Address space)
: 자식은 부모의 공간을 복사한다 (binary and OS data)
: 자식은 복사한 공간에 새로운 프로그램을 올린다
유닉스 예시
: fork() 시스템콜이 부모를 그대로 복사하고 주소 공간을 할당하여 새로운 프로세스를 생성
: fork 다음에 이어지는 exec () 시스템 콜을 이용해 새로운 프로그램을 메모리에 올린다
새로운 프로그램으로 덮어 씌운다.
프로세스 A가 wait() 호출하면
(1) 커널은 child 종료될 때까지 프로세스 A를 sleep 시킨다 (blocked)
(2) child가 종료되면 커널은 프로세스 A를 깨운다 (ready)
프로세스 종료. 사용자가 exit()를 호출할 수도 있다.
자발적 종료
: 마지막 statement 수행 후 exit() 시스템 콜을 통해
: 프로그램에 명시적으로 적지 않더라도, main 함수 return 부에 컴파일러가 알아서 넣어준다. 자동 종료
비자발적 종료
: 부모 프로세스가 자식 프로세스를 강제로 종료시키는 경우
: 키보드로 kill, break 등을 친 경우
: 부모가 종료되는 경우
프로세스는 마지막 명령 수행 후 OS에게 exit 시스템 콜을 이용해 종료됨을 알려준다.
exit (정상적으로 프로세스 종료되는 경우)
: 자식이 부모에게 output data를 보낸다 (via wait)
: 프로세스의 각종 자원들이 OS에게 반납된다
abort (부모가 자식 프로세스를 강제로 종료시키는 경우)
: 자식이 할당된 자원 한계치를 넘는 경우
: 자식에게 할당된 태스크가 더이상 필요하지 않은 경우
: 부모가 종료(exit)하는 경우 (OS는 부모가 종료될 때 자식이 더 이상 수행되도록 두지 않으며, 이를 단계적 종료라고 한다)
독립적 프로세스 (Independent process)
: 프로세스는 각자의 주소 공간을 가지고 수행된다 = 서로의 수행에 영향을 미칠 수 없다
협력 프로세스 (Cooperating process)
: 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스 수행에 영향 미칠 수 있다
프로세스 간 협력 메커니즘 (IPC : Interprocess Communication)
(1) 메시지 전달 방법
: message passing - 커널을 통해 메시지 전달
(2) 주소 공간 공유 방법
: shared memory - 서로 다른 프로세스 간 일부 주소 공간을 공유하게 하는 메커니즘
thread는 하나의 프로세스라서 프로세스 간 협력으로 볼 수 없다!
하지만 process 구성하는 thread 간에는 주소 공간을 공유하니까, thread 끼리는 협력이 가능하다.
Message system
: 프로세스 사이에 공유 변수를 사용하지 않고 통신하는 시스템
Direct Communication
: 통신하려는 프로세스의 이름을 명시적으로 표시
Indirect Communication
: mailbox(또는 port)를 통해 메시지 간접 전달