자! 운영체제에 대해서 공부해봅시다! :)
코딩 문제 풀이에서는 항상 반말로 했지만 CS전공 관련 내용들은 존댓말로 할까 합니다! (조금 어색ㅎ)
평소 살아가면서 학교 수업 외에는 프로세스와 스레드에 관련된 내용은 들어보지 못했을 겁니다.
저 또한 그래요.. 누가 친구들한테 프로세스는 메모리에 할당 되는 건데 그건 각각의 스레드로 .. 뭐 이런말 하면
어쩌라고? 하겠죠? ㅎㅎ
일상에서 쓰이지 않는 이 단어들은 저희는 알아야 해요~ 왜냐하면 컴퓨터를 배우니깐요!
서론이 조금 길었네요! 한번 차근차근 알아봅시다!
먼저, 프로세스에 대해서 한번 얘기해볼테니까 천천히 읽어봐요~
여러분들이 노트북을 펼쳐서 전원 버튼을 누르게 되면 제일 먼저 뜨는게 뭐죠??? 그쵸 바탕화면이죠??
바탕화면에 여러파일들이 있을겁니다!! 인터넷이나 워드, visual 등등 .. 프로그램이 존재할텐데
이 프로그램들은 하드디스크에 저장되어있어요
보통 256GB, 512GB, 1테라 등 다양할텐데 이 프로세스는 하드디스크와는 조금 별개의 내용입니다ㅎㅎ
이 프로세스는 램 (RAM) 이라는 저장공간에 담겨집니다.
즉, 메인메모리입니다!
메모리는 보통 하드디스크보다 작은 용량을 가지고 있는데 시스템 정보에 들어가면 몇 기가인지 확인 하실수 있어요!
저는 16GB를 사용하고 있습니다~
그래서!! 이 메인메모리와 프로세스가 무슨 연관성이 있는데?!
앞서 언급드렸듯이 프로그램들은 하드디스크에 존재하는데 이때 저희가 visual studio라는 프로그램을
실행시켰다고 가정해봐요!
visual studio를 실행시키면 컴퓨터에 있는 CPU나 memory등이 이 프로그램에게 할당되게 됩니다.
이때 CPU는 프로그램의 코드를 실행시키는 역할을 하고, memory는 그것을 불러오는 역할을 해요.
" 즉, 프로그램으로 존재하고 있다가 실행시키면 실제 램이라는 메모리 공간에 할당 되어 CPU가 접근할 수 있는 상태를 프로세스라고 합니다! "
프로그램과 프로세스의 차이 뭔지 아시겠나요??!
좀 더 구체적으로 볼게요! 알아요.. 복잡한 그림 싫어하는거ㅎ 그치만 보셔야합니다. ㅡ.ㅡ
위의 그림을 보시면 프로세스 안에 블럭 처리 되어있는 부분은 Process의 영역이에요.
각각의 프로세스는 서로 독립된 공간을 가지고 있는 게 보이나요??
하나하나 같이 살펴봐요!
Code 는 프로그램을 실행시키잖아요? 그러면 파일 내에 명령어들이 존재 하는데 이 명령어들을 메모리 상에 올려놔야해요. 즉, 명령어들이 존재하는 공간이 Code랍니다.
Heap 은 C의 malloc 또는 C++ new 라는 키워드를 써서 동적할당 하는 코드를 써본 경험이 있을거에요. 즉, runtime 시간에 동적할당을 위해 존재하는 공간이 Heap 입니다
Data 는 크게 data영역과 bss영역이 존재하는데 전역/정적변수, 배열, 구조체 등이 위치하는 공간으로 초기화 한 데이터는 data 영역에 속하고, 초기화 되지 않은 데이터는 bss영역에 저장된다고 보시면 됩니다!
Stack 은 함수를 호출할 때 해당 함수에서 사용되는 지역변수와 매개변수, 리턴 값 등 잠시 사용되었다가 없어지는 데이터를 저장하는 공간이 Stack 입니다~
어떤 느낌인지 감이 오시나요?!
이렇게 프로그램을 실행시키기 위해서는 메모리에 process를 위한 공간이 필요한거죠!
자! 그러면 CPU를 아까 언급드렸었는데 CPU가 어떤건지 어느정도 아시는 분도 계실거에요
하지만 처음 입문하시는 분들을 위해서 간단하게 소개드리자면,
저희가 프로그램을 실행시키게 되면, 메모리에 위치하게 되어 프로세스가 된다라고 설명 드렸잖아요?
이러한 프로세스를 메모리에만 올려놨다고 되는게 아니에요!
CPU라는 놈이 메모리에 존재하는 여러 프로세스를 계속 돌아보면서 처리 하는 역할을 합니다!
근데 이 CPU는 눈이 하나라서 하나의 프로세스만 들여다 볼 수 있어요. 근데 그 속도가 어마어마한거죠..
얼마냐 빨리 움직이냐?
만약 어떤 사람이 눈을 감는데 0.000000000001초로 감았다가 뜨는 사람이 있다고 칩시다!
근데 우리가 그 사람이 눈을 감았는지 알 수 있을까요? 아마 모를거에요
이처럼 CPU는 엄청난 속도로 여기저기 프로세스를 돌아보게 되는거죠!
즉, 유튜브에서 멜론을 여러개 켜놓고 틀어도 노래가 동시에 흘러나오는 것처럼 느끼는 거죠
그렇다면.. 여기서 CPU라는 놈은 프로세스를 여러군데 돌아봐야 하는데 어떻게 프로세스의 위치를 알고 해당 프로세스를 들여다 보는걸까요??
또 머리 아픈 표를 하나 들고 올게요.. 이게 마지막이니까 조금만 참으세요ㅎㅎ :)
<PCB (Process Control Block)>
Process id |
Process state |
Program counter |
Scheduling information |
Memory related information |
Accounting information |
Status information related to I/O |
저게 뭐지...? 하시는 분들 계실거에요~ 일단 저런게 있구나 하고 넘어가주세요
PCB(Process Control Block)란 운영체제가 프로세스를 제어하기 위해서 정보를 저장해 놓고, 프로세스의 상태 정보를 저장하는 구조체라고 보시면 돼요. 이 PCB는 프로세스 생성시 만들어지고 메모리에 저장되어 있답니다!
아직 무슨말인가 싶죠..?
자! CPU가 여러 프로세스를 번갈아 돌아보게 되는데 CPU는 한번에 하나의 프로세스만 볼 수 있다고 했잖아요??
그렇다면 하나의 프로세스를 보는 시간이 정해져있고 해당 시간이 끝난다면 다른 프로세스로 교체해야 합니다.
이때 PCB에 저장되어 있는 정보들을 이용해서 다른 프로세스로 교체를 도와줄 수 있는거죠.
이러한 프로세스를 교체하는 것을 "Context Switching (문맥교환)" 이라고 불러요!
CPU 내부에는 PC(Program Counter), SP(Stack Pointer) 같은 레지스터들이 존재하는데,
이러한 레지스터들에게 PCB의 정보를 꺼집어내서 활용을 하다가 다른 프로세스로 교체될 때 갱신 된 내용들을 다시 집어 넣어줍니다.
예를 들자면, 프로세스 "배씨" 가 존재하구요. "배씨"는 자신의 정보를 적어놓은 수첩 하나가 있어요
"배씨"는 옷을 입어야 하는 과정을 CPU에게 부탁을 합니다.
CPU라는 놈이 "배씨"를 불러요!
CPU : "너 누구였지?? 익순한 앤데..? 정보 수첩 좀 줄 수 있겠니??"
배씨 : "나 기억 못해? 바보야? 알았어 줄게"
CPU : "아 너 그때 걔구나, 저번에 왼쪽 양말까지 신었네. 오른쪽 양말 신겨야겠다~"
. . .처리중. . .
CPU : "뭐야!! 시간 다 됐네.. 이제 나가 "
배씨 : "아니 이번엔 오른쪽 양말 신기고 나가라는게 어딨어! 자켓도 입어야한다고! "
CPU : "시간 다 됐잖아! 너 정보 수첩 줘봐 거기다가 내가 어디까지 했는지 적어놓을게"
이때 배씨가 들고있는 정보 수첩은 PCB에 해당되고 CPU는 그 정보들을 CPU 내부 레지스터에 넣어서 수행하다가 CPU의 할당시간이 끝나버리면 갱신된 내용들을 수첩에 다시 적어주는 거죠.
조금 이해가 가시나요??
아까 위에서 PCB 정보를 담는 표를 보여드렸잖아요??
Process id 에 들어가있는 정보는 "배씨" 가 되는거고 명령어 포인터인 Program counter 에는 "오른쪽 양말 신기기" 라는 명령문의 주소지를 담고 있었을 겁니다. 이러한 과정이 엄청난 속도로 진행 된다고 보시면 돼요!
근데 여기서 Process라는 놈은 독립적인 공간을 갖고 있다고 말씀 드렸잖아요?!
그렇다면 각각 서로 다른 정보들을 가지고 있을 것이고 문맥교환이 일어날 때 CPU라는 놈은 계속
정보들을 다 바꿔줘야 하겠죠??
만약 서로 공유하는 공간이 있으면 문맥교환이 가벼워질거 같지않나요??
다음 글에서는 프로세스 내에 공유공간을 가지면서 독립된 공간을 가지는 "스레드" 라는 놈에 대해서 알아볼까 합니다 :) 감사합니다!
2022.03.10 - [* CS 질문] - [운영체제] 프로세스란 무엇인가 (추가내용)
'남이 읽는 CS > 운영체제' 카테고리의 다른 글
[운영체제 6편] 유저모드 커널모드 (3) | 2022.04.03 |
---|---|
[운영체제 5편] 데드락이 무엇인가 (4) | 2022.03.22 |
[운영체제 4편] 세마포어가 무엇인가 (5) | 2022.03.15 |
[운영체제 3편] 뮤텍스가 무엇인가 (3) | 2022.03.08 |
[운영체제 2편] 스레드란 무엇인가 (4) | 2022.03.05 |
댓글