λͺ©λ‘μ „체 κΈ€ (1005)

😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[λ¦¬λˆ…μŠ€ λ„€νŠΈμ›Œν‚Ή ν”„λ‘œκ·Έλž˜λ°] BSD μ†ŒμΌ“

⭐ 인터넷과 BSD μœ λ‹‰μŠ€ 1983λ…„ UC λ²„ν΄λ¦¬μ—μ„œ μ‚¬μš©ν•˜λŠ” BSD (Berkeley Software Distribution) 에 TCP/IP λ„€νŠΈμ›Œν¬μ˜ κ΅¬ν˜„μ„ λ§‘κ²ΌλŠ”λ°, μœ λ‹‰μŠ€μ— TCP/IP μŠ€νƒ (stack) 이 μΆ”κ°€λ˜μ—ˆμœΌλ©° 톡신을 μœ„ν•΄ μ†ŒμΌ“μ„ 좔가함 BSD μ†ŒμΌ“μ€ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ˜ ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€λ‘œ, 원격 호슀트λ₯Ό μ—°κ²°μ‹œμΌœ μ£ΌλŠ” 맀개체 역할을 μˆ˜ν–‰ν•œλ‹€ λŒ€λΆ€λΆ„μ˜ μœ λ‹‰μŠ€μ˜ TCP/IP λ„€νŠΈμ›Œν¬ μŠ€νƒ (stack) 은 BSD 기반으둜 ν•˜κ³ , μ†ŒμΌ“ μ‹œμŠ€ν…œλ„ μ‚¬μš©ν•œλ‹€ ⭐ BSD μ†ŒμΌ“ μ†ŒμΌ“μ€ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ μƒν˜Έ μ–‘λ°©ν–₯ 톡신 방식 μ†Œν”„νŠΈμ›¨μ–΄λ‘œ μž‘μ„±λœ 톡신 접속점을 λ‚˜νƒ€μΊκ³  λ„€νŠΈμ›Œν¬μƒμ—μ„œ λ‹¨λ§λ“€λΌλ¦¬μ˜ 연결을 μœ„ν•΄ μ‚¬μš©ν•œλ‹€ λ””λ°”μ΄μŠ€ 파일과 λ§ˆμ°¬κ°€μ§€λ‘œ 파일둜 λ‹€λ£° 수 μžˆλ„λ‘ 파일/μ†ŒμΌ“ λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ œκ³΅ν•˜λ©°, 각..

[λ¦¬λˆ…μŠ€ λ„€νŠΈμ›Œν‚Ή ν”„λ‘œκ·Έλž˜λ°] λ„€νŠΈμ›Œν¬μ˜ κ°œμš”

⭐ 인터넷 사물 κ°„μ˜ 톡신을 μœ„ν•΄μ„œλŠ” λ„€νŠΈμ›Œν¬λΌλŠ” κΈ°μˆ μ„ μ‚¬μš©ν•œλ‹€ μΈν„°λ„·μ—μ„œλŠ” TCP/IP ν”„λ‘œν† μ½œμ΄ μ‚¬μš©λ˜λŠ”λ° TCP와 UDP 둜 λ‚˜λ‰œλ‹€ TCPλŠ” 일상 μƒν™œμ˜ 전화와 같이 데이터λ₯Ό μ•ˆλ‚΄μ›μ΄λ‚˜ μ „ν™” κ΅ν™˜κΈ° ν†΅ν•΄μ„œ λ¨Όμ € μ—°κ²°ν•œ ν›„ 톡신 UDPλŠ” 일반 우편과 같이 λΆ„μ‹€ μš°λ €κ°€ μžˆλ‹€ λ„€νŠΈμ›Œν¬μ—μ„œλŠ” 각각의 ν΄λΌμ΄μ–ΈνŠΈλ“€μ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œ IPμ£Όμ†Œμ™€ 도메인 μ£Όμ†Œ, MAC μ£Όμ†Œκ°€ μ‚¬μš©λ˜κ³  μ„œλΉ„μŠ€λ“€μ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œ 포트 λ²ˆν˜Έκ°€ μ‚¬μš©λœλ‹€ μœ λ‹‰μŠ€μ—μ„œλŠ” λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ BSD μ†ŒμΌ“μ„ 이용 μ†ŒμΌ“μ„ μ΄μš©ν•΄μ„œ λ‹¨λ§λΌλ¦¬μ˜ 연결을 μˆ˜λ¦½ν•˜κ³  λ„€νŠΈμ›Œν¬ 톡신을 μˆ˜ν–‰ν•œλ‹€ μ†ŒμΌ“μ€ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ κΈ°λ³Έ λ‹¨μœ„, μœ λ‹‰μŠ€μ—μ„œλŠ” λ‹€λ₯Έ λ””λ°”μ΄μŠ€μ™€ 같이 파일둜 μΈμ‹λœλ‹€ μ›Ή μ„œλΉ„μŠ€λŠ” HTTP와 HTML 을 μ΄μš©ν•˜λ©° HTTPλŠ” μš”μ²­(..

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] μš”μ•½ (ν”„λ‘œμ„ΈμŠ€, μ‹œκ·Έλ„, μŠ€λ ˆλ“œ, λ™μ‹œμ„±)

