Skip to content

nayong2021/PracticalCoding

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

53 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์‹ค์ „์ฝ”๋”ฉ 2 ์‹ค์Šต

sshid : pcc011

name : ๋‚˜์šฉ์„ฑ

id : 201720707

Lecture 1

linux command

  • mkdir : ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ช…๋ น์–ด
  • cd : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด
  • ls : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด
    • ls ๋ช…๋ น์–ด์˜ ์˜ต์…˜
    • -l : ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์ƒ์„ธํžˆ ๋ณด์—ฌ์คŒ
    • -a : ์ˆจ๊ฒจ์ง„ ํŒŒ์ผ๊นŒ์ง€ ๋ณด์—ฌ์คŒ
  • cc : ์ปดํŒŒ์ผ ๋ช…๋ น์–ด
  • pwd : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • mv : ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๋ช…๋ น์–ด
  • passwd : ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ช…๋ น์–ด
  • chmod : ํŒŒ์ผ์˜ permission์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด
  • ~ : ์œ ์ €์˜ home ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋กœ ๋Œ€์น˜๋จ
  • ~username : username์˜ ์œ ์ €์˜ home ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋กœ ๋Œ€์น˜๋จ
  • .. : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ
  • . : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ
  • rm : ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๋ช…๋ น์–ด
  • whoami : ์œ ์ €์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • cat : ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • history : ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ช…๋ น์–ด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

vi editor command

vi editor์˜ ์„ธ๊ฐ€์ง€ ๋ชจ๋“œ

  • 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๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋ช…๋ น์–ด

Lecture 2

Computer Hardware System

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด CPU๋Š” Storage devices์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฝ๊ฑฐ๋‚˜ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์—†๊ณ  Input device์—์„œ ์ง์ ‘ ์ž…๋ ฅ๋ฐ›๊ฑฐ๋‚˜ Output device๋กœ ๋ฐ”๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์—†๋‹ค. CPU๋Š” Memory์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Storage devices์˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Storage devices์—์„œ ํŒŒ์ผ์„ Memory๋กœ ์ฝ์–ด์˜จ ๋‹ค์Œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. Input devices์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ฑฐ๋‚˜ Output devices๋กœ ์ถœ๋ ฅ์„ ํ•  ๋•Œ๋„ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ Memory์˜ Input Buffer์— ์ €์žฅ๋œ ๋‹ค์Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ Memory์˜ Output Buffer์— ์ €์žฅํ•œ ๋‹ค์Œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Linux Software

software๋Š” system software์™€ application software๋กœ ๋‚˜๋‰˜๋Š”๋ฐ system software๋Š” hardware์˜ ๋ฐ”๋กœ ์œ— ๋‹จ๊ณ„์— ์œ„์น˜ํ•˜๋ฉฐ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ป๋ฐ๊ธฐ ํ˜•ํƒœ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์‚ฌ์šฉ์ž๋Š” ๊ฐ€์žฅ ์œ—๋‹จ์˜ shell์„ ์‚ฌ์šฉํ•ด system software๋ฅผ ์ด์šฉํ•ด hardware๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. Linux์—ญ์‹œ system software ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

Linux Kernel

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

linux command

  • 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 : ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ ์ž‘๋™์ด ๋‹ฌ๋ผ์ง€๋Š” ๋ช…๋ น์–ด
    • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์„ ๋•Œ : ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ํ•œ ์ค„์”ฉ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์ž…๋ ฅ๋œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅํ•จ
    • ํŒŒ์ผ์˜ ์ด๋ฆ„๋“ค์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ : ์ž…๋ ฅ๋œ ํŒŒ์ผ ์ˆœ์„œ๋Œ€๋กœ ๋‚ด์šฉ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅํ•จ

vi editor command

  • set number : command mode์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ํŒŒ์ผ์˜ ํ…์ŠคํŠธ๋“ค์˜ ํ–‰ ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด
  • /(์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ) : ํŒŒ์ผ ๋‚ด์—์„œ (์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฒƒ)์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„์ฃผ๋Š” ๋ช…๋ น์–ด
  • o : normal mode์—์„œ ํ˜„์žฌ ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ์ค„ ๋ฐ‘์— ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค์„œ์˜ ์œ„์น˜๋ฅผ ์ถ”๊ฐ€๋œ ์ค„๋กœ ์ด๋™์‹œํ‚ค๊ณ  insert mode๋กœ ์ง„์ž…ํ•˜๋Š” ๋ช…๋ น

redirection

  • < ํŒŒ์ผ or 0< ํŒŒ์ผ : ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ stdin์œผ๋กœ ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•  ๋•Œ ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ์ž…๋ ฅ๋ฐ›๋Š” ๋Œ€์‹  ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Œ
  • > file or 1> file : ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ stdout์œผ๋กœ ์ถœ๋ ฅ๋  ๋•Œ ํ„ฐ๋ฏธ๋„๋กœ ์ถœ๋ ฅ๋˜๋Š” ๋Œ€์‹  file๋กœ ์ถœ๋ ฅ๋จ
  • 2> file : stderr๋กœ์˜ ์ถœ๋ ฅ์„ ํ„ฐ๋ฏธ๋„๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋Œ€์‹  file๋กœ ์ถœ๋ ฅ๋จ

Lecture 3

