본문 바로가기

분류 전체보기

(127)
[운영체제] Process Management(2) 이 글은 개인의 학습을 위해 정리한 글입니다. 이점 참고하고 읽어주세요;) - 자원 공유 프로세스의 생성 -> 부모 프로세스의 복제로부터 시작 완전히 같은 내용의 프로세스라면 메모리에 똑같은 두 개의 프로세스를 올리는 게 메모리의 낭비 때문에 리눅스 등의 일부 운영체제에서는 무조건 프로세스를 복제하기보다는 일단 공유할 수 있는 자원은 최대한 공유. 부모 프로세스를 카피해서 코드 스택 데이터를 복사하는 게 원칙이지만(공유 x), 리눅스 등의 일부 운영체제에서는 일단 카피하지 않고 자식이 부모의 주소 공간을 공유. 프로그램 카운터만 따로 하나를 복사해서 같은 위치를 가리키고 있게 함. 그런 식으로 실행을 하다가 부모와 자식이 내용이 달라지는 순간에(ie. 데이터 영역의 변수 값이 달라지는 경우) 그제서야 부..
[운영체제] Process Management(1) 이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;) 프로세스 생성 방법 -> 복제 생성 오직 하나의 부모 프로세스가 자식 프로세스를 복제 프로세스를 생성하기 위해서는 자원(CPU)이 존재해야 함. 부모 프로세스와 자원을 공유하는 모델도, 공유하지 않는 모델도 존재함. 원칙적으로는 공유하지 않음. 자식 프로세스를 생성하는 순간부터는 사실 별도의 프로세스이기 때문에 경쟁의 사이. 프로세스가 수행(Execution)될 때 1) 부모와 자식이 공존하며 수행되는 경우도 있고 2) 자식이 종료될 때까지 기다리는(blocked) 모델도 존재 자식 프로세스의 생성은 부모 프로세스의 복제 생성 1) 부모 프로세스의 주소 공간을 자식 프로세스가 복사 2) 운영체제에 존재하는 PCB 등등을 복사 ..
[운영체제] Process(2) 이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;) 사용자 프로그램에서 입출력 자료가 필요할 때: 시스템 콜을 통해 운영체제에게 입출력 작업 요청. 운영체제에서 입출력 디바이스에 명령을 내려서 작업 실행. 입출력 작업은 좀 긴 시간에 걸쳐 실행. - 이 과정에서 입출력 작업이 끝날 때까지 다른 일을 하지 않고, 입출력 작업이 끝나야 다시 작업을 시작하면 그건 동기식(Synchronous) 작업 - 이 과정에서 입출력 작업이 끝날 때 까지 기다리지 않고, 그 입출력 작업이 끝나든 끝나지 않든 CPU를 다른 프로세스에 사용하면 이게 비동기식(Asynchronous) 작업 동기식 입출력(Synchronous I/O) 구현 방법1. I/O가 끝날 때까지 CPU를 그 작업에 잡고 있음 ..
[JAVA] 멱집합 {a, b, c, d, e, f}의 모든 부분집합 = (1) a를 포함하지 않는 {b, c, d, e, f}의 부분집합 + (2) a를 포함하는 {b, c, d, e, f}의 부분집합 (1)과 (2)의 크기는 사실 같습니다. 결국 (1)에서 구한 {b, c, d, e, f}의 부분집합에 a를 더한 것들이 (2)이기 때문입니다. 만약 (1)의 크기가 2^5이라면, (2)의 크기 역시 2^5입니다. 때문에 (1) + (2)는 2^5* 2 = 2^6입니다. 여기서 recursion을 발견할 수 있습니다. {b, c, d, e, f}에 대해서도 위의 과정에서 했던 것처럼 b를 포함하지 않는 부분집합과 b를 포함하는 부분집합을 더해줍니다. recursion을 통해 부분 집합들을 계속 return하면 많은 양의 데..
[JAVA] Recursion의 응용: N-Queens 이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;) 이번 포스팅에서 다룰 것은 N-queens라는 문제입니다. N-queens 문제는 아래의 그림과 같이 N * N개로 나뉜 공간에서 N개의 점들이 단 한 점도 동일 선상 위에 놓이지 않게 배열하는 문제입니다. 마치 체스에서 직선과 대각선 모두 이동할 수 있는 퀸에게 잡히지 않게 말들을 배열하는 것에서 그 이름을 따왔을 것이라고 생각합니다. 이 포스팅에서는 N-queens 문제를 상태 공간 트리에서 Backtracking을 통해 해결하는 방법에 대해 알아볼 것입니다. 우선 상태 공간 트리란 가능한 모든 경우의 수들을 노드를 통해 연결한 개념적 그래프를 의미합니다. 가능한 모든 경우의 수를 다루고 있기 때문에 우리가 찾는 해 역시..
[C언어] 이중 연결 리스트 이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;) 단방향 연결 리스트는 자신의 이전 노드의 주소는 알지 못하고 오직 다음 노드의 주소만 알 수 있다는 특징을 가지고 있습니다. 때문에 특정 노드를 삭제하기 위해서는 항상 삭제하려는 노드 바로 앞 노드의 주소를 알고 있어야 한다는 불편함을 가지고 있습니다. 이러한 불편함을 해결하기 위한 자료구조가 바로 이중 연결 리스트입니다. next: 자신의 다음 노드의 주소 prev: 자신의 이전 노드의 주소 첫 번째 노드의 prev와 마지막 노드의 next는 NULL. 단방향에 노드에서 head 노드가 중요했듯이, 이중 연결 리스트에서는 head 노드와 tail 노드 모두 중요합니다. tail 노드를 통해서도 순회가 가능하기 때문입니다. p..
[운영체제] Process(1) 프로세스 = 실행 중인 프로그램 프로세스의 문맥 = 특정 시점을 놓고 봤을 때 어느 시점까지 진행을 했는지 파악하는 것 1. 프로그램 실행 2. 프로세스 A의 독자적인 주소 공간에 코드, 데이터, 스택 생성 3. 프로세스 A가 CPU 제어권을 받음 4. 프로그램 카운터라는 레지스터가 코드 특정 부분을 가리키고 있음 5. 그럼 매 순간 기계어를 읽어서 레지스터가 실행하고, 산술 연산 장치에서 작업을 하고, 결과를 레지스터에 저장하거나 외부의 메모리에 저장 6. 이걸 반복하다 어느 시점에 어느 시점에 왔는지 파악하는 게 프로세스의 문맥(context) -> 코드의 어느 부분까지 진행했는가, 스택에 어느 데이터를 저장하고 쌓아놓고 있는가, 변수의 값은 얼마인가, 레지스터에 어떤 값이 있고 어떤 연산까지 진행했..
[C언어] 연결리스트 - 다항식(3) 이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;) 1. 새로운 다항식 생성 Term* parse_and_add_term(char* expr, int begin, int end, Polynomial* p_poly) { int i = begin; int sign_coef = 1, coef = 0, expo = 1;// 계수의 부호 관리 if (expr[i] == '+')// 계수의 부호를 보고 기억 i++; else if(expr[i] == '-') { sign_coef = -1; i++; } while (i = '0' && expr[i] = end)// 차수가 0인 상수항일 경우 { add_term(coef, 0, p_poly); return 1..