Overview
process는 실행중인 프로그램을 의미합니다. process는 컴퓨터 프로그램이 동작하는 하나의 인스턴스입니다. 프로세스는 다양한 일을 할 수 있습니다. 각각의 프로그램이 실행되면 그 프로그램은 하나의 프로세스를 얻습니다. 이 프로그램은 더 많은 process를 만드는 것이 가능합니다. 사실 OS는 하나의 프로세스로부터 시작되어 나머지 다른 모든 프로세스는 그 프로세스의 fork된 것입니다. 이 과정은 부팅 시에 완료됩니다.
okay, but what's a proram?
- binary format: binary format은 OS에게 어떤 부분이 executable한지, 어느 부분이 상수인지, 어떤 library들이 include되었는지 등을 알려줍니다.
- machine instruction들
- 어떤 instruction이 시작해야하는 위치의 번호
- 상수
- 링크할 라이브러리와 그 라이브러리의 주소를 어디에 채울지
In the beginning
새로운 프로세스를 만들고 싶을 때에는 fork 함수 또는 다른 프로그램을 로드하는 함수를 사용해야 합니다.
Process Isolation
process들은 매우 강력하지만 각각 분리되어 있습니다. 즉, 기본적으로는 어떤 프로세스도 다른 프로세스와 communicate할 수 없습니다. 이점은 매우 중요합니다! 만약 당신이 큰 system(EWS같은)을 가지고 있다면 특정 프로세스는 더 높은 privilege를 가지게 만들어(monitoring이나 admin같은) 다른 유저가 실수로든 의도적으로든 process를 수정해 전체 시스템을 망가트릴 수 없도록 할 것입니다.
int secrets; //maybe defined in the kernel or else where
secrets++;
printf("%d\n", secrets);
위와 같은 코드를 두개의 다른 terminal에서 수행하면 둘다 2가 아닌 1을 출력할 것입니다.
만약 코드를 위험하게 바꾸더라도(메모리를 직접 읽는 것을 빼고) 다른 프로세스의 상태를 바꿀 방법은 없습니다.(가능할수도 있지만 너무 깊게 파고들어간 내용입니다)
Process Contents
Memory Layout
프로세스가 시작되면, 프로세스는 스스로의 메모리 공간을 얻습니다.
- A stack : stack은 automatic variable과 fuction call의 return address가 저장되는 공간입니다. 새로운 변수가 선언될 때마다 프로그램은 stack pointer를 이동해 변수를 저장할 공간을 예약합니다. stack은 쓰기는 가능하지말 실행은 불가능합니다. 만약 stack이 너무 많이 증가해 preset boundary를 넘거나 heap을 침범하면 stack overflow가 일어나 segmentation fault가 발생합니다. stack은 기본적으로 정적으로 할당됩니다. 즉 쓸 수 있는 공간이 정해져 있습니다.
- A heap : heap은 메모리 영역의 확장된 부분입니다. 만약 큰 object를 할당했다면 이곳에 저장됩니다. heap은 text segment의 위에서부터 시작해서 위쪽 방향으로 자랍니다. 즉 malloc을 호출하면 OS에게 heap 영역의 경계를 위쪽으로 올려달라고 요청하게 됩니다. heap도 stack과 마찬가지로 쓰기만 가능하고 실행은 불가능합니다. 주로 32비트 시스템에서 발생하는 문제지만, 주소가 부족하거나 시스템이 제한되어 있다면 heap 메모리가 부족해질 수 있습니다.
- A data segment : 이 부분은 모든 global을 가지고 있습니다. 이 영역은 text segment의 맨 끝에서부터 시작해서 정적으로 할당됩니다. global의 크기는 compile time에 알려지기 때문입니다. data segment는 IBSS(Initialized Basic Service Set)과 UBSS(Uninitialized data segment)의 두 영역으로 나눠집니다. 이 영역 또한 쓰기는 가능하지만 실행은 불가능합니다.
- A Text Segment : 이 부분은 틀림없이 address에서 가장 중요한 영역입니다. 이곳은 당신의 모든 코드가 저장되는 곳입니다. 어셈블리가 1과 0으로 컴파일하기 때문에, 이 곳은 1과 0이 저장되어 있습니다. Program counter가 이 segment를 통과하며 instruction을 실행하고 다음 instruction으로 이동합니다. 이 부분은 유일한 실행 가능한 section입니다. 만약 실행 중에 이 부분을 바꾸려는 시도가 발생한다면 주로 segmentation fault가 발생할 것입니다.
- 0부터 시작하지 않는 이유는 너무 벗어난 내용이므로 설명하지 않겠습니다. 보안에 관련된 이유라고 생각하시면 됩니다.
Process ID(PID)
OS는 프로세스를 관리하기 위해 각각의 프로세스에게 Process ID(PID)라는 숫자를 부여합니다. 또한 프로세스는 ppid(Parent Process ID)로 가지고 있습니다. 모든 프로세스는 parent를 가지고 있고, 그 parent process는 init.d가 될 수도 있습니다.
프로세스는 다음과 같은 정보를 가지고 있습니다.
Running State : 프로세스가 동작할 준비가 되었는지, 동작중인지, 멈춘 상탱니지, 종료된 상태인지 등등
FIle Descriptors : real devices(files, usb sticks, sockets)들을 정수로 mapping한 list
Permissions : 어떤 User가 file을 실행하고 있는지, 프로세스가 어느 group에 속하는지을 알 수 있다. 프로세스는 user나 group에게 그들이 user가 파일을 여는 것처럼 허용을 해줄 수 있습니다. 프로그램을 시작한 유저가 아닌 다른 사용자가 동작하는 것처럼 만들수도 있습니다. sudo 명령어가 그 예입니다. sudo를 사용하면 프로그램은 user가 실행하지만 root처럼 실행됩니다.
Arguments : 프로그램이 실행될 때 어떤 parameter를 가지고 실행할 것인지 알려주는 문자열
Environment List : NAME=VALUE의 형식으로 수정될 수 있는 문자열의 목록
'Angrave System Programming > Processes' 카테고리의 다른 글
Process Control : Wait macros (0) | 2019.01.11 |
---|---|
Forking: Fork, Exec, Wait(2) (0) | 2019.01.11 |
Forking: Fork, Exec, Wait(1) (0) | 2019.01.11 |
Forking Introduction (0) | 2019.01.10 |
Kernel, Shells, Terminals (0) | 2019.01.10 |