}

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate on the chrome↓↓↓===***===>

2020년 8월 29일 토요일

리눅스 idle process 란 자세히!

안녕하세요 마무입니다. 오늘은 "리눅스 모듈이란", "리눅스 부팅 과정", "idle process", "swapper", "드라이버란", "pid 0", "kswapd"에 대해서 매우 자세히 포스트해보겠습니다.

오늘 이 포스트를 다 읽을시

리눅스 모듈, swapper 프로세스와 idle process, pid 0, kswapd

에 대해서 정확하게 아시게 되실겁니다!


*이해에 필요한 선행 지식*
1. 프로세스란, 데몬과 서비스, 파일이름 끝에 d란, 웹서버와 브라우저 개념 살짝
2. 부팅 과정(ROM, 펌웨어, BIOS, POST, MBR, 부트로더, 부트스트랩)
****************************


--목차--

1. 최초의 프로세스를 실행시킬 때까지의 과정
i)리눅스 부팅 과정
ii)모듈(드라이버)이란 
iii)idle process(swapper, PID 0)란
iv) 리눅스 swap을 해주는 kswapd

2. Centos(RedHat)의 최초의 프로세스 init(6.9이하), systemd(7.0이상) 차이

--------


여기서 못 찾은 정보는
리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html
운영체제 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_14.html
에서 찾아보세요!





1. 최초의 프로세스를 실행시킬 때까지의 과정

자 저희는 지난 포스트를 통해서 "PC(Personal computer)들의 부팅 순서""GRUB"에 대해서 알았습니다. 이번에는 저번에 배웠던 내용을 포함한 "리눅스 부팅 과정"에 대해서 설명을 해보겠습니다.


i)리눅스 부팅의 과정 



1. 메인보드에 전력이 들어온다.

2. "BIOS"가 실행되고 "POST"를 한다

3. 디스크의 "MBR"에서 부팅정보를 가져오는" 부트스트랩"이 실행된다.

4. 부트스트랩 과정으로 "부트로더(GRUB)"가 메모리에 올라가 실행된다.

5. 부트로더(GRUB)는 "운영체제(커널)"을 메모리에 올리고 제어권을 넘긴다.

6. "커널(운영체제)"은 "/etc/modprobe.d/"에 있는 설정파일에 적혀있는 모듈들을 커널에 적재하고 그 외 필수적인 장치들을 실행한다.

7. 그 다음 커널은 "The idle process(swapper, PID 0)"과 "스케줄러", 모든 프로세스의 조상 "init(또는 systemd)"을 실행한다.


일단 과정은 이렇습니다만 당연히 "모듈"이나 "idle process"와 같은 단어는 많이 생소할 수도 있기에 설명하고 넘어가겠습니다!

아 참고로 "모듈"은 배워야할 내용들이 은근 많고 중요한 파트이므로 여기는 간단히 설명하겠으며, 더 자세하게는 다른 포스트에서 다루겠습니다.


ii)모듈(드라이버)이란 



모듈(module)이란 "어떤 전체 시스템에 속할 수 있으며, 독자적으로 분리될 수 있는 부분"을 말합니다. 뭔가 단어의 뜻을 보면 이해가 될듯 말듯 싶으실텐데, 쉽게 그냥 "다른 부품으로 바꾸기가 가능한 부분"입니다. 

뭐 자동차의 바퀴 같은 것을 떠올리면 이해가 쉬우실 겁니다.

그리고 컴퓨터의 "그래픽, 사운드 드라이버"와 같은 드라이버가 바로 이런 "모듈"에 해당합니다.

원래 운영체제(커널)가 제대로 컴퓨터 하드웨어를 사용하기 위해선 당연히 특정 하드웨어를 위한 코드(드라이버)가 있어야합니다.

하지만 이 세상에 정말 수~~~많은 컴퓨터 부품들(그래픽 카드, 사운드 카드, 마우스, 프린터 등등)이 있는데 그런 부품들 하나하나에 맞는 모든 코드를 커널안에 포함시키는 것은 거의 불가능하며 운영체제 프로그래머 입장에선 지옥이겠죠...

그래서 커널(운영체제)를 만들 때는 최소한의 드라이버들만 포함시키고, 대부분의 "드라이버"는 각 컴퓨터 부품(그래픽 카드, 사운드 카드, 마우스 등등)을 만드는 회사들이 알아서 만들기로 했습니다.

