전체 글 126

JavaScript | V8 엔진과 런타임 환경의 기본 개념

자바스크립트 런타임 환경 자바스크립트 런타임 환경은 자바스크립트 코드가 실행되는 환경을 말하며, 크게 1) 브라우저와 2) 브라우저 밖(Node.js) 으로 구분할 수 있다. 본래 브라우저가 자바스크립트의 고향이고, Node.js 덕에 브라우저 밖에서도 자바스크립트를 구동할 수 있게 되었다. 1. 웹 브라우저 웹 브라우저는 자바스크립트의 가장 전통적인 런타임 환경이다. 여기서 자바스크립트의 목적은 HTML과 CSS로 된 정적인 웹 페이지를 동적 웹 페이지로 조작할 수 있도록 하는 것이다. (대표적으로 이벤트 처리, 실시간 화면 전환, 시각 효과 등) 이를 위해 브라우저 내에는 자바스크립트 코드를 파싱하는 자바스크립트 엔진이 내장되었는데, 이 엔진은 파싱 외에도 DOM API, 이벤트 핸들링, AJAX 통..

Web API 이해하기 (BOM, DOM)

Web API 브라우저는 WEB API (= DOM + BOM)을 제공한다. 이는 자바스크립트 자체의 기능이나 문법이 아니라, 프로그래밍 언어로 웹페이지를 조작할 수 있도록 브라우저에서 제공하는 기능이다. BOM (Browser Object Model) BOM(Browser Object Model): 브라우저 자체를 다루기 위한 API 잘 보면 WEB API의 모든 것들이 window라는 객체의 하위 집합임을 확인할 수 있다. window 객체는 다양한 객체를 포함하고 있다. window.location window.navigator window.screen window.history .. 등 이 window 객체들의 집합을 BOM(Browser Object Model) 이라고 한다. 이들은 다양한 기능..

Week 10~11. PintOS 프로젝트 회고

오늘로써 크래프톤 정글에서의 핀토스 과정이 마무리됐다. 👏👏 프로젝트 중에 VM이 가장 어렵다고 정평이 나있었는데, 역시나 가장 어려웠다.. ㅋㅋㅋ 개인적으로 코로나에 걸려 공백이 좀 있었고, 그 체력과 멘탈에서의 후유증이 3번째 프로젝트까지 넘어와 좀 힘들었던 것 같다. 마치 배터리가 금방 방전되는 것 같은 기분..? 그래도 막판에는 다시 몰입할 정도로 회복되어서 다행이었다. 핀토스 과정에서 많은 것을 얻었다. 아쉬움이 일절 없다면 거짓말이지만, 그래도 이전의 나에 비하면 프로그램을 대하는 태도가 많이 달라졌다고 느낀다. 가장 큰 건 두려움이 한 층 걷힌 것 같다. 또한 주변에서 잘 해내는 친구들을 보면서 앞으로 나는 어떻게 프로그래밍을 해야 하는가에 대해서도 많이 생각해볼 수 있었다. 이 기억과 감흥..

PintOS | Project3. Virtual Memory | 트러블 모음 2

