SW 정글
-
[PintOS] WIL (4) 난 이해를 한 걸까..?SW 정글/운영체제 2024. 10. 22. 00:09
이 글은 swap disk와 copy on write에 대해 무지성으로 작성되었습니다.Copy On Write 현재까지는 fork할 때 메모리가 할당된 page에 대해서 부모에서 자식으로 복사할 때 같은 내용의 물리메모리를 자식에게도 할당 해주었다. 같은 메모리가 두 번 복사되기에 메모리 낭비로 볼 수도 있다.cow는 fork시에는 부모와 자식이 동일한 물리 메모리를 가리키게 하고해당 페이지에 write 요청이 발생해야 새로운 물리메모리를 할당해 주도록 수정한다. fork 시 물리메모리를 모두 복사하지 않고 부모와 같은 물리메모리를 공유하다가 write작업 시 해당 페이지의 물리메모리를 새로 맵핑한다.부모와 자식 프로세스는 쓰기 작업 이후에 서로 다른 메모리 프레임을 가지게 되어, 쓰기 작업이 서로에게 ..
-
[PintOS] WIL (3) Lazy load segment / 지연 로딩 간단한 수준으로만SW 정글/운영체제 2024. 10. 14. 23:56
지연로딩은 왜 하는 걸까요사용자가 필요할 때만 물리 메모리를 할당해서 사용하기 위함입니다. 지연 로딩을 구현하려면, 페이지 할당 과정에서 해당 페이지에 대응하는 (uninit 타입의) page 구조체만 생성하고,물리 프레임은 할당하지 않습니다. 이렇게 생성된 페이지는 초기에 아무런 내용도 담고 있지 않습니다.실제 내용을 담을 물리 메모리 프레임은 페이지 폴트가 발생했을 때에만 연결됩니다. 페이지 폴트는 시스템이 해당 페이지의 실제 데이터가 필요하다는 "시그널"을 받는 순간 발생합니다.이는 사용자가 해당 메모리 주소에 접근했다는 것을 의미하며, 필요한 데이터를 메모리로 로드하도록 구현되어야 합니다. 페이지 폴트가 처리된 후에는, 페이지의 타입을 uninit에서 실제 데이터 타입(예: anon 또는 file..
-
[PintOS] WIL (2) Argument_Passing / System_Call (수정전)SW 정글/운영체제 2024. 10. 8. 01:42
지금 현재 코드는 command line을 입력받으면 함수명과 인자를 분리하지 못 하고 통으로 하나의 문자열로 취급해서 받고 있습니다.process_exec() 에 코드를 추가해서 간단히 프로그램 파일 이름을 인자로 넣는 것 대신에,공백이 나올 때마다 단어를 parsing하도록 만들어야 합니다.이때, 첫 번째 단어는 프로그램명이고 두 번째, 세 번째 단어는 각각 첫 번째, 두 번째 인자입니다. Gitbook을 읽으면 핀토스가 커널에 통과시킬 수 있는 커맨드 라인의 인자 길이 제한은 128바이트라고 하지만 64로 해도 통과합니다 토큰화하기 // 인자 파싱을 수행하는 부분 char *parse[64]; char *token, *save_ptr; int count = 0; fo..
-
[PintOS] WIL (1) alarm-clock 위주 (추후 보완 예정)SW 정글/운영체제 2024. 10. 1. 01:22
현대의 우리 컴퓨터는 멀티스레딩 환경을 가지고 있다.멀티스레드 전에는 스레드가 하나일 때가 있지 않았을까?우리의 귀여운 PintOS는 하나의 스레드만을 가지고 있다.단일 스레드를 가진 프로세스는 어떻게 효율적으로 사용해야 하는지 고민하는 게 이번 과제라고 생각했다. 기존 코드의 문제 - Polling 방식?눌러? 아니네, 눌러? 아니네, 눌? 아, ㄱ? ㄴㄴ //*============ SLEEP ===================================// 지정된 타이머 틱 수만큼 실행을 일시 중단하는 함수입니다.void timer_sleep (int64_t ticks) { //timer_sleep 함수 호출 시 가장 먼저 timer_ticks()를 호출하여 현재 타이머 틱의 수(start)를 ..
-
1655. 가운데를 말해요 (우선순위 큐)SW 정글/알고리즘 2024. 8. 19. 14:47
https://www.acmicpc.net/problem/1655 풀이 import sys, heapqinput = sys.stdin.readlinen = int(input())left_h =[]right_h = []for i in range(n): num = int(input()) if len(left_h) == len(right_h): #원소의 개수가 짝수일 때 heapq.heappush(left_h, -num) #left의 원소들이 더 작을 수밖에 없으니 내보내는 걸로. else: heapq.heappush(right_h, num) #작은 수들의 [0]=최소값(실제는 최대값)이 큰 수들의 최소값[0]보다 크면 if right_h an..
-
10872. 팩토리얼SW 정글/알고리즘 2024. 8. 11. 13:39
풀이 import sys#팩토리얼n = int(input())a = 1for i in range(n): a *= n-i if n-i == 1: breakprint(a)# 10 입력하면 100부터 20까지 출력# n = int(input())# for i in range(n):# a = n*(n-i)# if n-i == 1:# break# print(a) 설명 밑에 주석은 일단 넘어가자(참고용이자 처음에 반대로 생각했던 코드)a를 n아래에 1로 할당했어야 했는데 놓친 부분이 있었다.하지만 앞에 골드바흐에서 break문을 쓰고 익혔던 걸 사용하니 원하는 길이 내에서 끝났다.또다른 풀이i=1for a in range(int(input())): ..
-
9020. 골드바흐의 추측SW 정글/알고리즘 2024. 8. 10. 23:42
2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.풀이 import sysdef is_prime(s): if s == 1: return False for i in range(2, int(s**0.5)+1): if s % i == 0: return False return True#소수조합 경우의 수가 여러 개일 경우, A+B에서 A와 B의 차가 가장 작은 두 요소를 출력해라#TestCase 개수n = int(input())for i in range(n): num = int(sys.stdin.readli..