프로세스 상태

Download Report

Transcript 프로세스 상태

제2장
프로세스 개념 및 관리
OS
컴퓨터공학과 운영체제
Page 1
 개념
 작업 (job)
 실행 프로그램과 이에 필요한 입력 데이터의 묶음
 컴퓨터에 실행 의뢰되기 전의 상태
 프로세스 (process)
 커널에 등록된 작업
 커널에 등록되어 커널의 관리하에 들어간 작업
작업과 프로세스의 개념 비교
프로그램
등록
커널
컴퓨터 시스템
데이타
프로세스
작업
컴퓨터공학과 운영체제
Page 2
프로세스의 정의
 프로세스 정의
 실행중인 프로그램 (작업)
 커널에 등록되고 커널의 관리하에 있는 작업
 각종 자원들을 요청하고 할당받을 수 있는 개체
 PCB(프로세스 관리 블록)을 할당받은 개체
 능동적인 개체
 실행 중에 각종 자원을 요구, 할당, 반납하며 진행
컴퓨터공학과 운영체제
Page 3
자원의 개념
 자원의 개념
 커널에 의해 다른 주체(process)에게 할당 또는 반납되는
피동적인 개체
 자원의 분류
하드웨어 자원
소프트웨어 자원
기억장치, 프로세서, 하드 디스크,
자기 테이프, 단말기, 모니터, 키보드 등
메시지, 시그널(signal), 화일,
각종 공유 소프트웨어 등
컴퓨터공학과 운영체제
Page 4
프로세스 제어 블록 (PCB)
 Process Control Block
 커널 공간 (kernel space) 내에 존재
 프로세스의 일생 동안 프로세스의 모든 정적 및 동적
인 정보를 가짐 (시스템 수준 문맥)
 커널에 등록된 각 프로세스들에 대한 정보를 저장하
는 영역
 커널은 PCB를 통해 프로세스 관리
 준비 리스트, 대기 리스트 : PCB의 리스트
컴퓨터공학과 운영체제
Page 5
PCB
Kernel
PCB-1
PCB-2
PCB-n
각 프로세스들에 대한
상태정보 저장
P1
Pn
P2
Memory
컴퓨터공학과 운영체제
Page 6
PCB
 PCB 내의 정보
 프로세스 고유 번호 (PID : Process Identification Number)
 프로세스 우선순위 (priority)
 우선순위-기반 스케줄링시 필요한 정보
 프로세스 현재 상태 (current state)
 메모리 관리 정보(Memory management information)
 Base/limit registers, page tables, segment tables
 I/O 상태정보(I/O status information)
 List of I/O devices allocated, list of open files
 문맥 저장 영역 (context save area)
 실행중인 프로세스의 일시 중지시 레지스터 문맥의 저장 영역
PCB 에 저장되어야 할 정보는 운영체제에 따라 서로 다름
커널의 PCB 영역 참조 및 갱신 속도 개선은 시스템 전체 성능에 중요함
컴퓨터공학과 운영체제
Page 7
프로세스 상태
 프로세스 상태
 현재 소유/요청하고 있는 자원들의 종류에 따라 구분
프로세스 상태의 종류 및 특성
상태
활동 상태
(active,
swapped-in)
지연 상태
(suspended,
swapped-out)
특 성
실행 상태
(running)
프로세서를 할당받은 상태
준비 상태
(ready)
필요한 자원을 모두 소유하고
프로세서를 요청하고 있는 상태
대기 상태
(blocked, asleep)
프로세서외 다른 자원도 없는 상태
지연 준비 상태
(suspended ready)
프로세서를 요청하고 있는 상태
지연 대기 상태
(suspended blocked)
프로세서외 다른 자원도 없는 상태
컴퓨터공학과 운영체제
기억장치를
할당받은
상태
기억장치를
잃은
상태
Page 8
컴퓨터공학과 운영체제
Page 9
컴퓨터공학과 운영체제
Page 10
컴퓨터공학과 운영체제
Page 11
컴퓨터공학과 운영체제
Page 12
컴퓨터공학과 운영체제
Page 13
프로세스 상태전이도
dispatch
(schedule)
timerrunout
(preemption)
ready
created
exit
running
sleep
(block)
asleep
(blocked)
wakeup
swap-in
(resume)
swap-in
(resume)
swap-out
(suspend)
suspended
ready
terminated
swap-out
(suspend)
wakeup
컴퓨터공학과 운영체제
(active)
(suspended)
suspended
blocked
Page 14
프로세스 상태
 생성 상태(created state)
 사용자가 요청한 작업이 커널에 등록되고
 PCB가 할당되어
 새로운 프로세스가 만들어지는 상태
 일시적으로 거쳐가는 상태
 커널
 기억장치 공간 검사
 준비 상태 또는 지연 준비 상태로 전이시킴
