좜처

cpu.land의 λ‚΄μš©μ„ 읽고 μš”μ•½ν–ˆμŠ΅λ‹ˆλ‹€.

CPU

CPU(Central Processing Unit, μ€‘μ•™μ œμ–΄μž₯치)

졜초둜 λŒ€λŸ‰ μƒμ‚°λœ CPUλŠ” Intel 4004둜, μ΄νƒˆλ¦¬μ•„ λ¬Όλ¦¬ν•™μžμ΄μž κ³΅ν•™μž Federico Fagginκ°€ 60λ…„λŒ€ ν›„λ°˜ μ„€κ³„ν•˜μ˜€λ‹€. 4λΉ„νŠΈ μ•„ν‚€ν…μ²˜λ‘œ, μ˜€λŠ˜λ‚  μ‚¬μš©λ˜λŠ” 64λΉ„νŠΈ μ•„ν‚€ν…μ²˜ ν”„λ‘œμ„Έμ„œλ³΄λ‹€ 훨씬 덜 λ³΅μž‘ν•˜λ‹€.

CPUλŠ” 이진 데이터λ₯Ό 읽고, 그에 따라 연산을 μˆ˜ν–‰ν•œλ‹€. 이 이진 λ°μ΄ν„°λŠ” μ—°μ‚°μ½”λ“œμ™€ 이λ₯Ό λ”°λ₯΄λŠ” λ°μ΄ν„°λ‘œ 이루어진닀. 이것을 거의 μΌλŒ€μΌ μˆ˜μ€€μœΌλ‘œ λ²ˆμ—­ν•œ 것이 μ–΄μ…ˆλΈ”λ¦¬μ΄λ‹€.

λͺ…λ Ή 포인터

λž¨μ—λŠ” μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨λ“€μ˜ λͺ¨λ“  데이터가 μ €μž₯λœλ‹€. CPUλŠ” 항상 λž¨μ—μ„œ μ½”λ“œλ₯Ό μ½μ–΄μ˜¨λ‹€.

CPUλŠ” 항상 λ‹€μŒ μ½”λ“œλ₯Ό 램의 μ–΄λŠ μœ„μΉ˜λ₯Ό 뢈러올 μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Instruction pointer(포인터?)λ₯Ό μ €μž₯ν•œλ‹€. μ½”λ“œκ°€ μ‹€ν–‰λœ λ’€ ν¬μΈν„°λŠ” RAM의 λ°”λ‘œ λ‹€μŒμœΌλ‘œ μ΄λ™ν•˜λ©° μ‹€ν–‰-포인터 지정이 반볡되며 μ½”λ“œκ°€ 순차적으둜 μ‹€ν–‰λ˜λŠ” 것이닀. 일뢀 μ½”λ“œλŠ” 무쑰건적, λ˜λŠ” 쑰건적으둜 포인터가 λ°”λ‘œ λ‹€μŒ μœ„μΉ˜λ‘œ μ΄λ™ν•˜μ§€ μ•Šκ³  μ •ν•΄μ§„ μœ„μΉ˜λ‘œ μ΄λ™ν•˜κ²Œ ν•œλ‹€. 이것이 반볡문과 쑰건문을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

ν¬μΈν„°λŠ” λ ˆμ§€μŠ€ν„°μ— μ €μž₯λœλ‹€. λ ˆμ§€μŠ€ν„°λŠ” CPU에 μžˆλŠ” μž‘κ³  μ•„μ£Ό λΉ λ₯Έ μ €μž₯ 곡간이닀.

κΆŒν•œ

컀널: OS(Operating System, 운영체제)의 ν•΅μ‹¬μœΌλ‘œ, 컴퓨터가 λΆ€νŒ…λ  λ•Œ 포인터가 μ‹œμž‘λ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ 컀널이닀. λ©”λͺ¨λ¦¬, μž₯치 등에 λŒ€ν•œ 거의 λͺ¨λ“  μ ‘κ·Ό κΆŒν•œμ„ κ°€μ§„λ‹€.

