
우리가 흔히 아는 컴파일 과정이 있다.전처리 > 컴파일 > 어셈블 > 링크 > 실행파일 생성이중에서도 실행파일의 PE포맷을 짧게 알아보고 실행파일 조작을 어떻게 하는지 알아보자. obj파일 생성과 분석우선 .obj이 어떻게 생성되는지 부터 보도록하자.#include using namespace std;int main(){ int a = 10; return 0;}위처럼 코드를 작성해주고 PowerShell을 켜준다. (본인은 직접 .obj파일을 생성하고 링크할 것이다) cl /c main.cpp위 명령어를 통해 .obj파일을 뽑아내준다. (물론 중간에 전처리, AST, IR등 어렵고 복잡한 단계를 거쳐서 .obj파일이 생성된다. 이부분은 다음에 글을 쓰도록 하겠다) 생성한 main.obj을 그냥 열면 알수..

Floating Point는 글자 그대로 해석하면 '떠 있는 점'이고 다른 말로하면 '부동 소수점'이다.부동 소수점이 뭔지 IEEE 754는 또 뭔지 알아 보도록 하자.다른 인터넷글을 찾아보면 부동 소수점에 대한 설명이 불친절? 하다고 느껴서 본인이 공부한 것을 좀 쉽게 풀어서 정리하려고 한다. 그리고 123.125f의 메모리를 까보면 00 40 f6 42가 나오는데 왜 값이 이렇게 나오는지와 에디안에 대해서도 짧게 알아보자. IEEE 754와 float단정도우선 어디서 한번쯤 들어봤을 법한 IEEE 754가 무엇인지 알아보자. (보통 I 트리플 754라고 발음하는 것 같다)'IEEE 754는 컴퓨터가 부동 소수점 수를 이진수로 어떻게 표현하고 연산할지를 규정한 국제 표준이다.' 그럼 IEEE 754라..

