WEEK 06 TIL C언어(4월24일 목요일)

Devkty·2025년 4월 24일
0

[목표]

6주차 발표
깃허브 코드 리뷰
6주차 퀴즈 정리
노션 정리
6주차 CS 지식 정리

9:45 ~ 10:30

커피 한잔에 빵먹으면서 어제 내용을 벨로그에 정리하고 있다.
와중에 깃허브에 코드리뷰자의 코드가 올라와서 코드리뷰를 했다.

10:30 ~ 12:00

WEEK06 전체 조 발표를 진행했다.

12:00 ~ 13:00

식사 진행 및 휴식(대화)

발제(13:00 ~ 13:20)

직접 개발 환경을 세팅해볼것.(우분투 18.04) → 난 완료했다.
환경 세팅, 형상관리 등의 상황을 해결해 나가는 경험을 해봐라
말록 랩을 구현하다가 어려우면 책을 보고 구현 해보자.

말록랩 방식에는 Implicit List, Explicit List, Segregated List, Buddy System이 있다.
책에 나온것이 임프리시? 방식이다. 메모리 블럭을 링크드 리스트 방식으로 구현(경계 태그)

N driver파일(테스트 10개)을 돌리면 점수 2개가 나오는데, 합친 점수를 올려보기(100점 넘음 1~3등)
책은 9장은 봐야하는데, 나머지 책 내용은 시간 남을때 읽기.(중요한 키워드들만 보자)

운영진 티타임(14:00 ~ 15:15)

발표는 RB 트리 erase 함수 시행착오 과정(함수나 고려할 사항이 많아지며 GPT의 한계에 부딪치며 동료학습의 중요성, c언어 괄호)을 발표했다.

다양한 발표 양식과 공부 방식을 볼 수 있었다. 점점 발표에 대해 어떤 식으로 전개하는 것이 좋은지 생각하게 되었다. 다시금 발표 내용을 구성하며 내용 재확인하며 틀렸던 내용들을 수정할 수 있는 기회가 되었다.(벨로그나 발표를 진행할 때 다른 사람분들께 잘못된 정보를 주면 안된다는 마음에)
회사에서 발표시에 중요하게 보는 것들이 무엇일까에 대해 생각하며 발표 준비 방식을 계속해서 개선해나아가고자 합니다.

[코치님 조언]

  • 내가 잘 알고 있는 것들에 대해 상대방이 아예 모르고 있다는 가정 하에 설명해야한다.(용어들이나 내용들 → 예시를 통해 설명하는 것이 좋음(메타포를 맞춘다))
  • 두괄식으로 발표 내용을 준비.

[발표의 의도]

  • 수많은 발표로 자연스럽게 한다.
  • 다른 사람들의 내용들을 공유
  • 내용의 키포인트들을 뽑아내는 기술을 연습
  • 은유를 통해 다른 사람들에게 쉽게 설명하는 기술을 배움(청중의 이해)
  • 짧은 시간안에 퀄리티 높은 자료를 만드는 방식을 배움
  • 발표 시의 자신의 스타일이 있다. 그걸 강점으로 전환하여 발표하자
  • 협업은 내가 가진 유니크함으로 팀원에게 기여하는 것이다.(남들과 비슷할 필요는 없다)
  • 발표 잘못했다고 망하는건 아니다. 여기서 실패하는 연습도 해보자

SW 개발자로써 HW란 무엇인가?
→ hw는 알아서 잘 움직이지만, 어떤식으로 움직이고 최적화를 시키면서 효율적인 개발할 수 있다.
요즘 sw 개발자도 HW를 잘아야 좋다
스스로 HW적 난제를 풀어나가야한다. 그래야 더 많은 경험과 배움을 얻을 수 있다.

사실상 성능 저하시 EC2의 성능을 올리는 방식이 있지만(비쌈), HW를 이해한 개발자는 최적화를 통해 개발하고 있는 프로그램의 성능을 올릴수도 있다. EC2의 성능을 올리는 것은 돈이 더 들기 때문에, HW를 이해한 개발자는 레이턴시를 줄이기 위한 치트키가 될 수 있다.(성능을 올림)

x86 확인해보면 모든것이 해결된다.
AI기술이 발전함에 따라 HW와 SW 융합 기술은 상시 중요하게 여겨질 것이다.

16시에 도커 기본 환경 설정에 대한 설명이 있었으나 안갔다. 기초적인 내용이고 오늘 할 일이 너무 많다.

15:15 ~ 16:45

먼저 코드 리뷰를 수행하여 6주차 코드에 관한 내용을 마무리하겠다. 내 코드를 리뷰 받는대로 동료 평가도 실시하겠다.

동료 발표(Kernal) 17:00 ~ 18:00

Kernal

커널에서 어떻게 시스템의 자원을 구성하는지? 알아보겠다.
하드웨어: CPU, 디스크, 메모리
전체적으로 조작하는 것을 운영체제라고 한다.

초기의 어셈블리어 유닉스

  • 기계 의존적(어셈블리어 특징)
  • 유지 보수성 좋지 않음

C언어의 특징

  • 저수준 접근 가능: 하드웨어 친화적
  • 이식성: 컴파일러 존재
  • 간결함: 간단한 문법
  • 라이브러리: 구조화된 코드, 다양한 작업 지원

유닉스 특징

  • 저수준 접근 가능 → 커널, 드라이버
  • 이식성 → 다양한 하드웨어에 유닉스 포탕
  • 간결함 → 단순하지만 빠른 설계
  • 라이브러리 → 시스템 콜 등 활용 가능