linux command

  • ํ™˜๊ฒฝ๋ณ€์ˆ˜ PATH

    • ์–ด๋А ์œ ์ €๊ฐ€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ linux๋Š” ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ PATH์— ์ €์žฅ๋œ ๊ฒฝ๋กœ์—์„œ ์ฐพ์•„์„œ ์‹คํ–‰ํ•œ๋‹ค. PATH์—๋Š” ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ ๊ฒฝ๋กœ๋Š” ':'๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์•ž์— ์ €์žฅ๋œ ๊ฒฝ๋กœ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’๋‹ค.
  • which : ๋ช…๋ น์–ด์˜ ์œ„์น˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

  • grep : ์ž…๋ ฅ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ํŠน์ • ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ํ–‰์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

  • clear : ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋œ ๋‚ด์šฉ์„ ์ง€์šธ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด

  • tee : stdin์œผ๋กœ์˜ ์ž…๋ ฅ์„ stdout๊ณผ ํŒŒ์ผ๋“ค์— ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

  • date : ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

markdown

  • # : ์ œ๋ชฉ
  • ## : ๋ถ€์ œ๋ชฉ
  • ### : ๋ถ€๋ถ€์ œ๋ชฉ
  • ๋นˆ ์ค„์„ ํ†ตํ•ด ๋ฌธ๋‹จ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ
  • * ๋˜๋Š” - ๋“ฑ์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์ค„ ์•ž์— ์ž…๋ ฅํ•˜์—ฌ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. ๊ณผ ๊ฐ™์ด ์ˆซ์ž๋ฅผ ์ค„ ์•ž์— ์ž…๋ ฅํ•˜์—ฌ ์ค„ ๋ฒˆํ˜ธ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ค„ ๋ฒˆํ˜ธ๋Š” ์ž๋™์œผ๋กœ ๊ณ„์‚ฐ๋˜์–ด ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ 1. ๋กœ ์ž…๋ ฅํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.
  • ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ์™€ ์ค„ ๋ฒˆํ˜ธ๋Š” ํƒญ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•˜์œ„ ๋ฌธ๋‹จ์œผ๋กœ ์ถœ๋ ฅ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ‘์€ ์ˆ˜์—…์—์„œ ์‚ฌ์šฉํ•œ markdown์˜ ์˜ˆ์‹œ

  • ๊ต์ˆ˜๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ์นดํ”ผํ•จ
  • Good Job
  • Hi

์ฃผ์˜
word์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋”ฐ์˜ดํ‘œ์™€ bash์—์„œ ๋ช…๋ น์–ด์— ์‚ฌ์šฉ๋˜๋Š” ๋”ฐ์˜ดํ‘œ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธ์‹๋จ.

  1. ์ผ๋ฒˆ
  2. ์ด๋ฒˆ
  3. ์‚ผ๋ฒˆ
cp ~hwan/.profile  ~hwan/.bashrc  ~hwan/.bash_logout .
source .profile

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ดˆ๋ก์ƒ‰์ด ๋จ

git

  • .gitignore : git์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์„ ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ
  • git clone ์ฃผ์†Œ : ์ฃผ์†Œ์˜ ์ €์žฅ์†Œ๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ช…๋ น์–ด. origin์„ ์œ ์ง€ํ•จ
  • git pull : origin์˜ ์ƒˆ commit์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ช…๋ น์–ด
  • git add : ํŒŒ์ผ์„ staged ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด
  • git commit : ํ˜„์žฌ๊นŒ์ง€์˜ staged๋œ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ commit์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๋ช…๋ น์–ด. commit ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•จ
  • git push : origin ์ €์žฅ์†Œ์— ๋กœ์ปฌ ์ €์žฅ์†Œ์˜ ์ƒˆ commit๋“ค์„ ๋ฐ˜์˜ํ•˜๋Š” ๋ช…๋ น์–ด.

Lecture 4

redirection

here document

0<< end message or << end message : ์ž„์‹œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด stdin์œผ๋กœ ์—ฐ๊ฒฐ. ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ž…๋ ฅํ•œ ๋’ค ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ์ž…๋ ฅํ•œ end message๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํŒŒ์ผ ์ž…๋ ฅ์„ ๋๋‚ด๊ณ  ์ƒ์„ฑ๋œ ์ž„์‹œ ํŒŒ์ผ์„ stdin์˜ ์ž…๋ ฅ์œผ๋กœ redirection ํ•จ.

here string

