시작하기 전에 - 가상화 기술의 종류 돌아보기

 
가상화 기술은 크게 세 가지로 나뉜다. 1) 호스트 가상화, 2) 하이퍼바이저 가상화, 3) 컨테이너 가상화.
호스트 가상화의 경우, 호스트 OS에 설치 프로그램을 받아 실행하는 것으로 게스트 OS를 쓰는 방식을 말한다.
하이퍼 바이저는, Windows에 딸려있는 Hyper-V 같이 하드웨어에 붙어 있는 가상화 기술을 말한다. 
컨테이너는, Docker 같이 각각의 컨테이너로 격리된 공간을 나누고, 호스트 OS의 자원을 공유할 수 있게 한 기술을 말한다.  
이번에 설치하는 Oracle Virtualbox는 이 중에서도 호스트 가상화 기술을 사용한 것이다.
 

[출처] 한빛출판네트워크, 원리부터 이해하는 도커 - 컨테이너, 가상화, 구성요소

 

 호스트 가상화하이퍼바이저 가상화컨테이너 가상화
내용HW에 설치된 호스트 OS 상에 가상화 SW가 설치되고 그 위에 SW 실행을 위한 게스트 OS가 구동되는 방식특정 OS에 의존하지 않고 하드웨어에 직접 설치되는 구조의 가상화 기술

- 전가상화 : H/W를 완전히 가상화 하는 방식(관리용 DOMO통해 게스트OS들의 커널 요청을 번역하여 하드웨어로 전달)

- 반가상화 : 게스트 OS가 하이퍼콜을 요청
애플리케이션을 동작시키는데 필요한 라이브러리 및 종속 리소스를 함께 패키지로 묶어 생성한 호스트 OS상의 논리적인 구역
장점게스트 OS가 HW 리소스에 접근하는 것을 제어하고 동기화하기 때문에 호스트 OS에 제약이 없음오버헤드 비용이 적음,
하드웨어를 직접 관리하여 리소스 관리가 유연함
게스트 OS의 실행에 소요되는 오버헤드가 없어 상대적으로 고속으로 작동

애플리케이션에서 사용하는 미들웨어나 라이브러리의 버전이 상이하여 발생하는 문제를 컨테이너를 통한 격리로 해결
단점호스트 OS와 게스트 OS의 공존으로 필요이상의 CPU, 디스크, 메모리 사용의 오버헤드 발생--
프로그램VMWare Workstation,
Microsoft Virtual Server,
Oracle Virtual Box
VMware ESXi
Microsoft Hyper-V
Citrix XenServe
Docker

 
 

준비 

Oracle Virtualbox 및 Mac OS 이미지를 다운로드한다.
* 가급적 Mac OS 버전을 13 이상으로 까는 걸 추천한다. Redcat 같은 앱은 버전 13 이상이어야 가능..
 
[1] Oracle Virtualbox 프로그램 설치 [바로가기]
[2] Oracle Virtualbox 프로그램 확장팩 설치 [바로가기]
[3] Mac OS 버전 이미지 다운로드
[4] 현재 내 컴퓨터가 가상화 기술을 허용하고 있는지 확인 - 부팅할 때 ESC를 눌러서 세팅화면으로 넘어가서 확인하기 
 
 

가상머신 생성하기

 
[1] [새로만들기] 를 눌러 가상 머신을 만든다.

 
[2] 가상머신의 이름을 작성하고 종류는 Mac OS X, 버전은 Mac OS X (64-bit)
 
* 버전의 경우, 사용하려는 Mac OS 이미지 버전과 맞는 것을 고르는 게 좋다. 그렇지 않으면 제대로 설치가 안 된다. 
* 만약, 처음 [새로 만들기]를 누르는 게 아니라면, ISO 이미지를 여기서 추가해줘도 좋다. 

 
[3] 하드웨어의 기본 메모리를 9000 MB 이상, 프로세서를 2개 이상으로 설정한다.
 
