아 뭐.. 제목은 아주 거창한데요...


  실질적인 내용은 아주 조금입니다.


  이전에 한번 얘기했던  ACPI 모드 중에서 suspend 혹은 hibernate 모드 상태로 들어가기 위해서 


  커널은 프로세스들을 가장 안정한 상태로 만들 필요가 있습니다.


 쉽게 얘기하면 프로세스가 디바이스와 프로토콜에 따라서 통신중에 suspend 모드로 들어가게 되면


 이후에 프로세스는 깨어날때 중단되었던 프로토콜을 계속 진행하려 하지만 상대는 이미 타임 아웃 처리가 되었으니


 응답할리가 없겠죠.


 이런 것들을 피하기 위해서 커널은 프로세스들을 모두 freeze 시켜 버립니다.


 커널 태스크 플래그에는 이와 관련된 플래그와 상태가 있는데 상태는 4가지가 잇습니다.


 PF_NOFREEZE


 PF_FROZEN


 TIF_FREEZE

 

 PF_FREEZER_SKIP (the last one is auxiliary)



 일단 커널에서 freeze 를 시도하게 되면 상태 플래그를 점검합니다.


 그것이 PF_NOFREEZE  인데   쉽게 얘기하면 freeze 가 가능한 프로세스냐 아니냐를 알려줍니다.


 가능하다면 freeze 를 시도하겠죠?


 freeze 가 되면 어떤 상태로 빠질까요?


 플래그에 TIF_FREEZE 를 셋해줍니다.


 그렇게 처리한 후에 해당 프로세스를 실행시켜 주면 


 해당 프로세스는 자기가 freeze 되어야 하는 것을 알고


 아직 처리 못한 일들을 처리한 후에 자기의 상태를 TASK_UNINTERRUPTIBLE  로 바꾸고 


 PF_FROZEN 상태가 풀릴때까지 무한 루프를 돌면서 schedule 을 호출하게 됩니다.


 이 상태가 frozen 되었다고 부릅니다.


 이렇게 만드는 것은 freezer 라고 하겠죠?

 

 간단하게 설명하려 했는데 그렇게 간단하지는 않을지도 모르겠습니다.


 freeze 가 뭔지 궁금했는데 사실 알고 보면 별거 아니죠? 


 무한 대기 하며 schedule 을 호출하고 있는 것이니까요


 소스는 kernel/power 에 관련된 소스가 있고 위에 대한 설명은 역시 커널 다큐먼트를 읽어 보시면 좋습니다.


 Documentation/power/freezing-of-tasks.txt


 이만...