<<< (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๋˜๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•ด์•ผ ํ•จ

pipe์—์„œ ์‹คํ–‰์˜ ์ˆœ์„œ

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

  • globbing : wildcard๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•œ globํŒจํ„ด์œผ๋กœ ์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ์ด๋ฆ„๋“ค์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ
  • wildcard : ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ๋Ÿฌ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž
      • : ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์— ๋Œ€์น˜๋จ(๋นˆ ๋ฌธ์ž์—ด ํฌํ•จ)
    • ? : ๋ฌธ์ž ํ•˜๋‚˜์™€ ๋Œ€์น˜๋จ
    • [abc] : ๊ด„ํ˜ธ ์•ˆ์˜ ๋ฌธ์ž ์ค‘ ํ•˜๋‚˜๋กœ ๋Œ€์น˜๋จ
    • [a-c] : ๊ด„ํ˜ธ ์•ˆ์— ์ง€์ •๋œ ๋ฌธ์ž์˜ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž ์ค‘ ํ•˜๋‚˜๋กœ ๋Œ€์น˜๋จ

linux command

  • cc๋ช…๋ น -o ์˜ต์…˜ : ์ƒ์„ฑ๋˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜

data type

  • ์ž๋ฃŒํ˜•์€ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋– ํ•œ ์„ฑ์งˆ์„ ๊ฐ–๋Š” ์ž๋ฃŒ์ธ์ง€ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ™์€ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์–ด๋А ์ปดํ“จํ„ฐ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์–ด๋–ค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ƒ์— ๋”ฐ๋ผ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹๊ณผ ํฌ๊ธฐ๋Š” ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ˜„์‹ค์—์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ์ •์ ์ธ ํฌ๊ธฐ์˜ bit๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์‹ค์—์„œ์˜ ๋ฐ์ดํ„ฐ์™€์˜ ์„ฑ์งˆ์—์„œ ์ฐจ์ด๊ฐ€ ์ƒ๊ธด๋‹ค.

    • /usr/include/limits.h์— ์ž๋ฃŒํ˜•๋“ค์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
  • ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜์˜ ์Œ์ˆ˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ•

    • ๋ถ€ํ˜ธ bit + ๊ฐ’
    • 1์˜ ๋ณด์ˆ˜
    • 2์˜ ๋ณด์ˆ˜
  • ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์–ด๋А ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”์ง€๋Š” ์ปดํ“จํ„ฐ, ์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

  • ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜์—์„œ ์ž๋ฃŒํ˜• ์•ž์— ์ˆ˜์‹์–ด๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ singed ์ž๋ฃŒํ˜•์œผ๋กœ ์ทจ๊ธ‰๋˜๋ฉฐ unsigned ์ˆ˜์‹์–ด๋ฅผ ๋ถ™์—ฌ์„œ 0 ์ด์ƒ์˜ ๊ฐ’๋งŒ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์œผ๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

signed, unsigned ์ฐจ์ด์ 

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์ด ๋œ๋‹ค.

vi command

  • yy :๋ณต์‚ฌ
  • p : ๋ถ™์—ฌ๋„ฃ๊ธฐ
  • n๋ช…๋ น์–ด : ๋ช…๋ น์–ด๋ฅผ n๋ฒˆ ๋ฐ˜๋ณต
    • ex) 5yy: ์ฝ”๋“œ 5์ค„ ๋ณต์‚ฌ
    • 5p : ๋ณต์‚ฌ๋œ ์ฝ”๋“œ๋ฅผ 5๋ฒˆ ๋ถ™์—ฌ๋„ฃ๊ธฐ

Lecture 5

cc ๋ช…๋ น์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฌด์—‡์ผ๊นŒ?

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-7

cc๋ช…๋ น์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ํŒŒ์ผ์€ /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์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ์˜ ์•„ํ‚คํ…์ณ์— ๋งž๋Š” ์‹คํ–‰ ํŒŒ์ผ์— ๋งํฌ ๋˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

singed, unsigned ์ฐจ์ด์  #2

####๋ณ€๊ฒฝ๋œ 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๊ฐ€ ์ถœ๋ ฅ๋จ.

hello.c

#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์„ ์ถœ๋ ฅํ•˜๋Š” ์˜ต์…˜

three basic memory in C

  • automatic : ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์ƒ์กดํ•˜๋Š” ๋ณ€์ˆ˜. ์ฒ˜์Œ ์‚ฌ์šฉ๋  ๋•Œ ์ดˆ๊ธฐํ™”๋˜์–ด ์„ ์–ธ๋œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์‚ฌ๋ผ์ง.
  • static : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ƒ์กดํ•˜๋Š” ๋ณ€์ˆ˜. ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘ํ•  ๋•Œ ์ดˆ๊ธฐํ™” ๋˜๋ฉฐ ์„ ์–ธ๋œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ.
  • manual : malloc๊ณผ free๊ฐ€ ํฌํ•จ๋œ ๋ณ€์ˆ˜? array์˜ ํฌ๊ธฐ๊ฐ€ ์„ ์–ธ๋œ ์ดํ›„ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ณ€์ˆ˜๋ผ๊ณ  ํ•จ.

define

#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์ด ๋“ค์–ด๊ฐ„ ๋ชจ์Šต์ด๋‹ค.

const

int const con = 100;
  • ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜.
  • ์„ ์–ธํ•  ๋•Œ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋˜์–ด์•ผ ํ•จ.

Lecture 06

linux command

  • alias : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด์˜ ๋‹จ์ถ• ๋ช…๋ น์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ช…๋ น์–ด
  • !$ : ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์‚ฌ์šฉํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋จ
  • kill : ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด

Pointer / Address

  • &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 ๋ณ€์ˆ˜์ด๊ธด ํ•˜๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋”ฐ๋กœ ํ•˜์ง„ ์•Š์Œ

Lecture 07

int const * vs int * const

fnpointer.c #1

#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 9999

a๊ฐ€ 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์— ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’์€ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

function pointer

fnpointer.c #2

#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

C Compile and Execution

  1. compile ๋ช…๋ น
    • preprocessor directive : #์ด ๋ถ™์€๊ฒƒ๋“ค(#define, #include ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌ
  2. compile user source code : preprocessor๊ฐ€ ๋๋‚œ source code๋กœ assembly code๋ฅผ ๋งŒ๋“ฌ
    • assembly : machine language์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์–ธ์–ด
  3. link assembler : printf, scanf๋“ฑ ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ link์‹œ์ผœ์„œ executable code๋ฅผ ์ƒ์„ฑ
    1. static link : ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฏธ๋ฆฌ ๋‹ค link์‹œํ‚ด
    2. dynamic link : ์‹คํ–‰ ๋„์ค‘์— ํ•„์š”ํ•  ๋•Œ link์‹œํ‚ด
  4. loader : memory๋กœ executable code๋ฅผ load์‹œํ‚ด
  • compile ํ”„๋กœ๊ทธ๋žจ
    • interpreter : ํ•œ๋ฒˆ์— ํ•œ ์ค„์”ฉ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜
      • python์€ interpreter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด
    • compiler : compile ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜
      • c์–ธ์–ด๋Š” compiler๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด

gcc option

  • -g : debugging์„ ์œ„ํ•œ ์˜ต์…˜. ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ฒดํฌ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์‹คํ–‰์†๋„๊ฐ€ ๋А๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— debuggingํ•˜์ง€ ์•Š์„ ๋• ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ.
  • -c : .oํŒŒ์ผ(assembly code)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ต์…˜
  • -E : preprocessing๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ต์…˜
  • -O : optimization ์˜ต์…˜
  • -m32 : 32๋น„ํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ์˜ต์…˜
    • 64๋น„ํŠธ ์ปดํ“จํ„ฐ์—์„œ๋„ --32 ์˜ต์…˜์œผ๋กœ ์ปดํŒŒ์ผ ํ•œ ์‹คํ–‰ํŒŒ์ผ์„ ์ง€์›ํ•จ
  • -m64 : 64๋น„ํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ์˜ต์…˜
    • 32๋น„ํŠธ ์ปดํ“จํ„ฐ์—์„œ๋Š” --64 ์˜ต์…˜์œผ๋กœ ์ปดํŒŒ์ผ ํ•œ ์‹คํ–‰ํŒŒ์ผ์„ ์ง€์› ๋ชปํ•จ

gcc compile - for multiple file

gcc main.c func.c

  1. main.c func.c์˜ preprocessing์ด ์ผ์–ด๋‚จ
    1. main.c์˜ #include <stdio.h>, #include "func.h"๊ฐ€ ์ฒ˜๋ฆฌ๋จ
    2. func.c์˜ #include "func.h"๊ฐ€ ์ฒ˜๋ฆฌ๋จ
  2. preprocessing๋œ main.c, func.c๋ฅผ compileํ•˜์—ฌ assembly code main.o, func.o๊ฐ€ ์ƒ์„ฑ๋จ
  3. linking : main.o์—์„œ ์‚ฌ์šฉํ•˜๋Š” printf, func1์— ๋Œ€ํ•œ linking์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‹คํ–‰ํŒŒ์ผ a.out์ด ์ƒ์„ฑ๋จ
    1. printf : ์‹คํ–‰ํ•  ๋•Œ dynamic linking ๋จ
    2. 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ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ๋‘์—ˆ๋‹ค๋ฉด ์ด๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

C Preprocessor (CPP)

preprocessing๊ณผ์ •์—์„ 

  • include header files
  • define macro
  • conditional compilation
  • line control

์ด ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

Lecture 08

\c์–ธ์–ด์—์„œ include file์„ ํ•  ๋•Œ "" <>์˜ ์ฐจ์ด #if, #ifdef, #ifndef, #elif, #else, #endif

macro definition

#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)๊ฐ€ ๋จ

Order Expansion of Function Macro

  1. Stringification(#) operations
  2. Parameters
  3. Concatenation operations
  4. 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

Special Macro

  • __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

Token stringication #

#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"

Token Concatenation

#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

gcc optimization

์ตœ์ ํ™”์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด

์˜ˆ์‹œ ์ฝ”๋“œ

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์„ ์‚ฌ์šฉํ•  ๋• ๊ด„ํ˜ธ ๋“ฑ์„ ์ ์ ˆํžˆ ์ฃผ์˜ํ•˜์—ฌ ์ž˜ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•จ

linux tip

๋ช…๋ น์–ด๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ–ˆ์„ ๋•Œ

  • ^(์ˆ˜์ • ํ•  ๋ถ€๋ถ„)^(๋Œ€์‹  ์‚ฝ์ž… ๋  ๋ถ€๋ถ„) ์˜ˆ์‹œ
$ 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 ํŒŒ์ผ์„ ์›ํ•˜๋Š” ๊ฒฝ๋กœ์™€ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์˜ต์…˜

CPP processing

  • Character set

    • utf-8 (์œ ๋‹ˆ์ฝ”๋“œ)
  • Initial processing

    1. LF, CR, LF ๋ฌธ์ž(์ค„๋ฐ”๊ฟˆ ์ฝ”๋“œ๋“ค)๋ฅผ CR๋กœ ๋ฐ”๊ฟˆ
    2. if -trigraphs
    3. long line with "\" -> merge
    a = "abc
    de"; //error
    a = "abc\
    de"; // output : a = "abcde";
    1. ๋ชจ๋“  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

Macro Definition tips

  • #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__,

Lecture09

ํ”„๋กœ์ ํŠธ

  • ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ๊ณ ์ •์†Œ์ˆ˜์  ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ

๊ฐœ๋ฐœ ์˜์˜

  • 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๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ป๋Š” ์ด๋“์— ๋น„ํ•ด ๋งค์šฐ ์ ์€ ์˜ค์ฐจ์ด๋‹ค.

๊ณ ์ • ์†Œ์ˆ˜์ ์˜ ํ•ฉ
  1. ๋ถ€๋™ ์†Œ์ˆ˜์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ•ฉํ•œ ํ›„ ๊ณ ์ • ์†Œ์ˆ˜์ ์œผ๋กœ ๋ณ€ํ™˜
    fixed32 fxAdd(fixed32 a, fixed32 b)
    {
            return fromFloat((toFloat(a) + toFloat(b)));
    }
  2. ๋ถ€๋™ ์†Œ์ˆ˜์ ๋ผ๋ฆฌ ๋ฐ”๋กœ ํ•ฉ์‚ฐ
    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

Debugging : ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋ฅผ ์žก๋Š” ๊ฒƒ

  • cc -g ์˜ต์…˜ : debug info๊ฐ€ ํฌํ•จ๋œ ์‹คํ–‰ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜๋Š” ์˜ต์…˜

gdb

gdb : GNU Debugger์˜ ์•ฝ์ž

  • debug info๊ฐ€ ํฌํ•จ๋œ a.out์„ gdb๋กœ debuggingํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰
    • gdb a.out๋กœ ์‹คํ–‰
gdb command
  • 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๊ฐ€ ๊ฑธ๋ฆผ

Lecture10

core dumped

core dumped : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์ค‘์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์ธ core๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ

  • core dumped ๋ฐœ์ƒ ์˜ˆ์‹œ ์ฝ”๋“œ
int main()
{       
        int a = 10/0; // 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” exception์œผ๋กœ ์ธํ•ด core dumped๊ฐ€ ๋ฐœ์ƒ
}

core ๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ์„ค์ • ๋ณ€๊ฒฝ

  • 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) unlimited