컴퓨터공학과 운영체제
Page 15
프로세스 상태
 준비 상태(ready state)
 프로세스가 필요한 모든 자원을 할당받고 프로세서를
할당받기 위해 기다리고 있는 상태
 프로세서만 할당받으면 즉시 실행 가능한 상태
 디스패치(dispatch) 또는 스케줄(schedule)
 준비 상태에서 실행 상태로의 전이
컴퓨터공학과 운영체제
Page 16
프로세스 상태
 실행 상태 (running state)
 프로세서에 의해 실행되고 있는 상태
 프로세스가 원하는 모든 자원(프로세서까지)을 소유한 상태
 타임 슬라이스를 소진하거나, 입출력 요구 등을 하여 CPU를 자
진 반납할 때까지 실행 상태
 선점(preemption)
 실행중인 프로세스가 프로세서 시간 할당량(time quantum, time
slice) 종료, 우선순위 등으로 인하여 자신에게 할당된 프로세서를
반납해야 하는 경우 준비 상태로 전이
 블럭(block/sleep)
 프로세스가 실행 중 자원을 요청하거나 기타 다른 이유로 system
call을 하는 경우 대기 상태로 전이
컴퓨터공학과 운영체제
Page 17
 사용자 모드 실행 (user mode running) : 사용자나 라이브러리
코드가 실행되고 있는 상태
 커널 모드 실행 (kernel mode running 또는 system mode
running) : 프로세스가 시스템 호출을 하거나 인터럽트 발생으
로 커널 내부로 진입하여 커널의 코드부분이 실행되는 상태
 사용자 모드
 특수 레지스터에 CPU의 모드가 사용자 모드임이 표시됨
 다른 사용자 영역에의 침입이나 특권 명령어 및 자원의 무단 사용을
막기 위해 보호 하드웨어가 작동됨
 커널 모드
 입출력 장치나 자원 관리와 관계된 특권 명령어 (privileged
instruction) 실행 가능
 보호 하드웨어 통과 컴퓨터공학과 운영체제
Page 18
프로세스 상태
 대기 상태 (blocked/asleep state)
 프로세스가 프로세서 외의 특정 자원을 요청하고 이를 할당
받을 때까지 기다리고 있는 상태
 입출력 요구, 사건 발생 대기 중에는 CPU가 필요 없음. CPU
반납 후 사건 발생 시까지 대기
 대기 상태 중에도 I/O는 진행될 수 있음
CPU와 I/O를 overlap 할 수 있는 기반이 됨
 system call  SVC(Supervisor Call)
 커널은 프로세스의 요청을 받기 위한 system call interface를
제공
 wakeup
 프로세스가 요청한 자원을 할당받는 등의 event가 발생하면
다시 준비 상태로 전이
컴퓨터공학과 운영체제
Page 19
프로세스 상태
 지연 상태 (suspended state)
 프로세스 생성 후 기억 장치의 양이 부족한 경우
 지연 준비 상태 (suspended ready state)
 준비 상태의 프로세스가 기억장치 잃은 경우
 지연 대기 상태 (suspended asleep state)
 대기 상태에서 기억장치를 잃는 경우
 활동 상태의 프로세스가 기억장치를 잃게 되는 이유
 커널에 의해 선택되는 경우: 시스템 기능 이상, 시스템 과부하
 프로세스 스스로 기억장치를 반납하는 경우: 실행 도중 프로그램의 의심스런
부분 확인
 swap-out(suspend)
 프로세스가 기억장치를 잃는 경우
 swap-in(resume)
 프로세스에게 기억장치가 할당되는 경우