* 실제로 해보면 프로세서 2개도 느렸다. 나는 가상머신 쓸 때 호스트OS로 작업을 안 할 거라, 그냥 4개로 넣어줬다. 

 
[4] 새 하드디스크를 만들어 준다. 파일 형식은 VMDK로 하고 Split into 2GB Parts에 체크를 해준다.

 
 

설정 세팅

 
[1] [시스템] - [마더보드]의 설정을 체크한다.
- 플로피 체크해제
- 칩셋 : ICH9
- 포인팅 장치 : USB 태블릿
- EFI 활성화

 
[2] [시스템]-[프로세서] 에서 PAE/NX 가 활성화 되어있는지 확인

 
[3] [디스플레이]-[화면] 에서 "비디오 메모리"를 128MB로 수정, 그래픽 컨트롤러도 VBoxVGA를 사용한다.

 
[4] [저장소]에서 컨트롤러 SATA의 "호스트 I/O 캐시 사용"에 체크 

 
[5] 아래와 같이 ISO 가 먼저 올 수 있게 SATA 포트를 0으로 설정해 준다.

 
 

CLI에서 스크립트 실행하기

Virtualbox에서 MacOS를 가상화하기 위해서는 CPU ID, DMI 정보, SMC 설정, CPU 프로필 설정을 해야한다. 
 
[1] Windows에서 CMD창을 관리자 권한으로 실행하고, 아래의 코드를 입력해 설정을 시도한다.

cd "C:\Program Files\Oracle\VirtualBox"

VBoxManage.exe modifyvm "macOS" --cpuidset 00000001 000106e5 00100800 0098e3fd bfebfbff
VBoxManage setextradata "macOS" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "imacOS19,1"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "macOS-AA95B1DDAB278B95"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
VBoxManage setextradata "macOS" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1

 
[2] 만약, 부팅 중에 "bdsdxe failed to load boot0001 uefi vbox cd-rom vb1-1a2b3c4d" 에러가 나타난다면 아래를 추가적으로 입력한다. 미리 에러를 막고 싶다면 그냥 [1]에서 같이 입력하는 방법 추천.

VBoxManage.exe modifyvm "macOS" --cpu-profile "Intel Core i7-6700K"

 
 

시작하기

Apple 화면이 뜨면 이제 설치를 해주면 된다. 
 
[1] [시작하기]를 눌러서 실행한다. 

 
Apple 화면이 잘 뜬다면 당신은 이제 80% 성공.

 
 
[2] Mac OS 설치 전에, [유틸리티] - [디스크 유틸리티]에서 [보기] 버튼을 클릭, "모든 장치 보기" 또는 "Show All Devices" 선택
 

 
[3] 왼쪽 사이드 바에서 VBOX HARDDISK Media를 선택 (최상위 디스크 선택), 상단의 "지우기" 버튼 클릭
 
- 이름: Macintosh HD (원하는 이름)
- 포맷: APFS
- 구성: GUID 파티션 맵
- "지우기" 클릭
 

 
[4] 아래와 같이 내가 설치하고자 하는 디스크 상세 정보가 잘 나오면 됨

 
[5] 다시 앞으로 돌아가서 Mac OS 설치를 시작한다. 

Docker 강의를 듣는 중에 리눅스 OS 사용이 필요해서 WSL을 사용하기로 했다.  

 

WSL 이란?

Windows Subsystem for Linux의 줄임말로, 윈도우에서 리눅스를 사용할 수 있게 해주는 서브시스템을 의미한다. 

기존 WSL을 사용하면 윈도우 환경에서도 powershell 등을 통해 linux 명령어를 사용할 수 있게 해주었다. 

WSL2에서는 업데이트된 형태로 하이퍼바이저를 통해 Windows 뿐만 아니라, Linux 또한 사용할 수 있도록 해준다.

* Hypervisor : 다수의 VM을 사용할 수 있도록 연결해주는 소프트웨어  

윈도우에서 WSL를 사용하는 명령어

* 윈도우 10 이상에서만 설치 가능 

wsl --install

 

powershell 또는 cmd 를 관리자 권한으로 열고 위의 명령어를 친 뒤, 재부팅을 해주면 된다.

 