gdb (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 ์˜ ๋””๋ฒ„๊น…

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 point

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 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)

floating point๋Š” exponent์˜ ํฌ๊ธฐ๊ฐ€ ํ—ˆ๋ฝํ•˜๋Š” ๋ฒ”์œ„ ๋‚ด์—์„  ์†Œ์ˆ˜์˜ ์œ ํšจ ์ˆซ์ž ๊ฐฏ์ˆ˜๊ฐ€ mantissa๊ฐ€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐฏ์ˆ˜ ์•ˆ์— ๋“ค์–ด์˜ค๋ฉด ๋ชจ๋‘ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ fixed point๋Š” ์ผ์ • ์ž๋ฆฌ ์ดํ•˜์˜ ๊ฐ’์€ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.

fixed FX_S15_16์€ 2 ^ (-17)๊ณผ 2 ^ 16์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์ง€๋งŒ floating point๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

fixed 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)
      => iv = iv_a - iv_b
  • ๊ณฑ์…ˆ
    • 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) => iv = iv_a / (iv_b * 2 ^ q)

Optimization

ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ž‘์—…์„ 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๊ฐ€ ์ตœ๋Œ€ํ•œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•จ
Pipeline

CPU ์—์„œ instruction ํ•˜๋‚˜๋ฅผ ์ฒ˜๋ฆฌํ•  ๋• ์ตœ๋Œ€ ์•„๋ž˜์™€ ๊ฐ™์€ 5๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. Instruction์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  1. Fetch : ์‹คํ–‰ํ•  ๋ช…๋ น์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์–ด์„œ
  2. Decode : ๋ช…๋ น์–ด๋ฅผ ํ•ด๋…ํ•ด ํ•  ์ผ์„ ํŒŒ์•…ํ•˜๊ณ  ๋ช…๋ น์— ํ•„์š”ํ•œ ์ธ์ž๋ฅผ ์ฝ์€ ๋’ค
  3. Execute : ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ณ 
  4. Memory : ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜์—ฌ
  5. Write : ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ๋””.

Pipeline์€ ๊ธฐ์กด์— ํ•œ instruction์—์„œ ๋ชจ๋“  ๋‹จ๊ณ„๊ฐ€ ๋๋‚œ ๋‹ค์Œ์— ๋‹ค์Œ instruction์˜ fetch๊ฐ€ ์‹œ์ž‘๋œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ํ•œ Instruction์˜ fetch๊ฐ€ ๋๋‚˜๊ณ  decode ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค์Œ instruction์˜ fetch๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ if๋ฌธ์— ์˜ํ•ด branch๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋А instruction์ด ๋‹ค์Œ์— ์‹คํ–‰ํ•ด์•ผ ํ•  instruction์ธ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ pipeline์ด ๊นจ์ง€๊ฒŒ ๋˜๊ณ  ์ด๋Š” ์„ฑ๋Šฅ ํ•˜๋ฝ์œผ๋กœ ์ด์–ด์ง.

profiling

ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์„ profiling์ด๋ผ๊ณ  ํ•จ

  • gprof : GNU profiling ๋„๊ตฌ์˜ ์ด๋ฆ„
how to use gprof
  • 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

Additional Optimization tips

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์•ˆํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์•ˆํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค
    • ๋‹จ์ˆœํ™” ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด #define macro๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.
  • profiling์œผ๋กœ ๋‚˜์˜ค๋Š” ์ˆ˜์น˜๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ์ •ํ™•ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
    • ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ(๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค ๋“ฑ)๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ  profiling์„ ํ•ด์•ผ ์ •ํ™•๋„๊ฐ€ ๋†’์•„์ง„๋‹ค.
  • ? ์กฐ๊ฑด๋ฌธ์€ if๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

Q. optimization์„ ํ–ˆ์„ ๋•Œ debugging์ด ๊ฐ€๋Šฅํ• ๊นŒ?

