2022. 12. 13. 16:18ㆍcs일지
2022/12/12
- 학습내용
1. 프로세스와 스레드
https://leedonggu.tistory.com/26
프로그래밍 기초탄탄#9 스레드
2022/10/31 학습내용 1.스레드 프로세스(Process) 프로그램이 실행되는 상태, 컴퓨터가 어떤 일을 하고 있는 상태를 프로세스라고 한다. 즉, 사용자가 작성한 프로그램이 os에 의해 메모리 공간을 할당
leedonggu.tistory.com
2. 프로세스와 컴파일 과정
1) 전처리(Preprocessor)
단어를 보면 pre + process이다.
보통 전처리라고 하지만 좀 더 쉽게 와닿게 말하자면 그냥 말 그대로 '사전 처리' 라고 보면 된다.
전처리 과정은 전처리기(preprocessor) 에 의해 소스코드에 포함 된 매크로나 지시자 같은 것을 포함시켜준다.
즉, 소스코드의 중심(main)이 실행되기 전에 사전준비 하는 과정' 이라는 말이다.
2) 컴파일러(Compiler)
compile 이라는 뜻이 '번역하다'라는 뜻이다.
흔히 컴파일을 소스코드를 실행파일로 만드는 것으로 생각할 수 있는데, 엄연하게는 다르다.
말 그대로 '번역'하는 것일 뿐 번역 된 것만으로는 컴퓨터가 실행 할 수는 없다.
(외국어책을 번역만 해놓고 책으로 묶지 않으면 그 건 책이 아니라 그냥 번역만 한 종이일 뿐이다.)
우리가 쓰는 eclipse, Visual Studio, X Code 같은 통합개발환경(IDE : Integrated Development Environment)들은 대부분 한 번 컴파일(또는 빌드)을 하면 실행파일까지 나와버리기 때문에 오해할 수 있다.
어떤 언어로 번역하느냐. 컴파일 하는 프로그램을 컴파일러(compiler)라고 한다.
한마디로 번역가다.
컴파일러가 컴파일 하면 바로 기계어(Machine Code)로 번역 될 것 같지만 아니다.
흔히 중간언어 또는 저수준 언어로 번역된다.
보통은 어셈블리어(Assembly Language)로 번역된다.
왜 기계어로 바로 번역하지 않고 저수준 언어(low-level Language)로 번역되는지 이해가 가지 않을 수 있다.
이유는 프로그래밍의 역사를 보면 쉽게 알 수 있는데, 과거에는 0과 1로만 작업을 했어야 하다보니 엄청 불편했다.
예로들어 'A'라는 문자를 표현하려면 1000001 이런식으로 했어야 했다.
이렇다 보니 이런 것들을 부호화(Symbolic) 한 것이다.
단순히 부호화만 했기 때문에 기계어(Machine Code)와 1대1 매칭이 된다.
그렇다 하더라도 우리가 사용하는 Java, C 같은 고급언어처럼 사람이 읽기 어려운 언어인지라 저수준 언어(low-level language)에 속하게 되는 것이다.
저수준 언어답게 장점도 있다.
내부가 어떻게 작동하는지, 즉 하드웨어를 직접적으로 조작하거나 특수 프로세서 명령어에 접근 등을 확인하거나 작업을 할 수가 있다는 것이다.
즉, 인간이 기계어를 이해하기 위해 고급언어와 기계어 사이에 중간단계인 저수준 언어로 번역하는 것이다.
3) 어셈블러(Assembler)
컴파일 단계에서 컴파일러가 고급언어를 저수준 언어로 번역을 해줬다.
그러면 이 저수준 언어(어셈블리어)를 최종적으로 기계어로 번역을 해줘야 한다.
이 어셈블리어를 기계어로 번역해주는 프로그램을 어셈블러(Assembler)라고 한다.
이렇게 CPU가 이해할 수 있는 언어로 번역된 파일을 보통 Object File 이라고도 하는데, 직역하면 '객체 파일'이라고 하지만, 대부분은 객체라 하지 않고 '목적 파일'이라고 한다.
"동작의 주체가 누군지 분류하여 동일성을 갖는 기능들을 하나의 묶음으로 만들어낸 하나의 실체"
어셈블리어에서 기계어로 번역된 Object File은 여러개의 연관된 파일을 빌드하면 '링크' 단계 전까지는 각 파일별로 번역되기 때문에 그 번역된 파일 하나하나가 실행하는 최종 파일의 일부분으로서의 객체가 된다고 보면 된다.
그래서 Object 라는 단어가 붙게 되는 것이다.
그리고 컴파일 과정을 여기까지 포함하기도 한다.
Compile이라는 단어 자체가 번역이라는 의미디.
프로그래밍에서는 크게 두 가지로 해석할 수 있디.
1) 좁은 의미로는 '소스코드를 저수준 언어로 변환해주는 과정'을 의미한다.
근데 좀만 생각해보면 어셈블도 번역하는 단계다. 즉, 컴파일이라고 볼 수도 있다.
2) 좀 더 넓은 의미로는 전처리 과정부터 어셈블 과정까지를 컴파일 단계라고 부르기도 한다.
(또한 컴파일 언어의 빌드 과정에 어셈블이 없다면, 즉, 어셈블리어 같은 저수준 언어가 아닌 바로 기계어로 번역되는 경우는 어셈블 과정이 생략되고 컴파일 단계만 있다.)
4) 링커(Linker)
여러개의 오브젝트파일을 하나로 합치거나 라이브러리를 합칠때 링커가 필요하다는 거지요.
컴파일(어셈블 포함) 과정을 통해 각 파일들이 기계어로 번역되었다면 이제 하나로 연결해주어야 한다.
책을 번역할 때도 각 낱장별로 번역된 종이들을 하나로 모아 묶어야 책이듯, 각각의 Object File 은 기계가 이해할 수 있는 번역본일 뿐 실행을 할 수 있는 파일은 아니다.
즉, Object File 들과 필요한 라이브러리들을 연결 시켜주고 최종적으로 하나의 'executable file (실행가능한 파일)'로 만들어준다.
우리가 흔히 어떤 프로그램을 사용할 때 .exe 라는 확장자를 갖는 파일을 실행시킨다.
이 exe가 바로 executablue 의 줄임말이다.
※ 컴파일 4단계 과정
좀 더 포괄적으로 보면 '전처리-컴파일-어셈블' 단계를 하나의 컴파일 단계라고 볼 수 있다.
즉, 빌드와 컴파일의 차이점이 여기서 나온다.
컴파일은 번역하는 단계로 소스코드를 목적 파일(Object File)로 만들어주는 과정일 뿐 그 결과물이 실행파일은 아니다.
이 컴파일 단계에 링크 과정이 포함 되어야 즉, 빌드가 비로소 실행가능한 파일이 나오는 전체 과정을 의미하는 것이다.
아주 쉽게 말하면 '컴파일 + 링크 = 빌드' 라고 이해하면 된다..
↓ 참고 블로그
https://st-lab.tistory.com/176
프로그래밍 언어와 빌드 과정 [Build Process]
안녕하세요. 제가 이 시리즈를 작성할 때 처음 계획했던 것이 있습니다. 최소한의 프로그래밍언어에 대한 작성 방법은 알고 있다는 전제하에 프로그래밍 전반에 관한 내용을 다뤄본다고 했죠.
st-lab.tistory.com
3. 프로세스의 상태
프로세스의 상태는 여러 가지 상태 값을 갖는다.
준비 -> 실행 : Dispatch
실행 -> 준비 : Time run out
대기 -> 준비 : Wake up
실행 -> 대기 : Block
1) 생성상태 (New)
생성 상태는 프로세스가 생성된 상태를 의미하며 fork() 또는 exec() 함수를 통해 생성한다.
이때 PCB가 할당된다.
2) fork()
fork()는 부모 프로세스의 주소 공간을 그대로 복사하며 새로운 자식 프로세스를 생성하는 함수이다
주소 공간만 복사할 뿐이지 부모 프로세스의 비동기 작업 등을 상속하지 않는다
3) exec()
exec()는 새롭게 프로세스를 생성하는 함수이다
4) 준비 상태 (Ready)
준비(대기) 상태는 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기하고 있으며 CPU 스케줄러로 부터
CPU 소유권이 넘어오기를 기다리는 상태이다.
5) 준비 중단 상태 (Ready Suspended)
준비(대기) 중단 상태는 메모리 부족으로 일시 중단된 상태이다.
6) 실행 상태 (Running)
실행 상태는 CPU 소유권과 메모리를 할당받고 인스트럭션을 수행중인 상태이다.
이를 CPU burst가 일어났다고도 표현한다.
7) 중단 상태 (Blocked)
중단 상태는 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태이다.
I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생한다.
예를들어 프린트 인쇄 버튼을 눌렀을때 프로세스가 잠깐 멈춘 듯할 때 그때가 바로 이 상태이다.
8) 일시 대기 상태 (Blocked Suspended)
일시 중단 상태는 준비(대기) 중단과 유사하다.
중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태이다.
9) 종료 상태 (Terminated)
메모리와 CPU 소유권을 모두 놓고 가는 상태를 말한다.
종료는 자연스럽게 종료되는 것도 있지만 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료 (Abort)로 종료되는 것도 있다.
자식 프로세스에 할당된 자원의 한계치를 넘어서거나 부모 프로세스가 종료되거나 사용자가 process.kill 등
여러 명령어로 프로세스를 종료할 때 발생한다.
4. 프로세스의 메모리 구조
프로그램이 실행되면 프로세스는 각 메모리 공간을 시스템으로부터 할당 받는다.
메모리는 code(text), data, heap, stack 영역으로 구성되어 있다.
1) 스택
지연변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
함수 호출 시 할당되고 함수 반환 시 소멸된다.
로드 시(컴파일 타임) 크기가 결정된다.
code, data, heap 세 영역은 컴파일 할 때 data, stack 영역의 크기를 계산해 메모리 영역을 결정한다.
2) 힙
동적 데이터 영역이다.
메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
따라서, 프로그램 동작 시(런타임)에 크기가 결정된다.
예를 들어, stack에서 pointer 변수를 할당하면 pointer가 가리키는 heap 영역의 임의의 공간부터 원하는 크기만큼 할당해 사용하게 된다.
3) 데이터영역
전역변수와 정적변수가 저장된다.
이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸된다.
더 자세히 들어가면 BSS(Block Stated Symbol) 영역이 있는데, 이 영역에는 초기화 되지 않은 전역변수가 저장된다.
초기화 된 전역변수는 Data 영역에 저장되어 비휘발성 메모리인 ROM에 저장되는데 이 부분은 비용이 많이 들어 RAM에 저장될 것과 ROM에 저장될 것을 구분하기 위해 영역을 구분해 사용한다.
4) 코드영역
실행할 프로그램의 코드가 저장된다.
CPU는 이 영역에서 명령어를 하나씩 가져와 처리하게 된다.
'cs일지' 카테고리의 다른 글
cs 전공지식 #32 운영체제 - 스레드, 멀티스레딩, 교착상태 (1) | 2022.12.15 |
---|---|
cs 전공지식 #31 운영체제 - PCB, 멀티 프로세싱 (0) | 2022.12.13 |
cs 전공지식 #29 운영체제 - 페이지 교체 알고리즘 (0) | 2022.12.11 |
cs 전공지식 #28 운영체제 - 메모리 관리 (0) | 2022.12.09 |
cs 전공지식 #27 운영체제 - 메모리 (0) | 2022.12.09 |