전체 글 93

[TIL] 인터럽트 / lock, monitor

인터럽트(Interrupt) 인터럽트는 컴퓨터 시스템에서 발생하는 이벤트로, 프로세서의 정상적인 실행을 중단하고 특정한 코드(인터럽트 핸들러 또는 인터럽트 서비스 루틴)를 실행하는 메커니즘이다. 어제 포스팅한 Synchronization(동기화)를 하는 가장 간단한 방법은 인터럽트를 불가능하게 하는 것이다. 일시적으로 CPU가 인터럽트에 응답하는 것을 막으면 다른 쓰레드는 진행중인 쓰레드를 선점할 수 없게 된다. 쓰레드 선점(preempt)는 timer interrupt에 의해 이뤄지기 때문. 더보기 CPU 동작 측면에서 인터럽트는 다음과 같은 과정을 거친다. 1. 인터럽트 발생 하드웨어나 소프트웨어에서 인터럽트가 발생한다. 이는 외부 장치의 신호, 오류, 타이머, 입출력 완료 등의 다양한 이벤트에 의해..

Jungle 2023.11.24

[TIL] pintos 운영체제 환경 세팅 + Synchronization(동기화)

오늘부터는 pintOS라는 교육용 운영체제를 만들고 테스트하며 운영체제에 대해서 배우는 첫 날이다. 먼저 작업 환경을 세팅해주고 시작하자. 일단 카이스트 핀토스 레포지토리의 master가 우리가 구현해야 하는 브랜치인 것으로 확인했다. 일단 해당 파일들을 분석하기 전에 개발 환경부터 세팅해주었다. 일단 우분투 18.04 버전의 EC2 환경에 카이스트 pintos 레포지토리를 복제했다. 이후 현재 파일에서 운영체제를 테스트하기 위해 가상환경을 세팅해준다. $ source ./activate 근데 가상환경의 세팅은 일시적인 것이므로 재부팅 시에 다시 세팅해주어야 하는 번거로움이 있다. 따라서 다음과 같이 root에서 가상환경을 자동 세팅해주도록 하는 코드를 추가했다. cd ~ # home 디렉토리로 이동 c..

Jungle 2023.11.23

[TIL] 파일 디스크립터

오늘은 파일 디스크립터에 대해 공부 해보자. 파일 디스크립터는 이전 포스팅들에서 클라이언트 소켓과 서버 소켓을 만들 때, fd라는 키워드로 확인할 수 있었다. 그렇다면 파일 디스크립터라는 존재는 무엇을 위해 존재할까? 파일 디스크립터란? 유닉스 시스템에서는 모든 것을 파일이라고 한다. (정규파일 , 디렉토리 , 소켓 , 파이프 , 블록 디바이스 , 캐릭터 디바이스 등의 객체들) 파일 디스크립터란 유닉스 혹은 리눅스 쪽의 시스템에서 Process -> File을 다룰 때 사용하는 개념으로, Process가 파일에 접근 시에 사용하는 추상적인 값이다. .. 이게 뭔소리지? 이 말에 대해 완벽하게 이해하기 힘들기 때문에 프로세스가 작업 중 파일을 다룰 때 어떤 방식으로 해당 여러 파일을 보관하는지 이해할 필요..

Jungle 2023.11.21

[TIL] C 네트워크 프로그래밍 - Echo 서버 작동 방식 분석

오늘은 이전 포스팅에서 만든 서버 호스트와 클라이언트 호스트의 소켓을 실제로 네트워크 통신해볼 것이다. Echo 서버를 생성하여 클라이언트와 서버와 연결하여 정상 작동하는지 확인하고 localhost가 아닌 실제 EC2 서버와도 연결이 가능한지 확인해보겠다. Echo 클라이언트 빠르게 코드의 역할과 연결 방식을 확인 해보자. #include "../csapp.h" #include #include #include int main(int argc, char **argv){ int clientfd; char *host, *port, buf[MAXLINE]; rio_t rio; if (argc != 3){ fprintf(stderr, "usage: %s \n", argv[0]); exit(0); } host =..

Jungle 2023.11.21

[TIL] C 네트워크 프로그래밍 - 소켓 생성하기

웹서버를 직접 구축해보자. 핀트OS를 시작하기 전에 웹 서버를 직접 만들어 보고 네트워크의 구성 요소와 어떻게 네트워크 방식이 가능한 것인지 확인해보겠다.  네트워크 프로그래밍을 위해 코드 속 함수들을 이용하여 어떻게 네트워킹하는지 이해하고 echo 서버와 클라이언트를 통신시키기 위해 소켓들을 생성해보자. hostinfo.c 코드 이해하기 먼저 이 파일에서는 실행 시 도메인 주소를 받아, 해당 도메인의 ip를 출력해주는 프로그램이다. 코드는 다음과 같다. #include "../csapp.h" #include #include #include int main(int argc, char **argv) { struct addrinfo *p, *listp, hints; char buf[MAXLINE]; int..

Jungle 2023.11.21

[TIL] 5주차 - (6) : 코드 재 분석 (realloc&coalesce) 후 최종 결과

오늘은 내가 짰던 realloc의 기존 문제점을 한번 살펴보고, 개선하여 좋아진 성능을 파악해보겠다. realloc 코드 재 분석 나는 내가 스스로 짠 realloc 코드가 최선이라고 생각하고 어쩔 수 없이 copy를 하는 비효율적인 상황 때문에 점수가 낮은 줄 알았다. 근데 팀원의 점수가 되게 높길래 팀원의 코드를 보니 realloc 점수가 너무 높아 해당 코드를 분석해보았다. 다음 코드가 팀원 분의 코드이다. void *mm_realloc(void *ptr, size_t size) { if (ptr == NULL) { return mm_malloc(size); } if (size == 0) { mm_free(ptr); return NULL; } size_t original_size = GET_SIZE..

Jungle 2023.11.14

[TIL] 5주차 - (5) : 스터디 문제 리뷰

오늘은 코알라 스터디 두번째 주간 문제를 풀었다. 난이도가 평이할 줄 알았는데 너무 어려워서 가장 쉬웠던 1문제 밖에 못맞추고 나머지 두개는 방향을 잘못 잡아서 풀지 못했다. 스터디 끝나고 어려운 나머지 두문제에 대해 토론했고, 토론한 내용을 토대로 다시 시도해서 푼 문제에 대해 리뷰하겠다. BaekJun - #10159 : 저울 (플로이드 워셜) 출처 : https://www.acmicpc.net/problem/10159 10159번: 저울 첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩 www.acmicpc.net 이 문제는 무게..

Jungle 2023.11.12

[TIL] 5주차 - (4) : realloc() 함수 개선

오늘은 realloc() 함수를 개선해 보겠다. realloc 함수 문제 인식 현재 realloc() 코드를 보자. void *mm_realloc(void *ptr, size_t size) { void *oldptr = ptr; void *newptr; size_t copySize; newptr = mm_malloc(size); if (newptr == NULL) return NULL; copySize = *(size_t *)((char *)oldptr - SIZE_T_SIZE); if (size < copySize) copySize = size; memcpy(newptr, oldptr, copySize); mm_free(oldptr); return newptr; } 현재 코드는 무조건 할당되어 있는 p..

Jungle 2023.11.11