PROCESS
Posts
28 posts[라즈베리파이] 스케줄링: 프로세스 상태 변화 관리
프로세스 상태 변화프로세스 상태 변화에 대해 알아보겠습니다. 프로세스 상태를 아는 것 보다 프로세스 상태가 변경될 때 세부 동작을 이해하는 것이 더 중요합니다. [1] 실행 대기 -> CPU실행 중프로세스가 생성된 다음 바로 TASK_RUNNING(실행 대기) 상태로 바뀌면서 자신을 런큐에 Enqueue 합니다. 스케줄러가 RUNNING_TASK(실행 대기) 프로세스 중에서 우선 순위가 가장 높은 프로세스를 선택한 다음 CPU에서 실행시킵니다. 프로세스가 CPU를 점유하면서 실행하기 위해서 먼저 TASK_RUNNING 상태로 변경해야 합니다. 실행 후보 프로세스 리스트가 되는 것입니다. 스케줄러에 의해 선택되기 위해 런큐에 Enqueue된 다음 실행 대기 상태를 관리하는 연결 리스트에 등록하는 것
[라즈베리파이] 스케줄링: 프로세스 상태 관리
프로세스를 효율적으로 관리하기 위해서 커널은 프로세스에게 프로세스 상태를 부여합니다. 커널에서 정의한 프로세스 상태는 다음과 같습니다.[https://elixir.bootlin.com/linux/v4.14.70/source/tools/perf/builtin-sched.c]#define TASK_RUNNING0#define TASK_INTERRUPTIBLE1#define TASK_UNINTERRUPTIBLE2 커널에서 구동 중인 프로세스는 위에서 정의한 상태 정보를 갖고 있으며 커널은 이 정보를 기준으로 스케줄링을 수행합니다. 그러면 프로세스 상태는 어디에 저장할까요?프로세스를 관리하는 태스크 디스크립터 필드 중 state는 위에서 언급한 정수형 상태 정보를 저장합니다.[https://elixir.
[라즈베리파이] 프로세스: 태스크 디스크립터(프로세스 관계)
이전 시간에 유저 공간에서 생성한 모든 프로세스의 부모 프로세스는 init 이고 커널 공간에서 생성한 커널 스레드(프로세스)의 부모 프로세스는 kthreadd라고 했습니다. 태스크 디스크립터에서는 프로세스의 부모와 자식 관계를 상세히 알 수 있습니다. struct task_struct *real_parent; 프로세스를 생성한 부모 프로세스의 태스크 디스크립터 주소를 저장합니다. struct task_struct *parent; 부모 프로세스를 의미합니다. real_parent 란 멤버는 해당 프로세스를 생성해준 프로세스를 의미합니다. 그런데 자식 프로세스 입장에서 부모 프로세스가 소멸된 경우 부모 프로세스를 다른 프로세스로 지정합니다. 프로세스 계층 구조에서 지정한 부모 프로세스가 없을 경우 in
[라즈베리파이] 프로세스: 태스크 디스크립터(프로세스 식별/프로세스 상태)
프로세스를 식별하는 멤버들을 살펴 보겠습니다. char comm[TASK_COMM_LEN]; comm은 TASK_COMM_LEN 크기 배열이며 프로세스 이름을 저장합니다. "ps -ely"란 명령어를 입력하면 다음과 같이 systemd, kthreadd 그리고 kworker/0:0H가 보입니다.root@raspberrypi:/home/pi # ps -ely1 S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD2 S 0 1 0 0 80 0 5964 7007 SyS_ep ? 00:00:02 systemd3 S 0 2 0 0 80 0 0 0 kt