⭐ ν”„λ‘œμ„ΈμŠ€ 일의 처리 λ‹¨μœ„ ν”„λ‘œμ„ΈμŠ€μ˜ μ€€λΉ„μ—μ„œλΆ€ν„° μ’…λ£ŒκΉŒμ§€μ˜ μ—¬λŸ¬ μƒνƒœλ“€μ„ 가지고 μžˆλ‹€ ν˜„μž¬ μ‹œμŠ€ν…œμ—μ„œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ˜ μƒνƒœλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄μ„œλŠ” ps λͺ…λ Ήμ–΄ μ‚¬μš©ν•œλ‹€ aux μ˜΅μ…˜μ„ μ‚¬μš©ν•΄μ„œ μ‹œμŠ€ν…œμ˜ λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ 정보λ₯Ό 확인할 수 μžˆλ‹€ ⭐ μ‹œκ·Έλ„ ν”„λ‘œμ„ΈμŠ€ 사이에 비동기적인 사건을 μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš© λ¦¬λˆ…μŠ€ μ‹œκ·Έλ„μ— λŒ€ν•œ μž‘μ—… μ‹œκ·Έλ„μ˜ λ°œμƒ, 전달, 처리λ₯Ό μ§€μ›ν•œλ‹€ μ‹œκ·Έλ„ μ²˜λ¦¬μ— μ‹œκ·Έλ„ 마슀크λ₯Ό μ΄μš©ν•΄μ„œ 보닀 λ‹€μ–‘ν•œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€ sigprocmask() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œκ·Έλ„ λ§ˆμŠ€ν¬μ— ν•΄λ‹Ή μ‹œκ·Έλ„μ„ μ„ νƒμ μœΌλ‘œ λΈ”λ‘μ‹œν‚€κ³  ν•΄μ œ ν•œ 번 μ‹œκ·Έλ„ λ§ˆμŠ€ν¬κ°€ μ„€μ •λ˜λ©΄ λ‹€μŒ μ„€μ • λ•ŒκΉŒμ§€ ν˜„μž¬ μ„€μ •λœ 값을 κ·Έλž˜λ„ μ‚¬μš©ν•œλ‹€ μ‹œκ·Έλ„ λ§ˆμŠ€ν¬κ°€ μ‹€ν–‰λ˜λŠ” λ™μ•ˆμ— μ „λ‹¬λœ μ‹œκ·Έλ„μ€ λΈ”λ‘λ˜κ³ , μ‹œκ·Έλ„μ΄ λΈ”λ‘λ˜μ–΄ μžˆλŠ”..

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] POSIX μŠ€λ ˆλ“œμ™€ 동기화

⭐ POSIX μŠ€λ ˆλ“œ μ—¬λŸ¬κ°€μ§€ 일을 λ™μ‹œμ— μ²˜λ¦¬ν•˜κ³  싢은 κ²½μš°μ—λŠ” λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό μ΄μš©ν•œλ‹€ ν”„λ‘œμ„ΈμŠ€λŠ” μžμ‹ λ§Œμ˜ λ©”λͺ¨λ¦¬ 곡간을 가지고 있고, μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“€ λ•Œλ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 λ”°λ‘œ λ§Œλ“€μ–΄μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μƒμ„±ν•˜λŠ” μž‘μ—…μ΄ λ³΅μž‘ν•˜λ‹€ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ—λ„ κ³΅μœ λ˜λŠ” λΆ€λΆ„ 없이 λ³„λ„μ˜ μ˜μ—­μ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 곡간이 λ‚­λΉ„λœλ‹€λŠ” λ¬Έμ œκ°€ μžˆλ‹€ μŠ€λ ˆλ“œ(Thread) λŠ” ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ‚˜λˆ„μ–΄μ§€λŠ” 일의 λ‹¨μœ„λ‘œ 컀널 레벨의 μŠ€λ ˆλ“œμ™€ μœ μ € 레벨의 μŠ€λ ˆλ“œλ‘œ κ΅¬λΆ„λœλ‹€ 일반적으둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μœ μ € 레벨의 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”λ°, μœ μ € 레벨의 μŠ€λ ˆλ“œλŠ” λ©”λͺ¨λ¦¬λ₯Ό λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ κ³΅μœ ν•  수 있기 λ•Œλ¬Έμ— 생성이 λΉ λ₯΄λ©° λ©”λͺ¨λ¦¬μ˜ 낭비도 막을 수 μžˆλ‹€ ν•˜μ§€λ§Œ μŠ€λ ˆλ“œκ°€ λ©”λͺ¨λ¦¬λ₯Ό 잘λͺ» κ±΄λ“œλ¦¬λ©΄ λ©”λͺ¨λ¦¬λ₯Ό 곡..

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (IPC) with POSIX의 IPC (POSIX λ©”μ‹œμ§€ 큐, λ„€μž„λ“œ μ„Έλ§ˆν¬μ–΄)

