-
[시스템프로그래밍] Process시스템프로그래밍 2023. 12. 13. 00:02
앞선 글들에서 다른 개념들을 설명하면서 '프로그램'과 '프로세스' 두 개의 단어가 계속 뒤섞여 나왔습니다.
프로그램은 뭐고 프로세스는 뭘까요?
결론부터 말하자면 '실행되고 있는 프로그램'을 프로세스라 부릅니다.
그러면 이제 프로그램과 프로세스에 대해 좀 더 자세히 뜯어볼까요?
Program
프로그램의 정의는 파일에 저장된 기계 명령어들의 순서 있는 모음입니다.
주로 상위 레벨 언어로 작성된 소스코드를 바이너리코드로 컴파일하여 제작합니다.
'그럼 프로그램을 실행한다'의 의미는 무엇일까요?
쉽게 말하자면 '프로그램을 실행한다'는 것은
1) 기계 명령어들의 (순서 있는) 리스트를 메모리에 올린 후(커널이 프로그램 코드를 메모리에 복사)
2) CPU가 각 명령어들을 순서에 맞춰(혹은 병렬적으로) 수행하도록 한다
는 의미입니다.
즉 정리하면 컴파일된 프로그램, 즉 실행 가능한 프로그램(Executable program)은
하드디스크나 SSD 같은 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이고,
이 프로그램을 실행하라고 명령을 내리면 커널이 프로그램 코드를 메모리에 복사하면서 프로세스 인스턴스가 생성됩니다.
여기서 '인스턴스가 생성된다'는 의미가 프로그램 실행에 필요한 내용이 메모리에 적재된다는 뜻입니다.
그림으로 보면 디스크에 있는 프로그램이 메모리에 올라가면서 이름이 프로세스로 바뀐 것을 볼 수 있습니다.
이렇게 메모리에 올라간 프로세스 객체는 OS가 짜 준 스케줄에 따라 본인 차례에 본인에게 할당된 시간만큼
CPU를 쓰고 나오면 됩니다.
마지막으로 파일 vs 프로세스를 한번 정리하고 넘어가보겠습니다.
File Process - 필요한 데이터를 가지고 있음
- 속성 정보 포함
- 커널에 의해 생성 및 파괴
- 디스크에 저장
- 디스크 블록 할당 리스트 가지고 있음- 실행가능한 명령어 코드 포함
- 속성 정보 포함
- 커널에 의해 생성 및 파괴
- 커널에 의해 메모리 안에 저장(공간 할당, 어떤 프로세스가 어떤 메모리 블록을 쓰고 있는지 계속 추적)
- 메모리 페이지 할당 리스트를 저장하는 자료구조 가지고 있음그럼 우리는 어떤 프로세스들이 현재 실행중인지 어떻게 볼 수 있을까요?
ls, ps
잠시 ls와 ps 명령어를 살펴보겠습니다.
ls는 디렉토리 내에 있는 폴더나 파일들을 전부 리스트화해서 보여주는 명령어입니다.
ps는 디렉토리 내에 있는 폴더나 파일 중, '현재 실행 중인 프로세스'들과 그 프로세스들의 속성만 리스트화해서 보여줍니다.
그림으로 보면 확실히 두 명령어가 출력되는 영역이 다릅니다.
ls는 해당 디렉토리의 파일 시스템 전체, ps는 메모리의 메모리의 user space를 출력합니다.
여기서 user space란 메모리에서 실행중인 프로그램과 데이터를 저장하고 있는 부분을 가리킵니다.
따라서 ps로 user space를 보면 현재 어떤 프로세스가 실행중인지 알 수 있겠죠?
ps 명령어의 출력 항목을 볼까요?
F: 플래그
S: 현재 프로세스의 상태 코드
UID: 프로세스 소유자의 이름
PID: 프로세스 식별 번호
PPID: 부모 프로세스 PID
C: 짧은 기간 동안의 CPU 사용률PRI: 실제 실행 우선순위NI: nice 우선순위 번호ADDR: 프로세스 메모리 주소SZ: 프로세스 메모리 사이즈(KB단위)WCHAN: process가 sleeping 상태인 이유(해당 프로세스가 기다리고 있는 이벤트의 메모리 주소) sleeping 상태인 프로세스의 kernel function의 이름을 보여줌TTY: 프로세스와 연결된 터미널TIME: 시간CMD: 명령ADDR과 F는 더 이상 사용되지 않습니다.
ps 명령어 옵션도 몇 가지만 보겠습니다.
-a: 다른 사용자 및 다른 터미널에서 실행 중인 프로세스를 포함하여 나열(shell 제외)
(구글링하면 세션 리더를 제외하고 데몬 프로세스처럼 터미널에 종속되지 않은 모든 프로세스를 출력.. 이라는데 무슨말인지)
-l: long format으로 출력(PRI와 NI값 확인 가능)
-fa: 그냥 -a를 쓰는 것보다 좀더 사람이 읽기 좋은 포맷으로 출력
UID 대신 실제 username, CMD도 중간에 잘리지 않고 풀 포맷으로 출력
PID, PPID
각각의 프로세스는 자신의 process ID를 (양의 정수 형태로) 갖고 있습니다.
Process ID는 다양한 시스템 콜에 의해 사용되고 반환됩니다. 예를 들어, kill() 시스템 콜은 caller가 특정 PID를 가진 프로세스에 signal을 보낼 수 있게 해줍니다. 리눅스 커널은 PID를 32,767 이하로 제한합니다.
또 모든 프로세스들은 자신을 생성한 부모 프로세스를 갖고 있습니다. 부모 프로세스가 무엇인지는 PPID로 확인 가능합니다.PPID는 Linux-specific/proc/PID/status 파일에서 생성됩니다.
끝!
'시스템프로그래밍' 카테고리의 다른 글
[시스템프로그래밍] Process Management (0) 2023.12.13 [시스템프로그래밍] Computer Memory and Program (0) 2023.12.13 [시스템프로그래밍] Signals (0) 2023.12.12 [시스템프로그래밍] User Program (0) 2023.12.12 [시스템프로그래밍] Termianal Driver (0) 2023.12.12