λͺ¨λ“œμ— 따라 ν”„λ‘œμ„Έμ„œμ˜ κΆŒν•œμ΄ 달라진닀. ν˜„λŒ€μ—λŠ” 보톡 컀널 λͺ¨λ“œμ™€ μ‚¬μš©μž λͺ¨λ“œλ‘œ λ‚˜λ‰œλ‹€. 컀널 λͺ¨λ“œμ—μ„œ CPUλŠ” λͺ¨λ“  λͺ…령을 μ‹€ν–‰ν•˜κ³  아무 λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•  수 μžˆλ‹€. μ‚¬μš©μž λͺ¨λ“œμ—μ„œλŠ” 일뢀 λͺ…λ Ήλ§Œ ν—ˆμš©λ˜λ©°, μž…/좜λ ₯, λ©”λͺ¨λ¦¬μ— λŒ€ν•œ 접근에 μ œν•œμ΄ μžˆλ‹€. 보톡 컀널과 λ“œλΌμ΄λ²„λŠ” 컀널 λͺ¨λ“œμ—μ„œ, 앱은 μ‚¬μš©μž λͺ¨λ“œμ—μ„œ μ‹€ν–‰λœλ‹€.

x86-64 μ•„ν‚€ν…μ²˜μ—μ„œ *ν˜„μž¬μ˜ λͺ¨λ“œκ°€ 무엇인지(CPL, Curent privilege level, ν˜„μž¬ κΆŒν•œ 레벨)*λŠ” cs(Code Segment)라 λΆˆλ¦¬λŠ” λ ˆμ§€μŠ€ν„°μ˜ μ΅œν•˜μœ„ λΉ„νŠΈ 두 κ°œμ—μ„œ μ½μ–΄μ˜¨λ‹€. 2λΉ„νŠΈμ΄λ―€λ‘œ 4κ°€μ§€ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 0이 컀널, 3이 μ‚¬μš©μž λͺ¨λ“œμ΄λ©°, 1κ³Ό 2λŠ” λ“œλΌμ΄λ²„ 싀행에 쓰인닀.

μ‚¬μš©μž λͺ¨λ“œμ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λΌλ„ OS와 μƒν˜Έμž‘μš©ν•˜κ³ , λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•΄μ•Ό ν•  λ•Œκ°€ μžˆλ‹€. μ΄λ•Œ μ“°μ΄λŠ” 것이 μ‹œμŠ€ν…œμ½œμ΄λ©°, μ‹œμŠ€ν…œμ½œμ€ ν”„λ‘œκ·Έλž¨μ΄ μ‚¬μš©μž κ³΅κ°„μ—μ„œ 컀널 κ³΅κ°„μœΌλ‘œ μ „ν™˜ν•˜κ³  ν”„λ‘œκ·Έλž¨ μ½”λ“œμ—μ„œ OS μ½”λ“œλ‘œ 점프할 수 있게 ν•˜λŠ” μ ˆμ°¨μ΄λ‹€.

이 μ „ν™˜μ€ ν”„λ‘œμ„Έμ„œμ˜ μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈλΌλŠ” κΈ°λŠ₯을 톡해 이루어진닀.

λΆ€νŒ… κ³Όμ •μ—μ„œ OSλŠ” μΈν„°λŸ½νŠΈ 벑터 ν…Œμ΄λΈ”(Interrupt Vector(Descriptor) Table)을 λž¨μ— μ €μž₯ν•˜κ³  CPU에 λ“±λ‘ν•œλ‹€. IVTλŠ” μΈν„°λŸ½νŠΈ λ„˜λ²„λ₯Ό ν•Έλ“€λŸ¬ μ½”λ“œ 포인터에 λ§€ν•‘ν•œλ‹€. ν”„λ‘œκ·Έλž¨μ€ INT와 같은 λͺ…λ Ήμ–΄λ₯Ό 톡해 IVTμ—μ„œ μ£Όμ–΄μ§„ μΈν„°λŸ½νŠΈ λ„˜λ²„λ₯Ό μ°Ύκ³  컀널 λͺ¨λ“œλ‘œ μ „ν™˜ν•œ λ‹€μŒ λͺ…λ Ή 포인터λ₯Ό IVT에 μ €μž₯된 λ©”λͺ¨λ¦¬ μœ„μΉ˜(ν•Έλ“€λŸ¬ μ½”λ“œ 포인터)둜 μ ν”„μ‹œν‚¨λ‹€.

μΈν„°λŸ½νŠΈκ°€ λλ‚˜λ©΄ IRETκ³Ό 같은 λͺ…령을 μ‚¬μš©ν•΄ λ‹€μ‹œ μ‚¬μš©μž λͺ¨λ“œλ‘œ μ „ν™˜ν•˜κ³  λͺ…λ Ή 포인터λ₯Ό μΈν„°λŸ½νŠΈκ°€ 트리거된 곳으둜 λŒλ €λ†“λŠ”λ‹€.