설치를 했는데 오류가 나는 경우 

wsl/callmsi/e_abort

만약에 위와 같은 오류가 나타난다면, 

윈도우 + R 을 누르고 regedit 를 입력한 뒤, 아래와 같이 WslService를 찾아 삭제 후 재부팅 후 재설치를 하면 된다.

  1. Navigate to Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
  2. Look for "WslService" -> Right click on folder icon -> Delete
  3. Restart PC

WSL 실행하기 

윈도우 > WSL 를 검색하면 WSL를 실행할 수 있다. 

 

참고  

https://hirlawldo.tistory.com/137

https://dongle94.github.io/windows/windows-wsl-install/

https://github.com/microsoft/WSL/issues/10764

|  소프트웨어 공학의 필요성

- 소프트웨어 공학이란? 시스템 초기부터 오픈 후 유지/보수까지의 소프트웨어 개발과 관련된 모든 측면을 의미

- 왜 필요한가?

  (1) 비용의 문제 (개발 60% + 테스트 40%) : 계획 없는 개발은 추가 비용을 발생시킨다.

  (2) 시스템 복잡도 향상 : 점차 복잡해지는 시스템 속에서 방향성을 잡는 것이 필요해졌다.

- 소프트웨어의 종류

Generic products 어떤 기능을 수행할지 개발자의 결정에 의해 만들어진 소프트웨어
Customized products 특정 고객의 요구사항에 맞추어 개발되는 소프트웨어

- 좋은 소프트웨어란? 고객에게 필요한 기능과 성능을 제공하는 소프트웨어

  > "높은 다양성과, 믿을 수 있는 소프트웨어"

  > 좋은 소프트웨어가 꼭 가져야하는 특성 : 유지가능성, 신뢰성과 보안, 효율성, 접근가능성(쉽고 단순해야)

 

|  소프트웨어 프로세스 정형화

1. 전통적인 방식 

- 고객/사용자(Client)/플젝 관리자(PM)/개발자

- SI의 방식과 비슷하다.

- 요구사항 > 요구명세 & 요구분석 > 설계 > 구현 > 테스트 > 납품/유지보수

단계 내용
요구사항 고객의 요구 사항 (Pain point + scope + benefit)
요구명세 & 분석 실제 구현을 위한 상세한 기능 분석 

- 요구사항에 대한 구체화를 위한 유도, 분석, 기록
- 기능 레벨, 필요 시스템, 테스트 요구사항,
  외부 시스템과의 연결 요구사항, 제약 사항
설계(Design) 세부적인 구현 레벨의 설계 (절차지향 / 객체지향)

- 객체지향 : Use Case Diagram, Class Diagram, Sequence Diagram

* Use Case는 사용자가 여러명이 있을 때 유용
* Class Diagram은 Class간 관계를 구체화할 때 유용
* Sequence Diagram은 각 Class간 호출 관계 간단히 표현
구현(Implemenation) Project Management로 각 개발 단계 세부화(WBS) 

* 과거에는 MS Project 툴을 사용했다고 한다.
테스트 QA라고도 하며 발생할 수 있는 버그 사항들에 대해 테스트
오픈(Release) 여러 버전의 사전 오픈에서 실제 오픈에 이르기까지

- pre-alpha, alpha, beta, RC(release candidate), official release
유지보수 오픈 후 운영 시 개선이 필요한 사항에 대해 하나씩 개선

1-1. 고전적인 개발 방법론

  폭포수 모델 프로토타입 모델 나선형 모델
내용 순차적인 단계 간단한 프로토타입을 만든 후 수정 작은 단위의 task로 점진적 개발
장점 사전 설계가 세부적일 때 유용 폭포수 보다 요구사항 도출 용이 프로토타입 보다 요구사항 파악 쉬움
위험을 최소화할 수 있음
대규모 시스템에 유리
단점 변화에 유동적이지 않음
일정 산출의 어려움
프로토타입을 완제품으로 오해
프로토타입 제작의 비효율성
개발 시간이 오래 소요
시스템이 복잡해 관리가 어려움
img