컴퓨터공학과 운영체제
Page 20
컴퓨터공학과 운영체제
Page 21
프로세스 상태
 종료 상태 (terminated/zombie state)
 프로세스의 실행이 완료되어
 모든 자원들을 반납하고
 커널 공간 내에 PCB 등의 프로세스 관리 정보만이 남아 있는
상태
컴퓨터공학과 운영체제
Page 22
프로세스의 상태 전이
신규
작업
스케줄러
타임 슬라이스 소진
비자발적 문맥 교환
준비
입출력 완료 등
사건 발생
종료
실행
CPU 스케줄러
입출력 요구,
동기화 대기 등
자발적 문맥 교환
대기
컴퓨터공학과 운영체제
Page 23
컴퓨터공학과 운영체제
Page 24
컴퓨터공학과 운영체제
Page 25
Scheduling Queues
 Ready queue
 준비 상태의 프로세스들의 공통점
 프로세서 외의 모든 자원을 확보한 상태로 프로세서 요청 중임
 준비-큐(ready queue), 준비-리스트(ready list)
 프로세스 스케줄링(process scheduling)
 프로세서 가용시, 준비 리스트로부터 한 프로세스를 디스패치함
준비 리스트
dispatch
(schedule)
ready
P1
P2
P3
running
sleep
(block)
timerrunout
(preemption)
wakeup
asleep
ready
list
컴퓨터공학과 운영체제
Page 26
Scheduling Queues
 Block queue
 대기 상태의 프로세스 큐
 각 프로세스가 요구한 자원의 종류에 따라 분류 가능
 대기-리스트(block list), 대기-큐(block queue)
 각 자원의 종류별 관리
 큐의 개수  커널이 관리하는 자원의 종류의 수
대기 리스트
dispatch
(schedule)
ready
running
timerrunout
(preemption)
wakeup
sleep
(block)
asleep
P11 P12 P13
P21 P22
blocked
list
컴퓨터공학과 운영체제
Pk1
Pk2
Pk3
Page 27
Thread 개념
 Thread 정의
 Lightweight process(LWP:경량 프로세스)
 CPU 스케줄의 단위
 구성
 Thread ID
 Program counter
 Register set
 Stack
 같은 프로세스에 속한 모든 thread들은 코드, 데이터, 파일
등의 자원을 공유한다
 응용분야: web server, RPC server, web browser
 전통적인 기존 process : single thread of control
컴퓨터공학과 운영체제
Page 28
Thread 개념
모든 thread들에게 공유되는 항목
각 thread마다 독립적으로
할당되는 항목
컴퓨터공학과 운영체제
Page 29
Single/Multi-threaded processes
code
data
registers
files
code
data
files
stack
registers
registers
registers
stack
stack
stack
thread
단일 thread
다중 thread
컴퓨터공학과 운영체제
Page 30
Three processes each with one thread One process with three threads
컴퓨터공학과 운영체제
Page 31
Thread 개념
 이점
 Responsiveness(응답성)
 Resource sharing(자원공유)
 Economy(경제성)
 Utilization of multiprocessor architectures