⭐ POSIX λ©”μ‹œμ§€ 큐 μ‹œμŠ€ν…œ V의 λ©”μ‹œμ§€ 큐와 λ§ˆμ°¬κ°€μ§€λ‘œ POSIX λ©”μ‹œμ§€ 큐λ₯Ό μ‚¬μš©ν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€ 간에 λ©”μ‹œμ§€μ˜ ν˜•νƒœλ‘œ 데이터λ₯Ό 전솑할 수 μžˆλ‹€ μ‹œμŠ€ν…œ V의 ν•¨μˆ˜λ“€μ΄ μ‹œμŠ€ν…œ 콜인 것에 λΉ„ν•΄μ„œ POSIX ν•¨μˆ˜λŠ” 라이브러리 ν˜•νƒœλ‘œ μ œκ³΅λœλ‹€ POSIX 의 λ©”μ‹œμ§€ νλŠ” mqd_t ν˜•μ„ μ΄μš©ν•œλ‹€ λ©”μ‹œμ§€ 큐의 생성과 νšλ“μ„ μœ„ν•΄ mq_open() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€ mq_open() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ mqd_t ν˜•μ„ λ°˜ν™˜λ°›μ€ ν›„ μ΄μš©ν•  수 μžˆλ‹€ λ©”μ‹œμ§€ 큐의 μ†‘μˆ˜μ‹ μ„ μœ„ν•΄ mq_send() 와 mq_receive() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€ ν”„λ‘œμ„ΈμŠ€κ°€ 큐의 μ‚¬μš©μ„ 끝낼 λ•Œ mq_close() ν•¨μˆ˜λ‘œ λ‹«λŠ”λ‹€ λ©”μ‹œμ§€ 큐가 더 이상 ν•„μš” μ—†κ²Œ 된 경우 mq_unlink() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 큐λ₯Ό μ‚­μ œν•œλ‹€ λ©”μ‹œμ§€ 큐의 속성은 mq_get..

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (IPC) with μœ λ‹‰μŠ€ μ‹œμŠ€ν…œ V/XSI (λ©”μ‹œμ§€ 큐, μ„Έλ§ˆν¬μ–΄, 곡유 λ©”λͺ¨λ¦¬)

