[OS-002][입문] 프로세스·스레드·스케줄링 이해하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[OS-002][입문] 프로세스·스레드·스케줄링 이해하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 259회 작성일 26-08-29 20:34

본문

[이번 수업]

실행 중인 프로그램을 운영체제가 어떻게 나누어 처리하는지 배웁니다. 프로세스와 스레드의 차이를 이해하고, 스케줄러가 실행 순서를 정하는 이유를 살펴본 뒤 Python에서 PID와 스레드 ID를 비교합니다.

[선수지식]

OS-001의 운영체제·커널·사용자 공간 개념과 터미널 실행법을 알면 됩니다. Python 3가 필요하며

[학습목표]

1. 프로그램과 프로세스, 스레드를 구분한다.
2. 실행 가능·실행 중·대기 상태의 흐름을 설명한다.
3. 동시성과 병렬성의 차이를 이해한다.
4. 같은 프로세스의 스레드와 자식 프로세스 ID를 확인한다.

[핵심개념]

프로그램은 저장장치에 놓인 명령과 데이터이고, 프로세스는 그 프로그램이 실행 중인 인스턴스입니다. 운영체제는 프로세스마다 PID라는 번호를 주고 가상 주소 공간, 열린 파일 같은 자원을 관리합니다.

스레드는 프로세스 안에서 명령을 실행하는 흐름입니다. 한 프로세스의 스레드들은 같은 주소 공간과 많은 자원을 공유하지만 각자 실행 위치와 스택을 갖습니다. 공유 덕분에 데이터 교환은 빠르지만 같은 값을 동시에 바꾸면 결과가 실행 순서에 따라 달라지는 경쟁 상태가 생길 수 있습니다.

CPU 코어보다 실행할 흐름이 많을 수 있으므로 커널의 스케줄러가 다음에 실행할 스레드를 선택합니다. 실행 가능한 흐름은 차례를 기다리고, 선택되면 실행하며, 파일·네트워크·타이머를 기다릴 때는 대기 상태가 됩니다. 구체적인 정책은 운영체제와 설정에 따라 달라지므로 코드가 실행 순서를 우연에 맡기면 안 됩니다.

동시성은 여러 작업의 진행 시간이 겹치는 구조이고, 병렬성은 여러 코어가 같은 순간 실제로 작업하는 것입니다.

[따라하기]

threads_and_processes.py에 다음을 저장하세요.

import os
import threading
import time
from multiprocessing import Process

def show_thread(label):
    time.sleep(0.05)
    print(
        f"{label}: pid={os.getpid()}, "
        f"thread={threading.get_native_id()}",
        flush=True,
    )

def show_child():
    show_thread("child main")

if __name__ == "__main__":
    show_thread("parent main")

    threads = [
        threading.Thread(target=show_thread, args=(f"worker {n}",))
        for n in range(1, 3)
    ]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()

    child = Process(target=show_child)
    child.start()
    child.join()

Windows에서는 py threads_and_processes.py, macOS·Linux에서는 python3 threads_and_processes.py로 실행합니다. 결과 숫자는 컴퓨터마다 다르지만 모양은 다음과 같습니다.

parent main: pid=4100, thread=100
worker 1: pid=4100, thread=101
worker 2: pid=4100, thread=102
child main: pid=4104, thread=200

두 worker의 PID는 부모와 같고 스레드 ID는 다릅니다. child는 별도 프로세스라 PID가 다릅니다. worker 출력 순서는 바뀔 수 있으며 그것도 스케줄링의 결과입니다. __main__ 조건은 특히 Windows에서 자식이 모듈을 다시 불러올 때 프로세스를 반복 생성하지 않도록 필요합니다.

[흔한 실수]

첫째, 스레드를 만들면 항상 여러 코어에서 빨라진다고 생각합니다. 작업 종류와 언어 실행 환경에 따라 다릅니다. 둘째, 출력 순서가 매번 같다고 가정합니다. 셋째, 공유 변수를 보호하지 않아 경쟁 상태를 만듭니다.

[보안 주의]

실습은 본인이 만든 프로세스에서만 진행하고 관리자 권한을 사용하지 마세요. 외부 입력으로 작업 수를 무제한 만들면 CPU·메모리 고갈로 이어질 수 있으므로 동시 작업 수와 실행 시간을 제한하세요. 공유 데이터에는 Lock을 사용하되 Lock 범위를 작게 유지하고, 민감한 값을 프로세스 명령행 인수에 넣지 마세요.

[직접 해볼 과제]

worker를 4개로 늘려 PID와 스레드 ID, 출력 순서를 세 번 비교하세요. 이어서 자식 프로세스를 하나 더 만들고 두 자식의 PID가 서로 다른지 기록하세요.

[확인문제]

1. 같은 프로세스의 스레드들이 공유하는 것과 따로 갖는 것은 무엇인가요?
2. 동시성과 병렬성은 어떻게 다른가요?
3. 출력 순서가 매번 같다고 가정하면 안 되는 이유는 무엇인가요?

[다음 학습]

순환 커리큘럼의 다음 글은 NET-002 IP 주소·서브넷·게이트웨이입니다. 운영체제 트랙에서는 OS-003 파일시스템과 권한으로 이어집니다.

[공식 참고 자료]

Python multiprocessing
https://docs.python.org/3/library/multiprocessing.html

Python threading
https://docs.python.org/3/library/threading.html

Python os.getpid
https://docs.python.org/3/library/os.html#os.getpid

Microsoft Processes and Threads
https://learn.microsoft.com/en-us/windows/win32/procthread/processes-and-threads

Linux 커널 Scheduler 문서
https://docs.kernel.org/scheduler/index.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
182
어제
5,103
최대
16,772
전체
771,236
Copyright © 소유하신 도메인. All rights reserved.