C & Unix/Linux

Process in memory

▪ 수행되고 있는 단위작업.

- Kernel process   exec() a program   User process.

exit()

....

BUS

-- ----

I/O devices

CPU's

① process table

② user block

③ text table

④ file table

⑤ i_node

P0 - user context

P1

P2

:

file mgmt

process

mgmt

user area

kernel area

* degee of multiprogramming

increases → thrashing

memory

▪ User process in memory

dynamic data

stack

heap

uninitialized data

initialized

read-write data

initialized

read-only data

text

Allocated by the kernel

static data

text

allocate more data space dynamically

ex) malloc()

the actual machine instructions

→ 공유가 가능한 부분 ex)p.56

user context

parameters

control link

local data

parameters

control link

local data

Main

function_1

ex) # ls ↲

Read from program file

when a pgm is executed

ex) p.21 program

int	debug = 1;	→ initialized read-write data

char	*progname;	→ uninitialized data

main(argc, argv)

int	argc;	→ stack: parameters

char	*argv[];	→  〃  : parameters

{

int	i;	→ i와 *ptr은 stack: local data

char	*ptr, *malloc(); → *malloc()는 heap.

progname = argv[0];                 //여기서부터

printf("argc = %d\n", argc);

for(i = 1; i < argc; i++) {

ptr = malloc(strlen(argv[i] + 1);	initialized read-only data

strcpy(ptr, argv[i]);

if (debug)

printf("%s\n", ptr);	//여기까지는 text.

▪ Kernel area in memory

data

text

user

block

text

data

user

block

process table

(PCB)

Kernel Area

User area

text table

P1

P2

P1

P3

P3

P2

user

block

data

“교체(swap in/out)

되는 부분”

“항상 memory에

상주하는 부분”

PID

UID

Process의 고유번호

Process를 만든 사용자

① Process table (PCB: Process Control Block): user process의 관리에 필요한 정보

․pid: 프로세스의 고유번호.

․ppid: parent 프로세스의 pid.  ex) 호적등본

․state: 프로세스의 현재상태.

․flag: 교체와 관련된 프로세스의 상태 및 기타 정보를 위한 flag.

․priority: 프로세스의 우선순위 값.

․time: 프로세스가 memory에 위치한 시간 - 스케쥴링에 이용.

․cpu: 프로세스가 CPU를 사용한 시간 - 스케쥴링에 이용.

․nice: 사용자가 정의한 nice 값.

→ 사용자 priority = pusher(100) + u_nice + penalty

․sig: 프로세스에게 들어온 signal의 상태.

․uid: 사용자의 고유번호(→ /etc/passwd). 즉, process의 주인.

․pgrp: 프로세스 그룹 리더.

․addr: 기억장치에서 교체(swap out)될 이미지(user context)의 시작주소.

․size: 기억장치에서 교체(swap out)될 이미지의 크기.

․wchan: 프로세스가 휴식(sleep)/대기(wait) 상태에서 기다리는 event.

․textp: text table을 가리키는 포인터.

․link: 실행대기 행렬(ready queue)을 linked list로 연결하는데 사용.

․clktim: alarm clock signal을 보내는데 사용. → alarm()

- 프로세스의 우선순위

휴식상태(sleep) ex) sleep()	-100: High 0	- sleep/wait 상태는 system call 상태이므로 kernel mode로 작동. → sleep()이나 I/O가 끝난 Process는 priority가 높음. - system call 발생시 user mode에서 kernel mode로 switching할 때 overhead가 발생. → system call의 횟수를 줄이면 수행시간이 감소.
대기상태(wait) ex) read()	1 99
사용자상태(ready)	100 127: Low	- 사용자 priority는 주기적으로 값이 다시 계산됨. - 사용자가 nice()를 이용하여 자의적으로 priority를 낮출 수 있음. - 자기에게 주어진 CPU quota 시간을 모두 쓰면 penalty가 높음.

② User block: 각 프로세스마다 할당됨. kernel이 필요한 정보.

․text, data, stack의 크기.

․virtual addr. space와 physical addr. space에 대한 mapping 정보.

․CPU register들의 값을 저장.  → 휴식/대기 상태로 전환시.

․system call시에 사용되는 정보.

․I/O시에 사용되는 정보. → file descriptor table, terminal ptr 등.

․user/group id

․수행시간

․root/current directory에 관한 정보.

․회계정보.

․kernel이 필요한 stack.

③ Text table: 프로세스들 간에 공유하는 text를 관리.

․daddr: 공유 text segment의 disk 주소.

․caddr: 공유 text segment의 memory 주소.

․size: 공유 text segment의 크기.

․iptr: 공유 text segment의 disk file 정보에 대한 ptr.

․count: 참조 횟수 (reference count).

․ccount: memory에서의 참조 횟수.

▪ Process ID (PID)

- An integer, typically in the range 0 through 30000.

- The kernel assigns the PID when a new process is created.

ex)  > ps -al ↲   /* 현재 process들에 대한 정보. (Windows: 작업관리자)

> ps -e ↲    /* root에서 daemon process 보기.

> kill -9 PID↲    /* terminate process by sending SIGKILL.

ex)	PID 0 : A special kernel process termed the process scheduler.

PID 1 : A special kernel process called init.

PID 2 : A special kernel process termed the pagedaemon for virtual memory → demand paging and swapping.

ex) Unix/Linux process들 display

ex) Task Manager in Windows Server (C:\WINDOWS\system32\taskmgr.exe)

▪ Parent process ID

- Each process has a parent process.

- int getppid()

ex) > ls

init

>

ls

fork()

fork() & wait(&status)

exit(status)

exec()

exec()

- int getpid(); Unix/Linux에서 process ID/부모 process ID 출력

ex) /* getpid.c */

#include <stdio.h>

int main(void){	{

printf("my ID = %d, parent ID = %d\n", getpid(), getppid());

return 0;

}