A. optimization์„ ํ•˜๋ฉด ๊ธฐ์กด์˜ ์ฝ”๋“œ์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— debugging์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

Lecture 11

gprof options

  • -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)

r, g, b, a๊ฐ’์„ t_rgba๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

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 ๋ณ€์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ฐ๊ฐ์˜ ์ปฌ๋Ÿฌ๋ผ๋ฆฌ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ 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);
}

Lecture 12

Make (GNU make)

make file์˜ ํ•„์š”์„ฑ

  1. ์†Œ์ŠคํŒŒ์ผ์ด ๋งŽ์•„ ๊ด€๋ฆฌํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•จ
  2. ์—ฌ๋Ÿฌ ์š”์†Œ์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์ง
    • ํƒ€๊ฒŸ์‹œ์Šคํ…œ์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜
    • ์ปดํŒŒ์ผ ๋ชฉ์ ์ด ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜(๋””๋ฒ„๊ทธ, ๋ฆด๋ฆฌ์ฆˆ, ํ”„๋ฆฌํ”„๋กœ์„ธ์„œ...)
    • ํƒ€๊ฒŸ์˜ ๋””ํŽœ๋˜์‹œ์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์ ธ์•ผ ํ•จ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Make๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค.

Make ์‚ฌ์šฉ๋ฒ•

  • Makefile์— ๋‹ค์Œ์˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•จ
    • target์„ ์ž‘์„ฑ(์ฃผ๋กœ ์ƒ์„ฑ๋  ํŒŒ์ผ)
    • target์˜ dependencies๋ฅผ ์ง€์ •ํ•จ
    • target์˜ dependencies๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์„ ์ž‘์„ฑ
  • make ๋ช…๋ น์œผ๋กœ target์„ dependencies๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋Œ๋ฉฐ ์ƒ์„ฑํ•จ
    • ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ Makefile์„ ์ด์šฉํ•ด ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•จ
    • make -f other-makefile : ๋‹ค๋ฅธ Makefile์„ ์ด์šฉํ•ด make ๋ช…๋ น์„ ์‹คํ–‰
  • ํŒŒ์ผ ์ˆ˜์ • time-stamp์— ๋”ฐ๋ผ ์žฌ์ปดํŒŒ์ผํ•จ

Makefile ์ž‘์„ฑ๋ฒ•

target
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
  • Macro ์ •์˜

NAME = string

OBJS = main.o data.o
  • Macro ํ™œ์šฉ

$(NAME)

$(OBJS) # output : main.o data.o

๋‚ด๋ถ€์— ์ •์˜๋œ ๋ณ€์ˆ˜

  • $@ : target name
  • $< : ์ฒซ๋ฒˆ์งธ dependency file์˜ ์ด๋ฆ„
default shell

make ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” default shell์€ /bin/sh ์ด๋‹ค. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋ฉด

SHELL:=/bin/bash b: SHELL:=/bin/bash

๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์˜ˆ์‹œ๋Š” bash๋กœ shell์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

time-stamp ์˜ ๋ณ€๊ฒฝ์— ์˜ํ•œ recompiling

Make๋Š” target์˜ dependency files์˜ time-stamp์˜ modification time์ด ๋ณ€๊ฒฝ๋˜๋ฉด make ๋ช…๋ น์ด ํ˜ธ์ถœ๋์„ ๋•Œ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  target์„ recompile ํ•œ๋‹ค.

touch
  • ์ด์ „์— 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.c

touch ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์ž 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์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

Pre-defined Macro
Suffix Rule

ํŒŒ์ผ์˜ ํ™•์žฅ์ž์— ๋”ฐ๋ผ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ทœ์น™.

  • ๊ฐ€๋ น .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

gccmakedep ๋ช…๋ น์€ Makefile์— ์›ํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ์˜ dependency files๋ฅผ ์ž๋™์œผ๋กœ ์ง€์ •ํ•ด์คŒ

CMake

make๋Š” shell command์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ ธ์„œ project์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๊ฐ€๋Š” ํ˜„๋Œ€์— ์‚ฌ์šฉํ•˜๊ธฐ์— ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„ํŽธํ•œ CMake๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

make vs 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)

CMake ์‹ค์Šต

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

Lecture 13

CPU Code

  • 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) ํ•˜๋‚˜๋Š” ํ•˜๋‚˜์˜ ์ฝ”์–ด์—์„œ ์‹คํ–‰

Linux Job

Shell์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ณ  interactiveํ•˜๊ฒŒ ์‹œ์ž‘๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค. Daemon์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์˜ ํ”„ ๋กœ๊ทธ๋žจ์ด๋‹ค. Job์€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ๋•Œ process๋“ค๋กœ ์ชผ๊ฐœ์ง„๋‹ค.

Daemon

์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ๋ฉด์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜๋ฉด์„œ ํŠน์ • ์š”์ฒญ์ด ์˜ค๋ฉด ์ฆ‰์‹œ ๋Œ€์‘ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์Šค๋„ˆ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

process

์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ํ”„๋กœ๊ทธ๋žจ์ด load๋˜์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์˜ ํ”„๋กœ๊ทธ๋žจ

context switching

  • ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ๋งค์šฐ ๋งŽ์€ process๋“ค์ด load๋˜์–ด ์žˆ๋‹ค(์‹ค์Šต ์„œ๋ฒ„ ๊ธฐ์ค€ 2000~3000๊ฐœ ์ •๋„).
  • ๊ทธ๋Ÿฌ๋‚˜ Processor์˜ ๊ฐœ์ˆ˜๋Š” process์˜ ๊ฐœ์ˆ˜์— ๋น„ํ•ด ๋งค์šฐ ์ ๋‹ค.

