| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 컴파일시스템
- 자바입력받기
- 오블완
- Entity
- AWS Cloud Practitioner Assential
- 티스토리챌린지
- 단국대학교 k-mooc
- K-MOOC 단국대학교 홍보단
- 블록체인
- 딥러닝
- 블록체인강의
- 블록체인 강의
- 스타트업
- StringTokenizer
- K-MOOC
- CSS 기초
- 머신러닝
- stringreader
- 우선순위큐
- 혁신의기술2:신뢰의미래 블록체인을 만나다
- 자바문자열구분
- 2차원배열정렬
- 디스크블록할당
- html기초
- biginteger사용법
- national instruments
- 린스타트업
- 자바스크립트
- 자바
- TypeScript
- Today
- Total
열정 실천
OS 한 번에 훑어보기! [1편] 본문
CPU부터 정리하고 들어가자!
CPU = ALU(연산 장치) + 레지스터들 + 제어장치 + 내부 버스
레지스터란? CPU 내에서 데이터들을 기억하는 메모리 장치
레지스터 종류와 역할
PC = Program Counter : 다음에 실행할 명령어 주소
IR = Instruction Register : 현재 실행 중인 명령어
MAR = Memory Address Register : 접근할 메모리 주소
MDR = Memory Data Register : 메모리에서 읽거나 쓸 실제 데이터
ACC = Accumulator : 연산 결과 저장
리눅스 명령어 총정리 feat.gpt






✨OS는 어떤 역할을 하나?
1️⃣ 자원 관리 (Resource Management) -> 공정성, 효율
CPU, 메모리, 디스크 같은 한정된 자원을 누구에게 언제 얼마나 줄지 결정
OS가 하는 일
- CPU → 누구 먼저 실행? 얼마나 실행?
- 메모리 → 어디에 올릴까? 넘치면?
- 디스크/입출력 → 누가 먼저 쓰게 할까?
1️⃣ 가상화 (Virtualization) -> 안정성, 편의성
하나의 자원을 여러 개처럼 보이게 만드는 기술
- CPU 하나
→ 각 프로그램은 “나 혼자 CPU 쓰는 중”이라 착각 - 메모리 8GB
→ 각 프로세스는 “내 메모리는 독립적”이라 믿음
OS는 한정된 자원을 잘게 쪼개고, 각자 혼자 쓰는 것처럼 속여서 모두가 편하게 쓰게 만든다.
✨ System call
유저 모드 : 일반 프로그램이 실행되는 안전한 모드
커널 모드 : 메모리, CPU, 디스크 직접 접근이 가능한 모드 *OS커널만 실행가능
syscall : 유저모드가 커널에게 "이거 좀 해줘"하는 공식 통로 *하드웨어 직접 접근X 반드시 syscall 거쳐야함





✨ CPU 가상화
하나의 CPU를 여러 개처럼 보이게 해서 여러 프로그램이 동시에 실행되는 것처럼 만드는 기술
✨ 프로세스 : 실행 중인 프로그램 (디스크에 있을 땐 프로그램 CPU로 올라오면 프로세스)
⏱️ 시간 쪼개기 (Time Sharing) : CPU 시간을 아주 작은 단위로 나눠 각 프로세스에게 번갈아 배분
🔁 문맥 교환 (Context Switch) : 프로세스가 바뀔 때 이전 프로세스의 상태를 레지스터에 저장하고 다음 프로세스의 정보를 가져오는 것
💥프로세스 관련 syscall
- fork() : 현재 프로세스를 복제해 자식 프로세스 생성
- 부모프로세스는 자식 프로세스의 PID 반환 (양수)
- 자식프로세스는 0 반환
- 실패 시 -1 반환 (음수)
- exec() : 현재 프로세스를 새로운 프로그램으로 완전히 교체
- exit() : 현재 프로세스 정상 종료
- wait() : 자식 프로세스가 종료될 때까지 대기 (동기화)
- getpid() : 현재 프로세스 ID 반환
- getppid() : 부모 프로세스 ID 반환
- kill() : 프로세스에 시그널 전달 (종료·중단 등)
✨ 프로세스의 상태 변화