μ§„μ§œ μ–΄λ ΅λ„€

λ‹€μ‹œ μ΅œλŒ€ν•œ μ‰½κ²Œ 써보면 IVTμ—μ„œ 각 μΈν„°λŸ½νŠΈ λ„˜λ²„λŠ” νŠΉμ • μœ„μΉ˜λ₯Ό 가리킀고 있고, μ‹œμŠ€ν…œ μΈν„°λŸ½νŠΈκ°€ μΌμ–΄λ‚˜λ©΄ 컀널 λͺ¨λ“œλ‘œ μ£Όμ–΄μ§„ μΈν„°λŸ½νŠΈ λ„˜λ²„κ°€ κ°€λ¦¬ν‚€λŠ” μœ„μΉ˜λ‘œ μ΄λ™ν•΄μ„œ OS μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. κ·Έ λ’€ λ‹€μ‹œ μ‚¬μš©μž λͺ¨λ“œλ‘œ μ „ν™˜ν•˜κ³  μ›λž˜ μœ„μΉ˜λ‘œ λŒμ•„κ°„λ‹€.

λ©€ν‹°νƒœμŠ€ν‚Ή

μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ²ˆκ°ˆμ•„ μ‹€ν–‰λ˜κ²Œ ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•  수 μžˆλ‹€. OS μŠ€μΌ€μ€„λŸ¬λŠ” 타이머 칩으둜 ν•˜λ“œμ›¨μ–΄ μΈν„°λŸ½νŠΈλ₯Ό νŠΈλ¦¬κ±°ν•œλ‹€.

OSλŠ” ν”„λ‘œκ·Έλž¨ μ½”λ“œ μ‹€ν–‰ 전에 타이머 칩이 일정 μ‹œκ°„ λ’€ μΈν„°λŸ½νŠΈλ₯Ό νŠΈλ¦¬κ±°ν•˜λ„λ‘ μ„€μ •ν•œλ‹€. OSλŠ” μ‚¬μš©μž λͺ¨λ“œλ‘œ μ „ν™˜ν•΄ ν”„λ‘œκ·Έλž¨ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. μ‹œκ°„μ΄ λ‹€ 되면 컀널 λͺ¨λ“œλ‘œ μ „ν™˜ν•˜κ³  OS μ½”λ“œλ‘œ λŒμ•„μ˜€λ„λ‘ ν•˜λŠ” ν•˜λ“œμ›¨μ–΄ μΈν„°λŸ½νŠΈκ°€ νŠΈλ¦¬κ±°λœλ‹€. μ΄λ ‡κ²Œ 되면 OSλŠ” ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λœ μœ„μΉ˜λ₯Ό μ €μž₯ν•œλ‹€. 이λ₯Ό μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨μ— 걸쳐 λ°˜λ³΅ν•˜λ©΄ λ©€ν‹°νƒœμŠ€ν‚Ήμ΄ κ°€λŠ₯ν•˜λ‹€. μ΄λŠ” ν”„λ¦¬μ— ν‹°λΈŒ λ©€ν‹°νƒœμŠ€ν‚Ήμ΄λΌκ³  λΆ€λ₯΄λ©°, ν”„λ‘œμ„ΈμŠ€κ°€ μΈν„°λŸ½νŠΈλ˜λŠ” 것을 프리엠셔닝라고 λΆ€λ₯Έλ‹€.

νƒ€μž„μŠ¬λΌμ΄μŠ€

νƒ€μž„μŠ¬λΌμ΄μŠ€λŠ” OS μŠ€μΌ€μ€„λŸ¬κ°€ μ •ν•˜λŠ” μ‹œκ°„ 길이이닀. ν”„λ‘œμ„ΈμŠ€λŠ” νƒ€μž„μŠ¬λΌμ΄μŠ€λ™μ•ˆ μ‹€ν–‰λœ λ’€ ν”„λ¦¬μ— μ…˜λœλ‹€. λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ— 같은 νƒ€μž„μŠ¬λΌμ΄μŠ€λ₯Ό μ μš©ν•˜λŠ” 것을 κ³ μ • νƒ€μž„μŠ¬λΌμ΄μŠ€ λΌμš΄λ“œ-둜빈 μŠ€μΌ€μ€„λ§μ΄λΌκ³  ν•œλ‹€. (λΌμš΄λ“œ-둜빈 μŠ€μΌ€μ€„λ§μ€ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ μš°μ„ μˆœμœ„κ°€ μ—†λ‹€)