* 출처 : 나무위키

* 이미지 출처 : https://m.blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=seilius&logNo=130185596031 

 

 

[ 완벽한 기획이 실제로 가능할까 (더보기) ]

- 고객의 요구사항이 코딩 테스트 문제처럼 세부적일 거란 기대는 하지 않는 게 좋다.

처음부터 개발자를 만족시킬 수 있는 기획이 있을까? 그럼 처음부터 고객을 만족시킬 수 있는 개발물은?

더보기

[ 완벽한 기획이 실제로 가능할까 ]

- 처음부터 개발자를 만족시킬 수 있는 기획이 있을까? 그럼 처음부터 고객을 만족시킬 수 있는 개발물은?

  - 사용자의 요구사항 + 고객의 요구사항 + 디자이너의 요구사항 + 개발자의 요구사항?

- 완벽한 고객의 요구사항이란 존재할 수가 없다.

- 그러니 완벽한 분석 또한 어려운 게 사실이다.

  - 고객의 계속해서 바뀌는 요구사항. 

  - 갑작스런 내외부 변동 사항 (ex. 내부적인 오류, 라이브러리 보안 이슈 등)

- 기획을 무시하기 보다, 

 

2. 오늘날의 개발 방식

- 최신 서비스 특성 : Mobile First, 웹 + 모바일의 서비스 개발, 클라우드 컴퓨팅 기반, 개인정보 보호 강화

- 최신 서비스 개발 Trend :  빠르게 micro 단위로 순차적인 개발을 한다.

   > 새로운 기술, Micro Features

   > 고객 경험을 모니터링 - micro단위로 AB테스트, 고객 로그를 활용

 

2-1. 최신 소프트웨어 업계 개발방식

  방식 내용
제공 환경 다양 반응형 웹, 하이브리드 앱 등
개발 방법론


Agile 고객 중심, 변화에 유연한, 협력적인 개발 문화

- Agile 툴 : Jira
CI 지속적 통합, Continuous Integration.
지속적으로 품질 관리를 적용하는 프로세스를 실행하는 것
 
- CI 툴 : Jenkins
TDD 테스트 주도 개발, Test Driven Development
테스트를 먼저 만들고 테스트를 통과하기 위한 것을 개발한다.
버전 관리 Git, Github  
유지 보수 / 운영 자동화 DevOps 개발팀 + 운영팀이 합쳐진 형태의 새로운 조직

 

Agile이란?

개발과 함께 즉시 피드백을 받아서 유동적으로 개발하는 방법

* 출처 : 나무위키

(1) Agile 선언문

애자일 소프트웨어 개발 선언
우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다.
이 작업을 통해 우리는 다음을 가치 있게 여기게 되었다:

공정과 도구보다 개인과 상호작용
포괄적인 문서보다 작동하는 소프트웨어
계약 협상보다 고객과의 협력
계획을 따르기보다 변화에 대응하기

가치 있게 여긴다.
이 말은, 왼쪽에 있는 것들도 가치가 있지만, 우리는 오른쪽에 있는 것들에 더 높은 가치를 둔다는 것이다.

(2) Scrum 프로세스

* Scrum이란? 순차적이고 점진적인 에자일 방식의 개발 과정

1️⃣ Scrum 팀 구성 및 미팅
2️⃣ Sprint 계획 & 진행
3️⃣ Daily Scrum으로 진척사항/변동사항을 확인 후 공유
4️⃣ Sprint 끝나면 진행한 것 리뷰/반성

출처:https://velog.io/@katanazero86/%EC%95%A0%EC%9E%90%EC%9D%BCagile%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

1️⃣ Scrum 팀 구성 : 일반적으로 10명 안밖으로 구성된다.

👥Product Owner(Manager) + Scrum Master + Senior Development Manager + Developer + .. (10명 가량)

출처:https://www.visual-paradigm.com/scrum/what-is-scrum-team/

2️⃣ Sprint 계획(1달, 2주) & 진행 

- Sprint : Epic(Story) - Tickets(Backlog) - Priorization - Dev Estimation - Test - Release