스레드(thread)란?'실행의 단위, 프로세스를 구성하는 실행 흐름의 단위를 뜻한다.' 실행의 흐름 단위가 1개라면 단을 프로세스, 실행 흐름의 단위가 여러개라면 멀티 스레드 프로세스이다.실행에 필요한 최소한의 정보만(프로그램 카운터, 레지스터, 스택)을 유지한체 프로세스의 자원을 공유하여 실행한다. 스레드가 왜 필요할까?윈도우 OS 기준 멀티 프로세스 기반 OS이다.즉 여러개의 프로세스를 실행할 수 있는데 여러개의 프로세스를 실행할 때 '컨텍스트 스위칭'이 발생한다.컨텍스트 스위칭(CS라 하겠다)을 간단하게 말하면 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정을 뜻한다.이 CS는 아무리 못해도 1초에 수십번 발생하기 때문에 성능저하의 원인이 된다.(멀티 프로세스 기반 OS의 최대 단점중 한가지..

스택 프레임이란?쓰레드의 실행 문맥(Context)를 제공하는 스택의 추상화입니다.다른 말로는 함수의 호출 정보를 저장하는 자료구조이고, 이 자료구조는 스택형태로 되어 있습니다.스택 프레임에는 함수로 전달되는 매개 변수(인수)와 지역변수, 함수 호출을 마치면 돌아올 복귀 할 주소 등의 정보들이 들어갑니다. 스택프레임 형성 과정이런식으로 호출을 하는 경우 대~충 아래처럼 스택이 쌓입니다.sp(stack pointer)이라는 레지스터는 변수가 하나씩 할당될 때마다 증가하는데 증가하면서 다음 변수가 할당될 메모리 위치를 가르키게 됩니다.함수가 호출이 종료되고 나서 돌아갈 곳을 기억하기 위해서 fp(frame pointer) 라는 레지스터를 사용을 합니다.즉, sp가 돌아갈 위치를 fp가 기억을 해주는 방식입니..
![[CS] 가상 메모리와 페이징](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbBLaRX%2Fbtsq5bicf3n%2FAAAAAAAAAAAAAAAAAAAAADYrf-w8WXSrTosFMiSJxLY8SJnrbGhXJdrx8NLzIgIi%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DnjJr0EivdNYqLzjK41v3989nmtw%253D)
이번글은 페이징에 대한 글입니다. 이전에 https://cjbworld.tistory.com/36 스와핑에 대해서 설명하던 도중 '외부 단편화'를 해결하는 방법으로 잠깐 소개했었는데요, 이번글은 외부 단편화를 해결하기도 하고 메모리 보다 큰 프로세스를 '적재' 할 때에도 사용되는 '가상 메모리'에 대한 정리글입니다! 가상 메모리란? 가상 메모리는 실행하고자 하는 프로세스의 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 도 큰 프로세스를 실행할 수 있게하는 기술 입니다. 이런 가상 메모리를 관리하는 기법 중에는 크게 '페이징'과 '세그멘테이션'이 있지만 페이징에 대해 알아보도록 하겠습니다. 아무튼 가상 메모리를 관리하는 기법인 '페이징'을 사용하는 외부 단편화 문제와 물리 메모리의 크기보다 더 큰 프..
![[CS] 스와핑(Swapping)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FPU6Dv%2FbtsqESwHs6x%2FAAAAAAAAAAAAAAAAAAAAACcoYmYwJq_TSks2U1kAU-hyJLj6FyRznuOpp4O1vlpi%2Fimg.gif%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3D9C8LODDlZfFjwEzlFi3q8wgPKPg%253D)
이번글은 주기억 장치인 메모리에 프로세스를 연속적으로 공간을 할당하는 방식인 "연속 메모리 할당"을 할경우 고려해야할 사항중 "스와핑"이라는 부분에 대해서 알아보도록 하겠습니다. 스와핑이란? 메모리에 적재된 프로세스들 중에서는 현재 실행중인 프로세스가 있을 수 있고 실행되지 않는 프로세스들이 있을 수 있습니다. 실행되지 않는 것의 예로는 입출력 요구로 대기상태에 빠진 프로세스들이라던지 아니면 오랫동안 사용되지 않은 프로세스들 등등이 여기에 포함됩니다. 이러한 실행되지 않는 프로세스들을 임시로 보조기억장치 일부 영역을 "쫒아내고" 그렇게 해서 생긴 "빈 공간"에 또 다른 프로세스를 적재하여 실행하는 방식을 "스와핑"이라고 합니다. 쫒겨나는 보조기억장치의 일부 영역을 "스왑 영역(swap space)"이라고..
![[CS] 논리주소와 물리주소](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fxjfa6%2Fbtsqj3rFH5e%2FAAAAAAAAAAAAAAAAAAAAAIMnwlklXYRUiqaeqsMlnp-U8WrpE32_WhxFaDUDCLSo%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DIYSMftJXfMIqDBgd%252FjVvZGDkFDM%253D)
[06-2] 이번글은 메모리의 논리주소와 물리주소에 대한글입니다. 먼저 메모리란 무엇인지에 대해서 알아보도록 하겠습니다! 주기억 장치의 종류로 크게 RAM, ROM가 있습니다. 이중에서도 "메모리"라는 용어는 보통 RAM을 가르키는 단어입니다. 그래서 RAM(메모리)에 대해서 살펴보도록 하겠습니다!!ㅎㅎ 참고로 ROM에 대한 부분은 https://information-factory.tistory.com/270 RAM(램)과 ROM(롬) 차이점 쉽게 이해하기! RAM 이란? ROM 이란? 무엇일까? RAM은 우리가 흔하게 보는 부품입니다. 바로 삼성전자와 SK하이닉스에서 세계에서 제일 잘 만드는 부품으로 "초록색의 긴 막대기 같은 부품"입니다. RAM의 약어는 Random information-factor..
![[CS] Context Switching(문맥 교환)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fd5nmes%2FbtsqfBfLYaW%2FAAAAAAAAAAAAAAAAAAAAAGlrlI7K5cBnlvhZGyzujPGK-K7mtdEzcsgQ3l93fSWh%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1756652399%26allow_ip%3D%26allow_referer%3D%26signature%3DU9DvCmXrTnT7r1%252BU%252BuqDCD9oZ4A%253D)
이번글은 프로세스와 스레드에 대해 알아보도록 하겠습니다. CPU와 코어 그전에! CPU를 잠깐 다시살펴보면 "명령어를 실행하는 부품"을 CPU로 설명을 많이 드렸었는데 현대의 CPU는 "명령어를 실행하는 부품"들로 이루어진 부품입니다. 이 명령어를 실행하는 부품을 "코어"라고합니다. 제 CPU의 성능은 이렇습니다. 클럭이 3.35GHz 정도이고 코어가 8개, 논리 프로세서가 16으로 잡히네요... 코어안에는 필수레지스터들(프로그램 카운터)과 ALU L!, L2 캐시 등등 많이 들어있을 텐데 이것들이 총 8개 있다는 말입니다. 그리고 논리 프로세서는 16개로 코어 하나당 하드웨어적 스레드가 2개씩 있다고 보면 되겠습니다. 보통 "스레드"라고 하면은 프로세스 상의 스레드를 떠올리시기 쉬운데 스레드는 뭐냐? ..