인프런의 운영체제 공룡책 강의를 듣고 정리한 포스팅입니다. 멀티 스레딩 하나의 프로세스가 여러 개의 스레드를 가질 수 있음 스레드 (Thread) 스레드는 가벼운 프로세스임 (LWP : Light Weight Process) 멀티스레딩이 제공된다면, CPU를 점유하는 단위가 스레드가 됨 CPU를 점유하는 것이 PID(Process ID)가 아닌 TID(Thread ID)가 됨 스레드 별로 나뉘는 것 program counter register set stack 나머지 메모리 영역은 프로세스 내의 모든 스레드가 공유 멀티 스레딩의 장점 Responsiveness : 유저 인터페이스를 처리할 때 block할 필요 없이 실행을 계속 할 수 있음 Resource Sharing : 스레드는 코드와 데이터 영역을 ..
들어가며 C#에서는 클래스가 참조 타입이기 때문에 매개 변수로 넘길 때도 힙 메모리를 가리키는 포인터를(주소값) 넘기는 것으로 알고있다. 그러면 ref 키워드를 안써도 원본의 값을 변경할 수 있는데 왜 ref 키워드를 쓰는거지? 궁금해서 찾아보다가 정리하게 되었다. 클래스의 멤버 변수는 바꿀 수 있다. using System.Collections.Specialized; using System.Linq.Expressions; namespace Test { class Program { class Point { private int x; private int y; public Point(int _x, int _y) { x = _x; y = _y; } public void AddPoint(Point pos) /..
인프런의 운영체제 공룡책 강의를 듣고 정리한 포스팅입니다. 프로세스 (Process) 메모리에 할당된 실행 중인 프로그램 프로세스는 운영체제에서 작업의 단위 프로세스가 필요한 자원 CPU time memory files I/O device 메모리 구조 프로세스의 메모리 레이아웃은 여러 개의 섹션으로 나누어짐 text : 명령어들이 있는 영역 data : 전역 변수와 static 변수가 있는 영역 heap : 동적으로 할당되는 영역 stack : 함수 호출시 쌓이는 영역 (매개 변수, 지역 변수, return 주소값) 프로세스의 생명 주기 프로세스의 생명 주기를 통해 상태가 나누어지는데, 이를 이용해 운영체제가 프로세스들을 관리함 New : 프로세스가 생성된 상태 Running : CPU를 점유해 프로세스..
인프런의 운영체제 공룡책 강의를 듣고 정리한 포스팅입니다. 운영체제의 정의 하드웨어 제어, 사용자와 어플리케이션 프로그램에 서비스를 제공하는 소프트웨어 컴퓨터에서 항상 실행하고 있는 프로그램 → 여기서 핵심은 커널(Kernel) 프로그램의 두 가지 타입 시스템 프로그램 응용 프로그램 커널 커널에서 시스템 프로그램과 어플리케이션 프로그램에 대한 인터페이스 제공 인터럽트 (Interrupts) CPU와 I/O device가 서로 통신하는 방법 중 하나 하드웨어가 언제나 인터럽트를 트리거 시킬 수 있음 트리거 시키면, 시스템 버스를 통해 CPU에 신호를 보냄 저장 시스템 용량, 속도에 따라 계층 구조가 나뉨 계층 구조 (상위 → 하위) CPU 내부에 있는 레지스터 캐시 메인 메모리 (RAM) SSD (soli..
문제 링크 15663번: N과 M (9) 풀이 순열 문제인데 백트래킹 대신 next_permutation 함수 연습할 겸 풀었다. 여느 순열 문제와 같이 풀면 되지만, 중복을 제거하기 위해 마지막으로 구한 순열과 현재 구한 순열이 같지 않으면 출력하도록 했다. 코드 #include #include #include using namespace std; int arr[9]; int n, m; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for (int i = 0; i > arr[i]; } sort(arr, arr + n); vector pre; do { vector cur; for (int i = 0; i ..
문제 링크 1600번: 말이 되고픈 원숭이 풀이 BFS로 푸는 문제. 처음에 메모리 초과가 났는데, 말로 오는 경우와 그냥 오는 경우 방문 처리를 같게 해서 그랬음 먼저 원숭이가 갈 수 있는 위치를 정해주기 위한 dy와 dx를 지정한다. 입력을 받으며 dist도 INF로 초기화해준다. dist 배열은 3차원 배열인데, 말로 이동한 횟수의 각 위치 거리를 계산하기 위함이다. BFS를 통해 탐색한다. q는 tuple로 각 위치와 말로 이동한 횟수를 넣어준다. 원숭이가 이동할 수 있는 자리는 12개인데, 말로 이동한 횟수가 k를 넘어서면 말로 이동을 못하기 때문에 continue 해당 위치가 범위를 넘어서거나, 갈 수 없는 위치라면 continue 말로 오는 경우 dist[ny][nx][cnt+1]이 왔던 위..
문제 링크 2146번: 다리 만들기 풀이 BFS 문제 섬에 대해서 BFS를 돌리면서 섬의 종류를 나눠준다. 육지에 대해 바다 옆에 있는 육지라면 q에 해당 육지를 넣어주고, 해당 거리부터 시작하기 위해 dist 값은 0으로 넣어준다. 다리를 짓기 위해 BFS를 돌릴건데, 해당 다리가 어느 섬에서부터 지어진건지 체크하며(island), 같은 섬에서 지어진 다리라면 continue, 다른 섬에서 지어진 다리라면 그 두 개의 다리를 이어주면 된다. (dist[ny][nx] + dist[ty][tx]) 3번의 경우의 수가 다 아닐 경우 바다이기 때문에 dist와 island를 갱신해주고 q에 넣어준다. 3번에서 두 개의 다리를 이어준 것 중 최솟값을 출력한다. 코드 #include #include #includ..
문제 링크 4179번: 불! 풀이 BFS문제인데 접근 방식이 헷갈렸던 문제 불에 대한 BFS 탐색으로 모든 길에 대한 dist를 구하고, 지훈이는 그 dist를 토대로 BFS탐색을 해야한다. 또, 불은 2개 이상 있을 수 있어 거리에 대해 불이 올 최소 시간을 구해야 하는데, 이는 큐에 불 초기 위치를 바로바로 push해주면 된다. 나는 여기서 불 하나씩 탐색을 해서 헷갈렸음 코드 #include #include #define INF 1000001 using namespace std; char board[1001][1001]; int fireDist[1001][1001]; int dist[1001][1001]; int r, c; int jy, jx; int dy[4] = { -1, 0,1,0 }; int..
문제 링크 10799번: 쇠막대기 풀이 스택 응용 문제 i가 str.size()-1이 아니라면 레이저인지 체크한 뒤, 레이저라면 answer에 현재 스택에 있는 막대기의 수를 더해준다. ()가 한 세트이기 때문에 i++도 해준다. (라면 stk에 push한다. )라면 stk에서 pop하고, answer에 1을 더해주는데, 예를 들어 막대기가 두 개의 레이저로 인해 잘렸다면 레이저 수 + 1로 3등분 되기 때문에 이를 위한 계산이다. 코드 #include #include #include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); string str; cin >> str; int answer = 0; stack stk; fo..
문제 링크 6198번: 옥상 정원 꾸미기 풀이 스택 응용 문제.. 어렵다 sum을 구할 때 int로 하면 틀린다. long long으로 해줘야 함 입력값을 거꾸로 스택에 넣어주기 시작한다. 현재 값을 stk의 top과 비교해서 작으면 pop하고 second를 더해준다 여기서 second는 현재 값을 포함한 지운 수가 된다. tmp에는 현재 값에서 볼 수 있는 옥상의 수가 된다. 현재 값을 stk에 push한다. second는 현재 값을 포함해야 하므로 지운값+1(tmp+1)이 된다. cnt에 tmp를 더한 뒤 출력한다. 코드 #include #include #include using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int..