linux command
- mkdir : ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ช ๋ น์ด
- cd : ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ช ๋ น์ด
- ls : ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ์ผ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ช
๋ น์ด
- ls ๋ช ๋ น์ด์ ์ต์
- -l : ํ์ผ์ ์ ๋ณด๋ฅผ ์์ธํ ๋ณด์ฌ์ค
- -a : ์จ๊ฒจ์ง ํ์ผ๊น์ง ๋ณด์ฌ์ค
- cc : ์ปดํ์ผ ๋ช ๋ น์ด
- pwd : ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- mv : ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋ช ๋ น์ด
- passwd : ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊พธ๋ ๋ช ๋ น์ด
- chmod : ํ์ผ์ permission์ ๋ณ๊ฒฝํ๋ ๋ช ๋ น์ด
- ~ : ์ ์ ์ home ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ก ๋์น๋จ
- ~username : username์ ์ ์ ์ home ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ก ๋์น๋จ
- .. : ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์์ ๋๋ ํ ๋ฆฌ
- . : ํ์ฌ ๋๋ ํ ๋ฆฌ
- rm : ํ์ผ์ ์ญ์ ํ๋ ๋ช ๋ น์ด
- whoami : ์ ์ ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- cat : ํ์ผ์ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- history : ์ง๊ธ๊น์ง ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ฅผ ์์๋๋ก ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- normal mode : ์ผ๋ฐ์ ์ธ ์ํฉ์์ ์ ์ฉ๋๋ ๋ชจ๋. ํ์ผ์ ๋ด์ฉ์ ํ์ํ๊ฑฐ๋ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ๋ฑ์ ๊ธฐ๋ณธ์ ์ธ ์กฐ์์ด ๊ฐ๋ฅํ ๋ชจ๋
- i(insert), a(append) : normal mode์์ insert mode๋ก ๋์ด๊ฐ๋ ํค. i, a ๋ชจ๋ insert mode๋ก ๋์ด๊ฐ์ง๋ง i๋ ํ์ฌ ์ปค์์ ์์น ๊ทธ๋๋ก insert mode๋ก ๋์ด๊ฐ๋ฉฐ a๋ ๋ค์ ์์น๋ก ์ปค์๊ฐ ์ฎ๊ฒจ์ง๋ ์ฐจ์ด์ ์ด ์๋ค.
- del, x : ํ์ฌ ์ปค์ ์์น์ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ญ์ ํ๋ ํค
- u(undo) : ๋ง์ง๋ง ๋ช ๋ น์ ์คํํ๊ธฐ ์ ์ํ๋ก ๋๋๋ฆฌ๋ ํค
- insert mode : ํค๋ณด๋๋ฅผ ์ด์ฉํด ํ์ผ์ ๋ด์ฉ์ ์ถํ ์ ์๋ ๋ชจ๋
- esc : insert mode์์ normal mode๋ก ๋๋์๊ฐ๋ ํค
- command mode : normal mode์์ ์ฝ๋ก ์ ์
๋ ฅํ์ฌ ์ง์
ํ๋ ๋ชจ๋๋ก ์ ์ฅ, ์ข
๋ฃ ๋ฑ์ ํน์ ๋ช
๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ํ ๋ชจ๋
- w : ํ์ฌ๊น์ง ์์ ๋ ๋ด์ฉ์ ํ์ผ์ ์ ์ฅํ๋ ๋ช ๋ น์ด
- q : vi editor๋ฅผ ์ข ๋ฃํ๋ ๋ช ๋ น์ด
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด CPU๋ Storage devices์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ๊ฑฐ๋ ์คํํ๊ฑฐ๋ ์ธ ์ ์๊ณ Input device์์ ์ง์ ์ ๋ ฅ๋ฐ๊ฑฐ๋ Output device๋ก ๋ฐ๋ก ์ถ๋ ฅํ ์ ์๋ค. CPU๋ Memory์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ Storage devices์ ํ์ผ์ ์ฌ์ฉํ๋ ค๋ฉด Storage devices์์ ํ์ผ์ Memory๋ก ์ฝ์ด์จ ๋ค์ ์ฌ์ฉํด์ผ ํ๋ค. Input devices์ ์ ๋ ฅ์ ๋ฐ๊ฑฐ๋ Output devices๋ก ์ถ๋ ฅ์ ํ ๋๋ ์ ๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๊ฐ Memory์ Input Buffer์ ์ ์ฅ๋ ๋ค์ ์ฌ์ฉํ ์ ์๊ณ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ Memory์ Output Buffer์ ์ ์ฅํ ๋ค์ ์ถ๋ ฅํ ์ ์๋ค.
software๋ system software์ application software๋ก ๋๋๋๋ฐ system software๋ hardware์ ๋ฐ๋ก ์ ๋จ๊ณ์ ์์นํ๋ฉฐ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๊ป๋ฐ๊ธฐ ํํ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์ฌ์ฉ์๋ ๊ฐ์ฅ ์๋จ์ shell์ ์ฌ์ฉํด system software๋ฅผ ์ด์ฉํด hardware๋ฅผ ์ ์ดํ ์ ์๋ค. Linux์ญ์ system software ์ค ํ๋์ด๋ค. Linux kernel์ Computer Hardware System์์ ๋ณผ ์ ์์๋ 5๊ฐ์ง ๊ตฌ์ฑ ์์๋ฅผ ๊ด๋ฆฌํ๋๋ก ์ค๊ณ๋์ด ์๋ค.- Linux Kernel์ ๊ตฌ์ฑ์์
- I/O subsystem : Input, Output device๋ฅผ ๊ด๋ฆฌํ๋ subsystem์ผ๋ก character device, network device, block device๋ฅผ ๊ด๋ฆฌํ๋ค.
- character device : ๋ฌธ์ ํ๋ ๋จ์๋ก I/O๊ฐ ์ํ๋๋ I/O device
- network device : network๋ฅผ ํตํด I/O๊ฐ ์ํ๋๋ I/O device
- block device : ๋ฐ์ดํฐ block ๋จ์๋ก I/O๊ฐ ์ํ๋๋ I/O device
- Memory Management subsystem : Memory๋ฅผ ๊ด๋ฆฌํ๋ subsystem
- Process management subsystem : CPU์์ ์ํํ๋ process๋ฅผ ๊ด๋ฆฌํ๋ subsystem
- I/O subsystem : Input, Output device๋ฅผ ๊ด๋ฆฌํ๋ subsystem์ผ๋ก character device, network device, block device๋ฅผ ๊ด๋ฆฌํ๋ค.
- ps : ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค๋ค์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- tty : ์ฌ์ฉ์ค์ธ terminal ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅํ๋ ๋ช
๋ น์ด
- linux๋ ๋ชจ๋ ์์์ ํ์ผ๋ก ์ทจ๊ธํ๋ฉฐ ๊ด๋ฆฌํ๋๋ฐ character device์ธ terminal์ญ์ ํ์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ tty๋ ์ ์ ์ terminal์ ํด๋นํ๋ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค. ๋ง์ฝ ๊ทธ ํ์ผ์ write ๊ถํ์ด ์๋ ๋ค๋ฅธ ์ ์ ๊ฐ terminal ํ์ผ์ write๋ฅผ ์ํํ๋ฉด ๊ทธ terminal์ writeํ ๋ด์ฉ์ด ์ถ๋ ฅ๋์ด ์ฌ์ฉ์ค์ธ ์ ์ ๊ฐ ๋ณผ ์ ์๋ค.
- wall : ๋ชจ๋ ์ ์ ์๊ฒ write๋ฅผ ์ํํ๋ ๋ช ๋ น์ด
- write : ํน์ ์ ์ ์ terminal์ ๋ฉ์์ง๋ฅผ writeํ๋ ๋ช ๋ น์ด
- Ctrl + d : EOF
- Ctrl + c : kill ์ ํธ๋ฅผ ๋ณด๋ด ํ์ฌ ์คํ์ค์ธ fore ground ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃ์ํด
- Ctrl + z : suspend ์ ํธ๋ฅผ ๋ณด๋ด ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ผ์ง์ค์ง ์ํด
- cp : ํ์ผ์ ๋ณต์ฌํ๋ ๋ช ๋ น์ด
- fg : back ground์์ ์คํ์ค์ธ ๋ช ๋ น์ด๋ฅผ fore ground์์ ์คํํ๋๋ก ํ๋ ๋ช ๋ น์ด
- cat : ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ์๋์ด ๋ฌ๋ผ์ง๋ ๋ช
๋ น์ด
- ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๋ : ํฐ๋ฏธ๋์ ํตํด ํ ์ค์ฉ ์ ๋ ฅ์ ๋ฐ๊ณ ์ ๋ ฅ๋ ๋ด์ฉ์ ๋ค์ ํฐ๋ฏธ๋์ ์ถ๋ ฅํจ
- ํ์ผ์ ์ด๋ฆ๋ค์ด ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์ด์ก์ ๋ : ์ ๋ ฅ๋ ํ์ผ ์์๋๋ก ๋ด์ฉ์ ์ฐ๊ฒฐํ์ฌ ํฐ๋ฏธ๋์ ์ถ๋ ฅํจ
- set number : command mode์์ ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ก ํ์ผ์ ํ ์คํธ๋ค์ ํ ๋ฒํธ๋ฅผ ํ์ํด์ฃผ๋ ๋ช ๋ น์ด
- /(์ฐพ๊ณ ์ ํ๋ ๊ฒ) : ํ์ผ ๋ด์์ (์ฐพ๊ณ ์ ํ๋ ๊ฒ)์ ์์น๋ฅผ ์ฐพ์์ฃผ๋ ๋ช ๋ น์ด
- o : normal mode์์ ํ์ฌ ์ปค์๊ฐ ์์นํ ์ค ๋ฐ์ ํ ์ค์ ์ถ๊ฐํ๊ณ ์ปค์์ ์์น๋ฅผ ์ถ๊ฐ๋ ์ค๋ก ์ด๋์ํค๊ณ insert mode๋ก ์ง์ ํ๋ ๋ช ๋ น
- < ํ์ผ or 0< ํ์ผ : ๋ช ๋ น์ ์คํํ ๋ stdin์ผ๋ก ์ ๋ ฅ๋ฐ์์ผ ํ ๋ ํฐ๋ฏธ๋์ ํตํด ์ ๋ ฅ๋ฐ๋ ๋์ ํ์ผ์ ๋ด์ฉ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์
- > file or 1> file : ๋ช ๋ น์ ์คํํ ๋ stdout์ผ๋ก ์ถ๋ ฅ๋ ๋ ํฐ๋ฏธ๋๋ก ์ถ๋ ฅ๋๋ ๋์ file๋ก ์ถ๋ ฅ๋จ
- 2> file : stderr๋ก์ ์ถ๋ ฅ์ ํฐ๋ฏธ๋๋ก ์ถ๋ ฅํ๋ ๋์ file๋ก ์ถ๋ ฅ๋จ
-
ํ๊ฒฝ๋ณ์ PATH
- ์ด๋ ์ ์ ๊ฐ ๋ช ๋ น์ด๋ฅผ ์คํํ ๋ linux๋ ํด๋น ๋ช ๋ น์ด๋ฅผ PATH์ ์ ์ฅ๋ ๊ฒฝ๋ก์์ ์ฐพ์์ ์คํํ๋ค. PATH์๋ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ ์ ์๊ณ ๊ฐ ๊ฒฝ๋ก๋ ':'๋ก ๊ตฌ๋ถ๋๋ค. ์์ ์ ์ฅ๋ ๊ฒฝ๋ก๊ฐ ์ฐ์ ์์๊ฐ ๋ ๋๋ค.
-
which : ๋ช ๋ น์ด์ ์์น๋ฅผ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
-
grep : ์ ๋ ฅ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ํน์ ๋ฌธ์์ด์ด ํฌํจ๋ ํ์ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
-
clear : ํฐ๋ฏธ๋์ ์ถ๋ ฅ๋ ๋ด์ฉ์ ์ง์ธ ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด
-
tee : stdin์ผ๋ก์ ์ ๋ ฅ์ stdout๊ณผ ํ์ผ๋ค์ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
-
date : ํ์ฌ ๋ ์ง์ ์๊ฐ์ ์ถ๋ ฅํ๋ ๋ช ๋ น์ด
- # : ์ ๋ชฉ
- ## : ๋ถ์ ๋ชฉ
- ### : ๋ถ๋ถ์ ๋ชฉ
- ๋น ์ค์ ํตํด ๋ฌธ๋จ์ ๊ตฌ๋ถํ ์ ์์
- * ๋๋ - ๋ฑ์ ํน์๋ฌธ์๋ฅผ ์ค ์์ ์ ๋ ฅํ์ฌ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ๊ฐ ์ถ๋ ฅ๋๊ฒ ํ ์ ์๋ค.
-
- ๊ณผ ๊ฐ์ด ์ซ์๋ฅผ ์ค ์์ ์ ๋ ฅํ์ฌ ์ค ๋ฒํธ๊ฐ ์ถ๋ ฅ๋๊ฒ ํ ์ ์๋ค. ์ค ๋ฒํธ๋ ์๋์ผ๋ก ๊ณ์ฐ๋์ด ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์ ๋ชจ๋ 1. ๋ก ์ ๋ ฅํด๋ ์๊ด์๋ค.
- ๊ธ๋จธ๋ฆฌ ๊ธฐํธ์ ์ค ๋ฒํธ๋ ํญ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํ์ ๋ฌธ๋จ์ผ๋ก ์ถ๋ ฅ๋๋๋ก ํ ์ ์๋ค.
๋ฐ์ ์์ ์์ ์ฌ์ฉํ markdown์ ์์
- ๊ต์๋์ ์ฝ๋๋ฅผ ์นดํผํจ
- Good Job
- Hi
์ฃผ์
word์์ ์ฌ์ฉํ๋ ๋ฐ์ดํ์ bash์์ ๋ช
๋ น์ด์ ์ฌ์ฉ๋๋ ๋ฐ์ดํ๋ ๋ค๋ฅด๊ฒ ์ธ์๋จ.
- ์ผ๋ฒ
- ์ด๋ฒ
- ์ผ๋ฒ
cp ~hwan/.profile ~hwan/.bashrc ~hwan/.bash_logout .
source .profile์ด๋ ๊ฒ ํ๋๊น ํ๋กฌํํธ๊ฐ ์ด๋ก์์ด ๋จ
- .gitignore : git์ผ๋ก ๊ด๋ฆฌ๋์ง ์์ ํ์ผ๋ค์ ์ ์ฅํ๋ ํ์ผ
- git clone ์ฃผ์ : ์ฃผ์์ ์ ์ฅ์๋ฅผ ๋ก์ปฌ ์ ์ฅ์๋ก ๋ณต์ฌํ๋ ๋ช ๋ น์ด. origin์ ์ ์งํจ
- git pull : origin์ ์ commit์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์ ธ์ค๋ ๋ช ๋ น์ด
- git add : ํ์ผ์ staged ์ํ๋ก ๋ณ๊ฒฝํ๋ ๋ช ๋ น์ด
- git commit : ํ์ฌ๊น์ง์ staged๋ ํ์ผ์ ๋ณ๊ฒฝ์ฌํญ์ commit์ผ๋ก ๊ธฐ๋กํ๋ ๋ช ๋ น์ด. commit ๋ฉ์์ง๋ฅผ ์ง์ ํด์ผ ํจ
- git push : origin ์ ์ฅ์์ ๋ก์ปฌ ์ ์ฅ์์ ์ commit๋ค์ ๋ฐ์ํ๋ ๋ช ๋ น์ด.
0<< end message or << end message : ์์ ํ์ผ์ ๋ง๋ค์ด stdin์ผ๋ก ์ฐ๊ฒฐ. ํ์ผ์ ๋ด์ฉ์ ๋ชจ๋ ์ ๋ ฅํ ๋ค ๋ช ๋ น์ ์คํํ ๋ ์ ๋ ฅํ end message๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ผ ์ ๋ ฅ์ ๋๋ด๊ณ ์์ฑ๋ ์์ ํ์ผ์ stdin์ ์ ๋ ฅ์ผ๋ก redirection ํจ.
<<< (string) : bash๋ง ๊ฐ๋ฅ ์ ๋ ฅ๋ string์ stdin์ผ๋ก redirectionํจ
- <<< $() : ๊ดํธ ์์ ๋ช
๋ น์ ์ถ๋ ฅ์ here string์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํจ
- ์์ : cat <<< $(echo -e "hello\nhere string")
a.out <<< 300 &> out.txt out.txt๋ด์ฉ Hello stderr 300 Hello stdout 300 ๋ฒํผ์์ ๋จผ์ ๋ญ๊ฐ ๋์ฌ์ง ๋ชจ๋ฅด๋ฏ๋ก stderr์ด ๋จผ์ ๋์ฌ ์ ์์ ์์๋ฅผ ์กฐ์ข ํ๊ธฐ ์ํด์ ํน์ ๋ฒํผ๊ฐ ๋จผ์ flush๋๋๋ก ํ๋ก๊ทธ๋๋ฐ ํด์ผ ํจ
cmd1 | cmd2 ๋ก ์คํํ ๋ cmd1์ ์ถ๋ ฅ์ด output ๋ฒํผ์ ์ ์ฅ๋ ๋ค cmd2์ input์ผ๋ก ์ฌ์ฉ๋๋๋ฐ ๋ ๋ช ๋ น์ด ์คํ๋๋ ์๋๊ฐ ๋ฌ๋ผ ๋ฒํผ์์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ฉด cmd1์ ์ถ๋ ฅ์ด ๋ฒ๋ ค์ง๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๋ ๋ช ๋ น์ ๋ณ๋ ฌ์ ์ผ๋ก ๋์์ ์คํ๋จ. cmd1์ด cmd2๋ณด๋ค ๋น ๋ฅด๋ฉด ํ์ดํ๋ก์ write๊ฐ ์ ์ ๋ฉ์ถ๋ค. ๋ฐ๋๋ก cmd2๊ฐ cmd1๋ณด๋ค ๋น ๋ฅด๋ฉด ํ์ดํ์์์ read๊ฐ ์ ์ ๋ฉ์ถ๋ค. cmd1์ด ๋จผ์ ์ข ๋ฃ๋๋ฉด ํ์ดํ๊ฐ ๋ซํ๊ณ cmd2๋ EOF๋ฅผ ์ฝ๊ณ ์ข ๋ฃ๋๋ค. cmd2๊ฐ ๋จผ์ ์ข ๋ฃ๋๋ฉด ํ์ดํ๊ฐ ๋ซํ๊ณ cmd1์ SIGPIPE์ ํธ๋ฅผ ์ฃผ๊ณ ์ ํธ๋ฅผ ๋ฐ์ cmd1๋ ์ข ๋ฃ๋๊ฒ ๋๋ค.
- mkfifo : named pipe๋ฅผ ์์ฑํ๋ ๋ช
๋ น์ด
- named pipe : ์ด๋ฆ์ด ์๋ pipe. ์๋ก ๋ค๋ฅธ ํฐ๋ฏธ๋์์ pipe๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์ฐจ์ด์ ์ด ์์
- ex) ์๋ก ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ๊ฐ์ named pipe๋ฅผ ์ด์ฉํด b.out > pipe a.out < pipe ๋ฅผ ์คํํ ์ํ์์ b.out๋ฅผ ์คํํ ํฐ๋ฏธ๋์์ ์ซ์๋ฅผ ์ ๋ ฅํ์ a.out์์ b.out์ ์ ๋ ฅํ ์ซ์๊ฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ด
- globbing : wildcard๋ฌธ์๋ฅผ ์ฌ์ฉํ globํจํด์ผ๋ก ์ฌ๋ฌ ํ์ผ์ ์ด๋ฆ๋ค์ ์ง์ ํ๋ ๊ฒ
- wildcard : ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ๋ ์ฌ๋ฌ ํ์ผ์ ์ด๋ฆ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ฌธ์
-
- : ๋ชจ๋ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ๋์น๋จ(๋น ๋ฌธ์์ด ํฌํจ)
- ? : ๋ฌธ์ ํ๋์ ๋์น๋จ
- [abc] : ๊ดํธ ์์ ๋ฌธ์ ์ค ํ๋๋ก ๋์น๋จ
- [a-c] : ๊ดํธ ์์ ์ง์ ๋ ๋ฌธ์์ ๋ฒ์์ ํด๋นํ๋ ๋ฌธ์ ์ค ํ๋๋ก ๋์น๋จ
-
- cc๋ช ๋ น -o ์ต์ : ์์ฑ๋๋ ์คํ ํ์ผ์ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ ์ต์
-
์๋ฃํ์ ๋ณ์๊ฐ ์ด๋ ํ ์ฑ์ง์ ๊ฐ๋ ์๋ฃ์ธ์ง ์ง์ ํด์ฃผ๋ ๊ฒ์ผ๋ก ๊ฐ์ ์๋ฃํ์ ์ฌ์ฉํ๋๋ผ๋ ์ด๋ ์ปดํจํฐ์์ ์ฌ์ฉํ๊ณ ์ด๋ค ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋์ ๋ฐ๋ผ ๊ตฌํ๋๋ ๋ฐฉ์๊ณผ ํฌ๊ธฐ๋ ๋ฌ๋ผ์ง ์ ์๋ค. ๋ํ ํ์ค์์์ ๋ฐ์ดํฐ๋ฅผ ํ์ ์ ์ธ ํฌ๊ธฐ์ bit๋ฅผ ์ด์ฉํด ๊ตฌํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ค์์์ ๋ฐ์ดํฐ์์ ์ฑ์ง์์ ์ฐจ์ด๊ฐ ์๊ธด๋ค.
- /usr/include/limits.h์ ์๋ฃํ๋ค์ ์ต๋ ํฌ๊ธฐ๊ฐ ์ ์๋์ด ์๋ค.
-
์ ์ํ ๋ณ์์ ์์ ํํ ๋ฐฉ๋ฒ
- ๋ถํธ bit + ๊ฐ
- 1์ ๋ณด์
- 2์ ๋ณด์
-
์์์ ์ค๋ช ํ๋ฏ์ด ์ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋์ง๋ ์ปดํจํฐ, ์ปดํ์ผ๋ฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
-
์ ์ํ ๋ณ์์์ ์๋ฃํ ์์ ์์์ด๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก singed ์๋ฃํ์ผ๋ก ์ทจ๊ธ๋๋ฉฐ unsigned ์์์ด๋ฅผ ๋ถ์ฌ์ 0 ์ด์์ ๊ฐ๋ง ๋ค๋ฃจ๋ ๊ฒ์ผ๋ก ๋ช ์ํ ์ ์๋ค.
binary.c
#include <stdio.h>
int main()
{
int in_a;
fscanf(stdin, "%d", &in_a);
fprintf(stdout, "%d : ", in_a);
for (int i = 31; i >= 0; i--){
fprintf(stdout, "%d", in_a >> i & 1);
if (i % 4 == 0)
fprintf(stdout, " ");
}
fprintf(stdout, "\n");
return 0;
}intํ ๋ณ์ ํ๋์ %d๋ก ์ ์๋ฅผ ํ๋ ์ ๋ ฅ๋ฐ์ ์ ์ฅ๋ bit ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋
binary.c ์คํ ๊ฒฐ๊ณผ
$ bin <<< 3
3 : 0000 0000 0000 0000 0000 0000 0000 0011
$ bin <<< -3
-3 : 1111 1111 1111 1111 1111 1111 1111 1101- 3์ ์ ๋ ฅํ์ฌ bit๋ก ์ถ๋ ฅํ ๊ฒฐ๊ณผ 3์ 2์ง์๋ก ๋ณํํ 11์ด ์ถ๋ ฅ๋๋ค.
- -3์ ์ ๋ ฅํ์ฌ bit๋ก ์ถ๋ ฅํ ๊ฒฐ๊ณผ 2์ง์ 11์ 2์ ๋ณด์๋ฅผ ์ทจํ bit๊ฐ์ด ์ถ๋ ฅ๋๋ค.
์ฆ, ์ฐ๋ฆฌ๊ฐ ์ค์ต์ ์งํํ๋ ํ๊ฒฝ์์๋ c์ธ์ด์ signed ์ ์ํ์ ์์๋ฅผ 2์ ๋ณด์๋ฅผ ์ทจํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ณ ์๋ค.
- python์์ ?
>>> bin(3)
'0b11'
>>> bin(-3)
'-0b11'
>>> bin(3&-3)
'0b1'- bin : ์ ๋ ฅํ ์ ์์ 2์ง์ ๊ฐ์ ์ถ๋ ฅํ๋ python ๋ช ๋ น์ด
- python์์ 3์ 2์ง์๋ 11์ด๋ค.
- -3์ 2์ง์๋ -11์ด๋ค.
- ์ด๋ ๋ง์น ๋ถํธ bit + ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
- 3 & -3์ 2์ง์๋ 1์ด๋ค.
- 3 & -3์ด 1์ด ๋์ค๋ ๊ฒฝ์ฐ๋ 3์ 2์ ๋ณด์๋ฅผ ์ทจํ ๋ฐฉ์์์๋ง ๊ฐ๋ฅํ๋ค.
์ฆ, ์ค์ต ํ๊ฒฝ์์ python์์ ์ญ์ 2์ ๋ณด์๋ฅผ ์ทจํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์ค์ต์ ์งํํ๋ฉด์ binary.c์ ์ซ์๋ฅผ ํ๋ ๋ ์ ๋ ฅ๋ฐ๊ณ ๋จผ์ ์ ๋ ฅํ ์ซ์์ ์ค๋ฅธ์ชฝ shift์ฐ์ฐ์ ๋๋ฒ ์ํํ ๊ฐ์ bit ์ ๋ณด๋ ์ถ๋ ฅํ๋๋ก ์์ ํ๋ค.
$ bin
-456 456
-456 : 1111 1111 1111 1111 1111 1110 0011 1000
456 : 0000 0000 0000 0000 0000 0001 1100 1000
-114 : 1111 1111 1111 1111 1111 1111 1000 1110
$ bin
456 -456
456 : 0000 0000 0000 0000 0000 0001 1100 1000
-456 : 1111 1111 1111 1111 1111 1110 0011 1000
114 : 0000 0000 0000 0000 0000 0000 0111 0010 - -456์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฒ shift์ฐ์ฐ์ ํ์ ๋งจ ์ผ์ชฝ bit๊ฐ 1์ด ์ถ๊ฐ๋์๋ค.
- 456์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ฒ shift์ฐ์ฐ์ ํ์ ๋งจ ์ผ์ชฝ bit๊ฐ 0์ด ์ถ๊ฐ๋์๋ค.
๋ณ์๋ค์ ์๋ฃํ์ intํ์์ unsigned intํ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
$ bin
-456 456
-456 : 1111 1111 1111 1111 1111 1110 0011 1000
456 : 0000 0000 0000 0000 0000 0001 1100 1000
1073741710 : 0011 1111 1111 1111 1111 1111 1000 1110
$ bin
456 -456
456 : 0000 0000 0000 0000 0000 0001 1100 1000
-456 : 1111 1111 1111 1111 1111 1110 0011 1000
114 : 0000 0000 0000 0000 0000 0000 0111 0010 - -456์์ intํ๊ณผ ๋ฌ๋ฆฌ shift์ฐ์ฐ์ ํ์ ๋ ๋งจ ์ผ์ชฝ bit๊ฐ 0์ด ์ถ๊ฐ๋์๋ค.
- 456์ shift์ฐ์ฐํ ๊ฒฐ๊ณผ๋ intํ๊ณผ ๊ฐ์๋ค.
๊ฐ์ ์ซ์๋ฅผ ์ ๋ ฅํ์ ๋ unsigned int, intํ์ ์ ์ฅ๋๋ bit์ ๋ณด๋ ๊ฐ์ง๋ง shift์ฐ์ฐ์ ์ํํ์ ๋ intํ ๋ณ์๋ ๋งจ ์ผ์ชฝ์ sign bit์ ๊ฐ์ด ์ ์ง๋๋ฉด์ shift์ฐ์ฐ์ด ์ผ์ด๋์ง๋ง unsigned int์ ์ ์ฅ๋ ๊ฐ์ 0์ด์์ ์ ์๊ฐ์ผ๋ก ์ทจ๊ธ๋๋ฏ๋ก ์ค๋ฅธ์ชฝ shift์ฐ์ฐ์ด ๋ฐ์ํ ๋ ๋งจ ์ผ์ชฝ bit๊ฐ 0์ด ๋๋ค.
- yy :๋ณต์ฌ
- p : ๋ถ์ฌ๋ฃ๊ธฐ
- n๋ช
๋ น์ด : ๋ช
๋ น์ด๋ฅผ n๋ฒ ๋ฐ๋ณต
- ex) 5yy: ์ฝ๋ 5์ค ๋ณต์ฌ
- 5p : ๋ณต์ฌ๋ ์ฝ๋๋ฅผ 5๋ฒ ๋ถ์ฌ๋ฃ๊ธฐ
which cc
/usr/bin/cc
ls -al /usr/bin/cc
lrwxrwxrwx 1 root root 20 8์ 20 2018 /usr/bin/cc -> /etc/alternatives/cc
ls -al /etc/alternatives/cc
lrwxrwxrwx 1 root root 12 8์ 20 2018 /etc/alternatives/cc -> /usr/bin/gcc
ls -al /usr/bin/gcc
lrwxrwxrwx 1 root root 5 5์ 21 2019 /usr/bin/gcc -> gcc-7
which gcc-7
/usr/bin/gcc-7
ls -al /usr/bin/gcc-7
lrwxrwxrwx 1 root root 22 12์ 4 2019 /usr/bin/gcc-7 -> x86_64-linux-gnu-gcc-7
which x86_64-linux-gnu-gcc-7
/usr/bin/x86_64-linux-gnu-gcc-7
ls -al /usr/bin/x86_64-linux-gnu-gcc-7
-rwxr-xr-x 1 root root 1047488 12์ 4 2019 /usr/bin/x86_64-linux-gnu-gcc-7cc๋ช ๋ น์ ์ฌ์ฉํ์ ๋ ์ค์ ๋ก ์คํ๋๋ ํ์ผ์ /usr/bin/x86_64-linux-gnu-gcc-7
- x86_64-linux-gnu-gcc-7 ๋?
- x86 : intel cpu์์ ์ฌ์ฉํ๋ ์ํคํ ์ฒ
- _64 : 64bit cpu์ฉ
- linux : linux์ด์์ฒด์ ์ฉ
- gnu-gcc-7 : gnu gcc 7๋ฒ์ ์ปดํ์ผ๋ฌ
๊ฐ์ธ์ ์ผ๋ก ๊ทธ๋ ๋ค๋ฉด ํน์ ๋ค๋ฅธ ๋ฒ์ ์ gcc๊ฐ linux์์ ์กด์ฌํ ์ง๊ฐ ๊ถ๊ธํ์ฌ ์ฐพ์๋ณด์๋ค.
ls -al /usr/bin | grep gcc | grep rwxr-x
-rwxr-xr-x 1 root root 428 5์ 7 2006 c89-gcc
-rwxr-xr-x 1 root root 454 4์ 11 2011 c99-gcc
-rwxr-xr-x 1 root root 907648 4์ 12 2018 gcc-5
-rwxr-xr-x 1 root root 31264 4์ 12 2018 gcc-ar-5
-rwxr-xr-x 1 root root 2189 12์ 7 2016 gccmakedep
-rwxr-xr-x 1 root root 31264 4์ 12 2018 gcc-nm-5
-rwxr-xr-x 1 root root 31264 4์ 12 2018 gcc-ranlib-5
-rwxr-xr-x 1 root root 1047488 12์ 4 2019 x86_64-linux-gnu-gcc-7
-rwxr-xr-x 1 root root 31200 12์ 4 2019 x86_64-linux-gnu-gcc-ar-7
-rwxr-xr-x 1 root root 31200 12์ 4 2019 x86_64-linux-gnu-gcc-nm-7
-rwxr-xr-x 1 root root 31200 12์ 4 2019 x86_64-linux-gnu-gcc-ranlib-7์์ ๊ฐ์ด /usr/bin ๋๋ ํ ๋ฆฌ์์ gcc๊ฐ ํฌํจ๋ ์ค์ ์คํ ํ์ผ๋ง์ ์ถ์ถ ํ๋๋ gcc-5, c89-gcc, c99-gcc๋ฑ ์ฌ๋ฌ๊ฐ์ง gcc๋ฒ์ ์ด ์๋๋ฐ ๊ธฐ๋ณธ์ ์ธ cc๋ช ๋ น์ ์ต์ ๋ฒ์ ์ gcc-7์์ ์ฌ์ฉํ๋ ์ปดํจํฐ์ ์ํคํ ์ณ์ ๋ง๋ ์คํ ํ์ผ์ ๋งํฌ ๋๊ฒ ์ค์ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
####๋ณ๊ฒฝ๋ binary.c
#include <stdio.h>
int main()
{
unsigned int in_a;
fscanf(stdin, "%u", &in_a);
fprintf(stdout, "%u \t : ", in_a);
for (int i = 31; i >= 0; i--){
fprintf(stdout, "%d", in_a >> i & 1);
if (i % 4 == 0)
fprintf(stdout, " ");
}
fprintf(stdout, "\n");
return 0;
}์ซ์ ํ๋๋ฅผ %u๋ก ์ ๋ ฅ๋ฐ์ unsigned int ๋ณ์์ ์ ์ฅํ ๋ค %u๋ก ์ถ๋ ฅํ๊ณ ๋ณ์์ ์ ์ฅ๋ bit๊ฐ์ 2์ง์๋ก ์ถ๋ ฅํ๋ ์ฝ๋
์์ ์ฝ๋์ -1์ ์ ๋ ฅํ ๊ฒฐ๊ณผ
pcc011@git:~/pcc/lec05$ bin
-1
4294967295 : 1111 1111 1111 1111 1111 1111 1111 1111 - unsigned int๋ฅผ ์ ๋ ฅ๋ฐ๋ %u์ ์์์ธ -1์ ์ ๋ ฅํ์ง๋ง ๋ณ์์ ์ ์ฅ๋ bit๋ 1์ 2์ ๋ณด์๋ฅผ ์ทจํ bit์ ๊ฐ๋ค.
- %u๋ก ์ถ๋ ฅํ ๊ฒฐ๊ณผ ์ฒซ๋ฒ์งธ bit๊ฐ sign bit๋ก ์ธ์๋์ง ์๊ณ 2์ง์์ 32๋ฒ์งธ ์๋ฆฌ๋ก ์ธ์๋์ด 2^32-1 ๊ฐ์ธ 4294967295๊ฐ ์ถ๋ ฅ๋จ.
#include <stdio.h>
int main()
{
signed int siA;
unsigned int unA;
signed int siSum;
unsigned int unSum;
signed short shortSum;
unsigned short unshortSum;
fscanf(stdin, "%d", &siA);
fprintf(stdout, "Signed Integer : %d\n", siA);
unA = siA;
fprintf(stdout, "Unsigned Integer : %u\n", unA);
fprintf(stdout, "Unsigned Integer %%d: %d\n", unA);
fprintf(stdout, "Signed Integer %%u: %u\n", siA);
siSum = siA + (signed int)unA;
unSum = (unsigned int) siA + unA;
fprintf(stdout, "siSum %%d %d\n", siSum);
fprintf(stdout, "siSum %%u %u\n", siSum);
fprintf(stdout, "unSum %%d %d\n", unSum);
fprintf(stdout, "unSum %%u %u\n", unSum);
shortSum = siA + unA;
unshortSum = siA + unA;
fprintf(stdout, "shortSum %%h %hd\n", shortSum);
fprintf(stdout, "shortSum %%uh %hu\n", shortSum);
fprintf(stdout, "unshortSum %%h %hd\n", unshortSum);
fprintf(stdout, "unshortSum %%uh %hu\n", unshortSum);
shortSum = siA + unA;
unshortSum = siA + unA;
fprintf(stdout, "shortSum %%h %hd\n", shortSum);
fprintf(stdout, "shortSum %%uh %hu\n", shortSum);
fprintf(stdout, "unshortSum %%h %hd\n", unshortSum);
fprintf(stdout, "unshortSum %%uh %hu\n", unshortSum);
return 0;
}%d๋ก intํ ๋ณ์ siA์ ์ ๋ ฅ์ ์ ์ฅํ ๋ค ๊ฐ์ ๊ฐ์ unsigned intํ ๋ณ์ unA์ ์ ์ฅํ๊ณ ๋ ๋ณ์์ ๊ฐ์ ํฉ์ int, unsigned int, short, unsigned shortํ ๋ณ์์ ์ ์ฅํ ๋ค ๊ฐ๊ฐ์ ๋ณ์๋ฅผ ๋ณ์์ ๊ธธ์ด์ ๋ง๋ signed, unsignedํ ์ถ๋ ฅ ์์(%d, %u, %hd, %hu)์ ์ด์ฉํด ์ถ๋ ฅํ๋ ์ฝ๋
์คํ๊ฒฐ๊ณผ
$ a.out
-1
Signed Integer : -1
Unsigned Integer : 4294967295
Unsigned Integer %d: -1
Signed Integer %u: 4294967295
siSum %d -2
siSum %u 4294967294
unSum %d -2
unSum %u 4294967294
siSum %h -2
siSum %uh 65534
unSum %h -2
unSum %uh 65534- intํ ๋ณ์์ -1์ ์ ๋ ฅ๋ฐ์ %d๋ก ์ถ๋ ฅํ์ -1์ด ์ถ๋ ฅ๋๋ค.
- intํ ๋ณ์๋ฅผ %u๋ก ์ถ๋ ฅํ๋๋ 4294967295์ด ์ถ๋ ฅ๋๋ค.
- unsigned int ๋ณ์์ int ๋ณ์์ ๊ฐ์ ๋์ ํ ๋ค ์ถ๋ ฅํ ๊ฒฐ๊ณผ๊ฐ int ๋ณ์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ๊ฐ์๋ค.
- int, unsigned int ๋ณ์์ ํฉ์ ์ถ๋ ฅ ์ญ์ int ๋ณ์์ ์ ์ฅํด์ ์ถ๋ ฅํ ๊ฒ๊ณผ unsigned int ๋ณ์์ ์ ์ฅํด์ ์ถ๋ ฅํ ๊ฒ ๋ชจ๋ %d๋ก ์ถ๋ ฅํ ๋ -2๊ฐ ์ถ๋ ฅ๋๋ค.
- int, unsigned int ๋ณ์์ ํฉ์ ์ถ๋ ฅ ์ญ์ int ๋ณ์์ ์ ์ฅํด์ ์ถ๋ ฅํ ๊ฒ๊ณผ unsigned int ๋ณ์์ ์ ์ฅํด์ ์ถ๋ ฅํ ๊ฒ ๋ชจ๋ %u๋ก ์ถ๋ ฅํ ๋ 4294967294๊ฐ ์ถ๋ ฅ๋๋ค.
- ๋ ๋ณ์์ ํฉ์ short, unsigned shortํ ๋ณ์์ ์ ์ฅํด์ ์ถ๋ ฅํ์ ๋ %h๋ก ์ถ๋ ฅํ ๊ฒฐ๊ณผ๋ -2์๋ค.
- ๋ ๋ณ์์ ํฉ์ short, unsigned shortํ ๋ณ์์ ์ ์ฅํด์ ์ถ๋ ฅํ์ ๋ %uh๋ก ์ถ๋ ฅํ ๊ฒฐ๊ณผ๋ 65534์๋ค.
- signed ๋ณ์์ด๋ unsigned ๋ณ์์ด๋ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ ๊ฐ๋ค.
- ์ด๋ ์๋ฃํ์ ๋ณ์์์ ๊ด๊ณ์์ด signed ์ ์์ ์ถ๋ ฅ์์(%d, %h)์ ์ด์ฉํด ์ถ๋ ฅํ๋ฉด ๋ณ์์ ๋ฐ์ดํฐ๊ฐ signed ์ ์๋ก ๋ณํ๋์ด unsigned ์ ์์ ์ถ๋ ฅ์์(%u, %uh)์ ์ด์ฉํด ์ถ๋ ฅํ๋ฉด ๋ณ์์ ๋ฐ์ดํฐ๊ฐ unsigned ์ ์๋ก ๋ณํ๋์ด ์ถ๋ ฅ๋๋ค.
- int์ unsigned int ๋ณ์์ ํฉ์ ์ํํ์ ๋ ๋ณ์๊ฐ signed์ธ์ง unsigned์ธ์ง ๊ด๊ณ์์ด ๋ณ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ๋ํ๊ธฐ bit์ฐ์ฐ์ด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ค.
- 1111 1111 1111 1111 1111 1111 1111 1111 ๋ฐ์ดํฐ ๋ ๊ฐ์ ํฉ ๋นํธ์ฐ์ฐ์ ํ ๊ฒฐ๊ณผ๋ 1111 1111 1111 1111 1111 1111 1111 1110 ์ธ๋ฐ ์ด ๋ฐ์ดํฐ๋ฅผ signed ์ ์๋ก ํด์ํ๋ฉด -2, unsigned ์ ์๋ก ํด์ํ๋ฉด 4294967294์ธ๋ฐ ๋ ๋ณ์์ ํฉ์ ์ ์ฅํ ๋ณ์๋ฅผ %d, %u๋ก ์ถ๋ ฅํ์ ๋์ ๊ฒฐ๊ณผ๊ฐ ์์์ ์ค๋ช ํ ๊ฐ๊ฐ์ ์์ ๊ฐ๋ค.
- ์๋ฃํ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋ณ์์ ๊ฐ์ ์ ์ฅํ ๋ ์๋์ผ๋ก type casting์ด ์ผ์ด๋๋ค.
- ๋๋ฌธ์ ๋ ๋ณ์์ ํฉ์ shortํ ๋ณ์์ ์ ์ฅํด %h๋ก ์ถ๋ ฅํ์ ๋ intํ ๋ณ์์ ์ ์ฅํด %d๋ก ์ถ๋ ฅํ์ ๋์ ๊ฐ์ -2๊ฐ ์ถ๋ ฅ๋๋ค.
- ๋ํ intํ ๋ณ์์์ ํฉ์ %u๋ก ์ถ๋ ฅํ์ ๋ 2^32-2๊ฐ ์ถ๋ ฅ๋ ๊ฒ ์ฒ๋ผ shortํ ๋ณ์์์ ํฉ์ %uh๋ก ์ถ๋ ฅํ ๊ฒฐ๊ณผ๊ฐ 2^16-2๊ฐ ์ถ๋ ฅ๋๋ค.
cc -W ์ต์ : ์ปดํ์ผ์์ ๋ฐ์ํ๋ ๋ชจ๋ warning์ ์ถ๋ ฅํ๋ ์ต์
- automatic : ๋ณ์๊ฐ ์ ์ธ๋ ๋ฒ์ ๋ด์์๋ง ์์กดํ๋ ๋ณ์. ์ฒ์ ์ฌ์ฉ๋ ๋ ์ด๊ธฐํ๋์ด ์ ์ธ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ฌ๋ผ์ง.
- static : ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์์กดํ๋ ๋ณ์. ํ๋ก๊ทธ๋จ์ด ์์ํ ๋ ์ด๊ธฐํ ๋๋ฉฐ ์ ์ธ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ฌ๋ผ์ง์ง ์์.
- manual : malloc๊ณผ free๊ฐ ํฌํจ๋ ๋ณ์? array์ ํฌ๊ธฐ๊ฐ ์ ์ธ๋ ์ดํ ๋ณํ ์ ์๋ ์ ์ผํ ๋ณ์๋ผ๊ณ ํจ.
#define macro_name value์ฝ๋์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ define์ ์ด์ฉํด ๋งคํฌ๋ก๋ก ์ ์ํ๋ฉด macro_name ์ ์ฝ๋์์ ์ฌ์ฉํ์ ๋ preprocessor๋ฅผ ์ฒ๋ฆฌํ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ณํ์ ์ง์ ๋ ๊ฐ์ผ๋ก ๋ณํ๋๋ค.
- cc -E ์ต์ : ์์ค์ฝ๋์ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ต์
count1.c์ ์ฝ๋
#include <stdio.h>
#define VALUE_ONE 1
// Count number of 1 (binary)
int count_one(unsigned int a)
{
int static numCalls = 0;
int count = 0;
while (a)
{
count += a & VALUE_ONE;
a >>= VALUE_ONE;
}
numCalls++;
fprintf(stderr, "Call : %d\n", numCalls);
return count;
}
int main()
{
int i;
int in_a;
fscanf(stdin, "%u", &in_a);
fprintf(stdout, "%u \t : ", in_a);
for (i = 31; i >= 0; i--)
{
fprintf(stdout, "%d", in_a >> i & 1);
if (i % 4 == 0)
fprintf(stdout, " ");
}
count_one(in_a);
count_one(in_a);
count_one(in_a);
count_one(in_a);
fprintf(stdout, "\n");
fprintf(stdout, "count : %d\n", count_one(in_a));
return 0;
}$ cc -E count1.c
.
.
.
# 5 "count1.c"
int count_one(unsigned int a)
{
int static numCalls = 0;
int count = 0;
while (a)
{
count += a & 1;
a >>= 1;
}
numCalls++;
fprintf(
# 15 "count1.c" 3 4
stderr
# 15 "count1.c"
, "Call : %d\n", numCalls);
return count;
}
.
.
.count1.c ํ์ผ์์ #define์ผ๋ก ์ ์๋ VALUE_ONE์ 11, 12๋ฒ์งธ ์ค์์ ์ฌ์ฉํ๋๋ฐ cc -E ์ต์ ์ผ๋ก count1.c์ ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ ์์ค์ฝ๋์์ 11, 12๋ฒ์งธ ์ค์์ VALUE_ONE์ด ์ฌ์ฉ๋ ๋ถ๋ถ์ VALUE_ONE์ด ์ฌ๋ผ์ง๊ณ VALUE_ONE์ ๊ฐ์ผ๋ก ์ ์๋ 1์ด ๋ค์ด๊ฐ ๋ชจ์ต์ด๋ค.
int const con = 100;- ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ์์์ฒ๋ผ ์ฌ์ฉ๋๋ ๋ณ์.
- ์ ์ธํ ๋ ๊ฐ์ด ์ด๊ธฐํ ๋์ด์ผ ํจ.
- alias : ์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด์ ๋จ์ถ ๋ช ๋ น์ด๋ฅผ ๋ง๋๋ ๋ช ๋ น์ด
- !$ : ๊ฐ์ฅ ๋ง์ง๋ง์ ์ฌ์ฉํ ํ๋ผ๋ฏธํฐ๊ฐ ๋ฐํ๋จ
- kill : ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ์ํฌ ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด
-
&val - ๋ณ์ val์ ์ฃผ์
-
*ptr - ๋ณ์ ptr์ ์ ์ฅ๋ ์ฃผ์์ ์ ์ฅ๋ ๊ฐ
-
ํฌ์ธํฐ ๋ณ์์ ๊ฐ์ ์ด๋ ์๋ฃํ์ ํฌ์ธํฐ๋์ ๋ฐ๋ผ ์ฆ๊ฐ๋ ๋ ๊ฐ ์๋ฃํ์ address line๋งํผ ์ฆ๊ฐํจ
- ex) int *a; // a++์ ํ ๋ ๊ฐ์ด 4๋งํผ ์ฆ๊ฐํจ
- ex) long long *b; // b++์ ํ ๋ ๊ฐ์ด 8๋งํผ ์ฆ๊ฐํจ
- ex) void *c; // c++์ ํ ๋ ๊ฐ์ด 1๋งํผ ์ฆ๊ฐํจ
-
automatic ๋ณ์ : ๋ณ์๊ฐ ์ ์ธ๋ ๋ฒ์ ๋ด์์๋ง ์์กดํ๋ ๋ณ์. ์ฒ์ ์ฌ์ฉ๋ ๋ ์ด๊ธฐํ๋์ด ์ ์ธ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ฌ๋ผ์ง.
-
static ๋ณ์ : ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์์กดํ๋ ๋ณ์. ํ๋ก๊ทธ๋จ์ด ์์ํ ๋ ์ด๊ธฐํ ๋๋ฉฐ ์ ์ธ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ฌ๋ผ์ง์ง ์์.
-
array์ pointer์ ์ฐจ์ด
- array
- ๊ธฐ๋ณธ์ ์ผ๋ก pointer๋ณ์์
- ๊ทธ๋ฌ๋ array์ ํฌ๊ธฐ๋งํผ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ ์๋์ผ๋ก ํ ๋นํ๊ณ pointer๊ฐ ํด๋น array์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋จ
- pointer
- pointer ๋ณ์์ด๊ธด ํ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ฐ๋ก ํ์ง ์์
- array
#include <stdio.h>
void add(int *a, int *b, int *c)
{
*c = *a + *b;
}
int main()
{
int const a = 100;
int b = 200;
int c = 9999;
int *p = &a;
fprintf(stdout, "a, b, c : %d %d %d\n", a, b, c);
*p = 200;
fprintf(stdout, "a, b, c : %d %d %d\n", a, b, c);
}์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด int const ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ int ํฌ์ธํฐ๋ก ์ฃผ์๋ฅด ์ด์ฉํด ์ ๊ทผํด ๋ณ๊ฒฝํ๊ณ ์ ์๋ํ๋ค.
์คํ๊ฒฐ๊ณผ
$ a.out
a, b, c : 100 200 9999
a, b, c : 200 200 9999a๊ฐ int const ๋ณ์์์๋ int ํฌ์ธํฐ ๋ณ์๋ก ์ ๊ทผํ๋๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
- ๊ทธ๋ฌ๋ฉด const๋ก ์ ์ธํ๋ ์๋ฏธ๋?
- ์ปดํ์ผ ๋จ๊ณ์์ warning์ด ๋ ์ const ๋ณ์์ ํฌ์ธํฐ๋ก ์ ๊ทผํ๋ ์ฝ๋๊ฐ ์์์ ์ ์ ์์
int const *p = &a;
*p = 200;์์ ๊ฐ์ด ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด int constํ ๋ณ์์ ๋ํ ํฌ์ธํฐ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ ์ค์ด ๋ถ๊ฐ๋ฅ ํ์ฌ ์ปดํ์ผ ๋จ๊ณ์์ ์๋ฌ๊ฐ ๋๊ฒ ๋๋ค.
- int const * p : int constํ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๋ pointer ๋ณ์ p
- p์ ์ ์ฅ๋ ์ฃผ์๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
- p์ ์ ์ฅ๋ ์ฃผ์์ ์์น์ ์ ์ฅ๋ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
- int * const p : intํ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๋ pointer const ๋ณ์ p
- p์ ์ ์ฅ๋ ์ฃผ์์ ์์น์ ์ ์ฅ๋ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
- p์ ์ ์ฅ๋ ์ฃผ์๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
#include <stdio.h>
void add(int *a, int *b, int *c)
{
*c = *a + *b;
}
void sub(int *a, int *b, int *c)
{
*c = *a - *b;
}
void mul(int *a, int *b, int *c)
{
*c = *a * *b;
}
void div(int *a, int *b, int *c)
{
*c = *a / *b;
}
int main()
{
int a = 100;
int b = 200;
int c = 9999;
char ch;
int op = 0;
fscanf(stdin, "%d %c %d", &a, &ch, &b);
void (*fp[4])(int *, int *, int *) = {add, sub, mul, div};
//int const * p = &a;
//int * const q = &a;
switch(ch){
case '+':
op = 0;
break;
case '-':
op = 1;
break;
case '*':
op = 2;
break;
case '/':
op = 3;
break;
default:
break;
}
fprintf(stdout, "a, b, c : %d %d %d\n", a, b, c);
fp[op](&a, &b, &c);
fprintf(stdout, "a, b, c : %d %d %d\n", a, b, c);
fprintf(stdout, "fp %lld %lld %lld %lld\n", add, sub, mul, div);
}ํจ์ ํฌ์ธํฐ์ ์ ์ธ
void (*fp)();ํจ์ ํฌ์ธํฐ fp : return๊ฐ์ด ์๋ void ํจ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํจ์ ํฌ์ธํฐ
fp์ ํ๋ผ๋ฏธํฐ๋ ์ปดํ์ผ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์์ง๋ง ํ์์ ๋ง๋ ํจ์๋ง ์ฌ์ฉํ๋๋ก ์์ ์ฅ์น์ ์ญํ ์ ํ์ฌ ์ปดํ์ผ ๋จ๊ณ์ warning์ด ๋จ๋๋ก ํ ์ ์๋ค.
void (*fp)(int *, int *, int *); /* add, sub, mul, div ํจ์๋
int์ ์ฃผ์๊ฐ ์ธ๊ฐ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ผ๋ฏ๋ก
์ด๋ ๊ฒ ์ ์ธํ์ฌ ์์ ์ฅ์น๋ฅผ ๋ฌ ์ ์๋ค */ ํจ์ ํฌ์ธํฐ fp์ mulํจ์์ ์ฃผ์๋ฅผ ์ ์ฅ
fp = mul; //๋ณ์์ ์ฃผ์์ ๋ฌ๋ฆฌ ํจ์๋ ์์ &๋ฅผ ๋ถ์ผ ํ์๊ฐ ์๋ค.์ฃผ์ : ์ด ๋ fp = mul();๋ก ์์ฑํ๋ฉด mulํจ์๋ฅผ ์คํํ๋ ํํ๊ฐ ๋๋ ์ด๋ ๊ฒ ์์ฑํ๋ฉด ์๋๋ค.
mulํจ์์ ์ฃผ์๊ฐ ์ ์ฅ๋ ํจ์ ํฌ์ธํฐ fp๋ก mulํจ์ ์คํํ๊ธฐ
fp(&a, &b, &c); /* ์ ์์ ์ธ ์คํ ๋ฐฉ๋ฒ */
*fp(&a, &b, &c); /* ํจ์ ํฌ์ธํฐ์์ ํฌ์ธํฐ๋ก ์ฃผ์์ ์ ๊ทผํ๋ค๊ณ
ํด์ ์์ *๋ฅผ ๋ถ์ผ ํ์๊ฐ ์๋ค. */ํจ์ ํฌ์ธํฐ์ ๋ฐฐ์ด fp ์ ์ธ
void (*fp[4])(int *, int *, int *) = {add, sub, mul, div};ํจ์ ํฌ์ธํฐ ๋ฐฐ์ด fp์ ์ ์ฅ๋ ํจ์์ ์ฃผ์๋ฅผ ์ด์ฉํ ํจ์ ํธ์ถ
fp[0](&a, &b, &c); // add(&a, &b, &c); ์ ๋์ผ
fp[1](&a, &b, &c); // sub(&a, &b, &c); ์ ๋์ผ
fp[2](&a, &b, &c); // mul(&a, &b, &c); ์ ๋์ผ
fp[3](&a, &b, &c); // div(&a, &b, &c); ์ ๋์ผ์ฆ fnpointer.c #2๋ ๋ ์ ์์ ์ฌ์น์ฐ์ฐ ๋ถํธ ํ๋๋ฅผ ์ ๋ ฅ๋ฐ์ switch case๋ฌธ์ ์ด์ฉํด ์ ๋ ฅ๋ฐ์ ๋ถํธ์ ๋ฐ๋ผ ํจ์ ํฌ์ธํฐ ๋ฐฐ์ด fp์์ ์คํํ ํจ์์ index๋ฅผ op์ ์ ์ฅํด ํจ์ ํฌ์ธํฐ ๋ฐฐ์ด fp๋ฅผ ์ด์ฉํด add, sub, mul, div ์ค ํ๋์ ํจ์๋ฅผ ์คํํด c์ ์ฌ์น์ฐ์ฐ์ ์ํํ ๊ฐ์ ์ ์ฅํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋์ด๋ค.
fnpointer.c ์คํ๊ฒฐ๊ณผ
$ a.out
100 + 200
a, b, c : 100 200 9999
a, b, c : 100 200 300
fp 94277047683002 94277047683041 94277047683080 94277047683120
$ a.out
50 - 34
a, b, c : 50 34 9999
a, b, c : 50 34 16
fp 94068517676986 94068517677025 94068517677064 94068517677104
$ a.out
12 * 9
a, b, c : 12 9 9999
a, b, c : 12 9 108
fp 94536957278138 94536957278177 94536957278216 94536957278256
$ a.out
200 / 25
a, b, c : 200 25 9999
a, b, c : 200 25 8
fp 94596585293754 94596585293793 94596585293832 94596585293872- compile ๋ช
๋ น
- preprocessor directive : #์ด ๋ถ์๊ฒ๋ค(#define, #include ๋ฑ)๋ฅผ ์ฒ๋ฆฌ
- compile user source code : preprocessor๊ฐ ๋๋ source code๋ก assembly code๋ฅผ ๋ง๋ฌ
- assembly : machine language์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ธ์ด
- link assembler : printf, scanf๋ฑ ์ธ๋ถ ์ฝ๋๋ฅผ link์์ผ์ executable code๋ฅผ ์์ฑ
- static link : ์คํ ํ์ผ์ ์์ฑํ ๋ ๋ฏธ๋ฆฌ ๋ค link์ํด
- dynamic link : ์คํ ๋์ค์ ํ์ํ ๋ link์ํด
- loader : memory๋ก executable code๋ฅผ load์ํด
- compile ํ๋ก๊ทธ๋จ
- interpreter : ํ๋ฒ์ ํ ์ค์ฉ ๊ธฐ๊ณ์ด๋ก ๋ณํ
- python์ interpreter๋ฅผ ์ฌ์ฉํ๋ ์ธ์ด
- compiler : compile ๋จ๊ณ์์ ์ฝ๋ ์ ์ฒด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํ
- c์ธ์ด๋ compiler๋ฅผ ์ฌ์ฉํ๋ ์ธ์ด
- interpreter : ํ๋ฒ์ ํ ์ค์ฉ ๊ธฐ๊ณ์ด๋ก ๋ณํ
- -g : debugging์ ์ํ ์ต์ . ๋๋ฒ๊น ์ ์ํ ์ฒดํฌ์ฝ๋๊ฐ ํฌํจ๋์ด ์คํ์๋๊ฐ ๋๋ ค์ง๊ธฐ ๋๋ฌธ์ debuggingํ์ง ์์ ๋ ์ฌ์ฉํ์ง ์์.
- -c : .oํ์ผ(assembly code)๋ฅผ ์์ฑํ๋ ์ต์
- -E : preprocessing๋ง ์ํํ๋ ์ต์
- -O : optimization ์ต์
- -m32 : 32๋นํธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ปดํ์ผ ํ๋ ์ต์
- 64๋นํธ ์ปดํจํฐ์์๋ --32 ์ต์ ์ผ๋ก ์ปดํ์ผ ํ ์คํํ์ผ์ ์ง์ํจ
- -m64 : 64๋นํธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ปดํ์ผ ํ๋ ์ต์
- 32๋นํธ ์ปดํจํฐ์์๋ --64 ์ต์ ์ผ๋ก ์ปดํ์ผ ํ ์คํํ์ผ์ ์ง์ ๋ชปํจ
gcc main.c func.c
- main.c func.c์ preprocessing์ด ์ผ์ด๋จ
- main.c์ #include <stdio.h>, #include "func.h"๊ฐ ์ฒ๋ฆฌ๋จ
- func.c์ #include "func.h"๊ฐ ์ฒ๋ฆฌ๋จ
- preprocessing๋ main.c, func.c๋ฅผ compileํ์ฌ assembly code main.o, func.o๊ฐ ์์ฑ๋จ
- linking : main.o์์ ์ฌ์ฉํ๋ printf, func1์ ๋ํ linking์ ์ฒ๋ฆฌํ์ฌ ์คํํ์ผ a.out์ด ์์ฑ๋จ
- printf : ์คํํ ๋ dynamic linking ๋จ
- func1 : func.o์์ static linking ๋จ
- cc -c main.c : assembly codeํ์ผ main.o ํ์ผ ์์ฑ
- cc -c func.c : assembly codeํ์ผ func.o ํ์ผ ์์ฑ
- cc main.o func.o : linking์ด ์ํ๋์ด executable code a.outํ์ผ ์์ฑ
๋ง์ฝ func.o๊ฐ ์์ฑ๋ ์ํ์์ main.c์ ์ฝ๋๋ง ์์ ๋์ ๋
cc main.c func.o๋ก ์คํํ๋ ๊ฒ์ด ์ข๋ค.
func.c์ ํฌํจ๋ ์ฝ๋๊ฐ ๊ธธ์ด์ ์ปดํ์ผ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฝ๋๋ผ๋ฉด ์ฝ๋๊ฐ ๋ณํ๊ฒ์ด ์๋๋ฐ
cc main.c func.c
๋ก ์คํํ๊ฒ ๋๋ฉด ๊ฐ์ func.o๋ฅผ ์์ฑํ๊ธฐ ์ํ ์๊ฐ์ด ๋ค์ ์๋ชจ๋๊ธฐ ๋๋ฌธ
๊ทธ๋ฌ๋ฏ๋ก func.oํ์ผ์ ์์ฑํด ๋์๋ค๋ฉด ์ด๋ฅผ ๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
preprocessing๊ณผ์ ์์
- include header files
- define macro
- conditional compilation
- line control
์ด ์ฒ๋ฆฌ๋๋ค๊ณ ํ๋ค.
\c์ธ์ด์์ include file์ ํ ๋ "" <>์ ์ฐจ์ด #if, #ifdef, #ifndef, #elif, #else, #endif
#define <identifier> <replacement token list> //macro ์ ์
#undef <identifier> //macro ์ ์ ํด์ macro๋ preprocessing ๋จ๊ณ์์ text๋ก replace๋จ
โ ๏ธ ์ฃผ์ : ๊ดผํธ๋ฅผ ์ ์ณ์ผ ํจ
#define sqr(a) a * a // X. sqr(1+5) -> 1+5 * 1+5๊ฐ ๋จ
#define sqr(a) (a) * (a) // O. sqr(1+5) -> (1+5) * (1+5)๊ฐ ๋จ
- Stringification(#) operations
- Parameters
- Concatenation operations
- Tokens expand
expansion order๋ฅผ ํ์ธ ํด๋ณผ ์ ์๋์์
#define HE HI
#define LLO _THERE
#define HELLO "HI THERE"
#define CAT(a,b) a##b
#define XCAT(a,b) CAT(a,b)
#define CALL(fn) fn(HE,LLO)
CAT(HE,LLO) // "HI THERE", because concatenation occurs before normal expansion
XCAT(HE,LLO) // HI_THERE, because the tokens originating from parameters ("HE" and "LLO") are expanded first
CALL(CAT) // "HI THERE", because parameters are expanded first- __FILE__ : string ํํ์ ํ์ผ ์ด๋ฆ์ผ๋ก ๋ณํ๋จ
- __LINE__ : int ํํ์ ํ์ฌ line ๋ฒํธ๋ก ๋ณํ๋จ
์ฌ์ฉ ์์
//test.c
#include <stdio.h>
int main()
{
printf("file : %s, line : %d\n", __FILE__, __LINE__);
}$ cc test.c
$ a.out
file : test.c, line : 5#define str(s) #s // ์ด ๋งคํฌ๋ก๋ฅผ ์ ์ธํ๋ฉด
str(p = "foo\n";) // outputs "p = \"foo\\n\";"
str(\n) // outputs "\n
//์์ ๊ฐ์ด ์๋์ผ๋ก ํ๋ผ๋ฏธํฐ์ ์
๋ ฅ๋ ๋ฌธ์์ด์ ๊ทธ๋๋ก ์ถ๋ ฅํ ์ ์๋ ํํ๋ก ๋ณํํด์ค
#define xstr(s) str(s) //expansion order๋ฅผ ์ด์ฉํ ์์ฉ
#define foo 4
str (foo) // outputs "foo"
xstr (foo) // outputs "4"#define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t
DECLARE_STRUCT_TYPE(g_object);
// Outputs: typedef struct g_object_s g_object_t;- Token Concatenation์ ์ฌ์ฉํ์ง ์์ ๊ฒ๊ณผ ์ฐจ์ด์ ?
- Token์ ์ฐ์์ผ๋ก ์ฌ์ฉํ ๋ Concatenation์ ์ฌ์ฉํ๋ฉด ๋ถ์ฌ์ ์ธ ์ ์๋ค.
#define sq(a) aaa
sq(b) //output : aaa
#define sq(a) a a a
sq(b) //output : b b b
#define sq(a) a##a##a
sq(b) //output : bbb์์ ์ฝ๋
int fn(int a)
{
int b;
return a * a;
}
int main()
{
int a = 100;
b = fn(a);
}-
ํจ์๊ฐ ํธ์ถ๋๋ฉด ํจ์์ ๋ฉ๋ชจ๋ฆฌ stack์ด ์์ฑ๋จ
- int a๋ฅผ ๋ฐ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ
- int b์ ๋ฉ๋ชจ๋ฆฌ
- return๋ ๊ฐ์ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ
-
์์ code์ fnํจ์์์ b๋ ์ฌ์ฉ๋์ง ์์ ํ๋ผ๋ฏธํฐ์
- ๊ทธ๋ฌ๋ฏ๋ก optimize๋ ๋ int b; ๋ ์ง์์ง๋ค.
๊ทธ๋ ๋ค๋ฉด
b = fn(a); //ํจ์ ํธ์ถํ๊ธฐ
b = a * a; //์ง์ ๊ณ์ฐํ๊ธฐ๋ ์ฝ๋์ ์ฐจ์ด์ ์?
- ์ฑ๋ฅ?
- ์ง์ ๊ณ์ฐ > ํจ์ ํธ์ถ
- ์ฝ๋ ๊ธธ์ด?
- ํจ์ ํธ์ถ > ์ง์ ๊ณ์ฐ
- 10์ค ์ง๋ฆฌ ์ฝ๋๋ฅผ ํจ์๋ก ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ฝ๋ ํ์ค๋ง ์ฐจ์งํ๋ค.
- ํด๋น ๊ณ์ฐ์ด ํ์ํ ๋ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ๋ฉด ์ฌ์ฉํ ๋ ๋ง๋ค 10์ค ์ฉ ์์ฑํด์ผ ํ๋ค.
#define์ผ๋ก macro๋ฅผ ์ ์ํด ์ฌ์ฉํ๋ฉด?
- ํจ์๋ฅผ ์ฌ์ฉํ๋ฏ์ด ์ฝ๋์ ๊ธธ์ด๋ฅผ ์ค์ด๋ฉด์ ์ฑ๋ฅ๋ ์ง์ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฒ๊ณผ ๊ฐ์ ์ฑ๋ฅ์ ์ป์ ์ ์๋ค.
- c++ ์์๋ ํจ์๋ฅผ ์ ์ํ ๋ inline ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ์์ ํจ์๊ฐ ์ฝ๋๋ก ์ฝ์ ๋์ด ์ฑ๋ฅ ๋ฉด์์ ์ข๋ค.
โ ๏ธ ์ฃผ์ : #define์ ์ฌ์ฉํ ๋ ๊ดํธ ๋ฑ์ ์ ์ ํ ์ฃผ์ํ์ฌ ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํด์ผ ํจ
๋ช ๋ น์ด๋ฅผ ์๋ชป ์ ๋ ฅํ์ ๋
- ^(์์ ํ ๋ถ๋ถ)^(๋์ ์ฝ์ ๋ ๋ถ๋ถ) ์์
$ cay test.c
$ ^y^t
cat test.c
int fn(int a)
{
int b;
return a * a;
}
int main()
{
int a = 100;
b = fn(a);
}- gcc options
- -E : preprocessing์ด ์๋ฃ๋ cpp ํ์ผ ์์ฑ ์ต์
- -S : compile์ด ์๋ฃ๋ assembly code ํ์ผ ์์ฑ ์ต์
- -c : assemble์ด ์๋ฃ๋ object ํ์ผ ์์ฑ ์ต์
- -o : linking๊น์ง ์๋ฃ๋ excutable ํ์ผ์ ์ํ๋ ๊ฒฝ๋ก์ ์ด๋ฆ์ผ๋ก ์์ฑํ๋ ์ต์
-
Character set
- utf-8 (์ ๋์ฝ๋)
-
Initial processing
- LF, CR, LF ๋ฌธ์(์ค๋ฐ๊ฟ ์ฝ๋๋ค)๋ฅผ CR๋ก ๋ฐ๊ฟ
- if -trigraphs
- long line with "\" -> merge
a = "abc de"; //error a = "abc\ de"; // output : a = "abcde";
- ๋ชจ๋ comment๋ฅผ "" ๋ก ๋ณํํ์ฌ ์ง์
-
Tokenization with space
#define foo() bar foo()bar -> bar bar // barbar๊ฐ ์๋ // barbar๊ฐ ๋๋ ค๋ฉด concatenate ์ฌ์ฉ
-
processing language
- inclusion of header / Macro Expansion / Conditional Compile / Line Control Diagnostics
-
#define์ ์ฌ๋ฌ์ค์ ๊ฑธ์ณ ์ฐ๊ธฐ
- ์์์ ์ค๋ช ํ back slash("\")์ฌ์ฉ
-
์ ์ํด์ผ ํ๋ ์์น?
- ์ด๋์๋ ๊ฐ๋ฅ
- ๋ง์ง๋ง์ผ๋ก ์ ์ํ macro๊ฐ ์๋ํจ
-
ํจ์ ํํ์ macro
- if๋ฌธ์ ์ฌ์ฉํ๋ ํจ์๊ฐ ํ์ํ ๋ถ๋ถ์์ ? ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ macro๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ๋งค์ฐ ์ข์์ง
- ๊ดํธ์ ์ฃผ์
- omit parameter
#define min(X, Y) ((X) < (Y) ? (X) : (Y)) min(, b) // output : (( ) < (b) ? ( ) : (b))
- macro๋ฅผ ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ๊ฐ ์์ด๋ ์ ์๋ํจ
โ ๏ธ ์ฃผ์ : ๊ทธ๋ฌ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์๋ ์ ๋ง์ถฐ์ผ ํจ
-
์์์ ์ค๋ช ํ stringization, concatenation์ ์ ์ฌ์ฉํ๋ฉด ์ข์
-
variadic
- ํ๋ผ๋ฏธํฐ์ ๊ฐฏ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋ํ ์ ์๋๋ก macro๋ฅผ ์์ฑ ๊ฐ๋ฅ
- printf๊ฐ ์ด๋ฅผ ํ์ฉํ ์ฝ๋์ ์์
#define eprintf(...) fprintf (stderr, __VA_ARGS__) eprintf ("%s:%d: ", input_file, lineno) // output : fprintf (stderr, "%s:%d: ", input_file, lineno) #define eprintf(format, ...) fprintf (stderr, format __VA_OPT__(,) __VA_ARGS__)
-
Misnesting
#define twice(x) (2*(x)) #define call_with_1(x) x(1) call_with_1 (twice) // - >twice(1) -> (2*(1)) #define strange(file) fprintf (file, "%s %d", strange(stderr) p, 35); // ๏ fprintf (stderr, "%s %d", p, 35);
- ์ด๋ ค์ด ๊ธฐ๋ฒ์
-
predefined macros
- All Standards
- __FILE__ - Filename with full path string
- __LINE__ - Decimal number of current line
- C99
- __DATE__ - run date string
- __TIME__ - run time string
- __STDC__ - 1 or 0 if standards // 0 is with -traditional-cpp
- __STD_VERSION__ , __STDC_HOSTED__, __cplusplus __OBJC__, __ASSEMBLER__
- GNU C Extension
- __COUNTER (generate uniq id), __GFORTRAN, __GNUC__, __GNU_MINOR, __FILE_NAME__,
- All Standards
- ์๋ฒ ๋๋ ์์คํ ์ ์ํ ๊ณ ์ ์์์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ
- floating point์ฐ์ฐ์ int ์ฐ์ฐ์ ๋นํด ๋น์ฉ์ด ๋ง์ด ์๊ตฌ๋๋ ์ฐ์ฐ์
- ๋ํ IoT๋ฑ์ ์ฌ์ฉ๋๋ ์ ๋ ดํ cpu์๋ floting point ์ฐ์ฐ์ ํ ์ฌ์ดํด ๋ด์ ์์ผ์ค ์ ์๋ math unit์ด ์๋ ๊ฒฝ์ฐ๋ ๋ง์
- ๊ทธ๋ ๊ธฐ์ int ์ฐ์ฐ์ ์ด์ฉํ์ฌ ๊ณ ์ ์์์ ์ฐ์ฐ์ ๊ฐ๋ฐํ๋ฉด ์๋ฒ ๋๋ ์์คํ ๋ฑ์์์ ์ค์ ์ฐ์ฐ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์
- cpu ๋ง๋ค ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฆ
- 8bit cpu, 16bit cpu, 32bit cpu, 64bit cpu ๋ฑ
- ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ๊ฐ์ ํ์ํํ
์๋ก ๋ค๋ฅธ ์ ์๋ถ, ์์๋ถ์ ๊ธธ์ด์ ์กฐํฉ์ด ๊ณผ์ ๋ก ์ฃผ์ด์ง ๊ฒ
- ex) #define FX_S_15_16 11516 // signํ ์ ์๋ถ 15, ์์๋ถ 16 ๊ธธ์ด๋ฅผ ๊ฐ๋ ๊ณ ์ ์์์ ์๋ฃํ์ ๊ตฌํํด์ผ ํจ
์ ์๋ถ 15, ์์๋ถ 16๊ธธ์ด signed ๊ณ ์ ์์์ ๊ฐ๋ฐ์ ๊ฐ์ด ์ค์ตํ๋ฉฐ ์ฐ์ตํด ๋ณด์๋ค.
- ๋ถ๋ ์์์ -> ๊ณ ์ ์์์
typedef int fixed32;
#define FX_2_PLUS_16 (1<<16)
fixed32 fromFloat(float fa)
{
return (fixed32)(fa * FX_2_PLUS_16);
}
// fromFloat(0.99) return 64880- ๊ณ ์ ์์์ -> ๋ถ๋ ์์์
#define FX_2_MINUS_16 1.52587890625e-05F
float toFloat(fixed32 xa)
{
return (float)(xa) * FX_2_MINUS_16;
}
// toFloat(64880) return 0.98990- floating point๋ก 0.99๋ฅผ ์ ๋ ฅ๋ฐ์ fixed point๋ก ๋ณํํ์ฌ %d๋ก ์ถ๋ ฅํ์ ๋ 64880์ด ์ถ๋ ฅ๋จ
- fixed point๋ก 64880์ ์ ๋ ฅ๋ฐ์ floating point๋ก ๋ณํํ์ฌ %f๋ก ์ถ๋ ฅํ์ ๋ 0.98990์ด ์ถ๋ ฅ๋จ
0.0001 ์ ์ค์ฐจ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ๊ธฐ์กด์ ์์์ 0.01% ์ ๋์ ๋น์จ๋ก fixed point๋ฅผ ์ด์ฉํ์ฌ ์ป๋ ์ด๋์ ๋นํด ๋งค์ฐ ์ ์ ์ค์ฐจ์ด๋ค.
- ๋ถ๋ ์์์ ์ผ๋ก ๋ณํํ์ฌ ํฉํ ํ ๊ณ ์ ์์์ ์ผ๋ก ๋ณํ
fixed32 fxAdd(fixed32 a, fixed32 b) { return fromFloat((toFloat(a) + toFloat(b))); }
- ๋ถ๋ ์์์ ๋ผ๋ฆฌ ๋ฐ๋ก ํฉ์ฐ
fixed32 fxAdd2(fixed32 a, fixed32 b) { return a + b; }
- fixed point๊ฐ ํํํ ์ ์๋ ๋ชจ๋ ๋ฒ์์ ๊ฐ์ for๋ฌธ์ ์ด์ฉํด ์ด๋์ ๋ ๊ฑด๋ ๋ฐ๋ฉด์ ํฉ์ ํ ๊ฒฐ๊ณผ
- ๊ธฐ๋ณธ์ ์ผ๋ก 1๋ฒ, 2๋ฒ ๋ฐฉ๋ฒ์ ๊ณ์ฐ ๊ฒฐ๊ณผ์ ์ฐจ์ด๊ฐ ์์
- 2๋ฒ ์ฐ์ฐ์ ํตํด overflow๊ฐ ๋ฐ์ํ๋ฉด ๊ณ์ฐ ๊ฒฐ๊ณผ์ ์ฐจ์ด๊ฐ ์๊ธธ ์ ์์
- ๊ทธ๋ฌ๋ ์ด๋ ๋ฐ์ดํฐ์ ๊ธธ์ด์ ๋ฌธ์ ์ด๋ฏ๋ก ๊ณ์ฐ ๋ฐฉ๋ฒ์ด ์๋ชป๋ ๊ฒ์ด ์๋
- ์ฐ์ฐ๋์ ์์ด์ ๋ฐ์ด๋ ๊ฒ์ 2๋ฒ ๋ฐฉ์์
- ๊ทธ๋ฌ๋ฏ๋ก 2๋ฒ ๋ฐฉ์์ ์ด์ฉํด ๊ตฌํํด์ผ ํ๋ค.
์ต์ ๋จ์๋ฅผ ๊ณ์ฐํ๊ณ ๊ทธ๊ฒ์ด ์ ์ต์ ๋จ์์ธ์ง์ ๋ํด ๊ณ ์ฐฐํ์ฌ ๋ณด๊ณ ์์ ์์ฑํด์ผ ํจ
- FX_S_15_16์ ๊ฒฝ์ฐ์์ ์ต์๋จ์๊ฐ 2 ^ (-16) ์
Debugging : ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ์ก๋ ๊ฒ
- cc -g ์ต์ : debug info๊ฐ ํฌํจ๋ ์คํํ์ผ์ ์ปดํ์ผ ํ๋ ์ต์
gdb : GNU Debugger์ ์ฝ์
- debug info๊ฐ ํฌํจ๋ a.out์ gdb๋ก debuggingํ๊ธฐ ์ํด ์คํ
- gdb a.out๋ก ์คํ
- run : ํ๋ก๊ทธ๋จ ์คํ
- where : Call stack ์ถ๋ ฅ
- list : ์ํ๋ ์์น์ code๋ฅผ ์ถ๋ ฅํ๋ ๋ช
๋ น์ด
- parameter ์์ : ํ์ฌ ์์น์์ ๋ถํฐ ์ฝ๋ 10์ค ์ถ๋ ฅ
- parameter ํจ์ ์ด๋ฆ : ํจ์์ ์ฝ๋ ์ถ๋ ฅ
- parameter num1, num2 : 'num1'์ค์์ 'num2'์ค๊น์ง ์ฝ๋ ์ถ๋ ฅ
- help : ๋ช ๋ น์ด์ ๋ํ ๋์๋ง์ ์ถ๋ ฅ
- pwd : ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ๋ ฅ
- print : ํ์ฌ ์ค์ฝํ ์์ ๋ณ์์ ๊ฐ์ ์ถ๋ ฅ
- step : ์ฝ๋๋ฅผ ํ์ค ์ฉ ์คํํ๋ ๋ช ๋ น
- next : ํ์ฌ ์์ค์ฝ๋์ ๋ค์ ์ค์ ์คํํ๋ ๋ช
๋ น
- step์ fprintf๋ฅผ ๋ง๋ฌ์ ๋ fprintf ํจ์๋ก ๋์ด๊ฐ๋ค.
- next๋ fprintf๋ฅผ ๋ง๋ฌ์ ๋ ํจ์์ ์ฒ๋ฆฌ๋ฅผ ๋๋ธ ๋ค์ ํ์ฌ ์์ค์ฝ๋์ ๋ค์ ์ค๋ก ๋์ด๊ฐ๋ค.
- break : break point๋ฅผ ์ง์ ํ๋ ๋ช ๋ น
- quit : gdb ์ข ๋ฃ ๋ช ๋ น์ด
- continue : ํ์ฌ ์์น์์ ๊ณ์ ์คํํ๋ ๋ช ๋ น
- alias : ๋จ์ถ ๋ช ๋ น์ด๋ฅผ ์ง์ ํ๋ ๋ช ๋ น
- delete : breakpoint๋ฅผ ์ญ์ ํ๋ ๋ช
๋ น
- delete num : num๋ฒ์งธ break point๋ฅผ ์ญ์ ํ๋ ๋ช ๋ น
- delete breakpoints : ๋ชจ๋ break point๋ฅผ ์ญ์ ํ๋ ๋ช ๋ น
- ni : next ๋ช ๋ น์ alias
- bt : back trace์ ์ฝ์. Call stack์ ์ถ๋ ฅํ๋ ๋ค๋ฅธ ๋ช ๋ น์ด
- watch : ๋ณ์์ ๊ฐ์์ ์ ์ค์ ํ๋ ๋ช ๋ น. ๊ฐ์์ ์ด ์ค์ ๋ ๋ณ์๋ ๊ฐ์ด ๋ฐ๋ ๋ break๊ฐ ๊ฑธ๋ฆผ
core dumped : ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ํ์ธ core๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ
- core dumped ๋ฐ์ ์์ ์ฝ๋
int main()
{
int a = 10/0; // 0์ผ๋ก ๋๋๋ exception์ผ๋ก ์ธํด core dumped๊ฐ ๋ฐ์
}- apport : ์๋ฌ๋ณด๊ณ ์๋น์ค
- /var/lib/apport/coredump : apport service๊ฐ ์๋์ค์ผ ๋ dumped๋ core๊ฐ ์ ์ฅ๋๋ ๊ฒฝ๋ก
๋จผ์ apport service๋ฅผ ์ข ๋ฃํ ๋ค์ core file size์ limit๋ฅผ ๋ณ๊ฒฝํ๋ค.
- ulimit -a ๋ช ๋ น์ ํตํด core file size ์ ํ์ ํ์ธํ ์ ์์
$ sudo service apport stop
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256271
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 256271
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited- ulimit -c unlimited ๋ก core file size์ ํฌ๊ธฐ๋ฅผ unlimited๋ก ๋ณ๊ฒฝ
$ ulimit -c unlimited
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256271
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 256271
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimitedgdb (debug_info๊ฐ ํฌํจ๋ ์คํํ์ผ) (core๊ฒฝ๋ก) : core๊ฐ dump๋ ์์ธ์ ์ถ๋ ฅํด์ค
$ gdb a.out core
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
[New LWP 4438]
Core was generated by `a.out'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0 0x000055c1cde22609 in main () at coredump.c:3
3 int a = 10/0;
(gdb)Visual Studio์์ project๋ฅผ ์์ฑํ๊ณ source file์ ๋ง๋ ๋ค์ source file์ ์ฝ๋๋ฅผ ์์ฑํ ๋ค์ ์ปดํ์ผ ํ์ฌ ์คํํจ
- F5 : ์ปดํ์ผ ๋ช
๋ น
- ์ปดํ์ผ ์ต์
- release : ์ผ๋ฐ ์คํํ์ผ ์์ฑ ์ต์
- debug : debug info๊ฐ ํฌํจ๋ ์คํํ์ผ ์์ฑ ์ต์ ( cc -g ์ต์ ๊ณผ ๋์ผํ ๊ธฐ๋ฅ)
- x86 : intel 32bit ์ปดํจํฐ์ฉ ์ต์
- x64 : intel 64bit ์ปดํจํฐ์ฉ ์ต์
- ์ปดํ์ผ ์ต์ ์ฐฝ
- ์ปดํ์ผ ์ต์
- line number ์ผ์ชฝ ๊ณต๊ฐ์ ํด๋ฆญํ์ฌ break point๋ฅผ ์ค์ ํ ์ ์๊ณ ํด๋น line์ ๋นจ๊ฐ ์ ์ด ์๊น
- ๊ทธ ์ธ์๋ gdb ์์ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ด GUI๋ก ๊ตฌํ๋์ด ์์ด ํธํ๊ฒ ์ฌ์ฉํ ์ ์์
- ๋ํ Call stack, ๋ณ์๋ค์ ๊ฐ, error info ๋ฑ๋ ํธํ๊ฒ ํ์ธํ ์ ์๊ฒ ํ์๋จ
float ๋ c์ธ์ด์์ ์ค์์ ๊ทผ์ฌ์น๋ฅผ ํํํ๊ธฐ ์ํ ๊ธฐ๋ณธ์๋ฃํ์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก 4๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํจ.
4๋ฐ์ดํธ float ์๋ฃํ์ ํ๋์ sign bit์ 8 bit์ exponent, 23bit์ mantissa ๊ฐ์ ๊ฐ์ง
float์ ์ ์ฅ๋ ๊ฐ์ sign, exponent์ mantissa์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ๋ค.
Val = (-2S + 1) * 1.mantissa * e ^ (exponent - 127)
floating point๋ ํ๊ธ๋ก ๋ถ๋ ์์์ ์ธ๋ฐ ๋ถ๋์ '๋ถ'๋ ํ์๋ก ๋ฐ ๋ถ ์ด๋ค. ์ฆ ์์์ ์ ์์น๊ฐ ์๋ฃํ ์์์ ๊ณ ์ ๋์ด์์ง ์์ ์์๋ฅผ ํํํ๋ ์๋ฃํ์ด floating point์ด๋ค.
๋ฐ๋๋ก fixed point๋ ์์์ ์ ์์น๊ฐ ๊ณ ์ ๋ ์๋ฃํ์ด๋ค.
fixed FX_S03_04์์์ ์์์ ์ ์์น๋ฅผ ํํํ ์์
- fixed FX_S03_04 ๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ๋์ sign bit์ 3bit์ ์ ์๋ถ, 4bit์ ์์๋ถ๋ก ๋๋๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก exponent์ ๋ฐ๋ผ mantissa bit๊ฐ ๊ฐ๋ ๊ฐ์ด ๋ฌ๋ผ์ง๋ floating point์ ๋ฌ๋ฆฌ b4 bit๋ ํญ์ 2์ 0์น ํฌ๊ธฐ๋ฅผ, b2 bit๋ ํญ์ 2์ -2์น ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก fixed FX_S03_04 ์ ์ ์ฅ๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋๋ค.
- b7์ด 1์ธ ๊ฒฝ์ฐ
- val = โ (~b6 * 2 ^ 2 + ~b5 * 2 ^ 1 + ~b4 * 2 ^ 0 + ~b3 * 2 ^ (-1) + ~b2 * 2 ^ (-2) + ~b1 * 2 ^ (-3) + ~b0 * 2 ^ (-4) + 2 ^ (-4))
- b7์ด 0์ธ ๊ฒฝ์ฐ
- val = b6 * 2 ^ 2 + b5 * 2 ^ 1 + b4 * 2 ^ 0 + b3 * 2 ^ (-1) + b2 * 2 ^ (-2) + b1 * 2 ^ (-3) + b0 * 2 ^ (-4)
int ์๋ฃํ๋ ๊ณ ์ ์์์ ์ ์ผ์ข ์ด๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ int ์๋ฃํ์์ ์์์ ์ b0 bit ๋ค์ ์์นํ๋ค.
- ์ด๋ฅผ ์ดํดํ๋ฉด fixed FX_S03_04์ ์ ์ฅ๋ ๊ฐ์ ์ ์๋ก ํํํ ๊ฐ์ 2 ^ (-(์์์ ์ ์์น))๋งํผ์ ๊ณฑํ ๊ฐ๊ณผ ๊ฐ๋ค๋ ์ฌ์ค๋ ์ดํดํ ์ ์๋ค.
- fixed FX_S03_04๋ ์์์ ์ ์์น๊ฐ b4๋ค์ ์์ผ๋ฏ๋ก val์ ์๋์ ๊ฐ๋ค.
- val = ์ ์๋ก ํํํ ๊ฐ * 2 ^ (-4)
- fixed FX_S03_04๋ ์์์ ์ ์์น๊ฐ b4๋ค์ ์์ผ๋ฏ๋ก val์ ์๋์ ๊ฐ๋ค.
floating point๋ exponent์ ํฌ๊ธฐ๊ฐ ํ๋ฝํ๋ ๋ฒ์ ๋ด์์ ์์์ ์ ํจ ์ซ์ ๊ฐฏ์๊ฐ mantissa๊ฐ ํํํ ์ ์๋ ๊ฐฏ์ ์์ ๋ค์ด์ค๋ฉด ๋ชจ๋ ํํํ ์ ์์ง๋ง fixed point๋ ์ผ์ ์๋ฆฌ ์ดํ์ ๊ฐ์ ํํํ ์ ์๋ค.
fixed FX_S15_16์ 2 ^ (-17)๊ณผ 2 ^ 16์ ํํํ ์ ์์ง๋ง floating point๋ ๊ฐ๋ฅํ๋ค.
v_a : fixed point๊ฐ ์ ์ฅํ ๊ฐ
iv_a : v_a์ ์ ์ฅ๋ bit๋ฅผ ์ ์๋ก ํํํ ๊ฐ (= v_a * 2 ^ (-q))
v_b : fixed point๊ฐ ์ ์ฅํ ๊ฐ
iv_b : v_b์ ์ ์ฅ๋ bit๋ฅผ ์ ์๋ก ํํํ ๊ฐ (= v_b * 2 ^ (-q))
- ๋ง์
- v = v_a + v_b = (iv_a * 2 ^ (-q)) + (iv_b * 2 ^ (-q)) = (iv_a + iv_b) * 2 ^ (-q)
=> iv = iv_a + iv_b
- v = v_a + v_b = (iv_a * 2 ^ (-q)) + (iv_b * 2 ^ (-q)) = (iv_a + iv_b) * 2 ^ (-q)
- ๋บ์
- v = v_a - v_b = (iv_a * 2 ^ (-q)) - (iv_b * 2 ^ (-q)) = (iv_a - iv_b) * 2 ^ (-q)
=> iv = iv_a - iv_b
- v = v_a - v_b = (iv_a * 2 ^ (-q)) - (iv_b * 2 ^ (-q)) = (iv_a - iv_b) * 2 ^ (-q)
- ๊ณฑ์
- v = v_a * v_b = (iv_a * 2 ^ (-q)) * (iv_b * 2 ^ (-q)) = (iv_a * iv_b) * 2 ^ (-2q)
=> iv = iv_a * iv_b * 2 ^ (-q)
- v = v_a * v_b = (iv_a * 2 ^ (-q)) * (iv_b * 2 ^ (-q)) = (iv_a * iv_b) * 2 ^ (-2q)
- ๋๋์
- v = v_a / v_b = (iv_a * 2 ^ (-q)) / (iv_b * 2 ^ (-q)) = (iv_a * iv_b) => iv = iv_a / (iv_b * 2 ^ q)
ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ์์ ์ Optimization์ด๋ผ ํ๋ค.
- Golden rule
- Speed(์์
์๋) - CPU > Memory > Storage > IO > Human
- Register > Cache(1st, 2nd) > Memory > ...
- ์๋๊ฐ ๋๋ฆฐ Hardware๋ฅผ ์ต๋ํ ๋ ์ฌ์ฉํ๋๋ก ํด์ผ ์ฑ๋ฅ์ด ์ข์์ง
- ex) printf๋ IO๋ฅผ ์ํํ๋ ๋ช ๋ น์ด๋ฏ๋ก ํ๋ก๊ทธ๋จ ์ง์ฒ๋๋ฅผ printf๋ฅผ ์ฌ๋ฌ๋ฒ ์ด์ฉํด ์ถ๋ ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด Optimization์ ๋ฐฉํด๊ฐ ๋ง์ด๋๋ค.
- Locality : ๋ฉ๋ชจ๋ฆฌ๋ ํ์ ๊ณ์ธต์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ loadํ ๋ ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ ์ฃผ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ด loadํ๋ ํน์ง์ด ์๋๋ฐ ์ด๋ฅผ locality๋ผ ๋ถ๋ฅธ๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ locality์ ์ํด load๋ ๋ฐ์ดํฐ๋ฅผ ์ต๋ํ ํ์ฉํ๋ฉด ์๋๊ฐ ๋๋ฆฐ ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด ์ข์์ง
- Pipeline
- Error : ํ๋ก๊ทธ๋จ์์ Error๊ฐ ๋ฐ์ํ๋ฉด Error๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ๋ง์ ๋น์ฉ์ด ์ฌ์ฉ๋๋ฏ๋ก Error๊ฐ ์ต๋ํ ๋ฐ์ํ์ง ์๋๋ก ํด์ผํจ
- Speed(์์
์๋) - CPU > Memory > Storage > IO > Human
CPU ์์ instruction ํ๋๋ฅผ ์ฒ๋ฆฌํ ๋ ์ต๋ ์๋์ ๊ฐ์ 5๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. Instruction์ ์ข ๋ฅ์ ๋ฐ๋ผ ํ์ํ์ง ์์ ๋จ๊ณ๊ฐ ์์ ์ ์๋ค.
- Fetch : ์คํํ ๋ช ๋ น์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด์
- Decode : ๋ช ๋ น์ด๋ฅผ ํด๋ ํด ํ ์ผ์ ํ์ ํ๊ณ ๋ช ๋ น์ ํ์ํ ์ธ์๋ฅผ ์ฝ์ ๋ค
- Execute : ๋ช ๋ น์ ์ํํ๊ณ
- Memory : ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ฌ
- Write : ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋.
Pipeline์ ๊ธฐ์กด์ ํ instruction์์ ๋ชจ๋ ๋จ๊ณ๊ฐ ๋๋ ๋ค์์ ๋ค์ instruction์ fetch๊ฐ ์์๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ํ Instruction์ fetch๊ฐ ๋๋๊ณ decode ๋จ๊ณ๊ฐ ์งํ๋๋ ๋์ ๋ค์ instruction์ fetch๊ฐ ๋์์ ์งํ๋๋๋ก ํ๋ ๋ฐฉ์์ ๋งํ๋ค.
๊ทธ๋ฌ๋ if๋ฌธ์ ์ํด branch๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ instruction์ด ๋ค์์ ์คํํด์ผ ํ instruction์ธ์ง ์ ์ ์์ผ๋ฏ๋ก pipeline์ด ๊นจ์ง๊ฒ ๋๊ณ ์ด๋ ์ฑ๋ฅ ํ๋ฝ์ผ๋ก ์ด์ด์ง.
ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๊ฒ์ profiling์ด๋ผ๊ณ ํจ
- gprof : GNU profiling ๋๊ตฌ์ ์ด๋ฆ
- compile with -pg option
- $ cc -pg -Wall test.c -o test
- Excute program and generate gmon.out file
- $ test
- Excute gprof
- $ gprof test gmon.out
- ํจ์ ํธ์ถ์ ์ํ ์ ์์ผ๋ฉด ์ํ๋๊ฒ ์ข๋ค
- ๋จ์ํ ์ํค๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด #define macro๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค.
- profiling์ผ๋ก ๋์ค๋ ์์น๋ ์ ๋์ ์ผ๋ก ์ ํํ ๊ฒ์ด ์๋๋ค.
- ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์์(๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค ๋ฑ)๋ฅผ ์ต๋ํ ์ค์ด๊ณ profiling์ ํด์ผ ์ ํ๋๊ฐ ๋์์ง๋ค.
- ? ์กฐ๊ฑด๋ฌธ์ if๋ฌธ๊ณผ ๋ฌ๋ฆฌ ์ฑ๋ฅ์ด ์ข๋ค.
Q. optimization์ ํ์ ๋ debugging์ด ๊ฐ๋ฅํ ๊น?
A. optimization์ ํ๋ฉด ๊ธฐ์กด์ ์ฝ๋์์ ๋ฌ๋ผ์ง๋ ๋ถ๋ถ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ debugging์ด ๋ถ๊ฐ๋ฅํ๋ค.
- -b // --brief -q -p : call graph or runtime
- -z // add unused functions(์ฌ์ฉํ์ง ์์ ํจ์๋ ๋ํ๋ด์ค)
Q. ํจ์ ํฌ์ธํฐ๋ก ํธ์ถ๋ ํจ์๋ counting์ด ์ฆ๊ฐํ ๊น?
A. ์ฆ๊ฐํ๋ค.
- -A // Annotation on source, must be compiled with -pg -g
- --graph
red, green, blue, alpha๊ฐ์ ๊ฐ๊ฐ 8bit์ฉ ์ฌ์ฉํ์ฌ ์ ์ฅํ๋ 32bit ์๋ฃํ ๋ง๋ค๊ธฐ
์๋ฃํ ์ด๋ฆ : t_rgba
[rrrrrrrr][gggggggg][bbbbbbbb][aaaaaaaaa]
์์ ๊ฐ์ ํํ๋ก ๊ฐ์ ์ ์ฅํ๊ฒ ๋ง๋ค๊ณ ์ ํจ
- ์ฌ์ฉํ๋ ์๋ฃํ
- unsigned int (int์ ์ฒซ ๋ฒ์งธ bit๋ sign bit์ด๋ฏ๋ก unsigned int๋ฅผ ์ฌ์ฉํด์ผ ํจ)
typedef unsigned int t_rgba;
- r, g, b, a๋ก ์ ๋ ฅ๋ฐ์ ์ ์๋ ๊ฐ์ ๋ฒ์ : 0 ~ 2^8-1 (=255)
0~255 ์ฌ์ด์ ๊ฐ์ unsigned int์ ์
๋ ฅ๋ฐ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋งจ ์ค๋ฅธ์ชฝ 8bit์์ ๊ฐ์ด ๋ชจ๋ ์ ์ฅ ๋ ๊ฒ์ด๋ค.
[00000000][00000000][00000000][????????]
์ด ๋ [????????]์๋ 0~255์ฌ์ด์ ์
๋ ฅ๋ฐ์ ๊ฐ์ด ์ ์ฅ๋์ด ์๋๋ฐ red์ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋งจ ์ผ์ชฝ 8bit๊ฐ ๋๋๋ก 24๋ฒ ์ผ์ชฝ์ผ๋ก shiftํ๊ณ
[00000000][00000000][00000000][rrrrrrrr]
=>
[rrrrrrrr][00000000][00000000][00000000] - (1)
green์ ๊ฒฝ์ฐ ์ผ์ชฝ์์ 9~16๋ฒ์งธ bit๊ฐ ๋๋๋ก 16๋ฒ ์ผ์ชฝ์ผ๋ก shiftํ๊ณ
[00000000][00000000][00000000][gggggggg]
=>
[00000000][gggggggg][00000000][00000000] - (2)
blue์ ๊ฒฝ์ฐ ์ผ์ชฝ์์ 17~24๋ฒ์งธ bit๊ฐ ๋๋๋ก 8๋ฒ ์ผ์ชฝ์ผ๋ก shiftํ๊ณ
[00000000][00000000][00000000][bbbbbbbb]
=>
[00000000][00000000][bbbbbbbb][00000000] - (3)
alpha์ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋
๋ ๋ค์
[00000000][00000000][00000000][aaaaaaaa] - (4)
(1), (2), (3), (4) ๋ค ๋ฐ์ดํฐ๋ผ๋ฆฌ bitwise or ์ฐ์ฐ์ ํ๋ฉด
[rrrrrrrr][gggggggg][bbbbbbbb][aaaaaaaa]
์์ ๊ฐ์ ํํ๋ก t_rgba๋ณ์์ ๊ฐ์ด ์ ์ฅ๋๊ฒ ๋๋ค.
์์ ๊ณผ์ ์ ํ๋์ ๋งคํฌ๋ก๋ก ์ฒ๋ฆฌํ ์ ์๋๋ฐ ์๋์ fromRGBA๊ฐ ๊ทธ ๋งคํฌ๋ก์ ํด๋นํ๋ค.
#define fromRGBA(r,g,b,a) (((r)&0xff)<<24)|(((g)&0xff)<<16)|(((b)&0xff)<<8)|((a)&0xff)
t_rgba rgba_1 = fromRGBA(red, green, blue, alpha);์ค์ต ๊ณผ์ ์ค ์ฒ์์ fromRGBA๋ฅผ ํจ์๋ก ์ ์ํ์ผ๋ #define์ผ๋ก macro๋ก ์ ์ํ์ ๋ ํจ์ ํธ์ถ ์์ด ์ฝ๋์ ์ง์ ์์ฑํ ํจ๊ณผ๋ฅผ ์ป์ด ์ฑ๋ฅ์ด ์ข์์ง๋ฏ๋ก ์์ ๊ฐ์ด ์์ ๋์๋ค.
r, g, b, a๋ฅผ ๊ฐ๊ฐ 0xff์ bitwise and ์ฐ์ฐ์ ๋จผ์ ์ํ ํ๊ฒ์ 0~255 ๋ฒ์์ ๊ฐ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ด ์ ๋ ฅ๋์ ๋ ๋ค๋ฅธ ์์ bit์ ์ํฅ์ ๋ผ์น์ง ์๋๋ก ํํฐ๋ง ํ ์์ ์ฅ์น์ด๋ค.
t_rgba ๋ณ์ ๋ ๊ฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ฐ๊ฐ์ ์ปฌ๋ฌ๋ผ๋ฆฌ ๊ณฑํ ๊ฒฐ๊ณผ๋ฅผ t_rgba๋ก returnํ๋ t_rgba๊ฐ์ ๊ณฑ์ ์ ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ ํด๋ณด์๋ค.
์ปฌ๋ฌ ๊ฐ์ float๋ก ๋ณํํ์ฌ float ์ฐ์ฐ์ผ๋ก ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ
#define F_NUM_1_255 (1.0f/255.0f)
t_rgba mul_float(t_rgba c1, t_rgba c2)
{
float r1, g1, b1, a1;
float r2, g2, b2, a2;
int ir, ig, ib, ia;
r1 = (float) ((c1 >> 24) ) * F_NUM_1_255;
g1 = (float) ((c1 >> 16) & 0xff ) * F_NUM_1_255;
b1 = (float) ((c1 >> 8) & 0xff ) * F_NUM_1_255;
r2 = (float) ((c2 >> 24) ) * F_NUM_1_255;
g2 = (float) ((c2 >> 16) & 0xff ) * F_NUM_1_255;
b2 = (float) ((c2 >> 8) & 0xff ) * F_NUM_1_255;
a2 = (float) ((c2 ) & 0xff ) * F_NUM_1_255;
ir = (int)((r1 * r2) * 255.0f);
ig = (int)((g1 * g2) * 255.0f);
ib = (int)((b1 * b2) * 255.0f);
ia = (int)((a1 * a2) * 255.0f);
return fromRGBA(ir, ig, ib, ia);
}์ปฌ๋ฌ๋ผ๋ฆฌ int ์ฐ์ฐ์ผ๋ก ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ
t_rgba mul_int(t_rgba c1, t_rgba c2)
{
unsigned int r1, g1, b1, a1;
unsigned int r2, g2, b2, a2;
unsigned int r, g, b, a;
r1 = (c1 >> 24) ; r2 = (c2 >> 24);
g1 = (c1 >> 16) & 0xff; g2 = (c2 >> 16) & 0xff;
b1 = (c1 >> 8) & 0xff; b2 = (c2 >> 8) & 0xff;
a1 = (c1 ) & 0xff; a2 = (c2 ) & 0xff;
r = (r1 * r2) / 255;
g = (r1 * r2) / 255;
b = (r1 * r2) / 255;
a = (r1 * r2) / 255;
return fromRGBA(r,g,b,a);
}- ์์คํ์ผ์ด ๋ง์ ๊ด๋ฆฌํ ๋ฐฉ๋ฒ์ด ํ์ํจ
- ์ฌ๋ฌ ์์์ ๋ฐ๋ผ ์ปดํ์ผ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง
- ํ๊ฒ์์คํ ์ด ๋ค๋ฅด๊ฑฐ๋
- ์ปดํ์ผ ๋ชฉ์ ์ด ๋ฌ๋ผ์ง๊ฑฐ๋(๋๋ฒ๊ทธ, ๋ฆด๋ฆฌ์ฆ, ํ๋ฆฌํ๋ก์ธ์...)
- ํ๊ฒ์ ๋ํ๋์์ ๋ฐ๋ผ ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ ธ์ผ ํจ
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Make๊ฐ ํ์ํ๋ค.
- Makefile์ ๋ค์์ ๋ด์ฉ์ ์์ฑํจ
- target์ ์์ฑ(์ฃผ๋ก ์์ฑ๋ ํ์ผ)
- target์ dependencies๋ฅผ ์ง์ ํจ
- target์ dependencies๋ฅผ ์ด์ฉํด ์์ฑํ๋ ๋ช ๋ น์ ์์ฑ
- make ๋ช
๋ น์ผ๋ก target์ dependencies๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋๋ฉฐ ์์ฑํจ
- ํ์ฌ ๋๋ ํ ๋ฆฌ์ Makefile์ ์ด์ฉํด ๋ช ๋ น์ ์ํํจ
- make -f other-makefile : ๋ค๋ฅธ Makefile์ ์ด์ฉํด make ๋ช ๋ น์ ์คํ
- ํ์ผ ์์ time-stamp์ ๋ฐ๋ผ ์ฌ์ปดํ์ผํจ
target: dependency files
tab (Commands to execute if dependency files changes) ์์
main.o: main.c main.h
cc -c main.c -o main.o- target์ main.o ์ด๊ณ main.o๊ฐ ์์ฑ๋๋ ค๋ฉด main.c, main.h ํ์ผ์ด ์์ด์ผ ํ๋ค.
- main.o๊ฐ ์์ผ๋ฉด make ๋ช ๋ น์ main.c, main.hํ์ผ์ ์ด์ฉํด main.o๋ฅผ ์์ฑํ๋ค.
- main.o๊ฐ ์์ฑ๋ ๋ค์ main.c, main.hํ์ผ์ด ์์ ๋ ๋ค์ make ๋ช
๋ น์ ๋ค์ ์คํํ๋ฉด main.o๊ฐ ์ฌ์ปดํ์ผ ๋๋ค.
- ๋ง์ฝ main.o๊ฐ ์กด์ฌํ๋๋ฐ main.c, main.h์ time-stamp๊ฐ ๋ณํ์ง ์์๋๋ฐ make ๋ช ๋ น์ด ํธ์ถ๋์ ๋ ์ฌ์ปดํ์ผํ์ง ์๋๋ค.
- Macro ์ ์
NAME = string
OBJS = main.o data.o- Macro ํ์ฉ
$(NAME)
$(OBJS) # output : main.o data.o๋ด๋ถ์ ์ ์๋ ๋ณ์
- $@ : target name
- $< : ์ฒซ๋ฒ์งธ dependency file์ ์ด๋ฆ
make ๋ช ๋ น์ ์ฒ๋ฆฌํ๋ default shell์ /bin/sh ์ด๋ค. ์ด๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ฉด
SHELL:=/bin/bash b: SHELL:=/bin/bash๊ณผ ๊ฐ์ด ๋ฐ๊ฟ ์ ์๋ค. ์์ ์์๋ bash๋ก shell์ ๋ณ๊ฒฝํ๋ ์ฝ๋์ด๋ค.
Make๋ target์ dependency files์ time-stamp์ modification time์ด ๋ณ๊ฒฝ๋๋ฉด make ๋ช ๋ น์ด ํธ์ถ๋์ ๋ ์ด๋ฅผ ์ธ์งํ๊ณ target์ recompile ํ๋ค.
- ์ด์ ์ touch ๋ช ๋ น์ ์ค์ตํ์ ๋ ์๋ ํ์ผ์ touch ๋ช ๋ น์ ์ด์ฉํด ๋น ํ์ผ์ ์์ฑํ๋ค.
- ๊ทธ๋ฌ๋ touch ๋ช ๋ น์ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์ด๋ฏธ ์กด์ฌํ๋ ํ์ผ์ modification time ์ ํ์ฌ ์๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ช ๋ น์ด๋ค.
touch ๋ช ๋ น๋ฌธ ์คํ ์์
$ ls -al main.c
-rw-r--r-- 1 pcc011 pcc 213 1์ 24 15:07 main.c
$ touch main.c
$ ls -al main.c
-rw-r--r-- 1 pcc011 pcc 213 1์ 24 23:35 main.ctouch ๋ช ๋ น์ ์คํํ์ main.c์ ์์ ์๊ฐ์ด 15:07์์ 23:35๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
time-stamp ๊ฐ ๋ณ๊ฒฝ๋์ด recompile ๋๋ ๊ฒ์ touch ๋ช ๋ น์ ์ด์ฉํด ํ์ธํด ๋ณด์๋ค.
$ make
cc -c -Wall -g -pg main.c
cc main.o fx_s15_16.o -Wall -g -pg -o main
$ make
make: 'main' is up to date.
$ touch main.c
$ make
cc -c -Wall -g -pg main.c
cc main.o fx_s15_16.o -Wall -g -pg -o main๋๋ฒ ์งธ make๋ time-stamp๊ฐ ๋ง์ง๋ง make์ดํ ๋ณ๊ฒฝ๋์ง ์์ ๋ฌด์๋์์ง๋ง main.c์ touch ๋ช ๋ น์ ์คํํ์ make ๋ช ๋ น์ ์ํด recompile์ด ๋๋ ๊ฒ์ ํ์ธํ๋ค.
ํ์ผ์ ํ์ฅ์์ ๋ฐ๋ผ ์ฐ์ฐ์ ์ํํ๊ฒ ๋ง๋๋ ๊ท์น.
- ๊ฐ๋ น .c ๋ ํ์ฅ์๋ก c๋ฅผ ๊ฐ๋ ํ์ผ์ ๊ฐ๋ฆฌํจ๋ค.
.SURFIXES: .o .c .s
.c.o:
$(CC) $(CFLAGS) -c $<.c ํ์ฅ์๋ฅผ ๊ฐ๋ ํ์ผ์ ์ด์ฉํด object file์ ์ปดํ์ผ ํ๋๋ก ํ๋ suffix rule
.s.o:
$(AS) $(ASFLAGS) -o $@ $<
.s ํ์ฅ์๋ฅผ ๊ฐ๋ ํ์ผ์ ์ด์ฉํด object file์ ์ปดํ์ผ ํ๋๋ก ํ๋ suffix rule
gccmakedep ๋ช ๋ น์ Makefile์ ์ํ๋ ์์ค์ฝ๋์ dependency files๋ฅผ ์๋์ผ๋ก ์ง์ ํด์ค
make๋ shell command์ ๊ธฐ๋ฐํ์ฌ ๋ง๋ค์ด์ ธ์ project์ ๊ท๋ชจ๊ฐ ์ปค์ ธ๊ฐ๋ ํ๋์ ์ฌ์ฉํ๊ธฐ์ ๋๋ฌด ๋ณต์กํ๋ค๋ ํ๊ณ๊ฐ ์๋ค. ๊ทธ๋์ ๋ณด๋ค ๋จ์ํ๊ณ ๊ฐํธํ CMake๊ฐ ํ์ํ๊ฒ ๋์๋ค.
- make
OBJS = test1.o test2.o test3.o
test: $(OBJS)
gcc -o $@ $^
test1.o: test1.c head1.h head2.h
gcc -c $<
test2.o: test2.c
gcc -c $?
test3.o: test3.c
gcc โc $*.c
clean:
\rm -f $(OBJS) test - cmake
project(mytest)
ADD_EXECUTABLE(mytest test1.c test2.c test3.c)make์ค์ต์ ์ฌ์ฉํ ์์ค์ฝ๋๋ฅผ CMake๋ฅผ ์ด์ฉํด ์ปดํ์ผ ํ๋ ์ค์ต์ ํด๋ณด์๋ค.
CMake๋ฅผ ์ด์ฉํด ์ปดํ์ผ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด CMakeLists.txtํ์ผ์ ์์ฑํด์ผ ํ๋ค.
#CMakeLists.txt
project(main)
ADD_EXECUTABLE(main main.c fx_s15_16.c)๊ทธ ๋ค์ cmake๋ช ๋ น์ ์คํํ๋๋ MakeLists.txt๋ฅผ ์ด์ฉํด makeํ์ผ์ด ์์ฑ๋๊ณ make๋ช ๋ น์ ์ด์ฉํด ์ปดํ์ผ์ ํ ์ ์์๋ค.
$ cmake .
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/course/pcc011/pcc/lec12/cmaketest
$ make
Scanning dependencies of target main
[ 33%] Building C object CMakeFiles/main.dir/main.c.o
[ 66%] Building C object CMakeFiles/main.dir/fx_s15_16.c.o
[100%] Linking C executable main
[100%] Built target main
$ main
1.000000 : 65536
0.390000 : 0.389969- Intel i7-980k
- Cache : ์๋นํ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ
- shared L3 Cache : cpu ์ธ๊ฐ๊ฐ l3์บ์๋ฅผ ๊ณต์ ํจ
- Intel i7-980k์๋ Core๊ฐ 6๊ฐ ์์
- ์ด๋ ๋ ผ๋ฆฌ์ ์ผ๋ก CPU๊ฐ 6๊ฐ ์๋๊ฒ๊ณผ ๊ฐ์
Core == Processor
Processor๋ ๋ช ๋ น์ ์ฒ๋ฆฌํ๋ ์ฅ์น
Q. Core๊ฐ 6๊ฐ๋ฉด ์ด๋ค ํ๋ก๊ทธ๋จ ํ๋๋ฅผ 6๊ฐ์ Core์์ ๋๋ ์ ์ํํ ์ ์๋?
A. ๋ถ๊ฐ๋ฅ. ์์ (job) ํ๋๋ ํ๋์ ์ฝ์ด์์ ์คํ
Shell์์ ์ฌ์ฉํ๋ ๊ฐ๋ ์ผ๋ก ๋ถ๋ฆฌํ์ง ์๊ณ interactiveํ๊ฒ ์์๋ ํ๋ก๊ทธ๋จ์ ๋งํ๋ค. Daemon์ ๋ฐ๋๋๋ ๊ฐ๋ ์ ํ ๋ก๊ทธ๋จ์ด๋ค. Job์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋ process๋ค๋ก ์ชผ๊ฐ์ง๋ค.
์ฌ์ฉ์๊ฐ ์ง์ ์ ์ผ๋ก ์ ์ดํ์ง ์๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋๋ฉด์ ์ฌ๋ฌ ์์ ์ ํ๋ ํ๋ก๊ทธ๋จ์ ๋งํ๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๋ฉด์ ํน์ ์์ฒญ์ด ์ค๋ฉด ์ฆ์ ๋์ ํ ์ ์๋ ๋ฆฌ์ค๋์ ๊ฐ์ ์ญํ ์ ํ๋ค.
์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ํ๋ก๊ทธ๋จ์ ์คํํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ก๊ทธ๋จ์ด load๋์ด ์คํํ ์ ์๋ ์ํ์ ํ๋ก๊ทธ๋จ
- ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ์๋ ๋งค์ฐ ๋ง์ process๋ค์ด load๋์ด ์๋ค(์ค์ต ์๋ฒ ๊ธฐ์ค 2000~3000๊ฐ ์ ๋).
- ๊ทธ๋ฌ๋ Processor์ ๊ฐ์๋ process์ ๊ฐ์์ ๋นํด ๋งค์ฐ ์ ๋ค.
๊ฐ๊ฐ์ Processor๊ฐ Process๋ฅผ ๋๋ ์ ๋ด๋นํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋์ Processor๋ ์๊ฐ์ ์ชผ๊ฐ์ ๋์๊ฐ๋ฉด์ Process๋ฅผ ์ํํ๋๋ฐ ์ด๋ฅผ CPU Scheduling์ด๋ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Processor๊ฐ CPU Scheduling์ ์ํด ์ํ์ค์ด๋ Process์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ค๋ฅธ Process๋ฅผ ์ํํ๊ธฐ ์ํด CPU๋ก Process์ ์ ๋ณด๋ฅผ load ํด์ค๋ ๊ณผ์ ์ context switching ์ด๋ผ ํ๋ค.
Process์ ์ํ๋ ํฌ๊ฒ ์ธ ๊ฐ์ง Run, Stop, Kill๋ก ๋๋จ
- Run : Process๊ฐ CPU์์ ์คํ๋๊ณ ์๋ ์ํ
- foreground
- background
- Stop : Process๊ฐ Memory์ load๋์์ผ๋ ์คํ์ด ๋ฉ์ถฐ์๋ ์ํ
- Foreground์์ ์คํ์ค์ด๋ Process๋ฅผ Ctrl + Z ํค๋ฅผ ํตํด stop ์ํฌ ์ ์์.
- Kill : Process๊ฐ ์ข ๋ฃ๋ ์ํ
stop๋ Process๋ฅผ runํ๊ธฐ ์ํ ๋ช ๋ น์ด
- fg : Stop ์ํ์ด๊ฑฐ๋ background๋ก ์คํ์ค์ธ Process๋ฅผ foreground๋ก ์คํํ๋ ๋ช
๋ น์ด
- ํ๋ผ๋ฏธํฐ ์์ด ์คํ : ๋ง์ง๋ง์ผ๋ก stop๋ ํ๋ก์ธ์ค๋ฅผ foreground์์ ์คํ
- fg %(job number) : job number์ ํด๋นํ๋ job์ fore ground์์ ์คํ
vi test.1 [1]+ Stopped vi test.1 $ vi test.2 [2]+ Stopped vi test.2 $ vi test.3 [3]+ Stopped vi test.3 $ jobs [1] Stopped vi test.1 [2]- Stopped vi test.2 [3]+ Stopped vi test.3 $ fg %2 # vi test.2๊ฐ ์คํ๋จ
- bg : stop๋ ํ๋ก์ธ์ค๋ฅผ background์์ ์คํ
- ํ๋ผ๋ฏธํฐ ์์ด ์คํ : ๋ง์ง๋ง์ผ๋ก stop๋ ํ๋ก์ธ์ค๋ฅผ background์์ ์คํ
- bg %(job number) : job number์ ํด๋นํ๋ job์ background์์ ์คํ
- jobs : ํ์ฌ ์์์ stop ์ํ์ job๊ณผ background์์ ์คํ์ค์ธ job์ ๋ชฉ๋ก์ job number, ์ํ ์ ํจ๊ป ์ถ๋ ฅํจ
/proc/cpuinfo : cpu ์ ๋ณด๊ฐ ๋ด๊ธด ํ์ผ
- (command mode) ! + ๋ช ๋ น์ด : vi๋ฅผ stop์ํค๊ณ ๋ช ๋ น์ shell์์ ์คํํจ
- (command mode) r + ํ์ผ๋ช : ํ์ผ์ ์ฝ์ด์ด
- (command mode) r + ! + ๋ช
๋ น์ด : ๋ช
๋ น์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ด์ด
- ์์
- :!ls : vi๋ฅผ stop์ํค๊ณ ls๋ช ๋ น์ ์์์ ์คํํจ
- :r output.txt : output.txtํ์ผ์ ์ฝ์ด์ ํ์ฌ ์ปค์ ์์น์ ํ์ผ์ ๋ด์ฉ์ ์ฝ์ ํจ
- :r!ls : ls๋ช ๋ น์ ์คํํ์ฌ ์ถ๋ ฅ์ ํ์ฌ ์ปค์ ์์น์ ์ฝ์ ํจ
- ์์
Context switching์ด ์ผ์ด๋๋ฉด ์ผ๋ฐ์ ์ผ๋ก
- ๊ธฐ์กด์ ์ํํ๋ ์์ ์ ์ ๋ณด๋ฅผ Memory์ ์ ์ฅํ ๋ค์
- ๋ค์์ ์ํํ ์์ ์ ์ ๋ณด๋ฅผ Memory์์ Core๋ก ์ฝ์ด์จ ๋ค์
- ์ฝ์ด์จ ์์ ์ ๋ค์ ์์ํ๋ค.
๊ทธ๋ฌ๋ Memory์ ์ ๊ทผํ๋ ๊ฒ์ CPU๊ฐ ๋ช
๋ น์ ์ฒ๋ฆฌํ๋ ์๋์ ๋นํด ๋งค์ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์ด๋ค.
๊ทธ๋์ Core๋ด์ ์ฌ๋ฌ๊ฐ์ ์์
์ ์ ์ฅํด๋๊ณ Core๋ด๋ถ์์ Context Switching์ด ์ผ์ด๋ ์ ์๋๋ก Core๋ด์์ ์์
์ ์ถ๊ฐ๋ก ์ ์ฅํ ์ ์๋ CPU ๊ตฌ์ฑ์์๊ฐ ๋ฐ๋ก Thread์ด๋ค.
system ํจ์ : ๋ช ๋ น์ด ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํธ์ถํ์ฌ ๋งค๊ฐ๋ณ์๋ก ์ ๋ ฅํ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ํจ์
#include <stdlib.h> // ํค๋ํ์ผ stdlib.h ์ ์ ์๋จ
int system(const char *command); // ๋งค๊ฐ๋ณ์๋ก ๋ช
๋ น์ด๋ฅผ ๋ฌธ์์ด ํํ๋ก ์
๋ ฅ๋ฐ์
execl("/bin/sh", "sh", "-c", command, (char *) 0); //์ค์ ๋ก ์คํ๋๋ ํจ์
int execl(const char *path, const char *arg, ... /* (char *) NULL */);execl ํจ์ : ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ํจ์
systemํจ์ ์คํ ์์
- system("ls -li");
- => execl("/bin/sh", "sh", "-c", "ls -li", (char *) 0);
- => /bin/sh -c ls -li ๋ฅผ ์คํํจ
- /bin/sh ์์ ์ด์ฉํด ls -li ๋ช ๋ น์ ์คํํ๋ ๋ช ๋ น์ด์
์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํ์ฌ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ํจ์
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
#define _GNU_SOURCE
#include <sched.h>
long clone(unsigned long flags, void *child_stack, int *ptid, int *ctid, unsigned long newtls);fork๋ process๋ฅผ ๋ณต์ ํ ๋ค์ child process์ pid๋ฅผ pid_t type์ผ๋ก ๋ฐํํ๋ค.
- pid_t : process์ pid๋ฅผ ์ ์ฅํ๋ type
- pid : process๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด process๊ฐ ์์ฑ๋ ๋ ๋ถ์ฌ๋๋ id
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int a = 0;
pid_t pid;
pid = fork();
for (int i = 0; i < 100; i++)
{
sleep(1) ;
printf("PID %d A=%d i=%d : \n", pid, a++, i);
}
}ํ๋ก์ธ์ค๋ฅผ forkํ ๋ค ๊ฐ๊ฐ์ ํ๋ก์ธ์ค์์ for๋ฌธ์ ์ด์ฉํด 1์ด ๊ฐ๊ฒฉ์ผ๋ก a์ 1์ ๋ํด๊ฐ๋ฉด์ fork์ return๊ฐ๊ณผ a, i์ ๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ
์คํ๊ฒฐ๊ณผ
$ a.out
PID 15042 A=0 i=0 :
PID 0 A=0 i=0 :
PID 15042 A=1 i=1 :
PID 0 A=1 i=1 :
PID 15042 A=2 i=2 :
PID 0 A=2 i=2 :
PID 15042 A=3 i=3 :
PID 0 A=3 i=3 :
PID 15042 A=4 i=4 :
PID 0 A=4 i=4 :
PID 15042 A=5 i=5 :
PID 0 A=5 i=5 :
.
.
.
$ a.out &
[1] 15571
$ ps
PID TTY TIME CMD
2078 pts/5 00:00:00 bash
15571 pts/5 00:00:00 a.out
15572 pts/5 00:00:00 a.out
15573 pts/5 00:00:00 ps
$ PID 15572 A=0 i=0 :
PID 0 A=0 i=0 :
PID 15572 A=1 i=1 :
PID 0 A=1 i=1 :
PID 15572 A=2 i=2 :
PID 0 A=2 i=2 :
.
.
.
PID 15572 A=9 i=9 :
PID 0 A=9 i=9 :
PID 15572 A=10 i=10 :
PID 0 A=10 i=10 :
kill -9 15572 # 15572 process kill ๋ช
๋ น
$ PID 15572 A=11 i=11 :
PID 15572 A=12 i=12 :
PID 15572 A=13 i=13 :
PID 15572 A=14 i=14 :
PID 15572 A=15 i=15 :
PID 15572 A=16 i=16 :
.
.
.- fork๋ context ์ ์ฒด๋ฅผ ๋ณต์ ํ๋ฏ๋ก child process์ parent process๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก child process์ parent process์์์ a ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ์์นํ๋ค.
- background๋ก a.out์ ์คํํ์ ๋ ํ process๋ฅผ kill -9 pid ๋ฅผ ์ด์ฉํด ๊ฐ์ ๋ก ์ข ๋ฃํด๋ ์๋ก ๋ค๋ฅธ Memory๋ฅผ ์ฌ์ฉํ๋ ๋ณ๊ฐ์ process์ด๋ฏ๋ก kill๋์ง ์์ ๋ค๋ฅธ process์ ์ํฅ์ ๋ผ์น์ง ์๋๋ค.
- fork ํจ์๋ฅผ ํธ์ถํ process์์๋ ์์ฑ๋ child process์ pid๋ฅผ return ํ๋ค.
- fork๋ก ์์ฑ๋ child process์๋ 0์ return ํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ํ process๋ pid์ ๊ฐ์ ์ถ๋ ฅํ ๋ 0์, ๋ค๋ฅธ ํ๋๋ 0์ด ์๋ ๊ฐ์ ์ถ๋ ฅํ๋๋ฐ 0์ ์ถ๋ ฅํ๋ process๋ child process์ด๋ฉฐ ๋ค๋ฅธ ๊ฐ์ ์ถ๋ ฅํ๋ process๋ parent process์ด๋ค.
fork์ return๊ฐ์ด child process์์ 0, parent process์์ child process์ pid๋ผ๋ ์ ์ ์ด์ฉํด ์๋ก ๋ค๋ฅธ ์์ ์ ๋ถ์ฌํ ์ ์๋ค.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int a = 0;
pid_t pid ,pid2;
pid = fork();
for (int i = 0; i < 100; i++)
{
sleep(1);
if (pid == 0) // child processs๋ a๋ฅผ ์ฆ๊ฐ์ํค๊ณ
printf("PID %d : A=%d : i=%d : \n", pid, a++, i);
else // parent process๋ a๋ฅผ ๊ฐ์์ํด
printf("PID %d : A=%d : i=%d : \n", pid, a--, i);
}
}์คํ๊ฒฐ๊ณผ
$ a.out
PID 19616 : A=0 : i=0 :
PID 0 : A=0 : i=0 :
PID 19616 : A=-1 : i=1 :
PID 0 : A=1 : i=1 :
PID 19616 : A=-2 : i=2 :
PID 0 : A=2 : i=2 :
PID 19616 : A=-3 : i=3 :
PID 0 : A=3 : i=3 :
PID 19616 : A=-4 : i=4 :
PID 0 : A=4 : i=4 :
.
.
.#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int a = 0;
pid_t pid ,pid2;
pid = fork();
pid2 = fork();
for (int i = 0; i < 100; i++)
{
sleep(1);
printf("PID %d : PID2 %d : A=%d : i=%d : \n", pid, pid2, a++, i);
}
}Q. fork๋ฅผ ๋ ๋ฒ ํธ์ถํ์ ๋ ์์ฑ๋๋ ํ๋ก์ธ์ค ๊ฐ์๋?
A. ์ต์ด์ ์คํ๋ ํ๋ก์ธ์ค๋ฅผ a๋ผ ๋ถ๋ ์ ๋ ์ฒซ๋ฒ ์งธ fork์์ child process ํ๋ ์์ฑ
์์ฑ๋ child process๋ฅผ b๋ผ๊ณ ํ ๋ ๊ทธ ๋ค์ ์ค์์ a, b ๋ชจ๋ child process๋ฅผ ํ๋์ฉ ๋ fork
๋๊ฐ์ child process๊ฐ ๋ ์์ฑ๋๋ฏ๋ก ์ด ์์ฑ๋๋ ํ๋ก์ธ์ค๋ 4๊ฐ
forktest.c #3 ์คํ๊ฒฐ๊ณผ
$ a.out
PID 19940 : PID2 19941 : A=0 : i=0 : #์ต์ด์ ์คํ๋ ํ๋ก์ธ์ค
PID 19940 : PID2 0 : A=0 : i=0 : #์ต์ด์ ์คํ๋ ํ๋ก์ธ์ค๊ฐ ๋๋ฒ์งธ fork์์ ์์ฑํ child process
PID 0 : PID2 19942 : A=0 : i=0 : #์ฒซ fork์์ ์์ฑ๋ child process
PID 0 : PID2 0 : A=0 : i=0 : #์ฒซ fork์์ ์์ฑ๋ child process๊ฐ ๋๋ฒ์งธ fork์์ ์์ฑํ child process
PID 19940 : PID2 19941 : A=1 : i=1 :
PID 19940 : PID2 0 : A=1 : i=1 :
PID 0 : PID2 19942 : A=1 : i=1 :
PID 0 : PID2 0 : A=1 : i=1 :
PID 19940 : PID2 19941 : A=2 : i=2 :
PID 19940 : PID2 0 : A=2 : i=2 :
PID 0 : PID2 19942 : A=2 : i=2 :
PID 0 : PID2 0 : A=2 : i=2 :
.
.
.
$ a.out &
[1] 22114
$ ps
PID TTY TIME CMD
2078 pts/5 00:00:00 bash
22114 pts/5 00:00:00 a.out
22115 pts/5 00:00:00 a.out
22116 pts/5 00:00:00 a.out
22117 pts/5 00:00:00 a.out
22122 pts/5 00:00:00 ps- thread.h (C11)
#include <threads.h>
#include <stdio.h>
int run(void *arg)
{
printf("Hello world of C11 threads.");
return 0;
}
int main(int argc, const char *argv[])
{
thrd_t thread;
int result;
thrd_create(&thread, run, NULL);
thrd_join(&thread, &result);
printf("Thread return %d at the end\n", result);
}- pthread.h (POSIX)
- linux์์ ์ฌ์ฉํ๋ ํ์ค์ผ๋ก ์ค์ ์ฝ๋ฉ ์ค์ต ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
#include <pthread.h>
#include <stdio.h>
void *run (void *arg)
{
printf("Hello world of POSXI threads.");
return 0;
}
int main()
{
pthread_t thread;
int result;
pthread_create(&thread, NULL, run, NULL );
pthread_join(thread, &result);
printf("Thread return %d at the end\n", result);
}- pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);์์ฑ ํจ์ start_routine์ ์คํ
- pthread_exit
void pthread_exit(void *retval);pthread_exit๋ฅผ ํธ์ถํ thread๊ฐ ์ข
๋ฃ๋จ
main thread๊ฐ ์ด ํจ์๋ก ์ข
๋ฃ๋์ด๋ ๋ค๋ฅธ thread๋ค์ ๋์ํ๋ค.
- pthread_join
int pthread_join(pthread_t thread, void **retval);๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง thread๊ฐ ์ข
๋ฃ๋ ๋๊น์ง wait ํ๋ ํจ์
Synchronization์ ์ํด ์ฌ์ฉํ๋ค.
๋ง์ฝ thread๊ฐ ์ด๋ฏธ ์ข
๋ฃ๋์๋ค๋ฉด ์ฆ์ ๋ฆฌํดํ๋ค.
- pthread_canel
void pthread_cancel(pthread_t thread);thread์ ์ทจ์ ์์ฒญ์ ๋ณด๋
- pthread_self
pthread_t pthread_self(void);pthread_self๋ฅผ ํธ์ถํ thread์ id๋ฅผ return
- pthread_equal
int pthread_equal(pthread_t t1, pthread_t t2);t1, t2์ thread id๋ฅผ ๋น๊ตํ๋ค.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
int bbb = 0;
void fn_s()
{
static int a = 0;
printf("== %d %d ==\n",a++, bbb++);
}
void *run (void *arg)
{
printf("Hello world of POSXI threads.%d\n", (int) pthread_self() );
for (int i = 0; i < 100; i++)
{
sleep(1);
fn_s();
}
return 0;
}
int main()
{
pthread_t thread1;
int result1;
pthread_create(&thread1, NULL, run, NULL );
run((void *) 0);
pthread_join(thread1, (void **) &result1);
printf("Thread return %d at the end\n", result1);
}์ค์ต์์ ๋ฒํผ์์ flush๋์ง ์์์ ์ถ๋ ฅ์ด ๋์ค์ง ์๋ ๋ฌธ์ ๋ฅผ printf๋ฌธ์ ์ค๋ฐ๊ฟ ๋ฌธ์๋ฅผ ์ฝ์ ํด ํด๊ฒฐ
์คํ๊ฒฐ๊ณผ
$ a.out
Hello world of POSXI threads.-1262057664
Hello world of POSXI threads.-1270536448
== 0 0 ==
== 1 1 ==
== 2 2 ==
== 3 3 ==
== 4 4 ==
== 5 5 ==
== 6 6 ==
== 7 7 ==
== 8 8 ==
== 9 9 ==
.
.
.thread๋ผ๋ฆฌ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ a์ ๊ฐ์ด ๊ณต์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
~/.vimrc : vim์ ์คํํ ๋ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ ์ฅํ๋ ํ์ผ
vim command
- set tabstop=(num) : tab์ ์ ๋ ฅํ์ ๋ ์ด๋ํ ์นธ์ ๊ฐฏ์
-
์ปดํจํฐ ์ฐ์ ํ์ฌ DIGITAL
- DIGITAL์ ์ญ์ฌ ์์ฝ
DIGITAL -> DEC๋ก ๊ฐ๋ช -> DIGITAL๋ก ๋ค์ ๊ฐ๋ช -> Compaq์ ์ธ์๋จ -> HP์ Compaq์ด ์ธ์๋จ (DIGITAL์ legacy๋ HP์ ์๋ค๊ณ ํ ์ ์๋ค.)
- C์ธ์ด์ ํ์
- DIGITAL๋ ๋ฏธ๋ ์ปดํจํฐ PDP ์๋ฆฌ์ฆ๋ฅผ ๊ฐ๋ฐํ์๋ค. ๊ทธ ์ค PDP-11์ ๋งค์ฐ ๋์ค์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ์ ํ
- PDP-11์ด ๋ง์ด ์ฌ์ฉ๋๋ ์์ PDP-11์ ์ ์ดํ๊ธฐ ์ํ ์ธ์ด๋ก C์ธ์ด๊ฐ Bell Labs์์ ํ์ํ๋ค.
- UNIX
- AT&T ์ฐํ์ Bell Labs์์ ๊ฐ๋ฐ๋ ์ด์์ฒด์ ๋ก PDP-11์์๋ ์ฌ์ฉํ๋ ์ด์์ฒด์ ์ด๋ค.
- C์ธ์ด๊ฐ ํ์ํ ๋ค์ C๋ก ์์ฑ๋ UNIX์ ์์ค ์ฝ๋๊ฐ ๋ฐฐํฌ๋จ
- UNIX์ ์์ฉํ
- AT&T์ ๊ท๋ชจ๊ฐ ์ปค์ ธ์ ๋ ์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ฌ๊ฐ ๋ถํ ๋จ
- ๋์ ๋ฒ๊ธฐ์ํด UNIX์ ์ํ๋ฅผ ๋ฑ๋กํ๊ณ ์์ค์ฝ๋๋ฅผ ๋ซ์
- UNIX๊ณ์ด OS๋ค์ ํ์
- UNIX๊ฐ ์์ฉํ ๋์ด ๋์ฒด์ ๊ฐ ํ์ํ๊ฒ ๋์์
- BSD
- UC Berkeley์์ ๊ฐ๋ฐํ UNIX๊ณ์ด OS
- Berkeley Software Distribution์ ์ฝ์
- IOS, macOS๋ฑ์ OS์ ๊ธฐ๋ฐ
- Linux
- Linus Torvalds๊ฐ ๊ฐ๋ฐํ kernel
- Linux๋ผ๋ ์ด๋ฆ์ Linux is not Unix์ ์ฝ์
- GNU project์ ํฌํจ๋๊ฒ ๋๋ค.
- GNU
- Richard Stallman์ ์์ ์ํํธ์จ์ด ์ฌ๋จ์ OS ํ๋ก์ ํธ
- GNU is not UNIX์ ์ฝ์
- POSIXํ์ค์ ํ์
- UNIX์ API ๊ท๊ฒฉ
- UNIX๊ณ์ด์ ์ฌ๋ฌ OS๋ค์ด ๋ชจ๋ ๊ท๊ฒฉ์ด ์๋ก ๋ฌ๋ผ์ก์
- ์ด๋ฅผ ํต์ผํ๊ธฐ ์ํด IEEE์์ ๋ง๋ ํ์ค์ด POSIX
- UNIX๊ณ์ด OS๊ฐ ๋๋ฆฌ ์ฐ์ด๊ฒ ๋ ์ด์
- FIPS
- ์ฐ๋ฐฉ์ ๋ถ์ ์ปดํจํฐ ๋ฉํ ํ์ค์ธ๋ฐ POSIX๋ฅผ ์ฌ์ฉ
- ์ฆ UNIX๊ณ์ด OS๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด FIPS๋ฅผ ๋ฐ๋ฅด์ง ๋ชปํจ
- FIPS
- ํ์ฌ ํ์คํ๋ ISO์์ ํ๋ค. ๊ทธ ์ค ISO/IEC JTC 1/SC 22๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ์ค์ ๊ฐ๋ฐํ๋ ๊ธฐ๊ตฌ.
- ๋ํ์ ์ผ๋ก ๊ฐ๋ฐ๋ ํ์ค : C, C++
Q. ์ ๋ฒ ๋ง์ง๋ง ์ค์ต์์ a.out ์คํ ์ ์ถ๋ ฅ์ด ์๋๊ณ ์๋ ์ด์
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, ์ค๋ฐ๊ฟ ๋ฌธ์๊ฐ ์์ด์ ๋ฒํผ์์ flush ๋์ง ์์์
- Terminal == Character Device
- Character Device : ํ ๋ฌธ์ ์ฉ IO๋ฅผ ์ํํ๋ IO Device
- ์ถ๋ ฅ์ ํด์ผํ ๋ cpu๊ฐ ํ๋ฌธ์์ฉ ํฐ๋ฏธ๋์ ์ถ๋ ฅ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ (CPU speed >> IO speed)
- ๊ทธ๋ฌ๋ฏ๋ก ์๋๊ฐ ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒํผ์ ์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋๊ณ ํน์ ๋ฐฉ์์ ๋ฐ๋ผ ํ๋ฒ์ ์ถ๋ ฅํ์ฌ CPU๊ฐ IO๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด Buuffer๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์
- Character Device : ํ ๋ฌธ์ ์ฉ IO๋ฅผ ์ํํ๋ IO Device
- FULL BUFFERING
- Buffer๊ฐ ๊ฝ ์ฐผ์ ๋ IO๋ฅผ ์ํํ๋ Buffering ๋ฐฉ์
- LINE BUFFERING
- ์ค๋ฐ๊ฟ ๋ฌธ์๊ฐ ์ ๋ ฅ๋๋ฉด IO๋ฅผ ์ํํ๋ Buffering ๋ฐฉ์
- NULL BUFFERING
- Buffer๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ์. Buffer์ ์ ์ฅ๋์ง ์๊ณ ๋ฐ๋ก๋ฐ๋ก Character by Character๋ก ์ถ๋ ฅ ๋จ. Buffer size๊ฐ 0์ธ๊ฒ๊ณผ ๊ฐ์
-
stdbuf
- ํ์ค ์คํธ๋ฆผ์ ๋ํด ์์ ๋ ๋ฒํผ๋ง ์์ ์ผ๋ก COMMAND๋ฅผ ์คํํ๋ bash๋ช ๋ น์ด
$ stdbuf --output=0 a.out # stdout์ NULL BUFFERING์ ์ ์ฉํ์ฌ ์คํ -
setvbuf
- buffer๋ฅผ ์ค์ ํ๋ C์ธ์ด ํจ์
#include <stdio.h> int setvbuf(FILE *stream, char *buf, int mode, size_t size);
- mode : Buffer ์๋๋ฐฉ์ ์
๋ ฅ
- _IONBF : NULL BUFFERING
- _IOLBF : LINE BUFFERING
- _IOFBF : FULL BUFFERING
์ฌ์ฉ ์์
int main() { char bufff[10]; setvbuf(stdout, bufff, _IOFBF, 10);
์์์์ setvbufํจ์๋ก stdout์ ๋ฒํผ๋ฅผ 10๋ฐ์ดํธ ํฌ๊ธฐ์ FULL BUFFERING ๋ชจ๋ ๋ฒํผ๋ก ๋ณ๊ฒฝํ๋ค.
-
fflush
- flush a stream : ๊ฐ์ ๋ก flushํ๋ ๋ช ๋ น์ด
์ ์
#include <stdio.h>
int fflush(FILE *stream);stream์ผ๋ก ์ ๋ ฅ๋ ๋ฒํผ๋ฅผ flush ์ํจ๋ค.
์ฌ์ฉ ์์
void fn_s()
{
static int a = 0;
printf("== %d %d ==",a++, bbb++);
fflush();
}๊ธฐ์กด์ ํ๋ก๊ทธ๋จ์ด ๋๋ ๋๊น์ง ์ถ๋ ฅ์ด ๋์ง ์๋ ๊ฒ์ด fflush ํจ์๋ฅผ ๋ง๋ ๋๋ง๋ค ์ถ๋ ฅ์ด ๋๋๋ก ๋ณํจ.
์ ์ถ๋ ฅ ํ ๋ ์ ์ถ๋ ฅ ์์์ ์ ๋ง์ถ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ผ๋ ์ ๋ง์ถฐ์ผ ํ๋ค.
thread ๋ผ๋ฆฌ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋๋ฐ ์ฌ๋ฌ thread๊ฐ ํ๋์ ์ ๋ณด๋ฅผ ์์ ํ๋ ค ํ ๋ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์
์ด ๋ thread ๋ค์ ๋ช ๋ น ์ํ ์์ ์ ์กฐ์ ํ์ฌ ์ ๋ณด์ ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ ๋๊ธฐํ๋ผ ํ๋ค.
- Asynchronous Execution
- ๋น๋๊ธฐ์ ์คํ : ๋๊ธฐํ ์์ด ์คํํ๋ ๊ฒ์ ์๋ฏธ
๋๊ธฐํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ์๋จ ์ค ํ๋๋ก ํ ์ค๋ ๋๊ฐ ์์์ ์ฌ์ฉํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ๋ชปํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.(=mutual exclusion)
- 'mut'ual 'ex'clusion -> mutex
Mutex์ ํ์ฉ
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // pthread_mutex_t ์ด๊ธฐํ
pthread_mutex_lock(&mutex); // mutex๋ฅผ ํ๋ && mutex๋ฅผ ํ๋ํ์ง ๋ชปํ๊ฒ lock์ ๊ฑธ์
count++;
pthread_mutex_unlock(&mutex); // mutex์ lock์ ํ์์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋์์ ํ๋์ ์ค๋ ๋๋ง count์ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ก ํ ์ ์๋ค.












