크래프톤 정글 TIL : 0902

lazyArtisan·2024년 9월 2일
0

정글 TIL

목록 보기
64/147

📝 배운 것들


🏷️ 인터럽트 핸들러는 쓰레드인가?

인터럽트 핸들러는 쓰레드의 일종이 아닙니다. 인터럽트 핸들러는 특정 이벤트(예: 하드웨어 인터럽트, 타이머 인터럽트)가 발생했을 때 실행되는 특수한 루틴으로, 일반적인 쓰레드와는 다른 개념입니다.

쓰레드: 쓰레드는 운영 체제에 의해 스케줄링되고 실행되는 독립적인 실행 흐름입니다. 각 쓰레드는 사용자 모드와 커널 모드에서 실행될 수 있으며, 자신의 스택과 레지스터 상태를 가지고 있습니다.

인터럽트 핸들러: 인터럽트 핸들러는 특정 이벤트가 발생했을 때 즉시 호출되어 실행되는 코드입니다. 인터럽트가 발생하면 CPU는 현재 실행 중인 작업을 중단하고 인터럽트 핸들러를 실행합니다. 인터럽트 핸들러는 운영 체제의 스케줄링과는 무관하게 실행되며, 다른 쓰레드와는 독립적인 스택을 사용하지 않습니다. 대신, 현재 실행 중인 프로세스의 커널 스택을 "빌려" 사용합니다​

🏷️ 커널 스택, 사용자 스택

쓰레드의 커널 스택과 사용자 스택은 가상 메모리에서 서로 다른 위치에 존재하며, 서로 합쳐지지 않고 독립적으로 쌓입니다. 운영 체제는 이 두 스택이 물리적으로나 논리적으로 구분되도록 설계되어 있습니다.

사용자 스택은 사용자의 가상 메모리 공간에서 할당됩니다. 각 쓰레드가 자신의 사용자 스택을 사용하여 사용자 모드에서의 작업(예: 함수 호출, 지역 변수 저장 등)을 처리합니다.
사용자 스택은 일반적으로 높은 메모리 주소에서 낮은 주소로 성장합니다.

커널 스택은 커널 모드에서 사용되며, 각 쓰레드가 고유한 커널 스택을 가집니다. 이 스택은 커널의 가상 메모리 공간에서 할당되며, 사용자 스택과는 다른 메모리 공간을 차지합니다.
커널 스택도 일반적으로 높은 메모리 주소에서 낮은 주소로 성장하지만, 이는 커널 영역 내에서만 해당됩니다.



🖥️ PintOS


주간공유 + WIL에 3시간 소요

🔷 주간공유 ppt



⚔️ 백준


📌 7569 토마토

from collections import deque
M,N,H=map(int,input().split())
box=[[] for _ in range(H)]
for i in range(H):
    for j in range(N):
        box[i].append(list(map(int,input().split())))
# 토마토 어디 있는지 탐색
# i : 층수, j : 세로, k : 가로
q = deque()
for i in range(H):
    for j in range(N):
        for k in range(M):
            if (box[i][j][k]==1):
                q.append((i,j,k))
# 큐에 들어있는 size만큼 빼내는거 반복하고 cnt 올리기
# 큐에서 빼내면 6방향 색칠한 뒤 색칠한 부분들 큐에 넣기
# 큐에 더 이상 아무것도 안 들어있으면 종료
di = [1,-1,0,0,0,0]
dj = [0,0,1,-1,0,0]
dk = [0,0,0,0,1,-1]
cnt = -1
while(q):
    cnt+=1
    repeat = len(q)
    for _ in range(repeat):
        i, j, k = q.popleft()
        for n in range(6):
            # 색칠 가능하다면 색칠하고 큐에 넣기
            if 0<=i+di[n]<H and 0<=j+dj[n]<N and 0<=k+dk[n]<M:
                if box[i+di[n]][j+dj[n]][k+dk[n]] == 0:
                    box[i+di[n]][j+dj[n]][k+dk[n]] = 1
                    q.append((i+di[n],j+dj[n],k+dk[n]))
# 다 익었는지 확인
all_ripe = 1
for i in range(H):
    for j in range(N):
        for k in range(M):
            if (box[i][j][k]==0):
                all_ripe = 0

if all_ripe:
    print(cnt)
else:
    print(-1)

# 실수 : i+di[n] 안 하고 box[i][j][k] 해버림

q의 size를 센 뒤 그만큼만 빼면 각 깊이에 따라 모아서 탐색할 수 있다는 거 가져가기

0개의 댓글