- Product Backlog 예시 이미지

SprintBacklog예시_출처:https://itwiki.kr/w/%EC%8A%A4%ED%94%84%EB%A6%B0%ED%8A%B8_%EB%B0%B1%EB%A1%9C%EA%B7%B8


3️⃣ Daily Scrum으로 진척사항/변동사항을 확인 후 공유

4️⃣ Sprint 끝나면 진행한 것 리뷰/반성

 

DevOps란?

- 소프트웨어의 개발(Development)과 운영(Operations)의 합성어로 최근에 새롭게 나타난 조직명이다.

- 에자일 방식의 경우 작은 단위로 서비스를 오픈한다.(Micro Feature Release)
- 새로운 기능이 릴리즈될 때 개발팀에서 운영팀에 어떻게 운영할지를 알려주어야 한다.
- 그러나 고전적인 기업 조직 구조에서와 같이 개발팀과 운영팀이 별도로 나뉘어져 있다면, 

- 부서가 분리되어 있으니 개발팀에서 운영팀에 최근 오픈된 서비스 사항을 제대로 공유하지 않게 되는데
- 그러다 특정 서비스를 오픈하다 이슈가 발생해 다운 현상이 일어나면 개발을 한 개발자가 blame을 받게 된다.
- 그러니 운영팀은 기존 서비스를 유지하고 신규 오픈은 막으려 하고, 개발팀도 되도록 신규 서비스 개발은 지양하게 된다.

- 이런 현상이 반복되면 결국 고객의 니즈에 맞춰가지 못하는 서비스가 되어 도태되는 현상 발생

- 역할 : Release System의 자동화, 코드 리뷰 및 테스트 자동화, 서비스 모니터링, 이슈 발생 시 커뮤니케이션 시스템

 

스타트업과 린 스타트업

- [린 스타트업], Eric Ries 

" 승리할 수 있는 유일한 방법은 다른 누구보다 빨리 배우는 것이다 "

- 스타트업이란? 극심한 불확실성 속에서 신규 제품이나 서비스를 만들고자 하는 조직

 

|  정리

✅ 소프트웨어 공학은 소프트웨어 개발 과정 전반에 대한 이론을 말한다. 
✅ 전통적인 소프트웨어 개발 방법론으로는 폭포수, 프로토타입, 나선형이 있다.
✅ 오늘날의 소프트웨어는 (스타트업 기준)애자일 방식을 사용하며, 유지/보수에 관하여는 DevOps조직이 새롭게 생성되었다.
✅ 애자일은 개발 즉시 피드백을 받아 빠르고 유동적으로 개발하는 방법을 말한다.

 

 

[ 참조 및 출처 ]

부트캠프 강의를 들은 후 기타 자료와 함께 정리한 내용입니다.

[Software Engineering] 소프트웨어 공학이란?, 소프트웨어 공학의 필요성, 좋은 소프트웨어의 특성

https://velog.io/@katanazero86/%EC%95%A0%EC%9E%90%EC%9D%BCagile%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

TDD란? https://gmlwjd9405.github.io/2018/06/03/agile-tdd.html

|  파일 시스템 

운영체제가 저장매체에 파일을 쓰기 위한 자료구조 및 알고리즘

1) 파일은 어떻게 만들어진 걸까?

- 0과 1만으로 이루어진 비트 데이터를 그대로 저장하면 관리하기 어렵다.

- 따라서 블록으로 (ex. 4kb) 데이터를 나눠 저장한다. (블록에 고유 번호 부여)

- 블록의 고유 번호도 구분하기 어려우니, 추상적인 객체가 필요하다. (객체 : 파일)

- 그렇게 파일이 만들어졌다.

 

2) 저장 방법

- 가능하면 연속적인 공간에 저장하는 것이 좋지만, 외부 단편화*나 파일 사이즈 변경 문제로 어렵다.

- 그렇기에 자료구조로 연결리스트를 사용한다.

* 외부 단편화 : 총 메모리 공간이 남았으나, 남아있는 공간이 연속적이지 않아서 발생하는 현상