κ³ μ • νƒ€μž„μŠ¬λΌμ΄μŠ€ μŠ€μΌ€μ€„λ§ 말고도 νƒ€κ²Ÿ λ ˆμ΄ν„΄μ‹œλ₯Ό μ§€μ •ν•˜λŠ” 방법이 μžˆλ‹€. νƒ€κ²Ÿ λ ˆμ΄ν„΄μ‹œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ ν”„λ¦¬μ— μ…˜ 된 λ’€ λ‹€μ‹œ μ‹€ν–‰λ˜κΈ°κΉŒμ§€μ˜ μ‹œκ°„μ΄λ‹€. 예λ₯Ό λ“€μ–΄ νƒ€κ²Ÿ λ ˆμ΄ν„΄μ‹œκ°€ 20ms이고 ν”„λ‘œμ„ΈμŠ€κ°€ 5개라면 νƒ€μž„μŠ¬λΌμ΄μŠ€λŠ” 20/5=4msκ°€ 되며, 각 ν”„λ‘œμ„ΈμŠ€λŠ” 20msλ§ˆλ‹€ μ‹€ν–‰λ˜κ²Œ λœλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ λ§Žμ•„μ§€λ©΄ νƒ€μž„μŠ¬λΌμ΄μŠ€κ°€ λ„ˆλ¬΄ μ§§μ•„μ§ˆ 수 μžˆλ‹€. ν”„λ‘œμ„ΈμŠ€μ˜ 쀑단 μœ„μΉ˜λ₯Ό μ €μž₯ν•˜κ³  λΆˆλŸ¬μ˜€λŠ” 것은 μ»΄ν“¨νŒ… λ¦¬μ†ŒμŠ€λ₯Ό μ†Œλͺ¨ν•˜κΈ° λ•Œλ¬Έμ— νƒ€μž„μŠ¬λΌμ΄μŠ€λ₯Ό λ„ˆλ¬΄ 짧게 μ§€μ •ν•˜λŠ” 것은 퍼포먼슀 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€. κ·Έλž˜μ„œ 보톡 νƒ€μž„μŠ¬λΌμ΄μŠ€ μ΅œμ†Œ ν•œλ„κ°€ μžˆμ–΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μΆ©λΆ„νžˆ λ§Žμ•„μ§€λ©΄ νƒ€κ²Ÿ λ ˆμ΄ν„΄μ‹œκ°€ λŠ˜μ–΄λ‚œλ‹€.

μ˜€λŠ˜λ‚ μ˜ μ»΄ν“¨ν„°λŠ” κ°€λ³€ νƒ€μž„μŠ¬λΌμ΄μŠ€ λΌμš΄λ“œ-둜빈 μŠ€μΌ€μ€„λ§κ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ 보톡 ν”„λ‘œμ„ΈμŠ€ μš°μ„ μˆœμœ„λ₯Ό κ³ λ €ν•œλ‹€.

초기 Mac OS와 같은 κ³Όκ±° OSλŠ” μ½”μ˜€νΌλ ˆμ΄ν‹°λΈŒ λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μ‚¬μš©ν–ˆλ‹€. μ½”μ˜€νΌλ ˆμ΄ν‹°λΈŒ λ©€ν‹°νƒœμŠ€ν‚Ήμ—μ„œλŠ” OSκ°€ νƒ€μž„μŠ¬λΌμ΄μŠ€λ₯Ό μ •ν•˜λŠ” λŒ€μ‹  ν”„λ‘œκ·Έλž¨μ΄ μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈλ₯Ό 톡해 자발적으둜 ν”„λ‘œμ„ΈμŠ€λ₯Ό OS둜 λ„˜κΈ°κ³ , OSκ°€ λ‹€μŒμœΌλ‘œ μŠ€μΌ€μ€„λ§λœ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•  수 있게 ν•œλ‹€. μ‹œκ°„μ  일관성을 μœ μ§€ν•˜λŠ” 것이 거의 λΆˆκ°€λŠ₯ν•˜κ³ , λ©€μ›¨μ–΄λ‚˜ 잘λͺ» μ„€κ³„λœ ν”„λ‘œκ·Έλž¨μ΄ OSλ₯Ό λ©ˆμΆ”κ²Œ ν•  수 있기 λ•Œλ¬Έμ— μ΄μ œλŠ” μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

λ©”λͺ¨

  1. λ³Όλ“œ ν‘œμ‹œ ν•˜κΈ°
  2. 챕터 3 읽기