๊ฐ๊ฐ์˜ Processor๊ฐ€ Process๋ฅผ ๋‚˜๋ˆ ์„œ ๋‹ด๋‹นํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜์˜ Processor๋Š” ์‹œ๊ฐ„์„ ์ชผ๊ฐœ์„œ ๋Œ์•„๊ฐ€๋ฉด์„œ Process๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์ด๋ฅผ CPU Scheduling์ด๋ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Processor๊ฐ€ CPU Scheduling์— ์˜ํ•ด ์ˆ˜ํ–‰์ค‘์ด๋˜ Process์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ Process๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด CPU๋กœ Process์˜ ์ •๋ณด๋ฅผ load ํ•ด์˜ค๋Š” ๊ณผ์ €์„ context switching ์ด๋ผ ํ•œ๋‹ค.

Process์˜ ์ƒํƒœ

Process์˜ ์ƒํƒœ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ Run, Stop, Kill๋กœ ๋‚˜๋‰จ

  1. Run : Process๊ฐ€ CPU์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ
    1. foreground
    2. background
  2. Stop : Process๊ฐ€ Memory์— load๋˜์—ˆ์œผ๋‚˜ ์‹คํ–‰์ด ๋ฉˆ์ถฐ์žˆ๋Š” ์ƒํƒœ
    • Foreground์—์„œ ์‹คํ–‰์ค‘์ด๋˜ Process๋ฅผ Ctrl + Z ํ‚ค๋ฅผ ํ†ตํ•ด stop ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ.
  3. Kill : Process๊ฐ€ ์ข…๋ฃŒ๋œ ์ƒํƒœ

stop๋œ Process๋ฅผ runํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด

  1. 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๊ฐ€ ์‹คํ–‰๋จ
  2. bg : stop๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ background์—์„œ ์‹คํ–‰
    • ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ์‹คํ–‰ : ๋งˆ์ง€๋ง‰์œผ๋กœ stop๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ background์—์„œ ์‹คํ–‰
    • bg %(job number) : job number์— ํ•ด๋‹นํ•˜๋Š” job์„ background์—์„œ ์‹คํ–‰

linux command

  • jobs : ํ˜„์žฌ ์‰˜์—์„œ stop ์ƒํƒœ์˜ job๊ณผ background์—์„œ ์‹คํ–‰์ค‘์ธ job์˜ ๋ชฉ๋ก์„ job number, ์ƒํƒœ ์™€ ํ•จ๊ป˜ ์ถœ๋ ฅํ•จ

/proc/cpuinfo : cpu ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํŒŒ์ผ

vi command

  • (command mode) ! + ๋ช…๋ น์–ด : vi๋ฅผ stop์‹œํ‚ค๊ณ  ๋ช…๋ น์„ shell์—์„œ ์‹คํ–‰ํ•จ
  • (command mode) r + ํŒŒ์ผ๋ช… : ํŒŒ์ผ์„ ์ฝ์–ด์˜ด
  • (command mode) r + ! + ๋ช…๋ น์–ด : ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์–ด์˜ด
    • ์˜ˆ์‹œ
      • :!ls : vi๋ฅผ stop์‹œํ‚ค๊ณ  ls๋ช…๋ น์„ ์‰˜์—์„œ ์‹คํ–‰ํ•จ
      • :r output.txt : output.txtํŒŒ์ผ์„ ์ฝ์–ด์„œ ํ˜„์žฌ ์ปค์„œ ์œ„์น˜์— ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์‚ฝ์ž…ํ•จ
      • :r!ls : ls๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ถœ๋ ฅ์„ ํ˜„์žฌ ์ปค์„œ ์œ„์น˜์— ์‚ฝ์ž…ํ•จ

Thread

Context switching์ด ์ผ์–ด๋‚˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ

  1. ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•˜๋˜ ์ž‘์—…์˜ ์ •๋ณด๋ฅผ Memory์— ์ €์žฅํ•œ ๋‹ค์Œ
  2. ๋‹ค์Œ์— ์ˆ˜ํ–‰ํ•  ์ž‘์—…์˜ ์ •๋ณด๋ฅผ Memory์—์„œ Core๋กœ ์ฝ์–ด์˜จ ๋‹ค์Œ
  3. ์ฝ์–ด์˜จ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Memory์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ CPU๊ฐ€ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์†๋„์— ๋น„ํ•ด ๋งค์šฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด๋‹ค.
๊ทธ๋ž˜์„œ Core๋‚ด์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์—…์„ ์ €์žฅํ•ด๋†“๊ณ  Core๋‚ด๋ถ€์—์„œ Context Switching์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋„๋ก Core๋‚ด์—์„œ ์ž‘์—…์„ ์ถ”๊ฐ€๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” CPU ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฐ”๋กœ Thread์ด๋‹ค.

System - System Call

system ํ•จ์ˆ˜ : ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜

function system() definition

#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ํ•จ์ˆ˜ ์‹คํ–‰ ์˜ˆ์‹œ

  1. system("ls -li");
  2. => execl("/bin/sh", "sh", "-c", "ls -li", (char *) 0);
  3. => /bin/sh -c ls -li ๋ฅผ ์‹คํ–‰ํ•จ
    • /bin/sh ์‰˜์„ ์ด์šฉํ•ด ls -li ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด์ž„

