process는 실행 중인 프로그램을 말함
CPU는 다수의 process를 다중 프로그래밍(multi programming)함.(병렬 처리)
각각의 프로세스는 address space(core image), process table entry로 이루어짐
⭐️process state
running: using the CPU/ 명령어를 수행하며 CPU를 사용 중
ready: runnable, temporarily stopped to let another process run/ CPU의 사용을 대기 중
blocked: unable to run/ CPU를 사용할 수 없는 상태
운영체제의 가장 하위계층은 스케줄러, 그 위에 다수의 프로세스들 존재
address space of process
text: code
data: variables (위로 자라남, heap(동적 메모리 할당을 할 때 사용))
stack: variables, etc (아래로 자라남)
cf) storage duration
automatic(dynamic)함: 함수 호출하면 선언되는 변수들이 일시적으로 스택에 쌓였다가 사라짐
static 함: 메모리에 존재하는 시간이 일시적이 아니라 프로그램 처음부터 끝까지 존재함(data segment에 자리잡음)
process hierarchies
프로세스 간 통신, 관리자 권한을 관리하는데 용이함
protection
시스템 관리자는 사용자에게 UID(User Identification)을 부여
자식 프로세스는 부모 프로세스의 UID를 가짐
각 그룹도 GID(Group Identification)를 가짐
UNIX에서는 특별한 권한을 가진 superuser가 있음
process table
해당 process 가 나중에 재사용될 때 사용하기 위해 process의 정보들이 저장되어 있음
process creation and termination
<creation>
1. 시스템 초기화
운영체제가 부팅할 때 일반적으로 여러 개의 프로세스가 생성됨
daemon: background에서 실행되는 process, 미리 정해진 어떤 기능을 수행
2. 수행 중인 프로세스가 프로세스 생성 시스템 호출을 부르는 경우
UNIX의 경우 fork system 호출하여 새로운 프로세스 생성
3. 사용자가 새로운 프로세스를 생성하도록 요청하는 경우
사용자가 명령어를 입력하거나 아이콘을 클릭하여 선택한 프로그램을 실행
4. 배치 작업의 시작
거대한 메인프레임 컴퓨터에서 볼 수 있음
여러 작업들을 묶어서 실행
<termination>
1. 정상적인 종료
작업을 완료하여 종료, return 0, UNIX에서 exit system call, 자발적
2. 오류 종료
잘못된 입력을 한 경우, 자발적
3. 치명적인 오류
프로세스에 의해 유발된 오류, 프로그램의 버그, 비자발적
ex) 잘못된 명령어 실행, 존재하지 않는 메모리 접근, 0으로 나누기 등
4. 다른 프로세스에 의한 종료
UNIX에서 kill system call, 비자발적
system calls for process management
프로세스 생성(fork), 프로세스 종료(exit), 프로그램 덮어쓰기(exec), 자식 프로세스 종료 대기(wait, waitpid), 메모리 요청(malloc), 메모리 해제(free)
사용자가 입력한 명령어를 실행하는 쉘과 유사한 프로그램
새로운 프로세스를 생성하고, 자식 프로세스에서 다른 프로그램을 실행하며, 부모 프로세스는 자식이 종료될 때까지 기다림
while(TRUE){ //TRUE==1, 무한루프
type_prompt(); //프롬포트 띄움
read_command(command,parameters) //명령어 입력받음
if(fork()!=0){ //부모 프로세스에서만 참이므로 parent code 실행
/* parent code */
waitpid(-1,&status,0); //자식 프로세스가 종료될때까지 대기
/* -1은 모든 자식프로세스들을 의미
&status는 자식 프로세스의 종료 상태를 저장하는 포인터 */
}else{
/* child code */
execve(command,parameters,0);
}
}
fork(): 부모 프로세스에서 자식 프로세스 생성
부모 프로세스는 PID(process ID)를 반환, 자식 프로세스는 0을 반환
execve(): 현재 프로세스를 새로운 프로그램으로 대체하는 시스템 호출
brk system call
프로세스의 data segment 크기를 조정하는 데 사용, 힙 메모리를 늘리거나 줄이는 역할
Handling of Interrupt
- 하드웨어가 현재 실행 중인 프로그램의 프로그램 카운터와 그 외 중요한 정보를 스택에 저장 (나중에 원래 프로그램으로 돌아갈 수 있도록 현재 실행 상태를 보존하는 역할)
- interrupt vector로부터 새로운 프로그램 카운터를 load, interrupt vector가 어떤 interrupt가 발생했는지 알려주고, 해당 interrupt를 처리할 코드로 jump 할 수 있도록 프로그램 카운터를 변경
- 어셈블리어 루틴으로 현재의 레지스터 값들을 저장
- 어셈블리어 루틴으로 새로운 스택을 설정
- c 프로시듀어로 interrupt 처리를 수행
- 스케줄러가 다음에 실행될 프로세스를 결정
- interrupt 처리가 종료되고 다시 어셈블리어 코드로 제어가 넘어가 원래의 상태로 복귀할 준비
- 어셈블리어 코드가 현재 프로세스의 실행을 재개, interrupt 발생 이전에 중단된 코드로 돌아감
'컴퓨터공학 > 운영체제' 카테고리의 다른 글
[운영체제] 04. memory -a (0) | 2024.11.07 |
---|---|
[운영체제] 02. scheduling (0) | 2024.10.28 |
[운영체제] 02. ipc (0) | 2024.10.25 |
[운영체제] 01. systemcall (0) | 2024.10.23 |