리차드 스톨만의 GNU 프로젝트 시작

  • 대부분의 GNU 도구(GCC, Bash 등) 완성
  • 그러나 핵심이 되는 운영체제를 완성하지 못했다.

-> 교육용 리눅스인 minix를 보고 유닉스 시스템을 보고 리눅스를 개발하기 시작함
이후 리눅스와 GNU 소프트웨어가 합쳐져 GNU / Linux 탄생

유닉스 운영체제 구조

  • 운영체제
  • 컴퓨터의 하드웨어 자원 운영 관리
  • 프로그램을 실행할 수 있는 환경 제공
  • 커널
  • 시스템 콜

커널이 OS의 핵심이다.

대략적인 구조도
하드웨어 ← 커널 제어 ← 시스템콜 ← shell, 라이브러리 ← 응용프로그램

c언어의 stdin, stdout이 파일이다. printf() 코드를 쓰면 write() 시스템 콜을 사용한다. 그러나 사용자는 이 과정을 보지 못한다. 내부적으로 처리하기 때문이다. 그래서 이게 추상화이다.

시스템 호출

  • 시스템 호출은 커널에 대한 서비스 요청을 위한 프로그래밍 인터페이스
  • 응용 프로그램은 시스템 호출을 통해 커널에 요청한다.

커널은 직접 서비스를 요청한다.
위의 방식은 프로그래밍 시 시스템 직접 접근해서 로우레벨까지 제어할 수 있지만, 남용하면 여러가지 문제가 발생할 수 있다.

18:00 ~ 19:00

휴식

버즈빌 우정범님 SPP 커리어 특강(19:00 ~ 20:00)

공부하는 방법

  • paper, code
  • 공식문서, 기술 세미나
  • 강의, 블로그

위와 같이 공부할 수 있고 진로와 취업 버즈빌에 대해서 알아보는 시간을 가졌다.

20:00 ~20:30

동료 피드백을 깃허브 코드 리뷰가 되지 않아 추후에 동료 평가를 하겠다.
시놀로지 SFTP 환경 세팅을 할려 했다가 그냥 나중에 너무 필요하면 사용하도록 결정했다.

20:30 ~ 21:00

햄버거 식사를 하고 왔다. 저녁을 못먹었기 때문이다.(마지막 팀원 날 기념)

21:00 ~ 21:50

일단 어제자 벨로그를 빠르게 정했다.
퀴즈 복습, 노션 정리, 벨로그 / 티스토리 정리, 컴퓨터 시스템 정리, 시놀로지 작업 등 해야할 일이 많다.

6주차 마지막 코어타임(21:50 ~ 22:40)

9. 가상 메모리

9.9 동적 메모리 할당(p808)

동적 메모리 할당을 왜 쓰는가? → 어떤 형식의 함수를 효과적이고 동적으로 할당하기 위해 사용한다.
동적 메모리 할당은 malloc이 한다.

다음주에는 뭘 할까?
메모리가 삭제되거나 삽입시, 얼마나 메모리를 효율적으로 조절하냐가 다음주의 점수에 큰 영향을 미친다.

단편화

  • 내부 단편화: 내부적으로 단편화시킨다. padding(너무 난무하면 메모리 낭비가 생길 수 있다)
  • 외부 단편화: 블록 자체를 어떻게 배치를 수행하는가?, 빈공간이 나오면(free) 어떻게 처리를 할것인가? 에대한 내용들이 있다.(가용블럭끼리 다시 붙이는 등)

가용블록 할당에 대한 알고리즘(정책)

  • first fit: 초기부터 검색을 하다가 (끝까지 x) 자기가 바로 들어갈 수 있으면 바로 들어감
  • bext fit: 확률적으로 블록을 붙임(전체 스캔 후)
  • next fit: 이전의 가용블럭을 발견했으면 그다음에 붙인다.

경계 태그 사용(4가지 케이스)

  1. 앞뒤 모두 할당시
  2. 앞에는 할당인데, 뒤에는 할당일떄
  3. 앞에는 미할당인데, 뒤에는 할당일때
  4. 앞뒤 모두 미할당일때

명시적 가용 리스트: 유저가 만든 가용 리스트
묵시적 가용 리스트: 자바나 파이썬의 가비지 컬렉션(스케줄링과 같은 때에 따라 메모리를 비워줌)

가상 메모리 개념 외의 CS 관련 질문들

파이프라인: 어떤 인스트럭션을 만나면 MLPS 5단계를 쓴다.

MLPS 5단계
Fetch → decode → excute → mem → write-back
인스트럭션 1이 Fetch를 하고 decode를 할시 한 클록마다 한번씩 지나가는데, 뒷 단계로 간다.
fetch는 놀고 있으니 인스트럭션 2를 fetch 시킨다. 뒷엣 단계가면 다른 인스트럭션이 계속 들어온다.
계속 이러면서 CPU단에서 처리 작업의 효율을 5배이상 늘린다.
-> MLPS 5단계가 아닌 3,4 단계들도 있으나 5단계가 많이 쓰인다.

22:45 ~ 02:30

이어서 퀴즈를 정리하겠다. 자리를 이사하고 퀴즈를 다시 복습했다. 퀴즈 관련된 내용은 따로 포스팅 하겠다.

퀴즈를 하다가 시놀로지 리눅스 말록랩 작업하다가 깃 clone이 안되서 헤멧다. 모든 방법을 써봤는데 안되서 내일 다시와서 해봐야겠다. 오늘은 6주차 마무리를 확실히 하겠다.

profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글