티스토리 뷰

728x90

 안녕하세요! 오늘은 리눅스의 프로세스에 대해 알아보겠습니다! !

1. 프로세스의 정의

 프로세스란 프로그램이 수행되고 있는 상태를 의미합니다. 따라서 프로그램 != 프로세스 != 프로세서 인거죠. 그럼 각각의 정의를 알아보겠습니다!

  1.  프로세스 (Process) : 프로그램이 실행중인 상태
  2.  프로그램 (Program) : 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체
  3.  프로세서 (Processor) : 프로그램들이 실행할 수 있도록 해주는 하드웨어

프로세스는 두가지 abstractions있습니다.

  1. 혼자 CPU를 독자적으로 수행하는 것 같은 착각
  2. 시스템 메모리를 프로그램 혼자 쓰는 것 같은 착각

이러한 현상은 여러개 프로세스를 빠르게 스위칭하고 가상 메모리 시스템에서 관리하는 주소 공간이 있기 때문에 발생합니다.

 

2. 프로세스 진행 방식

 프로세스 진행방식을 알려면 context switching에 대해 알아야합니다! context switching이란 현재 진행하고 있는 프로세스의 상태를 저장하고 다음 진행할 프로세스의 상태 값을 읽는 과정입니다. context switching은 다음의 그림과 같이 작동합니다.

3. 프로세스 상태(Process States)

프로세스의 상태는 총 6개입니다.

  1. Running : 프로세스가 CPU를 사용하고 있는 상태
  2. Runnable : 프로세스가 곧 CPU를 사용할 수 있도록 만들어놓은 상태 (준비 상태)
  3. Sleeping : 이벤트가 일어날때까지 기다리는 상태 (ex. read() 시스템 콜 발생)
  4. Suspended : SIGSTOP과 같은 signal에 의해 프로세스가 멈춰있는 상태 (ex. Ctrl+Z)
  5. Idle : fork() 시스템 콜로 프로세스가 방금 만들어진 상태. 아직 runnable 하진 않다.
  6. Zombified : 프로세스가 종료(terminated)되었지만 아직 부모(parent) 프로세스에 exit code가 전달되지 않은 상태

다음의 프로세스 상태는 프로세스가 어떤 방식으로 이루어지는지 그림과 함께 보면 이해가 쉽습니다. 

4.  프로세스 구성 (Process composition)

  모든 프로세스는 여러개의 영역(Area)에서 수행됩니다. 총 6개의 역역이 있습니다! 6개의 영역을 프로그램이 사용하고 접근할 수 있는 부분과 kernel에 속하는 부분 2개로 나눌 수 있습니다!

 

<프로그램이 사용하고 접근할 수 있는 부분>

  1. code area : 메모리에 탑재된 프로그램이 text로 있는 부분
  2. data area : 프로그램이 돌면서 변수나 동적할당 받은 메모리가 있는 부분
  3. stack area : 함수 호출할 때 쓰이는 stack 부분

<kernel에 속하는 부분>

  1. user area : 해당 프로세스에 대한 정보가 있는 부분
  2. page tables :사용하는 메모리에 대한 정보

5. 프로세스 테이블 (Process Table)

 프로세스 테이블은 시스템의 모든 프로세스에 대한 총괄적인 정보가 담겨있는 데이터 구조입니다. 프로세스 테이블은 커널의 데이터 영역에 생성되며 커널에서만 접근할 수 있습니다. 프로세스 테이블에는 다음 정보가 포함되어있습니다.

  1. 프로세스 ID (PID), 부모 프로세스 ID(PPID)
  2. 사용자 ID (UID) 및 그룹 ID(GID)
  3. 프로세스 상태(Process state)
  4. 코드, 데이터, 스택 및 사용자 영역의 위치
  5. Signal 목록

6. 프로세스 관리

 Linux가 켜지면 init 명령어가 실행되면서 첫 프로세스가 실행됩니다. 그 프로세스의 ID (PID)는 1입니다. 1번 프로세스를 복사(fork())하고 복사한 프로세스의 내용을 바꿔서(exec()) 프로세스를 진행합니다. 부모 프로세스의 (PID, PPID, runtime)을 제외한 내용을 복사합니다. 자식 프로세스는 부모 프로세스의 PID,PPID, runtime을 제외한 모든 내용이 똑같습니다. 이런 프로세스를 exec()명령어를 이용해서 코드 내용을 다른 파일의 내용으로 바꿔치기합니다!! 자식(child) 프로세스에서 복제(fork())하고, 코드 내용을 바꿀 (exec())동안 부모프로세스는 기다리는 상태가 됩니다. 다음은 위의 글을 그림으로 표현한 것입니다.

 다음 포스팅에서는 프로세스 관련 예제를 다루겠습니다!

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함