프로세스의 메모리 세그먼트 : 프로세스가 실행될 때 관련된 데이터가 관리되는 메모리상의 한 부분
┌─────────┐ max
│ Stack ⬇️ │ 함수 호출, 지역변수 :
├─────────┤
│ Heap ⬆️ │ 동적 메모리 (malloc)
├─────────┤
│ Data │ 전역/정적 변수
├─────────┤
│ Text │ 실행 코드
└─────────┘ 0
PCB (Process Control Block) : 각각의 프로세스가 들고 있는 정보
- PID (프로세스 ID)
- 프로세스 상태 (Running, Ready, Waiting)
- PC, 레지스터 값
- 스케줄링 정보
- 메모리 정보
👉 Context Switch 때 저장·복원됨
✨Trap vs Interrupt
Trap(시스템 콜)은 유저 프로그램이 스스로 OS를 호출하는 자발적 제어권 반환
Interrupt는 하드웨어가 강제로 OS를 호출해 제어권을 넘기는 방식
Timer Interrupt는 CPU를 강제로 회수해 CPU 독점을 막고 선점형 스케쥴링을 가능하게 한다.
✨스케쥴링
여러 개의 프로세스가 제한된 자원(CPU)를 사용할 때 순서를 정해주는 것
스케쥴링 지표
- Turnaround Time (반환 시간)
→ 프로세스가 도착해서 종료될 때까지 걸린 전체 시간 - Waiting Time (대기 시간)
→ 준비 큐에서 CPU를 기다린 시간의 합 - Response Time (응답 시간)
→ 요청 후 처음으로 CPU를 얻기까지 걸린 시간 - Throughput (처리량)
→ 단위 시간당 완료된 프로세스 수
스케쥴링 기법
FCFS:: 도착한 순서대로 CPU 할당
🙂 구현이 간단
😡 긴 작업이 짧은 작업을 기다려 좀비현상 발생
SJF - 비선점:: 실행시간이 가장 짧은 프로세스부터 CPU 할당
🙂 평균 waiting Time이 가장 짧음
😡 긴 작업이 무한히 대기하는 기아현상 발생
SRTF(=STCF) - Shortest Remaining Time Firtst 선점 SJF:: 현재 실행중인 프로세스 포함 가장 짧은 실행시간을 가진 프로세스에 CPU 할당
🙂 평균 waiting Time이 짧음
😡 문맥교환이 빈번하여 오버헤드 발생
Priority Scheduling:: 우선순위가 높은 프로세스부터 CPU 할당
🙂 중요하거나 긴급한 작업을 우선적으로 처리 가능
😡 우선순위가 낮은 작업의 기아 현상 발생
RR : Round Robin:: 각 프로세스에 일정시간(q:Time Quantum)만큼 cpu 할당하고 시간이 지나면 다음 프로세스로 전환
🙂 CPU를 공정하게 나누어 사용할 수 있음
😡 타임 퀀텀이 너무 짧으면 오버헤드 발생 (문맥 교환)
Multilevel Queue:: 여러 개의 큐에 다른 스케쥴링 기법을 적용
🙂 작업에 맞는 다양한 스케쥴링 전략 사용 가능
😡 큐 간의 프로세스 이동이 제한적
MLFQ : Multilevel Feedback Queue:: 프로세스가 우선 순위와 실행 시간을 기준으로 여러 큐를 순회
🙂 동적 우선순위 조정으로 모든 프로세스가 공정하게 처리
😡 구현과 관리가 복잡
✨ 스레드와 락
멀티 프로세스 : 여러 프로세스를 동시에 실행
멀티 스레드 : 하나의 프로세스 안에서 여러 스레드 실행

* 스케쥴링의 대상은 실제로 스레드 였던 것!
스레드의 장점
1. 프로세스보다 훨씬 가볍게 만들고 없앨 수 있음
2. 자원 공유가 쉬움
3. 같은 주소 공간을 공유해서 문맥 교환 오버헤드가 적음
4. 멀티 코어에서 병렬 처리에 유리
스레드 핵심 용어 4종 세트
- 공유 자원 (Shared Resource)
→ 여러 스레드가 동시에 접근할 수 있는 공통 데이터나 자원 - 경쟁 상태 (Race Condition)
→ 스레드 실행 순서에 따라 결과가 달라지는 문제 상황 - 임계 영역 (Critical Section)
→ 공유 자원에 접근하는 코드 구간 - 상호배제 (Mutual Exclusion) == 락(Lock)
→ 한 순간에 하나의 스레드만 임계 영역에 들어가게 하는 규칙
스레드에서는 자원을 공유해서 생기는 핵심 문제
이 한 줄의 High Level 코드 : for ( i = 0; i < 100; i++) { counter++; }
CPU레벨에서는 3개의 절차로 분리된다.
100 mov 0x8049a1c, %eax
105 add $0x1, %eax
108 mov $eax, 0x8049a1c
만약 두 개의 스레드가 동시에 이 코드를 동시에 실행하는데 T1이 105 add까지만 실행하고 T2이 데이터를 가져오게되면?
예상했던 결과가 아니게 되겠져? 이 상황이 경쟁상태! 이것을 예방하는 방법이 락(Lock)!
Thread API
- pthread_create()
→ 새로운 스레드를 생성해 지정한 함수부터 실행 - pthread_join()
→ 해당 스레드가 종료될 때까지 기다리고 자원을 회수 (동기화)
🔑 Mutex (뮤텍스) API (한 스레드만 접근 가능하게 하는 락)
- pthread_mutex_init() : 뮤텍스 초기화
- pthread_mutex_lock() : 뮤텍스 잠금 (임계 영역 진입)
- pthread_mutex_unlock() : 뮤텍스 해제 (임계 영역 종료)
- pthread_mutex_destroy() : 뮤텍스 제거
🔑 Semaphore (세마포어) API (정해진 개수만 접근 가능하게 하는 락)
- sem_init() : 세마포어 초기화
- sem_wait() : 세마포어 감소, 0이면 대기
- sem_post() : 세마포어 증가, 대기 스레드 깨움
- sem_destroy() : 세마포어 제거
🔑 Condition Variable 동기화를 위한 조건 변수
- pthread_cond_wait() : 조건 만족할 때까지 대기 (락 자동 해제/재획득)
- pthread_cond_signal() : 하나의 대기 스레드 깨움
락을 코드와 함께 더 자세히 공부하고 싶다면?!
https://guun-oni.tistory.com/101
"병행성"을 위한 mutex_lock, 그리고 semaphore
Concurrency - 병행성을 만족시키기 위한 두 가지 작업 여러 프로세스가 번갈아가면서 실행되고, 하나의 프로세스 안에 또 여러 스레드가 번갈아 실행되면서 문제 없이 동시에 잘 실행 (병행성) 되
guun-oni.tistory.com
'CS > OS' 카테고리의 다른 글
| 주기억장치 Main Memory (1) | 2024.11.23 |
|---|---|
| File System : OS가 파일을 저장하는 법 (0) | 2024.11.22 |
| Unix 명령어 모음집.zip (6) | 2024.10.21 |
| "병행성"을 위한 mutex_lock, 그리고 semaphore (0) | 2024.09.19 |
| 스케쥴링 - 어떤 프로세스에게 CPU를 줄까요~? (4) | 2024.09.15 |