Stack growth 트러블 모음 pt-write-code2 테스트 케이스 pt-write-code2 테스트는 잘못된 영역(코드 세그먼트)에 read() 시도를 하는 테스트이다. 메모리 관점에서 보면 read() 시스템콜은 파일의 데이터를 읽어서 메모리의 버퍼에 쓰는 작업을 포함한다. 그러나 현재는 코드 세그먼트는 not writable 해야 하는데, read()가 되고 있는 상황, 즉 not writable한 페이지에 write가 되는 상황이다. 문제상황을 실제 파일에서 확인해보았다. pt-write-code2 테스트 코드는 다음과 같으며, void test_main (void) { int handle; CHECK ((handle = open ("sample.txt")) > 1, "open \\"sa..

PintOS | Project3. Virtual Memory | 트러블 모음 1

Anonymous Page 1. Lazy Loading - thread_current()에서 터지는 문제 spt_insert_page 에서 문제를 발견할 수 있었다. hash_insert()는 첫번째 인자로 hash 구조체를 받아야 하는데, spt를 줬다. &spt 를 &spt->spt_pages 로 바꿔주니 문제 해결 2. Page fault 핸들링 때, spt에서 페이지를 찾지 못하는 문제 exit(-33)을 어디에 넣어놨냐면 .. 뭐가 문제였을까?? 애초에 page를 spt에 제대로 넣어주지 못했거나, 제대로 넣어줬으나 탐색 과정상의 문제로 찾지 못하는 상황인 듯 하다. 여기서 출발하여 원인을 탐색하다보니 다음과 같은 문제점을 발견할 수 있었다. vm_stack_growth(), setup_stac..

운영체제 | 가상메모리 | 페이징 관련 키워드 정리

익명 페이지와 file-backed 페이지 가상 메모리 시스템에 할당된 페이지를 분류할 때, 대부분의 경우 이들을 'anonymous 페이지'와 'file-backed 페이지'로 나눌 수 있다. 익명 페이지는 '새로운 것'을 만들기 위한 빈 페이지라고 생각할 수 있고, 파일 기반 페이지는 '이미 존재하는 것'을 보기 위한 페이지라고 생각할 수 있다. 익명 페이지 (Anonymous Pages) Anonymous 페이지는 특정 파일에 직접 매핑되지 않는 메모리 페이지이다. 프로세스의 동적 메모리 할당(예: malloc을 사용한 메모리 할당, 스택 공간)에 주로 사용된다. 시스템이 메모리 부족 상황에 처했을 때, 이러한 페이지는 스왑 공간(디스크)으로 옮겨질 수 있다. 익명 페이지들은 임시 데이터를 저장하는..

카테고리 없음 2023.12.17

운영체제 | 가상메모리 | 페이징과 주소번역 더 알아보기

큰 그림 요약 가상 메모리는 다음 페이지들의 집합으로 표현될 수 있다: 메인메모리에 로드된 cached page (익명 페이지와 file-backed page들) cached page는 메인메모리에 복제(load)되어 캐싱된 페이지를 뜻한다. cached 메모리의 경우 해당 프로세스(스레드) 페이지 테이블 중에서, 해당 페이지에 해당하는 PTE의 valid bit (다른 말로 present bit)가 1로 설정된다. 해당 프로세스(스레드) 페이지 테이블의 위치는 PTBR 에 저장된다. 메인메모리에 로드되지 않은 데이터 cached page 였다가 스왑 아웃된 uncached page: cached page 였다가 스왑 아웃된 uncached 페이지 중 익명 페이지들은 스왑 영역 안에 존재하게 된다. fi..

팀원들에게 배운 실용 지식들 (231214)

1. 깃허브 협업: 커밋 컨벤션 정하기 이슈를 등록해서 각자 할 일을 체크하고, 커밋할 때 gitmoji와 컨벤션을 통해 통일성 있는 커밋을 할 수 있다는 걸 알게 되었다! gitmoji 는 요즘 MZ 느낌의 힙쟁이들이 쓰는 컨벤션이라고 한다. 익스텐션을 설치하면 더 편하게 이모지를 찾을 수 있다. 2. 핀토스 Native Debug 익스텐션으로 디버깅하기 지금까지 Call stack과 에러 메시지, output 파일, printf 등만을 활용해서 디버깅을 했었는데, 서연님께서 보다 선진적인(?) 디버거 활용방법을 알려주셨다. [Pintos] VSCode를 활용한 Pintos 디버깅

Week 8~9. PintOS 프로젝트 2(User Program) 회고

7.5주차부터 8주차까지 약 1.5주동안 진행된 핀토스 프로젝트2가 끝났다. 이번 주간에는 코로나에 걸리는 바람에 약 5일 정도는 제대로 공부를 하지 못했다. 때문에 격리에서 돌아온 이후에는, 주변 동료들의 도움을 많이 받으면서 구현보다는 개념 이해에 집중해서 최대한 가성비있게(?) 공부하고자 했다. 다행히도 어찌어찌 모든 테스트 케이스를 통과하긴 했지만, 동료들 도움이 없었다면 절대 해내지 못했을 것 같다..! (감사합니다..) ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 제목만으로 우리반 사람들 사이에서 엄청난 공감을 얻었던 블로그들이다. 진짜... 핀토스 쉽지않다. 우리 팀원분은 한가지 테스트케이스에서 약 20% 미만의 확률로 됐다가 안됐다가 해서(심지어 에러메시지도 없어서 원인도 찾기 어려운..) 엄청난 스트레스를 받으셨..

PintOS | Project2. User Program | 이슈, 알게된 점 메모

조건부 컴파일 (#ifdef, #endif) #ifdef, #endif 는 C와 C++ 프로그래밍 언어에서 조건부 컴파일을 위해 사용되는 전처리 지시문이다. 이들은 특정 조건이 참일 때만 코드 블록을 컴파일에 포함하도록 하는 데 사용된다. #ifdef: "If Defined"의 약자로, 다음으로 오는 코드 블록이 컴파일에 포함되기 위해서는 1) 지정된 매크로가 정의되어 있거나, 2) 컴파일 시점에 해당 조건을 명령어에 포함해야 함을 나타낸다. 예를 들어, #ifdef USERPROG는 USERPROG이라는 매크로가 이미 정의된 경우에만 그 이후의 코드가 컴파일 과정에 포함되도록 한다. #endif: #ifdef로 시작된 조건부 컴파일 블록의 끝을 나타낸다. 이는 해당 조건이 끝났음을 컴파일러에게 알려준다..

카테고리 없음 2023.12.13