(다중처리기 구조의 활용)
컴퓨터공학과 운영체제
Page 32
A word processor with three
threads
컴퓨터공학과 운영체제
Page 33
A multithreaded Web server
컴퓨터공학과 운영체제
Page 34
While (1)
{
clientFd = accept(serverFd, clientSockAddrPtr, &clientLen);
// if (fork() == 0)
//
{
writeRecipe(clientFd);
close(clientFd);
//
exit(0);
// }
// else
//
close(clientFd);
}
//clone(writeRecipe2, child_stack, CLONE_VM|CLONE_FILES, arg);
컴퓨터공학과 운영체제
Page 35
Implementing Threads in User Space
A user-level threads package
컴퓨터공학과 운영체제
Page 36
Implementing Threads in the Kernel
A threads
package
managed by
the kernel
컴퓨터공학과 운영체제
Page 37
Hybrid Implementations
Multiplexing user-level threads onto kernel- level
threads
컴퓨터공학과 운영체제
Page 38
Pthread example(1)
#include <stdio.h>
#include <pthread.h>
void consumer (void); // thread function prototype
char buffer[n];
int n, in = 0, out = 0;
int main ()
{
char nextp; int i;
pthread_t tid;
pthread_create (&tid, NULL, consumer,NULL); // consumer thread 의 생성
// main thread는 producer의 역할을 한다. // consumer thread와 병행으로 수행된
다.
for (i = 0; i < 500; i++) {
produce an item in nextp
while ( (in+1) % n == out) ; // 대기 loop
buffer[in] = nextp; in++; in %= n;
}
pthread_join (tid);
}
컴퓨터공학과 운영체제
Page 39
Pthread example(2)
void consumer(void)
{
char nextc;
for (i = 0; i < 500; i++) {
while (in == out) ; // 대기 loop
nextc = buff[out];
out++; out %= n;
...
consume the item in nextc;
}
}
Producer
Process
Consumer
Process
Producer
Process
Circular Buffer
컴퓨터공학과 운영체제
Page 40
인터럽트 처리 및 문맥 교환
 인터럽트 개념
 unexpected event
 인터럽트의 일반적인 종류
 입출력 인터럽트 (I/O interrupt)
 클럭 인터럽트 (clock interrupt)
 콘솔 인터럽트 (console interrupt)
 프로세스간 통신 인터럽트 (interprocess communication interrupt)
 시스템 호출 인터럽트 (system call interrupt, SVC interrupt)
 프로그램 오류 인터럽트 (program check interrupt)
 하드웨어 검사 인터럽트 (machine check interrupt)
컴퓨터공학과 운영체제
Page 41
 인터럽트 처리 과정
인터럽트 발생
프로세스 중단
인터럽트 처리 (interrupt handling)
인터럽트 발생 장소, 원인 파악
인터럽트 서비스 할 것인지 결정
인터럽트 서비스 루틴
(interrupt service routine) 호출
커널 : 인터럽트 발생시 항상 개입하여
인터럽트의 처리 과정 및 인터럽트 서비스 과정을 제어함
컴퓨터공학과 운영체제
Page 42
인터럽트 처리 과정
Interrupt
handler
Kernel
프로세서
ISR-1
ISR-2
Pi
ISR-n
PCBi
PCBj
인터럽트 발생
주기억장치
컴퓨터공학과 운영체제
Page 43
 문맥 보존 및 문맥 교환
 문맥(context)의 의미
 특정 프로세스와 관련된 정보들의 총집합
 프로세스의 실행 중단시 보존되고, 속개시 다시 원상 복구되어
야 하는 프로세스의 실행을 위한 모든 정보
 context saving
 실행중인 프로세스의 레지스터 문맥 보존을 위하여 저장하는 일
 context restoring
 기존에 저장되었던 문맥을 프로세서로 다시 이동시키는 일
 context switching
 실행 상태의 프로세스를 다른 프로세스로 교체하기 위하여 그들
의 문맥을 각각 save하고 restore하는 일
컴퓨터공학과 운영체제
Page 44
프로세스 문맥의 구성
사용자 수준 문맥 (user-level context)

텍스트 (text) 영역

자료 (data) 영역

스택 (stack) 영역
시스템 수준 문맥 (system-level context)

CPU 내의 각종 범용 및 특수 레지스터의 내용
(Program counter register 포함)

프로세스의 현재의 각종 자원 사용 정보

기타 커널의 프로세스 관리 정보
컴퓨터공학과 운영체제
Page 45
문맥 교환(context switching)
 시분할 기반의 스케줄링에 의한 CPU 선점이나, 프
로세스 스스로 입출력 요청에 의해 CPU를 반납할
때, CPU는 다른 프로세스에게 할당된다.
 이때, 실행이 정지되는 프로세스의 문맥은 보존되
고, 새로 실행되는 프로세스의 문맥이 활성화된다.
 사용자 수준 문맥은 메모리에 남아 있으나, 레지스
터의 내용들은 추후의 복구를 위해 저장되고, 새로
운 문맥이 적재된다.
컴퓨터공학과 운영체제
Page 46
문맥 교환
Registers
범용 registers
Program Counter
Stack Pointer, 기타
save
실행 중단 프로세스의
문맥 정보
restore
실행 속개 프로세스의
문맥 정보
컴퓨터공학과 운영체제
Page 47
UNIX KERNEL
 5 - 10 % of total UNIX OS
 memory 상주
- 90% C
- 10% Assembly
효율성, 하드웨어 제어부분
 3 부분
 프로세스 관리
 파일 시스템
 I/O 시스템
 2 modes of machine operations
 kernel mode
 user mode
 for protection
(memory space, privileged instruction 등)
컴퓨터공학과 운영체제
Page 48
UNIX KERNEL
 모드 전환
user's source program : " read next word from file X into variable y "
object program : 시스템 호출을 위한 매개변수 준비
인터럽트 실행
CPU : save state vector(문맥)
CPU mode ← kernel mode로 전환
인터럽트 서비스 루틴으로 이동
OS : (interrupt handler 는 커널 영역)
interrupt 원인 파악 (system call, illegal code, address fault,....)
해당 kernel procedure로 이동
|
system call service
|
OS가 CPU mode ← user mode로 전환
restore state vector(문맥)
Now, back to user program.
컴퓨터공학과 운영체제
Page 49
UNIX PROCESS MANAGEMENT
 PCB(process control block)
 In UNIX, PCB is divided into 3 parts
 u
 proc
 text
 All in the kernel address space
 used by kernel for system call services
컴퓨터공학과 운영체제
Page 50
UNIX PROCESS MANAGEMENT
 Proc Table





process마다 하나씩 할당됨
항상 memory에 상주
allocated when process is created
freed when process is terminated
저장 내용
 프로세스가 디스크로 swap-out되었을지라도 메모리에 남아있어야
하는 부분들
 process id, 상태, 우선순위, waiting event,
location of "image" (text segment, data segment,.....)

프로세스가 실행중이 아닌 중에도 시스템에 의해 필요한 정보들
컴퓨터공학과 운영체제
Page 51
UNIX PROCESS MANAGEMENT
 U block (1024 bytes)
 프로세스가 실행중일 때만 시스템에 의해 필요한 정보들
 프로세스와 함께 swap-out 가능
 low overhead for suspended process
(only proc table entry, which is few words !)
 CONTENT of u block










open files descriptor
directory(current, root)
command argument
state vector save area
offset
execution time (for scheduling)
signal
parent process id
pointer to proc table entry
others
컴퓨터공학과 운영체제
Page 52
UNIX PROCESS MANAGEMENT
 fork system call : 프로세스 생성 시스템 호출



프로세스 개수를 증가시킬 수 있는 유일한 방법
create a copy of itself
All environments (u block) are shared (exact copy)



process id 만 다름
process 간에 메모리 공유하지 않음(단지 생성시의 모든 정보 상속)
fork 수행과정





새로운 프로세스를 위해 프로세스 테이블항을 할당
자식 프로세스에게 고유의 ID 번호 부여
부모 프로세스의 내용 복사
프로세스와 관련된 자원들(파일 테이블,inode 테이블 등)의 이용
카운터 증가
부모 프로세스에게는 자식의 ID 번호를 return,
자식 프로세스에게는 0을 return
컴퓨터공학과 운영체제
Page 53
fork를 사용한 프로세스 생성
컴퓨터공학과 운영체제
Page 54
UNIX PROCESS MANAGEMENT
main()
{
int pid;
printf("Just one process so far\n");
printf("Calling fork …\n");
pid = fork();
if(pid == 0)
printf("I'm the child \n ");
else if (pid > 0)
printf("I'm the parent, child has pid %d \n ", pid);
else
printf("Fork returned error code, no child \n ");
}
컴퓨터공학과 운영체제
Page 55
fork에 의한 프로세스 생성
int a = 3;
int main()
{
int pid;
:
do something;
if ((pid = fork()) == 0) { //child
a = 4;
printf ("child's a = %d\n", a);
exit(0);
} else // end of child
{
// parent
a = 5;
printf ("parent's a = %d\n", a);
wait();
}
do something;
}
// child’s variable a
// child 종료
// parent’s variable a
// parent는 child의 exit 까지 대기
컴퓨터공학과 운영체제
Page 56
UNIX PROCESS MANAGEMENT
 exec system call
 text & data segments를 새로운 것으로 교체
 즉 프로그램을 다른 것으로 교체하는 효과
 exec does not change process but execute different
code
 goto와 유사
 디스크의 프로그램을 새로운 프로세스로 생성하기 위해
fork + exec 를 사용
 다른 운영체제에서는 fork와 exec의 기능을 합한 시스템 호
출을 제공함
컴퓨터공학과 운영체제
Page 57
exec 계열을 사용한 프로세스 생성
컴퓨터공학과 운영체제
Page 58
#include <unistd.h>
int
int
int
int
execl(const char *path, const char *arg, ...);
execlp(const char *file, const char *arg, ...);
execv(const char *path, char *const argv[]);
execvp(const char *file, char *const argv[]);
arg
path나 file로 지정한 실행 파일을 실행할 때 필요한 명령
어 라인의 옵션과 인자이다. 한 개 이상을 지정할 수 있으
며 마지막 인자는 반드시 NULL 포인터로 지정해야 한다.
argv
arg와 같은 의미를 가지나 문자형 포인터의 배열로 형태가
다르다. 배열의 마지막은 NULL 문자열로 끝나야 한다.
컴퓨터공학과 운영체제
Page 59
 exec 계열의 함수는 지정한 실행 파일로부터 프로세스를 생성
한다.
 fork는 실행 중인 프로세스로부터 새로운 프로세스를 생성한다.
 exec 계열 함수의 사용 예
 셸 프롬프트 상에서 “ls”를 실행하는 것과 비교
$ ls -l apple/
...
execlp("ls", "ls", "-l", "apple/", (char *)0);
main 함수의 *argv[]에 저장되는 문자열들과 같다.
프로세스를 생성하기 위해 선택된 실행 파일의 이
름이다.
컴퓨터공학과 운영체제
Page 60
UNIX PROCESS MANAGEMENT
/* run ls in a subprocess */
main()
{
int pid;
pid = fork();
if (pid > 0) {
wait((int *) 0);
printf("ls completed \n ");
exit(0);
}
if (pid == 0) {
execl("/bin/ls", "ls", "-l", (char *)0);
perror("execl failed");
exec 호출이 성공하면 실행되지 않는다.
exit(1);
}
perror ("fork failed");
}
컴퓨터공학과 운영체제
Page 61
UNIX 계열 프로세스 tree
init
fork,
exec
getty
getty
getty
getty
exec
login
fork + exec
exec
shell
a.out
wait
exit
컴퓨터공학과 운영체제
Page 62
축약된 shell의 코드
while (!logout) {
print prompt sign;
accept command line string;
parse the command line; // 이때 command는 “a.out" 또는
// “a.out&” 이라 가정
if ((pid = fork()) == 0) { // child shell
execve ("a.out",,,);
}
// parent shell
if (foreground)
while (pid != wait());
}
컴퓨터공학과 운영체제
Page 63
UNIX PROCESS MANAGEMENT
 PROCESS 종료
 "exit" system call : 자발적 종료
 "signal" 이용(user kills, quit, break 등...) : 비자발적 종료
 swappable image(text, data segment, u)는 즉시 반납
 proc table entry 는 존재 → "zombie" 상태
 parent가 wait중이면 parent에게 signal이 감
 추후 parent가 wakeup, run하면 종료된 child의 proc table
entry를 제거해줌
컴퓨터공학과 운영체제
Page 64
시스템 호출, 문맥 교환 및
인터럽트 처리 예제
 사용자 프로세스가 디스크 입력을 위한 read 시스템
호출을 하여 완료될 때까지의 과정
 시스템 호출 처리
 대기에 의한 문맥 교환
 인터럽트에 의한 디스크 입출력의 처리
컴퓨터공학과 운영체제
Page 65
사용자 프로세스
int main ()
{
int fd;
char buf[100];
do something;
fd = open ("my_file", 0);
n = read (fd, buf, 100); // 사용자모드에서 실행 중
// 시스템 호출을 하여 커널로
// 진입하며 커널 모드 실행으로 전환
// 복귀 시는 다시 사용자 모드임
:
}
컴퓨터공학과 운영체제
Page 66
시스템 호출 처리 루틴(1)
int sys_read (,,,)
{
// 커널 모드 실행으로 전환된다
파일의 현재 논리적 접근 위치를 디스크 블록 번호로 변환한다;
원하는 디스크 블록이 커널의 버퍼 캐시에 있는 지 검색한다;
if (버퍼 캐시에 있으면) {
100 byte 만큼 커널 버퍼의 자료를 사용자 영역으로 복사한다;
ret_from_sys-call; // 사용자 모드로 복귀한다.
}
// 버퍼 캐시에 없으므로 디스크 입력이 필요한 경우이다.
// 유니스/리눅스 계열에서 아래 부분은 bread 함수에 의해
실행된다.
디스크 I/O 요청 블록을 생성한다;
디스크 I/O 요청 블록을 disk I/O 큐에 삽입한다;
컴퓨터공학과 운영체제
Page 67
시스템 호출 처리 루틴(2)
if ( 현 disk I/O 요청 블록이 큐에서 첫 번째이면 ) {
// 현재까지 디스크 제어기가 쉬는 상태였음
디스크 제어기에 I/O 명령을 내려 작동을 지시한다.;
}
// 이 시점에서 프로세스가 요청한 디스크 I/O는
// 큐의 첫 번째에 삽입되어 시작되었을 수도 있고,
// 큐의 뒷부분에 삽입되어 (즉 다른 디스크 I/O가 이미 진행 중)
// 입출력을 시작하지 못한 경우도 있다.
// 두 경우 모두 디스크 I/O가 완료될 때까지 프로세스는
// 중앙 처리기를 반납하고 대기 상태로 진입하여야 한다.
sleep_on (디스크 입출력 완료); // 디스크 입출력 완료까지
// 대기 상태로 진입
컴퓨터공학과 운영체제
Page 68
시스템 호출 처리 루틴(3)
// 대기 상태에서 깨어나면 디스크 I/O는 완료된 상태이고,
// 이 프로세스는 준비 상태를 거쳐 이미 커널 모드 실행 상태로
// 전환된 것이다.
I/O가 수행된 버퍼 캐시에서 사용자 영역으로 자료를 복사한다;
사용자 모드로 복귀; // 이 때 복귀 과정에서 스케줄링 필요한
경우 스케줄러가 작동된다.
}
컴퓨터공학과 운영체제
Page 69
커널 내부 함수 sleep_on
int sleep_on (event_name)
{
현 프로세스 PCB의 상태 정보 = BLOCKED;
현 프로세스 PCB를 준비 리스트에서 삭제한다;
현 프로세스 PCB를 사건(event) 종류별 대기 큐에 삽입한다;
준비 리스트에서 우선순위가 가장 높은 PCB를 선정한다;
// 현 프로세스의 PCB를 old_PCB,
// 준비 리스트에서 새로 선정한 PCB를 new_PCB라 하자.
context_switch ( old_PCB, new_PCB );
// context_switch에서 새로운 프로세스로 jump가 일어나고,
// 후에 이 지점으로 복귀되었을 때는 이미 준비(ready) 상태를
// 거쳐 실행(kernel-mode running) 상태로 된 것임.
return;
}
컴퓨터공학과 운영체제
Page 70
디스크 인터럽트 처리기
int disk_intr_handler (,,)
{
// 입출력 완료 인터럽트라 가정한다.
// 디스크 입출력 큐의 가장 앞(프론트)에 있는 입출력 요구가 수행 완료된 것이다.
디스크 입출력 대기 큐 프론트의 입출력 정보 블록을 제거한다;
입출력을 요구한 프로세스의 PCB를 대기 큐에서 제거하여, 준비 리스트 (ready
list)에 삽입;
// 대기 큐에서 제거하고 준비 리스트에 삽입하는 것은
// 사건을 기다리던 프로세스를 깨운다는 뜻으로
// wakeup_process(event)라 표시할 수 있다.
디스크 입출력 대기 큐의 다음 요구 블록의 입출력 정보로,
디스크 제어기에 명령을 내려 다음 입출력을 시작시킨다.
사용자 모드로 복귀; // 복귀 과정에서 스케줄러가 동작된다.
}
컴퓨터공학과 운영체제
Page 71