실행되고 있는 컴퓨터 프로그램. 프로그램은 작업을 수행하는 명령어들의 집합을 의미한다. stack에 임시데이터(함수 호출, 로컬변수)가 저장되고, heap에는 코드에서 동적으로 만들어지는 데이터가 저장된다. DATA는 초기화되지 않은 변수(BSS)와 초기값이 있는 전역변수(DATA)가 있다.
자동으로 다음 응용 프로그램이 실행될 수 있도록. 순차실행하므로 실행 시간이 긴 프로그램이 많에 있으면 다른 프로그램 응답시간이 길어진다.
응용 프로그램이 CPU를 점유하는 시간을 잘게 쪼개어 실행할 수 있도록 하는 시스템. 응답시간이 짧다
단일 CPU에서 여러 응용 프로그램이 동시에 실행되는 것처럼 보이도록하는 시스템. 10ms~20ms 단위로도 실행 응용 프로그램이 바뀌므로 사용자에게 동시에 실행되는 것처럼 느껴진다. 시분할 시스템의 기본 기술과 같다.
여러 CPU에 하나의 프로그램을 병렬로 실행해서 실행속도를 극대화함
단위시간당 CPU 활용도를 높이는 기술. 응용프로그램은 실행되는 동안 온전히 CPU를 쓰지 않고 중간에 다른 작업을 하는 경우가 있다. (프로그램 실행중에 파일을 읽거나 프린트하는 경우 등) 이렇게 다른 작업을 하는 동안 다른 프로그램을 cpu에서 실행한다.
CPU에 실행할 프로세스를 교체하는 기술이다. PCB는 프로세스 상태 정보를 의미한다. PC, SP, 메모리, 스케줄링 정보등을 가지고 있다. 실행 중지할 프로세스 정보를 해당 프로세스의 PCB에 업데이트해서 메인 메모리에 저장하고, 다음 실행항 프로세스 PCB 정보를 메인 메모리에서 읽어와 CPU에 넣고 실행한다
프로세스는 다른 프로세스의 공간에 접근할 수 없다
. 프로세스 데이터나 코드가 바뀌면 위험하기 때문이다. 환경변수와 프로세스 핸들 테이블 상속이 가능하지만 독립적인 관계
이다. 성능을 높이기 위해 여러 프로세스를 만들어 동시에 실행하는데 프로세스간 상태 확인 및 데이터 송수신이 필요하다. 프로세스간 공간은 완전히 분리되어 있기 때문에 프로세스 간 통신(IPC)
을 수행해야 한다. 그리고 IPC에는 다양한 기법이 있다.
커널 공간의 메모리를 사용하는 기법이다.
기본적으로 단방향 통신을 하고, fork()로 자식 프로세스를 만들어, 부모 자식간 통신을 할 때 사용된다.
커널 공간의 메모리를 이용한다. 큐이므로 FIFO 정책으로 데이터 전송. key 값을 알면 다른 프로세스의 데이터를 읽을 수 있다. 파이프와 달리 부모/자식이 아니라 어느 프로세스 간에라도 데이터 송수신이 가능하고, 단방향, 양방향 모두 가능하다.
커널 공간에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식
이다. 공유메모리 key를 가지고 여러 프로세스에 접근 가능하다.
UNIX에서 30년 이상 사용된 전통적인 기법이다. 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생했는지를 알려주는 기법
. 프로세스 관련 코드에 관련 시그널 핸들러를 등록해서 해당 시그널을 처리한다.
기본적으로 클라이언트와 서버 등 두 개의 다른 컴퓨터 간의 네트워크 기반 통신기술이다. 하나의 컴퓨터 안에서, 두 개의 프로세스 간에 통신 기법으로 사용 가능하다.
프로세스 내에서 실행되는 흐름의 단위.
프로세스처럼 동작하지만 그것보다는 구조가 작다. 프로세스의 서브셋.
import threading
g_count = 0
def thread_main() :
num = 0
global g_count
look.acquire() # mutual exclusion - 파이썬에서 제공하는 함수
for i in range(100000) :
g_count = g_count + 1
lock.release()
lock = threaing.Lock()
threads = []
for i in range(50):
th = threading.Thread(target = thread_main)
threads.append(th)
for th in threads :
th.start()
for th in theads :
th.join()
print('g_count =',g_count)
📑 reference