fork

์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜

#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

forktest.c #1

#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 ๊ฐ’์— ๋”ฐ๋ฅธ ์ž‘์—… ๋ถ€์—ฌ

fork์˜ return๊ฐ’์ด child process์—์„  0, parent process์—์„  child process์˜ pid๋ผ๋Š” ์ ์„ ์ด์šฉํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

forktest.c #2

#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 : 
.
.
.

fork ์—ฐ์† ๋‘๋ฒˆ ํ˜ธ์ถœ

forktest.c #3

#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 vs pthread

  • 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.h API

  • 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๋ฅผ ๋น„๊ตํ•œ๋‹ค.

threadtest.c

#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์˜ ๊ฐ’์ด ๊ณต์œ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Lecture 14

vim tip

~/.vimrc : vim์„ ์‹คํ–‰ํ•  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ €์žฅํ•˜๋Š” ํŒŒ์ผ

vim command

  • set tabstop=(num) : tab์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ด๋™ํ•  ์นธ์˜ ๊ฐฏ์ˆ˜

POSIX์˜ ๊ธฐ์›

  • ์ปดํ“จํ„ฐ ์‚ฐ์—…ํšŒ์‚ฌ 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๋ฅผ ๋”ฐ๋ฅด์ง€ ๋ชปํ•จ
  • ํ˜„์žฌ ํ‘œ์ค€ํ™”๋Š” ISO์—์„œ ํ•œ๋‹ค. ๊ทธ ์ค‘ ISO/IEC JTC 1/SC 22๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ‘œ์ค€์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ธฐ๊ตฌ.
    • ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ํ‘œ์ค€ : C, C++

About Buffer

Q. ์ €๋ฒˆ ๋งˆ์ง€๋ง‰ ์‹ค์Šต์—์„œ a.out ์‹คํ–‰ ์‹œ ์ถœ๋ ฅ์ด ์•ˆ๋˜๊ณ  ์žˆ๋˜ ์ด์œ 

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๊ฐ€ ์—†์–ด์„œ ๋ฒ„ํผ์—์„œ flush ๋˜์ง€ ์•Š์•˜์Œ

Buffer์˜ ๋ชฉ์ 

  • Terminal == Character Device
    • Character Device : ํ•œ ๋ฌธ์ž ์”ฉ IO๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” IO Device
      • ์ถœ๋ ฅ์„ ํ•ด์•ผํ•  ๋•Œ cpu๊ฐ€ ํ•œ๋ฌธ์ž์”ฉ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„ํšจ์œจ์  (CPU speed >> IO speed)
      • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒ„ํผ์— ์ž…์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋†“๊ณ  ํŠน์ • ๋ฐฉ์‹์— ๋”ฐ๋ผ ํ•œ๋ฒˆ์— ์ถœ๋ ฅํ•˜์—ฌ CPU๊ฐ€ IO๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด Buuffer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ 

Buffer ์ž‘๋™๋ฐฉ์‹

  1. FULL BUFFERING
    • Buffer๊ฐ€ ๊ฝ‰ ์ฐผ์„ ๋•Œ IO๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Buffering ๋ฐฉ์‹
  2. LINE BUFFERING
    • ์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด IO๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Buffering ๋ฐฉ์‹
  3. NULL BUFFERING
    • Buffer๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹. Buffer์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ๋ฐ”๋กœ Character by Character๋กœ ์ถœ๋ ฅ ๋จ. Buffer size๊ฐ€ 0์ธ๊ฒƒ๊ณผ ๊ฐ™์Œ

Buffer ์ œ์–ด๋ฐฉ๋ฒ•

  1. stdbuf

    • ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ์ˆ˜์ •๋œ ๋ฒ„ํผ๋ง ์ž‘์—…์œผ๋กœ COMMAND๋ฅผ ์‹คํ–‰ํ•˜๋Š” bash๋ช…๋ น์–ด
    $ stdbuf --output=0 a.out # stdout์— NULL BUFFERING์„ ์ ์šฉํ•˜์—ฌ ์‹คํ–‰ 
  2. setvbuf

    • buffer๋ฅผ ์„ค์ •ํ•˜๋Š” C์–ธ์–ด ํ•จ์ˆ˜
    #include <stdio.h>
    int setvbuf(FILE *stream, char *buf, int mode, size_t size);
    • mode : Buffer ์ž‘๋™๋ฐฉ์‹ ์ž…๋ ฅ
      1. _IONBF : NULL BUFFERING
      2. _IOLBF : LINE BUFFERING
      3. _IOFBF : FULL BUFFERING

    ์‚ฌ์šฉ ์˜ˆ์‹œ

    int main()
    {
        char bufff[10];
        setvbuf(stdout, bufff,  _IOFBF,  10);

    ์˜ˆ์‹œ์—์„  setvbufํ•จ์ˆ˜๋กœ stdout์˜ ๋ฒ„ํผ๋ฅผ 10๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ FULL BUFFERING ๋ชจ๋“œ ๋ฒ„ํผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

  3. 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
    • ๋น„๋™๊ธฐ์  ์‹คํ–‰ : ๋™๊ธฐํ™” ์—†์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

Mutex

๋™๊ธฐํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ ์ค‘ ํ•˜๋‚˜๋กœ ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ชปํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.(=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์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

About

Linux command, advanced C language & various programming tools

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors