용어 | 설명 |
---|---|
Program | |
프로그램 | 실행할 수 있는 파일 (executable file) |
Application | |
응용프로그램 | End user가 사용할 수 있는 프로그램 |
ex) game, Web 등 | |
OS(Operating System) | |
운영체제 | Application(User)이 Hardware와 소통할 수 있는 시스템 소프트웨어 (인터페이스 + 실행 환경 제공). Kernel, Shell, 그리고 Boot Loader로 이루어져 있다. |
ex) 윈도우, 우분투, 안드로이드 | |
Kernel | |
커널 | 프로세스에게 하드웨어의 자원을 할당하고 System Call을 수행하는 부분. |
monolithic(모놀리식; 단일형) 커널과 microkernel(마이크로) 커널로 나뉜다. | |
ex) 리눅스 커널 | |
Firmware | |
펌웨어 | ROM에 기록된, 하드웨어를 제어하는 최소한의 프로그램들의 집합. |
ex) 메인보드 BIOS, 신호등 제어프로그램 등 | |
OS vs 커널 vs 펌웨어 | 펌웨어는 ROM에 기록되고, 한 가지 하드웨어를 동작하기 위한 작은 규모의 프로그램의 집합. 거의 수정되지 않는다. |
OS는 RAM과 저장장치에 기록되고, 여러가지 하드웨어를 동작하기 위한 대규모의 프로그램의 집합. 자주 수정된다. | |
커널은 OS의 핵심적인 부분으로 CPU, 메모리, 입출력 등의 자원을 초기화하고 관리한다. | |
Shell | |
셸 | 운영 체제의 일부분으로, 커널과 이용자 사이에서 이용자의 명령을 해석하고 그 처리 결과를 뿌려주는 시스템 프로그램. Shell-Terminal 관계는 인터프리터-IDE 느낌. |
ex) bash, sh, Power shell, cmd, ... | |
Terminal | |
터미널 | GUI 위에서 동작하는 CLI(Command Line Interface). 환경이라서 명령을 처리하는 것이 아닌 디스플레이만 해준다. IDE-인터프리터 관계에서 IDE(그래픽) 부분 느낌. 실제로 처리는 Shell이 한다. 말 그대로 터미널 역. |
ex) Command Prompt | |
Console | |
콘솔 | 시스템을 물리적으로 조작할 수 있는 체계. |
ex) Xbox, PlayStation 등 | |
Boot loader | |
부트 로더 | Boot(OS)를 메모리에 올려주는 프로그램. 부트스트랩 프로그램 |
Bootstrap | |
부트스트랩 | BIOS가 부팅매체에서 MBR을 읽고 부트로더를 메모리에 올리는 과정 |
Interrupt | CPU가 멈추고 Interrupt handler를 실행시키게 하는 이벤트 |
Interrupt handler | 인터럽트를 접수하면 그에 맞는 함수를 실행시키는 루틴 |
Interrupt vector | 인터럽트 루틴들의 주소 리스트 |
Interrupt 유의할 점 | Interrupt가 끝나고 원래 수행하던 instruction으로 다시 돌아가기 위해 |
User mode
함수와 크리티컬한 명령을 처리하는 Kernel mode
함수로 나뉜다. |
| Trap | CPU 내부 interrupt. User mode
➡ Kernel mode
로 전환해준다. mode bit로 현재 모드를 확인한다(user가 1, kernel이 0) |
| Privileged Instructions | 시스템에 영향을 줄 수 있는 instruction. Kernel mode에서만 사용가능.
쓰고싶으면 user mode → trap → kernel mode 에서 사용하자. |
| System call
시스템 콜 | user가 OS 서비스(READ/WRITE, network...)를 요청하는 일종의 API. 보통 wrapper(라이브러리)를 통해 제공된다. 이 때, portability가 보장됨. |
| | |
| Command line Interface (CLI) | OS Interface. User로부터 명령을 실행시킨다.
Shell(sh, ksh, csh, bash)이라고도 불림. |
| OS service | User Interface(CLI, GUI, batch interface)
Program execution(Load, run, end, execution)
I/O operation(printing, scanning...)
File System Manipulation(파일,디렉토리 CRUD)
Communication(프로세스간 통신)
Error detection(에러 났을 때 대처)
Resource allocation(컴퓨터 자원 할당)
Accounting(리소스를 얼마나 쓰는지 tracking : cloud billing의 기준)
Protection and Security(접근제어,보안) |
| 라이브러리 → 시스템 콜 | printf, write → write
fread, read → read
malloc → brk |
| System call 동작과정 | 1. open() system call 실행P0
state to PCB0
→ Load P1
state from PCB1
|
| Process Scheduling
프로세스 스케쥴링 | 로딩이 없도록 시간 분배를 잘 해서 다음 프로세스를 선택하는 방법.int* status; pid=wait(status);
이거 안된다.fork()
, exec()
해야함)Register set
, Stack
, Program counter
을 갖는다.code
와 data
, file
들은 프로세스의 것으로 공유한다. |
| Concurrency
vs Parallelism | Concurrent : 코어 하나로 Job을 Time-sharing
Parallelism : 코어 여러개에 Job을 나눠서 Time-sharing |
| Hyper-Threading
하이퍼스레딩 | OS가 바라보는 Thread(실행 흐름). Process는 무시한다.
CPU가 Instruction을 수행할 때 잠깐 비는 시간에 다른 Instruction을 실행시키는 것. OS 입장에서는 두 개의 흐름(Thread)가 실행되는 것 처럼 보인다. |
| Multicore issue | Identifying task : 어떤 파트가 독립적인지 알아야함 (피보나치 수열)
Balance : 일을 균등하게 배분해야함
Data Splitting : 데이터를 균등하게 배분해야함
Data dependency : 현재 task가 다른 task의 data에 의존함
Testing and Debugging : 실행순서가 매번 바뀜 **(Non-deterministic)range(0,n)
+ range(n,2n)
Task parallelism : task를 나누는 것. 평균 구하기
+ summary 구하기
|
| Thread Level
쓰레드 종류 | 쓰레드에 대한 개념을 구체화 시켜놓은 것
User level Thread (application이 돌아가는 환경)
****- OS가 모른다. Thread가 존재하는지도 모른다.N:1
모델 : user thread 1개 → 유일한 kernel thread. 끝나면 다른 거 선택.
1:1
모델 : user thread → 전용 kernel thread 생성. Limit number. 리눅스
N:N
모델 : user thread → 임의 kernel thread 매핑. flexible but complex.fork()
할 때pthread_join()
, pthread_testcancel()
|
| | |
| producer-consumer problem | producer : 아이템을 생산하고 버퍼에 추가한다.
consumer : 버퍼로부터 아이템을 가져오고 소비한다.
producer와 consumer의 속도가 다를 때 Bounded Buffer Problem 발생 |
| Race condition | 멀티프로세싱, 멀티스레딩에서 실행 순서에 따라서 결과가 달라지는 상태 |
| Synchronization is Needed | Multi-thread applicatoinRequirement를 만족하는가?
flag[j]==false
혹은 turn==i
일때만 CS에 진입함flag[i]==flag[j]==true
&&turn==i==j
이어야함wait(S)
: S≤0일 때 busy waiting이다가 S>0이면 S-1하고 나간다.
signal(S)
: S+1해준다.
Binary Semaphore : S가 True,False. Mutex lock이랑 똑같음
Counting Semaphore : S가 integer. n개의 프로세스를 동시에 시작 가능.
실행 순서도 조정할 수 있다. |
| Semaphore S
with blocking | wait(S)
signal(S)
<producer> <consumer>
while : while :
produce item wait(full)
wait(empty)
wait(mutex)
wait(mutex)
remove from buffer
add to buffer signal(mutex)
signal(mutex)
signal(empty)
signal(full)
consume item |