그리고 각 컴퓨터 부품에 필요한 드라이버가 있으면 따로 다운로드한 다음 커널(운영체제)에 포함시키는 겁니다. 

그림을 보시죠!





이런 느낌으로 커널을 만들 때, 각 컴퓨터 부품에 맞는 드라이버 자리용 공간을 마련해두고




이렇게 자기 컴퓨터 부품에 맞는 드라이버를 설치해서 커널이 사용하게 하는 느낌이라는 것이죠!

이렇게 드라이버와 같이 커널에 포함했다 뺐다 할 수 있는 것을 "모듈"이라고 하는 것이고, "리눅스"에선 이런 "모듈"들을 "리눅스 커널"과 합치거나 제거할 때 사용하는 명령어들이 있습니다. 하지만 그건 다른 포스트에서 다루도록 하고 여기선 "모듈"의 개념까지만 이해하고 넘어갑시다.


iii) idle process(swapper, PID 0)란 



운영체제에는 "Idle process(task)"라는 프로세스가 있습니다. 이녀석은 "PID 0번"을 가지며 "swapper"라고도 불립니다.

"swap(메모리가 부족할 때 디스크를 대신 쓰는 공간, 가상메모리)" 용어를 아시는 분들은 이 이름을 보고 "swapping(프로그램을 메모리<->디스크로 옮기는 행위)"을 해주는 녀석이라 "swapper"라 하는거군!  하면서 생각을 하실텐데..(저도 그랬었습니다..)

이상하게도 "swapper"는 "swap"과 관련이 1도 없습니다... 그럼 왜 "swapper"라 부르느냐?
거기엔 유닉스의 역사적인 이유가 있습니다.

"swapper"란 명칭은 과거 유닉스에서 사용되던 것으로 이름에 걸맞게 실제로 "swap"에 사용이 됐습니다. 하지만 시간이 지나자 "demand paging(가상메모리 관리 기술중 하나)"사용하는 유닉스 운영체제에 적합하지 않기에 1990년도부터 사용을 안하게 됐습니다.
(출처 : https://superuser.com/questions/377572/what-is-the-main-purpose-of-the-swapper-process-in-unix)

그리고 리눅스에선 원래 "PID 0번 프로세스"를 유닉스와 다르게 "Idle process(task)"라고 부르고 사용했습니다. 하지만 유닉스와 리눅스가 비슷한 점이 많다보니 "swapper"라는 이름을 리눅스에서도 간혹 사용하는 사람이 있었나봅니다.

하지만 정확힌 "Idle process"가 맞는 표현으로, 여기서 "idle"이란 단어의 뜻 "활동이 없는, 어떠한 목적이 없는, 게으른"처럼 이 "idle process"실행될 프로세스가 아무것도 없는 상황을 방지하기 위해 존재하는 "가장 낮은 우선순위를 가진 프로세스"입니다

자료구조나 운영체제를 아직 공부를 못 해보신 분들은 이해가 좀 힘들 수 있겠지만 원래 "운영체제"는 프로세스들에게 우선순위를 매긴다음 우선순위대로 차례차례 실행(CPU할당)합니다.  그리고 이렇게 실행되기를 기다리를 프로세스 대기 공간을 "큐(queue)"라고 합니다.

그런데 만약에 큐(프로세스 대기공간)안에 실행될 프로세스가 없는 경우가 발생하면 어떻게 될까요?

프로그래밍을 안해보신 분들은 공감을 못하시겠지만, 그냥 없으면 없는거지~ 하고 이런 상황을 프로그래밍에선 쉽게 넘어갈 수가 없습니다.

모든 경우의 수에 대한 프로그래밍을 하지 않으면, 특정 상황에 버그에 걸릴 것이고 이것이 단순한 프로그램이 아니라 "운영체제"의 버그라면 심각한 문제가 되겠죠(다른 프로그램이 버그에 걸리면 운영체제가 강제 종료하지만, 운영체제 문제라면 전원을 뽑아야...)

그리고 보통 이런 경우의 수를 대비한 프로그래밍은 쉽지 않으며, "운영체제"라 더더욱 복잡해질겁니다. 그래서 그냥 "실행할 프로세스가 없는 경우의 수"를 "idle process"이용해 없앤겁니다. 

프로그래밍은 간단할수록 좋으니까요

그래서 이 "Idle process(task)"란 "아무런 프로세스가 없는 상황"이 생기면 실행되고, 또한 "CPU의 low-power(절전)모드"때 실행(메모리에 있는 프로세스들을 디스크로 옮기니까 프로세스가 없다)된다고 합니다.

그럼 이런 질문이 분명 다들 생각나실겁니다.


iv) 리눅스 swap을 해주는 kswapd 



