옵시디언에 써놓은건데 아까워서 업로드
1. 멀티프로그래밍 throughput >> 타임쉐어링 throughput
-> 멀티프로그래밍 방법은 타임 쉐어링 방법에 비해 ready 상태로 돌아가는 회수가 적기 때문 (멀티프로그래밍에서는 한번 cpu 를 배정 받으면 입출력 요청과 같은 블록시스템 콜이 발생하거나 실행을 마칠 때까지 계속해서 cpu 를 사용하지만 타임쉐어링 방식은 타임슬라이스라는 제한 시간을 정해둬서 클락 인터럽트마다 강제로 cpu 를 뺏기고 레디 상태로 보내짐.)
2.커널 스택 : OS 가 프로세스 실행 환경 중 프로세스를 제어하기 위해 내부적으로 생성하여 운영하는 System Context 의 핵심 구성요소
Pasted image 20260418225542.png
유저모드 커널모드 나뉘어있고, 그 안에 각각 유저스택 커널스택이 있음.
커널 스택 -> 커널모드일때 운영체제 내부의 커널 함수들을 호출 + 임시 정보 저장, 시스템 콜 + 인터럽트 처리 시 사용함
(커널함수인자값, 커널함수지역변수, Register Context)
유저 스택 -> 내 프로그램에서 일반 함수 호출 시. (복귀주소+리턴어드레스, 지역변수, argu 저장)
유저스택과 커널스택 모두 각자의 실행모드에서 호출되는 함수의 인자, 로컬 변수, 복귀 주소 등을 저장하는 본연의 역할을 동일하게 수행함.
(Context = 프로세스가 "갖고 있는 것" / Mode = CPU가 "지금 어떤 상태인가")
유저모드 : 사용자가 작성한 일반적인 응용 프로그램 코드를 실행할 때 상태
커널모드 : 운영체제의 핵심 코드인 커널을 실행할 때 상태 (유저모드였다가 운영체제의 개입이 필요하면 모드 진입 -> 시스템콜 호출, 인터럽트 발생 시)
3. PCB
동일한 프로그램을 여러번 실행해서 여러개의 프로세스가 생성되어도 각각은 운영체제 입장에서 독립 된 별개의 프로세스이다.
-> 각 프로세스의 고유한 상태와 정보를 관리하기 위해 운영체제는 각 프로세스마다 개별적인 PCB 를 따로 생성하여 할당한다. (1프로세스 1PCB)
4. 마이크로 커널은 주소공간관리, IPC (프로세스 간 통신) 기본 스케줄링 같은 몇가지 필수 기능만 가진다
그 외 커널 기능들은 유저 레벨 프로세스로 구현될 수 있다.
마이크로 거널은 커널의 크기화를 최소화하기 위해 시스템 운영에 없어서는 안 될 가장 핵심적이고 필수적인 기능만을 커널 영역에 남겨둔다.
3가지 핵심기능 : 주소 공간 관리 / (IPC)프로세스 간 통신 / 기본 스케줄링
(덜 핵심 기능은 커널 밖으로 빼내어 일반 앱과 같은 유저레벨 프로세스 형태로 구현하여 동작시킨다)
뛰어난 유지보수 및 확장성 but 유저 레벨로 분리된 기능들이 서로 협력하려면 반드시 커널을 거쳐서 메시지를 주고받는 IPC 과정을 수행해야해서 실행속도가 느려짐.
5. Suspend 상태 : 프로세스를 메모리에서 디스크로 통째로 내쫗기
프로세스는 보통 '러닝-> 블락-> 레디-> 러닝...' 이러는데 가끔 메모리 부족하면 OS 가 일부 프로세스를 아예 메모리에 꺼내서 디스크에 저장해버림
이게 suspend(중단)
Suspended 상태의 핵심 특징 : 프로세스가 메모리에 없고 디스크에 있음 / CPU 스케줄링 대상에서 완전 제외 / 다시 메모리로 불러오는 swap-in 을 해야 실행 가능해짐
Suspended 2종류
- Suspended Ready : 레디 상태일때 메모리에서 쫓겨남. 메모리에 올라오면 바로 레디
- Suspended Block : 블락 상태일때 메모리에서 쫓겨남. 메모리에 올라와도 여전히 I/O 대기
Suspended 원인 : 메모리부족 / 사용자의 프로세스 일시중지 / OS 가 악성 오류 프로세스 격리 / 부모가 자식proc 중단시킬 때
6. atomic : 중간에 안끊기고 다 해버리는거 (인터럽트 차단)
critical section 주변에 entry/exit section을 추가해 보호하는 방법의 장점은 mutual exclusion ( 한번에 하나의 프로세스만 임계 구역에 들어갈 수 있게 강제하는 것) 이 제공되지만
크리티컬 섹션이 atomic 하게 실행되진 않는다;;
크리티컬 섹션이 실행되는 도중에 클럭 인터럽트 등이 걸려 다른 프로세스로 컨텍스트 스위치가 발생할 수 있다.
화장실 칸 = Critical Section (공유 자원)
문 잠그기 = Entry Section (진입 요청)
볼일 보기 = Critical Section 실행
문 열기 = Exit Section (퇴장 알림)
밖에서 기다리기 = Blocked 상태
race 방지를 위해 반드시 만족해야 하는 3가지 조건
- mutual exclusion (상호 배제)
- progress (임계구역이 비어있으면 무조건 출입 허용해줘야함)
- bounded waiting (한정대기)
entry/exit 으로 담장을 치는 알고리즘은
peterson's / testset / semaphore / Backery 에 모두 쓰인다
7. PCB 에 저장되어 있는 것
Pasted image 20260418234442.png
식별정보(pid) / 프로세스 상태 / CPU 레지스터 저장값 / 스케줄링 정보 / 메모리 정보 / 자원 및 I/O 정보
8. 프로세스와 스택구조
모든 프로세스는 생성될 때 기본적으로 하나의 스레드로서 실행될 수 있는 환경 (스택과 제리스터 문맥 저장공간)을 이미 갖추고 있다.
- 따라서 기본 스레드 한 개만 있는 싱글 스레드 프로세스 경우에는 기존 프로세스가 가지고 있는 한 개의 스택과 한개의 (TCB=레지스터 저장공간,pcb의 일부)만 존재합니다.
- 멀티 스레드 프로세스에는 스레드 개수만큼 스택과 레지스터 공간이 생긴다.
9. 시그널
시그널은 단순히 특정 이벤트가 발생했음을 알리기 위해 미리 약속된 정수 번호만을 전달하는 매커니즘이다.
10. semWait(s), semSignal(s)
semWait(s) : 자원 요청, 돌 하나 꺼낸다. 근데 돌 없으면 나를 큐에 넣고 잔다.
-> 여기서 자원을 얻지 못해 블록 된 프로세스는
semSignal(s)에 의해 깨어나 ready 상태를 거쳐 cpu 를 받는다. 이 때 semWait(s)를 처음부터 다시 실행하는 것이 아니라 블록되어 멈췄던 지점부터 실행을 재개하여 곧바로 임계구역에 들어간다. 즉 , 돌은 이미 꺼내진 상태고 자원이 이미 확보된 상태다. (semSignal 이 queue에서 꺼낼 때 자원을 넘겨주기 때문.)
semSignal(s) : 자원 반납. 돌 하나 다시 넣는다. 기다리는 애 깨워준다.
11. Backery algorithm
mutual, progress, bounded waiting 3가지 모두 만족
그러나 entry section의 코드가 매우 길고 복잡하며 자원을 기다리는 동안 CPU 를 낭비하는 BusyWaiting 을 해야함 (오버헤드가 매우 커서 실용성 XXx)
그러나 semaphore 은 backery 알고리즘 처럼 완벽한 3가지 만족 + 진입 시 semWait 한줄. 특히 자원이 없을 때는 busy waiting 이 아니라 그냥 자면 됨. cpu 낭비가 적어서 효율적임.
따라서 세마포어를 사용하면 베이커리 알고리즘과 동일한 3가지 기능을 더 효율적으로 실행하도록 구현할 수 있음
12. Binary semaphore
바이너리 세마포어도 자신의 큐를 가진다. 다만 semSignal()이 실행되면 큐에서 기다리는 모든 프로세스들을 레디 상태로 보낸다. (깨운다는 뜻)
0과 1 만의 값을 가지는 바이너리 세마포어도 자원을 얻지 못한 프로세스들이 대기하는 큐를 가짐.
일반 세마포어 : semSignal() 하면 앞에 있는 프로세스 단 하나만 깨움
이진 세마포어 : semSignal() 하면 큐에서 자고있는 애들 다 깨워서 준비시킴 (ready 로 전환) -> 동시에 다 깨서 무질서한 race 생길 수도.. 운이 나쁜애는 새치기를 계속 당해 자원을 얻지 못하고 Starvation이 될 수도 있음.
13. Device file : os 내 특수 파일
운영체제는 장치를 파일처럼 추상화하여 공통 된 인터페이스로 제어하기 때문에, 일반 파일들과 마찬가지로 해당장치 파일의 속성 및 제어 정보를 담는 FCB를 메인메모리와 디스크에 생성하여 관리 한다.
2. race 방지 4가지 방법
2. Critical section problem의 해결방법에 필요한 세 가지 요구사항 관점에서 아래 네 개 중 하나는 나머지 세 개와 차이가 있다. 그것이 무엇인지 번호를 답지에 쓰시오. (3점)
① Peterson's algorithm ② Bakery algorithm ③ Testset function ④ Semaphore
답 : ③ Testset function
==임계구역 문제 해결 3요소 : mutual (상호배제), progress, bounded waiting ==
1 2 4 는 3요소를 모두 만족시키지만 테스트셋은 bounded waiting 을 만족 못시킴.
atomic으로 상호배제는 할 순 있지만 진입을 위해 무한 반복하며 묻는 비지웨이팅방식을 사용하면서도 대기자들이 사이의 순서를 정해주는 규칙이 없음. 기아상태 생길 수도
4가지 방법
요약
피터슨 : flag와 turn 변수 사용함. 3요구사항 다 만족 but 오직 프로세스가 2개일때만 작동함.
베이커리 : 여러개의 프로세스에서 작동 가능. 3요구사항 다 만족. 그러나 엔트리 섹션 코드가 너무 복잡하고 길어서 오버헤드가 큼. 실용성 별로. 가끔 비지웨이팅도 걸림
테스트셋 : atomic 하게 실행. 값을 검사해 0이면 1로 바꾸고 true 반환함. 여러개의 프로세스에서 가능. 효율적임. while(!testset(bolt))로 짧음 코드가
근데 근데 바쁜대기, 기아, 데드락 걸림
세마포어 : 3요구사항 다 만족. 큐와 semWait() semSignal() 써서 바쁜대기가 없고 세마포어가 관리하는 공유자원(임계구역 입장권)이 없을 때 프로세스를 대기에서 지워버림 (block) 프로세스간 실행 순서 제어에도 쓸 수 있음. 그블락되고 자던 애는 semSignal 맞고 세마포어 1증가되면 레디상태 (레디큐에 올라가기도 함)
이진세마포어 : 세마포어 변수값이 0과 1만됨. 상호배제를 위해서만 사용됨. semSignal() 하면 자고 있던 애들 다 깨서 비지웨이팅이나 기아상태 발생 가능.
긴 설명
Peterson's Algorithm (피터슨 알고리즘)
- 의미: 임계 구역(Critical Section) 문제를 해결하기 위해 flag와 turn 변수를 사용하는 순수 소프트웨어적 해결책입니다.
- 장점: 임계 구역 보호를 위한 3가지 필수 요구사항(상호 배제, 진행, 유한 대기)을 모두 완벽하게 만족합니다.
- 단점: 오직 2개의 프로세스가 존재하는 환경에서만 동작하며, 3개 이상의 프로세스에서는 사용할 수 없습니다.
Bakery Algorithm (베이커리 알고리즘)
- 의미: n개의 프로세스(n \ge 2)를 지원하기 위해 고안된 소프트웨어 해결책으로, 빵집에서 번호표를 뽑고 순서를 기다리듯 가장 작은 번호를 가진 프로세스가 먼저 임계 구역에 진입하는 방식입니다.
- 장점: n개의 프로세스 환경에서 3가지 요구사항을 모두 만족하는 이론적으로 완벽한 해결책입니다.
- 단점: 진입 구역(Entry Section)의 코드가 매우 길고 복잡하여 실행 시간이 오래 걸리는 큰 오버헤드가 발생합니다. 또한, 자원을 기다리는 동안 루프를 계속 도는 바쁜 대기(Busy-waiting)를 사용하여 CPU를 낭비하므로 실제로는 거의 사용하지 않는 비실용적인 방법입니다.
TestSet Instruction (테스트셋 명령어)
- 의미: 하드웨어의 지원을 받아 원자적(Atomic)으로 실행되는 운영체제 내부의 특수 함수입니다. 값을 검사해 0이면 1로 바꾸고 true를 반환하는 짧은 코드로 진입 여부를 결정합니다.
- 장점: 코드가 한 줄(while (!testset(bolt)))로 매우 간단하며 베이커리 알고리즘보다 대단히 효율적입니다. 단일 및 다중 프로세서 환경의 n개 프로세스에 모두 적용 가능합니다.
- 단점: 여전히 바쁜 대기(Busy-waiting)를 사용하여 CPU 시간을 낭비합니다. 프로세스 진입 순서를 보장하지 않아 유한 대기 조건을 위배하므로 기아 상태(Starvation)가 발생할 수 있으며, 우선순위 스케줄링 시 교착 상태(Deadlock)를 유발할 위험도 존재합니다.
Semaphore (세마포어 / 범용 세마포어)
- 의미: 정수형 변수와 자체 대기 큐(Queue)를 가지는 하드웨어/운영체제 지원 동기화 도구입니다. 원자적으로 실행되는 semWait()(값을 감소시키고 자원이 없으면 스스로 블록 상태 진입)와 semSignal()(값을 증가시키고 대기 중인 프로세스를 깨움) 함수를 통해 자원을 관리합니다.
- 장점: 자원이 없을 때 반복해서 확인하지 않고 프로세스를 대기 큐에서 재워버리므로(Block), 바쁜 대기(Busy-waiting)로 인한 CPU 낭비를 원천적으로 없앴습니다. 상호 배제, 진행, 유한 대기 3조건을 모두 만족하며 상호 배제 외에도 프로세스 간 실행 순서 제어 등 다양하게 활용할 수 있습니다.
- 단점: 프로그래머가 코드 내에서 semWait()와 semSignal()의 호출 횟수(짝)를 정확히 맞추지 않으면 시스템이 오동작할 수 있으며, 초보자에게는 초기값 설정 및 사용이 다소 까다로울 수 있습니다.
Binary Semaphore (이진 세마포어)
- 의미: 세마포어 변수 값이 오직 0(사용 불가)과 1(사용 가능)만 가질 수 있도록 제한된 특수 세마포어입니다. 주로 임계 구역의 상호 배제(Mutual Exclusion)를 위해서만 엄격하게 사용되며 '락(Lock/Mutex)'이라고도 불립니다.
- 장단점 및 특징: 범용 세마포어와 역할은 같으나, 전통적인 이진 세마포어에서 semSignal()을 호출하면 대기 큐에서 자고 있던 모든 프로세스를 동시에 깨워버린다는 구조적 단점이 있습니다. 동시에 깨어난 프로세스들이 서로 자원을 차지하려고 무질서하게 경쟁하게 되어 유한 대기(Bounded waiting)가 보장되지 않고 기아 상태(Starvation)를 유발할 위험이 있습니다. (단, 최신 운영체제들의 락 구현에서는 큐의 맨 앞 프로세스 하나만 깨우도록 이 단점을 보완해 사용합니다).
💡 4가지 방식의 핵심 차이점 요약
- 소프트웨어 vs 하드웨어 지원 여부
- 피터슨 알고리즘, 베이커리 알고리즘: 프로그래머가 작성한 일반 코드만으로 제어하는 순수 소프트웨어적 해법입니다.
- TestSet, 세마포어, 이진 세마포어: 실행 도중 인터럽트가 걸리지 않는 원자적(Atomic) 연산이라는 하드웨어 및 운영체제의 특별한 지원을 받아 구현되는 해법입니다.
- 대기 방식: 바쁜 대기(Busy-Waiting) vs 블록(Block/Sleep)
- 베이커리 알고리즘, TestSet: 임계 구역에 들어가지 못할 때 while문 등을 무한 반복하며 진입 가능 여부를 계속 묻는 바쁜 대기(Busy-waiting) 방식을 사용하여 소중한 CPU 자원을 크게 낭비합니다.
- 세마포어, 이진 세마포어: 자원이 없음을 인지한 순간 운영체제가 해당 프로세스의 CPU를 빼앗고 대기 큐로 보내 잠재우는 블록(Block/Wait/Sleep) 방식을 사용하므로 CPU 낭비를 혁신적으로 줄였습니다.
- 적용 가능한 프로세스의 수
- 피터슨 알고리즘: 오직 2개의 프로세스 사이에서만 유효합니다.
- 나머지 모두 (베이커리, TestSet, 세마포어류): n개의 다중 프로세스 환경에서 폭넓게 사용할 수 있습니다.
3. 프로세스 상태도
Pasted image 20260419010123.png
4. COW 질문들 각각에 대해 설명하시오. (10 점)
(1) 자신과 다른 코드를 가진 child process를 만들 때 COW 방법의 장점
일반적인 fork 방식 : 즉시 전체 복사
자식프로세스를 생성할 때 부모프로세스 유저의 컨텍스트 (데이터, 스택 등)을 메모리에 고스란히 복사해야한다.
COW 방식 : 필요할 때만 복사. PCB 만 만들어놓고 코드 데이터 스택을 가리키기(공유)만 하는거임
즉 fork() 직후에는 페이지 테이블만 복사해놨다가 실제 수정할 때만 그 페이지만 복사하는거. 그러다 값 변경하려하면 바로 복사해서 각자 영역 만듦
근데 cow 방식을 사용하면 메모리를 당장 복사하지 않고 부모의 메모리주소만 공유하게 설정한 다음에, exec() 호출하자마자 연결 끊고 새 실행파일의 문맥만 디스크에서 읽어와서 메모리에 새롭게 할당해주면 되어서 무의미한 복사과정이 생략된다.
Pasted image 20260419012124.png
자식 프로세스를 생성한 후 곧바로 exec() 시스템콜을 호출하여 자신과 전혀 다른 코드로 덮어씌우는 경우, COW 방식을 사용하면 불필요한 메모리복사 오버헤드를 없애 프로세스 생성시간을 단축하고 메모리를 크게 절약 할 수 있따.
(2) System call 과 OS command (shell command)의 용도 차이
System call : 프로그램->운영체제 커널에 작업을 요청할 때 부르는 프로그래밍 인터페이스
OS command : 사용자가 운영체제 서비스 이용,작업
5. VAS 그리기
vas : 총 4G ( 0- 4G-1)