외부단편화,출처:https://code-lab1.tistory.com/54

3) 다양한 파일 시스템

- 인도우는 FAT이라는 자료구조에 블록 위치를 기록

- 리눅스는 inode 방식 - 일종의 인덱스 블록 기법 - 을 사용

* 가장 기본 파일 시스템 방식은 inode이다.

 

|  inode 파일 시스템 구조

수퍼 블록 파일 시스템 정보 (파일 시스템 전반의 메타 데이터)
아이노드 블록 파일 상세 정보 (파일 각각의 메타 데이터)
데이터 블록 실제 데이터

- 파일은 inode 고유값과 자료구조로 주요 정보를 관리한다.

- '파일이름:inode'로 이름과 inode번호를 매칭

- inode를 기반으로 파일에 접근한다. (inode 기반 메타데이터* 저장)

super block
↓ inode ↓ inode
fileA fileB
disk
block
disk
block
disk
block
disk
block
disk
block
disk
block

* inode 메타데이터 : 파일 권한, 소유자 정보, 파일 사이즈....등등등

출처:https://www.science.unitn.it/~fiorella/guidelinux/tlk/node96.html

더보기

ext2_inode 구조

  • i_blocks: 파일이 몇 개의 데이터 블록을 가지고 있는지 나타냄.
  • i_mode: 이 inode가 관리하는 파일의 속성 및 접근 제어 정보 유지
  • i_links_count: 이 inode를 가리키고 있는 파일 수(또는 링크 수)를 의미. (파일 이름 -- inode)
  • i_uid, i_gid: 파일을 생성한 소유자의 userID, groupID 의미.
  • i_atime, i_ctime, imtime: 파일의 접근 시간, 생성 시간, 수정 시간 의미.
  • i_block[15]: 파일에 속한 디스크 블록들의 위치를 관리.

[ 출처 ] https://velog.io/@jinh2352/inode-%EA%B5%AC%EC%A1%B0

 

|  가상 파일 시스템 (VFS)

가상적(virtual) 층으로 다양한 파일시스템에 일관된 방식으로 접근할 수 있게 하는 것

- 원래 EXT2, EXT4, XFS 파일 시스템들에 대해 각각에 맞는 고유 함수를 호출해야하나,

- VFS를 사용하면 open(), read(), write() 와 같은 동일 함수를 사용해 호출할 수 있다.

- 어느 파일 시스템으로 저장되었는지 상관 없이 일관된 인터페이스를 사용해서 파일에 접근 가능

 

|  가상 머신

하나의 하드웨어에 다수의 운영체제를 설치하고 개별 컴퓨터처럼 동작하게 한 것

- 하이퍼바이저, KVM(AWS), VMWare 등이 있다.

 

|  부팅 

- 컴퓨터를 켜서 동작시키는 절차

 

/ 확인하기

1. inode 파일 시스템 방식이 뭔가?

2. 가상 머신에 대해 설명하라

3. 외부 단편화에 대해 설명하라

 

[ 출처 ]

부트 캠프 강의를 듣고 책, 블로그 내용 등을 참조하여 정리하였습니다.

 

[ 참고 ] 

https://blog.naver.com/PostView.naver?blogId=n_cloudplatform&logNo=222481521174&parentCategoryNo=&categoryNo=11&viewDate=&isShowPopularPosts=false&from=postView 

https://hyoje420.tistory.com/53

https://code-lab1.tistory.com/54

|  쓰레드란?

- Light Weight Process

- 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위

출처:위키백과

 

|  프로세스와 쓰레드의 차이점

  프로세스 스레드
차이점 프로세스 간에 독립적이다 프로세스의 서브셋
각각의 프로세스가 독립적인 자원 가짐 프로세스 자원 공유
프로세스 자신만의 주소영역을 가짐 스레드는 주소 영역을 공유한다
IPC 기법으로 통신 가능 별도의 통신 기법이 필요 없다

 

|  스레드 장단점 정리

  내용 추가 설명