그러게요.. "swapper"라는 녀석은 사실상 없고, "PID 0"인 "Idle process"는 위에서 말했듯이 아무런 프로세스가 없을 때나 절전모드(메모리에 있는 프로그램들을 가상메모리{swap공간}에 옮겼을 때)사용한다면

누가 "swap(메모리<->디스크공간)"을 해주냐는거죠.

그건 이제 리눅스에선 "Kernel Swap Daemon(kswapd)"이란 녀석이 해줍니다.





이렇게 아직은 안 배웠지만 실행되고 있는 프로세스중 "swap"이란 이름의 프로세스를 보여달란 명령어를 치니, "swapper"란 놈은 없고 "kswapd0"이란 위에서 말한 "kernel swap daemon"이 실행되고 있는 것을 볼 수 있습니다.

밑에 "grep --color=auto swap"은 방금 저희가 실행한 명령어 "ps aux | grep swap"에서
"grep swap" 명령어 부분입니다.

어? "ttm_swap"은 무엇인가요??

원래 "TTM(Translation Table Maps)"이란 이제 다양한 종류의 GPU(그래픽 카드)의 메모리 타입을 위해 고안된 "그래픽카드 메모리 관리자" 입니다.

그리고 "ttm_swap"이란 GPU 메모리를 swap할 때 사용하는 thread(독단적으로 실행되는 프로그램속 가장 작은 단위의 명령어)입니다.

GPU에도 swap을 사용합니까???

NVIDIA의 개발자 답변을 보면 "리눅스에서 사용되는 pascal 이나 volta 그래픽 카드는 사용할 수 있다" 라고 합니다.
https://forums.developer.nvidia.com/t/gpu-swapping/61192



2. Centos(RedHat)의 최초의 프로세스 init(6.9이하), systemd(7.0이상)


설명이 길어졌는데, 어쨌든 1-i)에서 설명한 것처럼 일련의 부팅 과정이 끝나면, "커널"은 드디어 최초의 프로세스(Init, systemd)를 실행 시킵니다.

그런데 참 아쉽게도... "Centos(Redhat)"에선 "6.9미만 버전""7.0이상 버전"은 최초의 프로세스 개념이 많이 다릅니다.

"init"과 "systemd"로 이름뿐만 아니라 리눅스 내 디렉토리 위치도 완전히 달라지고 심지어 작동하는 매커니즘도 많이 달라졌습니다.

그리고 나중에 배우겠지만 프로세스 관리하는 데 사용하는 명령어 또한 완전히 달라졌죠..

그래서 "init"과 "systemd" 각각 설명할게 다르고 많기에 각자 다른 포스트로 설명해야할 것 같습니다.

"리눅스마스터 시험"에선 아직까진 "6.9"미만인 "init"에 대해서 물어보지만, 나중에 7.0이상인 "systemd"으로 바뀔지도 모르는 일이니까요...



이번에도 꽤나 포스트 하느라 많이 힘들었네요.. 도움이 되셨다면 좋아요와 팔로우 클릭, 따뜻한 댓글을 달아주시면 저에게 아주 큰 힘이 됩니다!!!

그럼 다음에 더 좋은 포스트로 찾아뵙겠습니다.


댓글 2개:

#1 여러분들이 소중한 시간을 투자해 달아주시는 따뜻한 댓글들은 저에게 정말 큰 힘이 됩니다!

#2 저의 각 포스트들은 엄청난 노력과 시간 투자를 통해 만들어진 포스트들로, 무단 복제나 모방하는 것을 금지합니다.

#3 저의 포스트에도 틀린 정보가 있을 수도 있습니다. 그럴 경우 친절한 말투로 근거와 함께 댓글로 달아주시면 정말 감사하겠습니다!

* 바쁜 개인 일정으로 댓글 답변이 많이 느립니다 *