| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- WHERE절
- 미니프로젝트
- re-id
- vscode
- 가상환경
- js
- resnet50
- Class
- poetry
- WIL
- 파이썬
- 프로그래머스
- channels
- 개발일지
- 2주차
- 프로젝트
- 정보처리기사
- Commpot
- 장고
- WebSocket
- 1주차
- 정보처리기사실기
- 알고리즘
- REDIS
- 채팅
- github
- 마스킹
- 백준
- sql
- Git
Archives
- Today
- Total
개발일기
프로세스, 스레드 본문
1. 프로세스 : 실행 중인 프로그램

① 프로세스 분류
- 포그라운드 프로세스: 사용자가 볼 수 있는 공간에서 실행되는 프로세스
- 백그라운드 프로세스: 사용자가 볼 수 없는 공간에서 실행되는 프로세스

② 백그라운드 프로세스
- 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
- 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스
③ 프로세스 제어 블록
- 모든 프로세스는 실행을 위해 CPU가 필요하다.
- CPU 자원은 한정되어 있다..!!
- 그러므로 프로세스들은 돌아가며 한정된 시간만큼만 CPU 이용한다.

- 따라서 운영체제 입장에서는 빠르게 번갈아 수행되는 프로세스들을 관리할 수 있어야 한다.
- 이를 위해 사용하는 자료구조가 프로세스 제어 블록 (이하 PCB)이다..!!
- 프로세스 관련 정보를 저장하는 자료구조
- 마치 상품에 달린 태그와 같은 정보
- 프로세스 생성 시 커널 영역에 생성, 프로세스 종료 시 폐기
- PCB에 담기는 대표적인 정보: 프로세스 ID(PID), 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 정보, 사용한 파일과 입출력장치 정보

④ 프로세스의 메모리 영역
- 사용자 영역에는 크게 코드영역(= 테스트 영역), 데이터 영역, 힙 영역, 스택 영역

⑤ 코드 영역(= 테스트 영역)
- 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read only!!)
⑥ 데이터 영역
- 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장
- 예를 들어 전역 변수
⑦ 힙 영역
- 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
⑧ 스택 영역
- 데이터가 일시적으로 저장되는 공간
- (데이터 영역에 담기는 값과는 달리) 잠깐 쓰다가 말 값들이 저장되는 공간
- 예를 들어 매개 변수, 지역 변수
- 동적으로 스택 영역의 크기는 변한다.
⑨ 멀티 프로세스
- 동일한 작업을 수행하는 단일 스레드 프로세스 여러 개 진행

- 각각 독립적으로 실행된다.
- 각 프로세스는 PID 값이 다 다르다.
2. 스레드 : 프로세스를 구성하는 실행 흐름의 단위
- 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.
- 스레드는 프로세스 자원을 공유한다. (프로세스끼리는 자원을 공유하지 않는다.)


① 단일 스레드 프로세스: 실행 흐름이 하나인 프로세스

② 멀티 스레드 프로세스
- 실행 흐름이 여러 개인 프로세스 (멀티 스레드 프로세스)
- 프로세스를 이루는 여러 명령어 동시에 실행 가능
- 동일한 프로세스에서의 스레드는 서로 영향을 미친다.
- 대신 멀티 프로세스보다 경량이다. (메모리 적게 씀)
- 같은 프로세스에서의 스레드는 PID값이 같다.

3. 깜짝 퀴즈...ㅎㅎ (이번 프로세스, 스레드 주제와 무관하지만.. 그냥 넣어봄)
request.POST['key']
vs
request.POST.get('key')
둘의 차이점은???
둘다 딕셔너리 특정 키에 대응하는 값을 불러오는 코드지만,
request.POST['key']의 경우 키 값이 없으면 keyerror를 가지고 온다. 따라서 try-except문으로 예외처리를 해주어야 한다.
그러나 request.POST.get('key')의 경우 키 값이 없으면 None을 반환한다. 고로 예외처리를 해주지 않아도 괜찮다.
4. 실습타임!
파이썬에서는 os.getpid()로 프로세스의 PID를 확인할 수 있다.
PID값은 운영체제가 그때그때 부여하는 값이기 때문에 여러 번 반복적으로 실행했을 때 다른 PID 값이 출력될 수 있다.
1. 프로세스
# 자식 프로세스 생성하기
from multiprocessing import Process
import os
def foo():
print('chile process', os.getpid())
print('my parent is', os.getppid())
if __name__ == '__main__':
print('parent process', os.getpid())
child = Process(target=foo).start()
# 실행결과
# parent process 5100
# chile process 26048
# my parent is 5100
# 동일한 작업을 수행하는 프로세스
from multiprocessing import Process
import os
def foo():
print('hello, os')
if __name__ == '__main__':
child1 = Process(target=foo).start()
child2 = Process(target=foo).start()
child3 = Process(target=foo).start()
# hello, os
# hello, os
# hello, os
# 각기 다른 작업을 하는 프로세스
from multiprocessing import Process
import os
def foo():
print('This is foo')
def bar():
print('This is bar')
def baz():
print('This is baz')
if __name__ == '__main__':
child1 = Process(target=foo).start()
child2 = Process(target=bar).start()
child3 = Process(target=baz).start()
# This is foo
# This is bar
# This is baz
2. 스레드
# 스레드 만들기
import threading
import os
def foo():
print('thread id', threading.get_native_id())
# 참고로 스레드 ID를 출력하는 파이썬 코드는 threading.get_native_id()입니다.
print('process id', os.getpid())
if __name__ == '__main__':
print('process id', os.getpid())
thread = threading.Thread(target=foo).start()
# foo라는 함수를 실행하는 스레드를 만들고 실행하라
# 실행결과
# process id 28140
# thread id 2536
# process id 28140
# 동일한 작업을 수행하는 스레드 만들기
import threading
import os
def foo():
print('thread id', threading.get_native_id())
print('process id', os.getpid())
if __name__ == '__main__':
print('process id', os.getpid())
thread1 = threading.Thread(target=foo).start()
thread2 = threading.Thread(target=foo).start()
thread3 = threading.Thread(target=foo).start()
# 실행결과
# process id 7052
# thread id 20544
# process id 7052
# thread id 31604
# process id 7052
# thread id 2200
# process id 7052
# 프로세스 ID는 똑같지만, 스레드 ID는 다르다.
# 세 개의 스레드 모두 각기 다른 스레드지만, 이들은 모두 동일한 프로세스를 공유하고 있다
# 각기 다른 작업을 하는 스레드 만들기
# 하나의 프로세스 내에 여러 개의 실행 흐름을 만든다.
import threading
import os
def foo():
print('This is foo')
def bar():
print('This is bar')
def baz():
print('This is baz')
if __name__ == '__main__':
thread1 = threading.Thread(target=foo).start()
thread2 = threading.Thread(target=bar).start()
thread3 = threading.Thread(target=baz).start()
# 실행결과
# This is foo
# This is bar
# This is baz'오늘의 공부일기' 카테고리의 다른 글
| 6주차 WIL (0) | 2023.04.24 |
|---|---|
| 5주차 WIL (0) | 2023.04.18 |
| 노베이스 초보 개발러를 위한 학습법 특강..!! (0) | 2023.04.11 |
| 4주차 WIL (0) | 2023.04.10 |
| 3주차 WIL이자 게임 프로젝트 후기 (2) | 2023.04.02 |