장점 성능 향상 멀티 스레드로 병렬 처리
응답성 향상 다수의 사용자의 요청이 오거나,
여러개의 처리와 동시에 요청이 이루어질 때 응답성이 향상
자원 공유 효율 프로세스 내부에서 스레드 간 자원 공유(IPC X)
단점 한 스레드가 프로세스 전체에 영향을 준다 멀티 프로세스의 경우, 하나의 프로세스가 문제가 있어도
다른 프로세스에 영향 주지X
동기화 이슈 동기화 코드를 적절히 추가해야한다.

 

|  스레드 동기화 이슈 이해

동기화(Synchronization) : 작업들 사이에 실행 시기를 맞추는 것

- 여러 개의 스레드가 하나의 자원에 동시에 접근, 수정할 때 동기화 이슈가 발생한다. 

 

|  동기화 이슈 해결 코드 작성 방법

임계 구역에 대한 접근을 막기 위해 Locking 매커니즘이 필요하다

  Mutual exclusion (상호 배제) = Mutex Semaphore (세마포어)
공통점 임계 구역에 대해 Locking(자바는 synchronized)을 걸어 동기화 이슈 해결
차이점 임계 구역에 하나의 스레드만 들어갈 수 있게 한다. 임계 구역에 여러 스레드가 들어갈 수 있게 한다
(Counter를 두어 동시 접근 가능 수 제어)

[ 자바 코드 예시 ]

class Shared { // 공유 자원
 
    // 임계 자원(공유 데이터)
    private static int sharedData = 0; 
 
    // 임계 영역(임계 자원을 사용하는 부분에 동기화 코드 추가)
    public synchronized void count(int n){
        sharedData = sharedDate + n;
    }
}

class Visitor extends Thread { // 공유 자원 방문자
	
    private int n;
    
    Visitor(int n) {
    	this.n = n;
    }
    
    @Override
    public void run(){
        for (int i = 0; i < 100; i++){
            MainThread.shared.count(n);
        }
    }
}

public class MainThread{

    public static Shared sharedData = new Shared();

    public static void main(String[] args) throws Exception{
        
        for (int i = 0; i < 100; i++){
            Visitor visitor = new Visitor(i);
            visitor.start(); // 누가 언제 sharedData를 갱신하는지 모른다.
        }
    }
}

 

|  데드락(교착 상태)과 스타베이션(기아 상태) 개념 이해

  데드락(교착상태) 스타베이션(기아 상태)
의미 무한 대기 상태 우선순위에 따른 자원 미할당 상태
언제? 여러 프로세스가 동일 자원 점유 요청할 때 여러 프로세스가 부족한 자원을 점유하려 경쟁할 때
어디서? 프로세스, 스레드 모두에서 발생 가능 프로세스에서만 발생
어떻게? 두 개 이상의 작업이
상대방의 작업이 끝나는 걸 기다림
특정 프로세스의 우선순위가 낮아
영원히 자원을 할당받지 못하게 됨
비고

내 폰의 어떤 앱이 갑자기 멈춰버렸다.
-> 운영체제가 보통 어느정도 시간이 지나면
    강제 종료시켜 버린다.
기아 상태는 우선순위를 변경하면 해결된다.
- 프로세스 우선순위 수시 변경
- 오래 기다린 프로세스 순위 변경
- 우선순위가 아닌 FIFO 기반 요청큐 사용

출처 - 위키 백과

 

|  확인하기

1. 프로세스 간에 어떻게 통신하는지, 쓰레드와 비교하여 설명하라

2. 프로세스와 쓰레드의 차이점

3. 언제 멀티 프로세스를 사용하고, 언제 쓰레드를 써야하나

4. 쓰레드 동기화란 무엇이며 왜 사용해야 하나

5. 뮤텍스와 세마포어의 차이점에 대해 설명하라

 

[ 출처 ]

부트 캠프 강의를 듣고 책, 블로그 내용 등을 참조하여 정리하였습니다.

 

[참고]

위키백과

https://jhnyang.tistory.com/3

https://donghoson.tistory.com/8?category=799810 

https://brunch.co.kr/@kd4/3

 

+ Recent posts