https://www.inflearn.com/course/독하게-되새기는-c프로그래밍/dashboard
강의에서 알려주는 것
1. 컴퓨터 이론 재정리 (컴퓨터는 어떻게 더하는 가?)
2. 컴퓨터 구조와 컴파일러의 이해
3. stack frame 구조와 원리
4. 변수와 상수에 대한 고급 이론과 컴파일러 최적화
5. 멀티 스레드 (생성 및 동기화)
6. 가상 메모리와 IPC
7. 동기 비동기, 파일 입력 출력
8. 정적/동적 라이브러리 개발
9. 보안 시큐어 코딩
컴퓨터 언어 서적, 강의에서 알려주는 보편적인 문법위주의 강의가 전혀 아니며 C를 도구로 사용해서 컴퓨터에 대하여 알려주는 강의
오히려 내용 자체는 면접용 CS 강의 포지션이며 IDE, 메모리 뷰어, 어셈블리어를 사용해 강의를 진행하고 동시에 직접 실습하니 시간은 더 걸리지만 무작정 외우는 것 보다는 좋은 것 같고 재미있음
Byte Order
1.'0x12345678'인 4byte의 데이터가 존재한다.
2. 1Byte씩 분리한다.(1바이트가 메모리에 접근하는 최소 단위이며 16진수로 표기하여 16진수 2개가 1바이트를 표현, 256개)
3. "12", "34", "56", "78"가 나옴
Mac환경 Visual Studio Code의 메모리 뷰어도 기본적으로 Litten Endian이 적용
다른 Byte Order를 사용하는 호스트끼리는 통신이 안된다고 합니다.
문자 배열
data의 영역
16진수 편집기를 사용해서 Executable File의 상수를 수정하고 실행시키면 코드를 작성했던 값이 아니라 위변조된 값이 적용된다.
컴파일러 구성요소
Front-end :
Back-end :
호출관계와 void
Caller : 호출자
Callee : 피호출자
void : 성공, 실패같은 부분을 고려하지 않는다.
매개변수 전달 기법
전달 방식
매개변수 저장공간 Register?, Stack?
Stack
공간크기 : 512KB ~ 1MB 언저리, 1개 호출에서 Stack의 공간이 넘어가면 StackOverFlow가 일어난다.
함수
inline : callee의 내용을 caller에 넣는다. 함수 호출에 의한 오버헤드가 줄어듦
함수 포인터
int add(int a, int b) {
int result = a + b;
return result;
}
int main(void) {
int result = 0;
// 일반적인 호출
result = add(3, 4);
printf("Result: %d \n", result);
// 함수 포인터 사용
int (*pfAdd)(int, int) = add;
result = pfAdd(3, 4);
printf("Result: %d \n", result);
return 0;
}
Buffered/Non-buffered I/O, Flush
동기/비동기 File 입/출력
동기 방식
비동기 방식
동기/비동기?
thread 동기화
임계구간 코드가 여러 스레드(multi thread)에서 동시에 실행되는 것을 막는 것
동기화 객체를 이용해 구현
임계 구역