일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 삼성기출
- pwnable.kr
- BFS
- Memory Management
- BOJ
- 백준
- 스케줄링
- segmentation
- dfs
- ascii_easy
- 알고리즘
- paging
- 구현
- Deadlock
- Brute Force
- 완전탐색
- 프로세스
- exec
- 가상메모리
- fork
- samsung research
- 백트래킹
- 동기화문제
- 김건우
- 컴공복전
- 시뮬레이션
- 삼성리서치
- 데드락
- 운영체제
- higunnew
- Today
- Total
목록분류 전체보기 (57)
gunnew의 잡설
이미 Deadlock이 무엇인지는 앞선 7강 동기화 문제에서 살펴본 바가 있다. 이것을 좀 더 가시화한 그림이 다음이다. 앞으로만 갈 수 있는 도로에서 차들이 꽉 막혀 진행될 수 없는 상태이다. 시스템 안에서 Deadlock은 자원이 있는데 각 프로세스들이 어떤 자원은 절대 내놓지 않고 갖고 있으면서 다른 자원을 얻으려고 하는 상태를 뜻한다. * 자원의 사용 절차 및 Deadlock 발생의 4가지 조건* 즉, 데드락이 생기는 이유는 자기 것을 내놓지 않고 다른 자원을 얻으려는 일종의 욕심 때문에 발생한다. 그렇다면 프로세스가 자원을 어떤 절차로 사용하는가 먼저 살펴보자. 1. Request (요청) 2. Allocate (할당) 3. Use (사용) 4. Release (반납) 이러한 과정 속에서 데드락..
지금까지 Semaphore에 대한 얘기를 주구장창 했다. 그런데 Semaphore의 문제점은 있다. 구현도 어렵고, 실수 하면 시스템이 완전히 무너진다. 또한 Semaphore를 이용하여 프로그래밍 했을 때 어디에 P연산과 V연산이 들어가야 하는지 정확히 시스템이 작동되는지 검증하기가 굉장히 어렵다. 그러면 이러한 동기화 문제를 해결함에 있어서 조금 더 쉬운 방법은 없을까 고민하다가 나온 것이 Monitor라는 개념이다. Monitor Monitor는 High-level Language에서 제공하는 동기화 수단이다. Semaphore에서는 공유 데이터 접근을 Semaphore가 책임지지 않았고 실제로 동기화 문제는 프로그래머가 처리해야 했다. 공유 데이터에 접근하기 전에 Lock을 프로그래머가 걸어야 하..
이번 게임도 개념을 안다면 정말 쉬운 문제였지만, 나는 몰랐기에 여기저기 많이 뒤져보았다. 이번 문제를 이해하기 위해서는 Bash(그냥 우리가 쓰는 쉘임)의 환경변수 설정에 대해 알아야 한다. 1. Bash 환경 변수 설정 Bash에서 환경 변수를 세팅해보자. foo=3을 대입하고 export foo를 해주면 env에 foo=3이 등록될 것이다. 그리고 환경 변수 대신에 환경 함수(?)를 설정할 수도 있다. foo()라는 함수를 hi를 출력하도록 해보자. 다음과 같이 foo() { echo hi; } 와 export -f foo를 하면, foo=3과 foo() { echo hi; }가 동시에 등록될 것이다. 근데 옛날 bash에서는 foo 환경 변수를 설정하는 것처럼 환경 함수(?)를 설정할 수도 있다...
Semaphore은 프로그래밍을 조금만 잘못해도 문제가 발생할 수 있다. 예를 들어 Semaphore 변수가 S와 Q로 두 개가 있다고 가정하자. 그리고 어떤 프로세스는 두 Semaphore를 모두 얻어야만 할 수 있는 작업이라고 하자. 예를 들면 A라는 Tape driver에 있는 내용을 B에 저장을 하는 것과 같은 작업이다. 그것들을 각각 P0와 P1이라고 하며 에 나타나 있다. 겉으로 보기엔 문제가 없어 보인다. 그러나 여기에는 심각한 문제가 발생할 수 있다. P0가 S를 얻고 CPU를 뺏겼다고 해보자. 그리고 CPU가 P1로 넘어가고 P1은 Q를 획득했다고 하자. P1이 이제 아랫부분을 실행하려고 해도 S를 P0가 가지고 있기 때문에 실행을 못하고, 반대로 P0가 Q를 얻으려고 해도 P1이 가지고..
이번 것은 굉장히 쉬웠다. 그러나 이전에 트라우마(?)가 있어 gdb로 뜯어보다가 시간만 날렸다. 결론부터 말하면 그냥 C파일만 봐도 된다. 왜냐하면 힌트에 operator priority가 쓰여있기 때문. 소스 코드를 통한 풀이 #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!s..
어떻게 매번 모르는 개념만 나올 수 있을까. ARM assembly를 알아야만 풀 수 있는 문제이다. 뭐 이미 Intel assembly를 알고 있어서 어느 정도는 이해할 수는 있었으나 내가 알던 개념과 조금은 달랐다. 가령 PC register에는 다음 instruction이 아니라 다다음 instruction이 담겨있다는 것과 같은 것 말이다... 코드부터 보자. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code..
아... 이번 거는 그냥 소스 코드 보자마자 포기했다. 리눅스로 소켓 입출력 문제가 나올 것이라 생각도 못했다. 그냥 바로 해설을 보러 갔다...(비루한 인생) 하지만 그래도 내가 공부하며 알게된 것들을 내 나름대로 풀어 써 보자. 0. input.c 살펴보기 #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the fl..
PS 백준 소스 코드 모음 : https://github.com/kgw4073/Problem-Solving 우선 이 문제는 여러 방법으로 풀 수 있는 것 같다. 혹자는 MST로 풀어버리던데... 문제를 풀고 나서 다른 사람 코드를 보면서 이걸 '어케 MST라고 판단했지?' 하는 생각이 들었다. 나는 MST로 푼다는 생각 자체를 하지 못했다. 당연히 DFS로 완전 탐색 돌리는 거라고 생각했는데 생각해보니 참 신박하다. 뭐, 어쨌든 문제를 보니 input이 워낙 작기 때문에 애초에 완전 탐색을 유도한 문제라고 생각했기에 MST라고 생각하지 못한 것에 대한 억지 위로를 하였다. (뭐 어쨌든 MST도 거리 계산할 때 완전 탐색 할듯?) https://www.acmicpc.net/problem/17472 1747..
이번 챕터는 너무 쉽다. library에 있는 rand 함수의 취약점을 이용하는 건데, rand()는 진짜 random이 아니라 pseudo-random number이다. 그러니까 seed가 동일하다면, 동일한 random sequence를 내놓는다. 코드부터 보자. random에 rand()를 호출하는데 seed는 0으로 언제나 똑같다. 그러면 seed가 0일 때 어떤 rand값을 산출하는지 확인해보면 1804289383으로 항상 같은 값을 산출하는 것을 볼 수 있다. 다시 코드로 돌아가서 random (XOR) key 가 0xdeadbeef가 되어야 한다. random은 1804289383으로 binary로 110 1011 1000 1011 0100 0101 0110 0111 이다. 그리고 0xdea..
공유데이터 접근 문제는 High-level Language에서 한 문장에 해당하는 instruction이 Low-level에서 기계어로서 CPU에서 실행될 때 atomic하게 한 번에 처리될 수 없기 때문에 발생하는 문제이다. 이 문제 해결되기 위해서는 다음 조건들을 모두 충족해야 한다. 1. Mutual Exclusion (상호 배제) : 동시에 critical section을 수행하면 안된다. 2. Progress (진행) : 아무도 critical section에 없을 때, 해당 section에 들어가고자 하는 프로세스가 있으면 허락해 주어야 한다. 3. Bounded Waiting (유한 대기 시간) : 기다리는 시간이 유한해야 한다. 즉, starvation problem을 방지해야 한다. Al..