목록카테고리 (60)
교대최소제곱법
이 글은 이전 글인 "[pintOS] 운영체제와 cpu 아키텍쳐의 관계 그리고 펭귄" 의 후속 글 입니다 재밌는 이야기를 보기 전에 이전 글을 보면 더 재밌습니다! https://changjohwang.tistory.com/53 여기서는 정말 재밌는 이야기를 할 것이다 windows와 리눅스 원래 운영체제 시장은 x86 아키텍쳐를 사용한 마이크로 소프트의 Windows가 독점하다시피 하고 있었다 운영체제 = windows가 성립하던 시대였다 하지만 unix의 자손들이 하나 둘 떠오르기 시작되었고 리눅스는 그 중 최고라고 볼 수 있다 우리가 잘 아는 안드로이드, 타이젠도 이 리눅스 기반의 모바일 운영체제이다! 여기에 unix기반의 macOS까지 해서 windows, macOS, linux 삼대장의 시대가 ..
문제 정의 우리가 만든 pintOS는 ec2의 우분투 x86_64 환경 위에서 작동한다 amazon/ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-20230329 이미지를 보면 우분투인 것은 알겠는데 뒤에 amd64가 붙어 있는 것을 볼 수 있다. 그 전에는 운영체제는 소프트웨어고 cpu아키텍쳐는 하드웨어라 연관성을 못 느꼈는데 최근 pintOS를 만들면서 이 둘의 관계가 궁금해졌다 + 사실 친구가 리눅스 마스코트인 턱스가 귀엽다는 말을 해서 리눅스가 궁금해졌다 일단 우분투란 무엇일까? = 우분투는 debian 기반의 linux 배포판이다 그럼 debian이란? = 커뮤니티인 데비안 프로젝트에서 개발하고 있는 linux 배포판 아무튼 우분투는 linux..
GET / POST의 차이점 GET은 데이터를 Query String으로 전송하고 POST는 body로 데이터를 전송한다 GET에도 바디가 있지만 빈 바디이기 때문에 content-type 헤더필드도 들어가지 않는다. GET의 단점은 브라우저별로 URL 길이에 제한이 있기 때문에 전송할 수 있는 데이터가 제한된다는 것 POST는 바디에 데이터가 있기 때문에 Content-length나 Content-Type과 같은 정보가 헤더에 필요하다. + TMI GET 메소드 요청시 body 는 원래 보낼 수 없었지만 2014년도 부터는 body 를 보낼 수 있게 되었다. GET 메소드 요청시 body 를 보낼 수는 있으나 일부 클라이언트에서는 지원되지 않을 수 있다. GET 메소드 요청시 body 를 보낼 수 있을..
2019년 유해사이트를 막는다는 명목으로 HTTPS를 차단하는 사건이 있었다. 당시에는 그냥 HTTPS가 막혀서 https가 들어가는 주소는 우회해야 되는구나로 이해했지만 이번에 네트워크를 공부하면서 사건의 전말을 이해 할 수 있었다. HTTPS 차단 사건의 시작 대한민국은 국민들의 유해 사이트 접근을 막기 위해 방통위 주관으로 http 주소로 접근을 시도하면 도메인 주소를 IP로 DNS resolution 할 때 도메인 주소에 유해 사이트의 도메인이 포함되어 있으면 warning.or.kr로 리턴하는 방식으로 납치(?)했다 이를 DNS Sinkhole이라고 부른다 DNS Sinkhole은 DNS와 transaction하는 과정에서 생기기 때문에 그냥 DNS를 싱크홀이 없는 DNS로 바꿔주면 손쉽게 우회..
일단 문제를 보자마자 이진탐색임을 직감은 했지만 이진탐색을 사용하는 방법이 좀 아쉬웠다. 아이디어가 좋은 문제인 것이 가장 인접한 두 공유기 사이의 최대 거리를 구하기 위해서는 최대한 일정한 크기로 잘라야 한다는 점이다 그렇기 때문에 어느정도의 사이즈로 잘라야 일정하게 짤리는가를 찾는 문제로 치환될 수 있다. 따라서 이진탐색을 공유기를 찾는데 활용하는 것이 아니라 잘려지는 길이를 이진탐색으로 찾는 문제였다 구현에서 핵심은 잘려지는 길이를 찾는 것이기 때문에 start와 end를 인덱스로 잡는 것이 아니라 길이로 잡아야 한다 즉, 최소 1 최대는 시작부터 끝까지의 길이로 설정해서 그 사이의 값을 찾도록 구현해야한다 def install_router(seq): start = 1 end = seq[-1] - ..
페이징과 세그멘테이션 모든 메모리 관리에는 단편화 문제가 생기고 (현실적으로는) 외부 단편화 해소를 위한 것이 페이징 내부 단편화 해소를 위한 것이 세그멘테이션 페이징과 세그멘테이션의 차이 페이징 → 일정한 크기의 페이지로 분할해서 메모리에 적재 세그멘테이션 → 논리적 단위인 세그먼트로 분할해서 메모리에 적재 돼지를 비유하면 무조건 같은 크기로 잘라서 넣는 것 → 페이징 부위 별로 잘라서 보관하는 것 → 세그먼트 세그먼트는 부위 별로 잘라서 보관하기 때문에 내부 단편화가 생기지 않는다 하지만 부위의 크기가 다 다르기 때문에 외부 단편화 문제가 발생한다 단편화가 생기는 것은 똑같은데 그럼 왜 세그멘테이션이 아니라 페이징을 쓰나요? → 외부 단편화를 파악하는 것이 더 복잡하기 때문! 차라리 내부 단편화가 생..
디스크 조각모음 보조 기억 장치의 단편화를 해결하기 위한 최적화 프로그램 과거에는 저장장치가 구리고 단편화 문제가 실제로 체감되었기 때문에 디스크 조각모음 프로그램을 따로 설치하여 돌려주고는 했었다. 최근에는 이런 사설 프로그램을 설치할 필요 없이 기본적으로 운영체제에서 해결해준다. 찾아보니까 매주 자동으로 하드디스크를 정리해주는 모양이다. 과거에는 디스크 조각모음이 중요했으나 캐시 메모리의 대형화, 자기 디스크에 대한 기술 발전으로 처리 속도, 저장 용량 등의 성능이 향상되면서 중요성이 다소 떨어졌다. SSD는 디스크 조각모음이 필요없다 정확히는 플래시 메모리 저장매체들은 디스크 조각 모음이 필요없다. 그 이유는 메모리 할당 과정을 통해 알 수 있는데 malloc 구현을 하다보면 find_fit라는 함..
스택과 레지스터 스택과 레지스터 모두 지역저장장치 역할을 한다 스택 프로시저 호출을 처리하는데 중요한 역할 1. 함수의 로컬 변수 저장 2. 함수의 제어 흐름 관리 장점 동적으로 메모리를 할당하고 해제할 수 있다. -> malloc, calloc 구현이 간단하며(stack), 메모리 관리 오버헤드가 낮다 레지스터 중간 연산 결과의 저장에 활용 꼬리 재귀 최적화 return에 재귀함수를 쓴다고 다 꼬리 재귀 최적화가 아니다 # 꼬리 재귀 최적화 구현 return factorial(n-1, n*acc) 이렇게 return에도 아무것도 남기지 않아야 한다. # 틀린 예시 return n*factorial(n-1) 기억해야 할 지역변수가 있으면 함수를 종료시키지 못하고 스택에 변수를 저장해놓게 된다. Memor..