⭐ μœ λ‹‰μŠ€ μ‹œμŠ€ν…œ V AT&T 벨 μ—°κ΅¬μ†Œμ—μ„œ λ§Œλ“€λ˜ μœ λ‹‰μŠ€ 계열을 톡칭함 ν˜„μž¬ λ¦¬λˆ…μŠ€λŠ” μœ λ‹‰μŠ€ μ‹œμŠ€ν…œ V κ³„μ—΄μ˜ μœ λ‹‰μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” μ‹œμŠ€ν…œ 호좜과 BSD κ³„μ—΄μ˜ μœ λ‹‰μŠ€μ—μ„œ μ œκ³΅ν•˜λ˜ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ λͺ¨λ‘ μ œκ³΅ν•œλ‹€ μ‹œμŠ€ν…œ V의 IPC λŠ” POSIX IPC κ°€ λ“±μž₯ν•œ μ΄ν›„λ‘œ XSI (X System Interface) 둜 뢈리우고 μžˆλ‹€ ꡬ뢄 λ‚΄μš© λ©”μ‹œμ§€ 큐 (Message Queue) λ©”μ‹œμ§€ λ‹¨μœ„λ‘œ I/O λ₯Ό μˆ˜ν–‰ν•˜λŠ”λ°, λ‹€λ₯Έ IPC 와 달리 μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 같은 μ‹œκ°„μ— μ‘΄μž¬ν•  ν•„μš”κ°€ μ—†λ‹€ μ„Έλ§ˆν¬μ–΄ (Semaphore) 데이터 전솑을 λͺ©μ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ IPC κ°€ μ•„λ‹Œ ν”„λ‘œμ„ΈμŠ€ 동기화에 ν•„μš”ν•œ 곡유 λ³€μˆ˜μ™€ 같은 곡유된 λ¦¬μ†ŒμŠ€ μ œν•œμ„ μœ„ν•œ μ„Έλ§ˆν¬μ–΄μ˜ 참쑰와 쑰직을 μœ„ν•΄ λ§Œλ“€μ–΄μ§„ IPC 곡유 λ©”λͺ¨λ¦¬ (Shared..

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 (IPC) with 파일 λ””μŠ€ν¬λ¦½ν„° 기반 (PIPE, FIFO)

⭐ IPC (Inter-Process Communication) ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신을 μœ„ν•œ 기법 β˜‘οΈ 파일 μ‹œμŠ€ν…œ ν”„λ‘œμ„ΈμŠ€ 간에 버퍼 μš©λ„μ˜ μ‚¬μš©ν•  수 μžˆλŠ” νŒŒμΌμ„ μƒμ„±ν•˜κ³ , λ‹€μˆ˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ ν•œ νŒŒμΌμ„ κ²½μœ ν•˜λŠ” λ°©λ²•μœΌλ‘œ νŒŒμΌμ— μž…μΆœλ ₯ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ„œ μ„œλ‘œ 데이터λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€ μš΄μ˜μ²΄μ œμ— 따라 μ“°κΈ° μš©λ„λ‘œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ νŒŒμΌμ„ μ—΄ 수 있기 λ•Œλ¬Έμ—, μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€κ°€ νŒŒμΌμ„ μ΄μš©ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” μ ˆμ°¨κ°€ ν•„μš”ν•˜λ‹€ 파일 μ‹œμŠ€ν…œμ€ μž…μΆœλ ₯ 닀쀑화 μ‹œ 문제 해결이 μ–΄λ ΅λ‹€ 파일 μž…μΆœλ ₯ μ‹œ λΉˆλ²ˆν•œ μ‹œμŠ€ν…œ 호좜이 λ°œμƒν•œλ‹€ ꡬ뢄 λ‚΄μš© 파일 λ””μŠ€ν¬λ¦½ν„° 기반의 IPC νŒŒμ΄ν”„μ™€ FIFO(λ‹¨λ°˜ν–₯), μ†ŒμΌ“(μ–‘λ°©ν–₯) μœ λ‹‰μŠ€ μ‹œμŠ€ν…œμ˜ V의 IPC λ©”μ‹œμ§€ 큐, μ„Έλ§ˆν¬μ–΄, 곡유 λ©”λͺ¨λ¦¬ POSIX의 IPC λ©”μ‹œμ§€ 큐, λ„€μž„λ“œ μ„Έλ§ˆ..

[ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ 닀쀑 처리] ν”„λ‘œμ„ΈμŠ€μ˜ μ’…λ£Œμ™€ 생성, μ’…λ£Œ λŒ€κΈ°

⭐ ν”„λ‘œμ„ΈμŠ€μ˜ μ’…λ£Œ Cμ–Έμ–΄μ˜ main() ν•¨μˆ˜λŠ” int ν˜•μ˜ λ°˜ν™˜κ°’ κ°–λŠ”λ‹€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ˜λ©΄ μ‹€ν–‰ κ²°κ³Όλ₯Ό μš΄μ˜μ²΄μ œμ— λ°˜ν™˜ν•˜κ³  κ·Έ μš΄μ˜μ²΄μ œλŠ” κ·Έ ν”„λ‘œμ„ΈμŠ€κ°€ μ—΄μ—ˆλ˜ (open ν•¨μˆ˜) 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λͺ¨λ‘ λ‹«λŠ”λ‹€ (close ν•¨μˆ˜) ν”„λ‘œμ„ΈμŠ€κ°€ μ°¨μ§€ν•˜κ³  μžˆλ–€ λ©”λͺ¨λ¦¬λ₯Ό κ°€μš© λ©”λͺ¨λ¦¬ ν’€ (pool) 둜 λ°˜ν™˜ν•˜κ²Œ λœλ‹€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ’…λ£Œν•  λ•Œ main() ν•¨μˆ˜μ—μ„œ return 으둜 λ°˜ν™˜ν•˜λŠ” 경우 μžλ™μ μœΌλ‘œ exit() ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€ exit() ν•¨μˆ˜λŠ” 파일 μŠ€νŠΈλ¦Όμ— λŒ€ν•΄μ„œλ„ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰, μ—΄λ € μžˆλŠ” 파일의 μŠ€νŠΈλ¦Όμ— λŒ€ν•΄μ„œλŠ” fclose() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ 버퍼에 남은 데이터λ₯Ό λͺ¨λ‘ 좜λ ₯ (flush) ν•œλ‹€ ⭐ ν”„λ‘œμ„ΈμŠ€μ˜ 생성 λ¦¬λˆ…μŠ€κ°€ 처음 λΆ€νŒ…λ˜λ©΄, λ¦¬λˆ…μŠ€ 컀널이 직접 처음 ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•œ ν›„ λ‹€μŒ..