virtualbox 특이한 오류

virtualbox로 ubuntu 등을 돌릴 때 가끔 부팅 시 무한정 로딩하는 경우가 생겼다. 응답없음이 떠서 강제종료하고 다시 켜봐도 똑같은 증상이 반복되었다 검색해서 여러 해결 방법을 써도(0x80004005, 0x80040154 오류도 막 떠서 재설치, 설치된 OS 삭제 후 다시 import, sfc /scannow 등) 해결되지 않았는데  우연히 발견한 원인은 단순했다. 바로 에어팟 때문이었다. 에어팟을 블루투스로 노트북에 연결하고 있으면 virtualbox에서 ubuntu를 부팅시 무한로딩을 하게 된다. 아마 우분투에서도 오디오 잡으려하고, 윈도우에서도 잡으려 하고 이게 무한정 반복되는 게 원인으로 추정된다(작업표시줄 오른쪽 밑에서 뭔가 자꾸 바쁘게 움직임) 해결방법은 당연히 에어팟을 잠깐 연결 해제하고 부팅 후 다시 연결하는 것이다. 그러니 virtualbox에서 부팅이 안 될 때는 에어팟 등의 오디오 기기가 연결 되어 있는지 한번 확인하고 해제도 한번 해보고 그러자. @오류환경 윈도우10, 갤럭시북 이온, virtualbox 6.x.x, ubuntu 16.04 LTS, 에어팟 2세대.

C++ int, long int, long long int 어떤 걸 써야할까

이미지
(출처:  https://ko.cppreference.com/w/cpp/language/types ) (LP32, ILP32, LLP64, LP64는 data model을 나타내며, 글 맨 아래 '참고'에 정리해둠) C++ 정수형 데이터 타 입들 C++ standard를 기준으로      short                     - 최소 16비트      int                         - 최소 16비트      long int                - 최소 32비트      long long int        - 최소 64비트 (C++ standard는 정수형 데이터 타입의 명확한 크기를 정해두지 않았다.  다만 최소한의 하한선만 정해놓았다) 일반적으로 short 는 16 비트 , int 는 32 비트로 알고 있다 . 그래서 int 는 -2^31 ~ 2^31 – 1 범위의 정수를 표현할 수 있고 , 이보다 크거나 작은 정수를 표현하기 위해서는 비트수가 더 필요하다 . 그러면 long 을 써야하나 long long 을 써야하나 ? 확실한 방법은 long long int 를 쓰는 것이다 . C++ 표준을 보면 long int 는 최소 32 비트를 보장한다고 한다 . -2^31 ~ 2^31 – 1 범위를 넘어서는 정수를 표현하기 위해서는 C++ 표준 기준으로 최소 64 비트를 보장하는 long long int 를 써야한다 . (long int를 쓸 경우, 윈도우 환경에서는 int와 똑같은 범위까지만 표현할 수 있다) // 나만의 생각 시작 그러면 long int 는 필요 없는 것 아닌가 ? ILP32, LLP64, LP64 data model만 고려한다면 그렇다고 볼 수 있지 않을까 싶다. 왜냐하면 위 세 개의 data model 에서는 int 와 long int 의 비트수가 같거나,  long int 와 long long int 의 비트수가 같기 때문이다 . long int가 int

Skip List를 어디에 쓸 수 있을까

이미지
Skip List 일반 Linked List 는 정렬이 되어있더라도 그 이점을 살리지 못하고 , 원하는 노드를 찾기 위해 헤드부터 끝까지 쭉 돌아야 한다 . == O(n). Skip List 는 일반 Linked List 에 level 의 개념을 추가해서 마치 binary search tree 처럼 탐색 속도를 줄이는 자료구조라고 할 수 있다 우선 생긴 것은 아래와 같다 . 출처 :  https://en.wikipedia.org/wiki/Skip_list#/media/File:Skip_list.svg   각 노드마다 위쪽으로 길게 포인터가 붙어있는데 , 이것을 레벨이라고 한다 . ( 위에서부터 0 이라 하는지 , 밑에서부터 0 이라 하는지 등의 구체적인 것은 구현에 따라 달라질 수 있음 ) 먼저 find 를 생각해보자 . 위의 Skip List 에서 7 를 찾고 싶다고 생각하면 , 기존의 Linked List 에선 7 개의 노드를 봐야한다 . (1)   1 보고 , 아니네 ? 다음 (2)   2 보고 , 아니네 ? 다음 (3)   3 보고 , 아니네 ? 다음 … (7)   6 보고 , 아니네 ? 다음 (8)   7 보고 , 맞네 ? 찾았다 ! 물론 원하는 게 바로 안 나오면 n 개까지 찾다가 없다고 알아낼 수 있다 . 7 을 7 번만에 찾았다는 건 운이 좋은 경우이고 , 정렬이 되어있더라도 이 사실은 크게 변하지 않는다 ( 일반적인 Linked List 라고 하면 ). 반면 Skip List 에서 8 를 찾고 싶다면 1 -> 4 -> 6 -> 7 을 거쳐 찾을 수 있다 . (1)   1 보고 , 나보다 작네 ? 가장 높은 레벨 (4) 이 가리키는 애를 보자 (2)   Null 을 가리키고 있네 .. 그러면 다음 낮은 레벨 (3) 을 보자 . (3)   4 를 기리키고 있네 ? 내가 찾고자하는 8 보다 작으니 이동하자 (4)   4 에서 같은 레

x86 OS interrupts routine

x86 운영체제에서는 다음과 같은 과정을 거쳐 interrupt 를 호출한다 1.       interrupt n instruction 수행 . 2.       IDT 에 등록되어있는 ISR(interrupt Service Routine) 수행 . xv6 는 위의 두 과정을 아래와 같이 진행한다 . 1. interrupt n instruction - “int n” instruction workflow. 1)        IDT(interrupt descriptor table) 에서 n’th descriptor 를 읽어온다 . -  시스템 부팅시 tvinit() 함수로 vertors.S 의 번호 , DPL 을 다 초기화 해줌 . -  system call은 DPL이 유저 레벨로 세팅됨 2)        CPL 이 DPL 보다 작거나 같은지를 확인함 ( 커널 모드 : 0, 유저 모드 : 3, 부를 수 있는지 없는지를 확인하는 것 ) -   이 조건을 충족하지 못하면 부를 수 없는 interrupt 를 부른 것이라 exception 이 발생한다 . 3)        만약 target segment selector 의 PL 이 CPL 보다 작으면 PL 의 변환이 필요하다 (ex PL 이 커널모드인 경우 ). 다음 3 단계를 거쳐서 변환이 일어남 . (1)   현재 유저모드니깐 , 유저모드의 esp, ss register 를 임시로 저장함 ( 임시로 저장하는 이유는 커널 스택에다 푸시하기 위해서 ) (2)   task segment descriptor 에서 esp, ss 를 불러와서 CPU-internal registers 에 저장함 . (3)   이제 아까 임시로 저장한 esp, ss 를 푸시해줌 ( 유저 모드로 돌아가기 위한 esp, ss) 4)        eflags, cs, eip register 를 stack 에 푸시한다 . -   당연히 여기는 Kernal Stack 임 .

C++ string 클래스 정리글 링크

https://blockdmask.tistory.com/338 위 블로그가 정리가 잘되어 있어서 올림. 링크가서 보시고 다른 글들도 좋으니 보세요~

Selection Sort with C

수업 중 selection sort를 C로 구현하는 게 있어 업로드 합니다? 한다? 매번 C++ 을 쓰다가 C를 쓰니 문법이 기억날랑말랑 했다. 하지만 멀록은 내가 가장 좋아하는 명령어라서 기억이 났다. Selection sort 과정 Selection sort은 정렬 기법 중에 하나로 구현은 쉽지만 시간복잡도가 크다. 오래 걸린다는 뜻이다. Selection sort의 구현방법은 다음과 같다. (오름차순 기준) 1. N개의 숫자가 무작위로 있다고 가정할 때, 각각 1번, 2번 ... N-1번, N번 이라고 생각해보자. 2. index를 1로 초기화한다 3. index번 ~ N번까지 중 가장 작은 수를 찾는다. 4. 젤 작은 것을 찾아 index 위치의 수와 자리를 바꾼다. 5. index++을 해준 뒤 2,3 번을 index가 N이 될 때까지 해준다. 대강 { 1, 5, 3, 6, 4, 2, 7, 9, 8, 6 } 이 있다고 가정하면 결과는 { 1, 2, 3, 4, 5, 6, 7, 8, 9 } 가 되는 것이다.(정렬이니 당연하다) 시간복잡도 정리 첫 번째 자리의 수를 찾기위해 N번의 탐색, 두 번째 자리의 수를 찾기위해 N-1번의 탐색, 세 번째 자리의 수를 찾기위해 N-2번의 탐색 ... ... ... N-1 번째 자리의 수를 찾기위해 2번의 탐색, N 번째 자리의 수를 찾기위해 1번의 탐색. 탐색한 수를 전부 더하면 N(1+N) / 2 이다. 합공식이 가물가물한데.. 사실 시간복잡도 계산에선 차수가 제일 큰 놈이 중요하기 때문에 째깐둥이들은 조금 엇나가도 괜찮을 거다. N(1+N) / 2 = 1/2(N^2 + N) 여기서 차수가 제일 큰 놈은 N^2이니, 앞뒤로 다 떼어주면  시간복잡도는 O(N^2)가 되는 것이다. 소스코드 정리 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18