6. Suspended
(1) Suspended 상태에 있는 프로세스가 스케줄링 작업 대상에 포함되는 지, 예 또는 아니오로 답하시오
아니오
(2) 위 문제의 답이 예인 경우 block 상태 프로세스에 비해 어느 것을 우선하는지 설명하시오. 답이 아니오인 경우 아닌 이유를 설명하시오.
suspended 상태는 메인 메모리 공간 부족등의 이유로 유저문맥의 메인메모리에서 보조기억장치(디스크) 로 쫗겨나있는 상태이다
스케줄러에 의해 선택되어 cpu를 할당받고 실행되려면 ready 상태여야한다. 메인메모리로 다시 불려오기전까진 cpu스케줄링 대상에서 제외된다.
7. 스레드 컨텍스트 스위치 , 프로세스 컨텍스트 스위치
(1) 어느 것이 더 오래 걸리는지 쓰시오.
프로세스 컨텍스트 스위치
(2) 그 이유를 설명하시오.
프로세스 컨텍스트 스위치 : 메모리에 있는 기존 프로세스의 유저문맥을 안전하게 보관하고 새로운 프로세스를 위한 리소스들로 완전히 변경 (문맥 변경 + 리소스 변경) 오버헤드가 커서 시간 많이 소요됨
스레드 컨텍스트 스위치 : 코드, 데이터. 파일등의 리소스 바꿀 필요 없이 스레드 컨텍스트와 스택, 레지스터 값 정보만 변경하면 되어서 시간 적게 소요됨.
8. DeadLock 사례
Pasted image 20260419013844.png
DeadLock 대처 방법
- 사전 예방. 상호 배제, 점유 대기, 비선점 순환 대기 중 단 하나라도 만족하지 못하게 원천적으로 진입 막기 (오버헤드 크고 자원 활용도 떨궈서 안됨)
- 주기적으로 발생 여부 검사해서 발생했을 때 해결
- 아무런 조치도 안취하고 프로그래머가 개입하여 문제가 된 프로세스 강제종료 시키기
데드락 원인 4요소
- 상호배제 : 자원을 한 번에 한 프로세스만 독점적으로 사용
- 점유대기 : 프로세스가 이미 일부 자원을 가진 상태에서 다른 프로세스에 할당 된 자원을 추가로 기다림
- 비선점 : 다른 프로세스가 쥐고 있는 자원 못 뺏음
- 순환대기 : 프로세스들이 꼬리에 꼬리를 물고 사로 상대방이 가진 자원을 기다리는 닫힌 순환고리
'학교' 카테고리의 다른 글
| 2026 하계 모각코 1회차 (0) | 2026.07.02 |
|---|---|
| 2026 하계 모각코 0회차 (계획) (0) | 2026.06.26 |
| 데이터통신 6주차 공부내용 (1) | 2026.04.23 |
| 데이터통신 5주차 공부내용 (1) | 2026.04.23 |
| 데이터통신 4주차 공부내용 (1) | 2026.04.23 |