-
Notifications
You must be signed in to change notification settings - Fork 5
7주차: [ETC] CI/CD란 #54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
KJY97
wants to merge
3
commits into
no-study-no-future:KJY97
Choose a base branch
from
KJY97:cicd
base: KJY97
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,62 @@ | ||
| # CI/CD란 | ||
|
|
||
| ## 요약 | ||
|
|
||
| > 애플리케이션의 개발 단계를 자동화하여 짧은 주기로 고객에게 애플리케이션을 제공하는 방법 | ||
|
|
||
| ## CI/CD가 나온 배경 | ||
|
|
||
| - 모든 개발이 끝난 이후에 코드 품질을 관리하는 고전적 방식의 단점을 해소하기위해 나타난 개념 | ||
| - 분업과 협업의 과정에서 코드의 Merge 과정은 까다롭고, 테스트하는데 큰 자원을 소비되게 된다. 이 문제를 해결하기 위해 도입 | ||
| - 개발 브랜치가 일정 기간 이상 이용되면, 통합의 어려움은 커지고 충돌 해결에 들어가는 시간이 길어지고 오류 발생 위험이 커진다.<br/>이러한 단점을 극복하고자 변동 내용의 반영 빈도를 늘리는 **자동화**가 등장 | ||
|
|
||
| ## CI의 정의 | ||
|
|
||
| - **지속적인 통합(Continuous Integration)** | ||
| - 어플리케이션의 **새로운 코드 변경 사항**이 정기적으로 **빌드 및 자동 테스트** 되어 공유 레포지토리에 **통합(병합)**하는 것 | ||
| - 개발자를 위한 자동화 프로세스(여러명의 개발자간의 코드 충돌을 방지하기 위한 목적) | ||
| - 자동화된 테스트에서 **동작을 확인**하고 변경으로 인해 문제가 생기는 부분이 발견되면 CI를 통해 빠르게 수정 가능 | ||
| - 버그를 신속히 찾아 해결하고 소프트웨어 품질 개선, 새로운 업데이트의 검증 및 릴리즈 시간 단축시키는 것이 핵심 목표 | ||
|
|
||
| ### CI를 만드는 데 필요한 4가지 규칙 | ||
|
|
||
| - 모든 소스 코드가 있고 누구나 현재 소스(및 이전 버전)를 얻을 수 있는 단일 장소 유지할 것 | ||
| - 누구나 단일 명령을 사용하여 소스에서 시스템을 빌드할 수 있도록 빌드 프로세스를 자동화 할 것 | ||
|
|
||
| - 단일 명령으로 언제든지 시스템에서 우수한 테스트 모음을 실행할 수 있도록 테스트 자동화할 것 | ||
| - 누구나 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것 | ||
|
|
||
| > 이 중 가장 중요한 것이 **테스팅 자동화**!!<br/>지속적인 통합을 하기 위해서는 무엇보다 이 프로젝트가 완전한 상태임을 보장하기 위해 테스트 코드가 구현되어 있어야만 한다. | ||
|
|
||
| ## CD의 정의 | ||
|
|
||
| - **지속적인 서비스제공(Continuous Delivery)** or **지속적인 배포(Continuous Deployment)** | ||
| - **지속적인 서비스제공(Continuous Delivery)** | ||
| - 공유 레포지토리로 자동으로 Release 하는 것 | ||
| - 운영팀이 보다 빠르고 손쉽게 애플리케이션을 프로덕션으로 배포 가능 (**수동적 배포**) | ||
| - 프로덕션 환경으로 배포할 준비가 되어 있는 **코드베이스를 확보**하는 것이 목표 | ||
| - **지속적인 배포(Continuous Deployment)** | ||
| - 프로덱션 레벨까지 자동으로 deploy 하는 것 | ||
| - 애플리케이션을 프로덕션으로 릴리스하는 작업을 **자동화** | ||
| - 개발자가 애플리케이션에 변경 사항을 작성한 후 몇 분 이내에 애플리케이션을 **자동으로 실행**할 수 있는 것을 의미 | ||
| - 간단히 말하면 **배포 자동화 과정** | ||
| - 서버가 많을 경우 개발자가 일일이 배포를 진행하지 않아도 되므로, 리소스가 낭비되지 않는다. | ||
|
|
||
|  | ||
|
|
||
| ## CI/CD 종류 | ||
|
|
||
| - Jenkins | ||
| - CircleCI | ||
| - TravisCI | ||
| - Github Actions | ||
|
|
||
| 등.. | ||
|
|
||
| ## 참고 | ||
|
|
||
| - https://www.youtube.com/watch?v=0Emq5FypiMM&t=10s | ||
|
|
||
| - https://www.redhat.com/ko/topics/devops/what-is-ci-cd | ||
| - https://devuna.tistory.com/56 | ||
| - https://www.martinfowler.com/articles/originalContinuousIntegration.html | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,156 @@ | ||
| # 프로그램, 프로세스, 스레드 | ||
|
|
||
| > - 프로그램이란 특정 작업을 수행하기 위한 실행파일이다. 실행파일을 클릭했을 때 메모리 할당이 이루어지고, 이 메모리공간으로 코드가 올라간다. 이 순간부터 프로세스이다. | ||
| > - 프로세스는 OS로부터 자원을 할당받는 실행되고 있는 프로그램의 인스턴스이다. 각각 독립된 메모리 영역(Code, Data, Stack, Heap 구조) 등을 할당받는다. | ||
| > - 스레드는 프로세스의 가장 작은 실행단위로, 프로세스가 할당받은 자원을 이용한다. 프로세스 내에서 각각 stack과 PC 레지스터만 따로 할당받고 Code, Data, Heap 영역은 프로세스 내에 쓰레드끼리 공유하면서 실행된다. | ||
| > - 스레드를 사용하면 응답시간 단축, 빠른 통신과 비용적음, 빠른 문맥 교환, 시스템 처리량을 향상시킬 수 있지만, 스레드의 자원 공유는 동기화 문제에 신경을 써야하며 멀티스레드 프로그래밍은 구현과 디버깅이 어렵다는 문제점이 있다. | ||
|
|
||
| ## 프로그램(Programe)이란? | ||
|
|
||
| - **특정 작업을 수행하기 위해** 작성된 일련의 지침을 포함하는 **실행 파일** | ||
|
|
||
| - 컴퓨터의 주 메모리에 저장되지 않고, 디스크 또는 컴퓨터의 **보조 메모리에 저장**된다. | ||
|
|
||
| - 프로그램은 주 메모리에서 읽고 커널에 의해 실행된다 | ||
|
|
||
| ex) chrome.exe (웹 페이지 보기), notepad.exe (텍스트 파일 편집) | ||
|
|
||
| - **특징** | ||
| - **수동적(정적) 개체(passive entity)**. 실행할 명령어 그룹을 저장.<br/>당장 실행파일을 열어보면 다양한 명령어가 적혀있는 것을 알 수 있다. 이러한 명령어를 그룹으로 모아저 저장하는 것이 프로그램! | ||
| - 수동으로 **삭제할 때까지 메모리에 저장**된다. | ||
| - 프로그램은 **실행 없이 어떤 작업도 수행 불가능.** | ||
|
|
||
| ## 프로세스(Process)란? | ||
|
|
||
| > program is in execution (실행 중인 프로그램) | ||
|
|
||
| - 메모리에 올라와 **실행되고 있는 프로그램의 인스턴스(독립적인 개체)** | ||
|
|
||
| - 프로그램이 실행되는 실행 단위 | ||
|
|
||
| - 프로그램 실행 중에 생성되어 **주 메모리에 load**된다. | ||
|
|
||
| ex) google 크롬 아이콘을 더블 클릭하면 크롬 프로그램을 실행하는 프로세스가 시작된다. | ||
|
|
||
| - **특징** | ||
|
|
||
| - **능동적(동적) 개체(active entity)**. 응용 프로그램의 목적을 수행함 | ||
| - **수명이 매우 제한적**. 작업이 완료되면 종료된다. | ||
| - 프로세스에는 OS로부터 **실행에 필요한 자원을 할당**받는다.<br/>ex) 파일 디스크립터(file descriptors), 네트워크 포트, cpu시간, 메모리 영역(Code, Data, Stack, Heap 구조) | ||
| - 여러 프로세스가 동일한 프로그램과 관련될 수 있다.<br/>ex) 메모장 프로그램의 여러 인스턴스 실행 가능 (각 인스턴스 = 프로세스) | ||
| - 프로세스에 대한 정보는 **PCB(Process Control Block)**에 저장된다. | ||
|
|
||
| ### PCB(Process Control Block) | ||
|
|
||
| > 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조 | ||
|
|
||
| - 사용자가 프로세스를 생성할 때마다 운영체제는 해당 프로세스에 해당하는 PCB를 생성한다. | ||
|
|
||
| - **[PCB]에 저장되는 정보** | ||
|
|
||
| | 이름 | 정의 | | ||
| | -------------------------------------- | ------------------------------------------------------------ | | ||
| | 프로세스 식별자 (Process-Id, PID) | 프로세스 식별 번호 | | ||
| | 프로세스 상태 (Process state) | new, ready, running, waiting, terminated 등의 상태를 저장 | | ||
| | 프로세스 우선순위 (Process Priority) | 수명, 소비한 자원 등으로 우선순위 나눔<br />숫자 값이 작을수록 해당 프로세스의 우선 순위 증가 | | ||
| | 회계정보 (Accounting Information) | 사용된 CPU 양과 시간, 시간 제한, 계정 번호 등 제공 | | ||
| | 프로그램 카운터 (Program Counter, PC) | 프로세스가 다음에 실행할 명령어의 주소 저장 | | ||
| | CPU 레지스터 (CPU Registers) | 인터럽트 발생 or 프로세스 간 문맥 교환 발생 시 임시 정보 저장. | | ||
| | PCB 포인터 (PCB Pointers) | 프로세스 상태가 ready인 다음 PCB 주소 저장 | | ||
| | 열린 파일 목록 (List of Open Files) | 프로그램이 실행되는 동안 필요한 모든 파일 정보 저장 | | ||
| | I/O 상태 정보 (I/O status Information) | 프로세스에 할당된 입출력 장치 목록 저장 | | ||
|
|
||
| ## 프로세스 상태 (Process State) | ||
|
|
||
|  | ||
|
|
||
| - **New** : 프로세스가 생성중인 상태 | ||
|
|
||
| - **Running** : CPU를 잡고 명령어(instruction)를 수행중인 상태 | ||
| - **Ready** : CPU를 기다리는 상태 (다른 조건을 다 만족하고 CPU만 얻으면 되는 상태를 의미) | ||
| - **Blocked(wait, sleep)** : CPU를 주어도 당장 명령어(instruction)을 수행할 수 없는 상태 | ||
| - Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태 | ||
| - ex) 디스크에서 file을 읽어와야 하는 경우 | ||
| - **Terminated** : 수행(execution)이 끝난 상태 | ||
|
|
||
| ## 프로그램과 프로세스 차이점 | ||
|
|
||
| | | 프로그램 | 프로세스 | | ||
| | --------- | ------------------------------------------------ | -------------------------------- | | ||
| | 정의 | 프로그래밍 목표를 달성하기 위해 정렬된 작업 그룹 | 실행 중인 프로그램 | | ||
| | 상주 위치 | 디스크 or 보조 메모리 | 주 메모리 | | ||
| | 개체 유형 | 정적, 수동적 개체(passive entity) | 동적, 능동적 개체(active entity) | | ||
| | 자원 관리 | 명령어 저장을 위한 메모리만 필요 | 리소스 요구사항이 매우 높음 | | ||
| | 수명 | 수명이 길다. (삭제 전까지 저장됨) | 수명이 짧고 매우 제한적 | | ||
|
|
||
|
|
||
|
|
||
| ## 스레드(Thread) | ||
|
|
||
| > 프로세스 내의 실행 흐름 | ||
|
|
||
|  | ||
|
|
||
| - 프로세스의 **실행 가능한 가장 작은 단위** | ||
|
|
||
| - 프로세스는 동시에 실행되는 여러 스레드를 가질 수 있다. | ||
|
|
||
| - 이러한 프로세스를 경량 프로세스(Lightweight Process) 라고도 부른다. | ||
|
|
||
| - **분류** | ||
|
|
||
| | User Threads | Kernal Threads | | ||
| | ----------------------- | --------------------- | | ||
| | 사용자에 의해 구현 | OS에 의해 구현 | | ||
| | 구현이 쉬움 | 구현 복잡 | | ||
| | 종속 스레드로 설계 | 독립 스레드로 설계 | | ||
| | 문맥 교환 시간이 짧음 | 문맥 교환 시간이 길다 | | ||
| | 하드웨어 지원 필요 없음 | 하드웨어 지원 필요 | | ||
|
|
||
| ### 멀티 스레딩 | ||
|
|
||
| **하나의 프로세스를 다수의 실행 단위로 구분**하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 **수행 능력을 향상시키는 것** | ||
|
|
||
| - 즉, 하나의 프로그램에 동시에 여러개의 일을 수행할수 있도록 해주는 것 | ||
| - 하나의 프로세스 내 **메모리와 자원을 공유**한다. | ||
| - 메모리의 **code, data, heap 영역은 공유**하고, **stack과 PC 레지스터는 따로 할당**받는다. | ||
| - **각 스레드는 독립적으로 수행**되어야 하기 때문. | ||
| - **장점** | ||
| - **응답시간 단축** : 여러 스레드로 분할되면 하나의 스레드가 실행을 완료될 때 즉시 출력 반환 가능 | ||
| - **빠른 통신** : 동일한 메모리 영역을 공유해서 여러 쓰레드 간 통신이 원활함 | ||
| - **빠른 문맥 교환** : 프로세스에 비해 캐시 메모리를 비울 필요가 없기 때문. | ||
| - **시스템 처리량 향상** : 각 스레드 기능을 하나의 작업으로 간주하면서 단위 시간당 완료되는 작업 수 증가함 | ||
| - **문제점** | ||
| - **동기화 문제** | ||
| - 공유하는 자원에 동시에 접근하는 경우, 프로세스와 달리 **데이터와 힙 영역**을 공유하기 때문에 어떤 쓰레드가 다른 쓰레드에서 사용중인 변수나 자료 구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 동기화가 필요! | ||
| - 동기화를 통해 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있다. 그러나 불필요한 부분까지 동기화를 하면 과도한 lock으로 인해 병목 현상이 병목 현상이 발생해 성능 저하 가능성 높다. | ||
| - 구현이 어려움 | ||
| - 테스트, 디버깅하기 어려움 | ||
| - 하나의 스레드의 문제가 발생하면 전체 프로세스에 영향을 끼침 | ||
| - 사용 사례 | ||
| - 영상통신 : 영상을 받아 화면에 출력하는 작업과 영상을 생성하여 보여주는 작업이 동시에 발생 | ||
| - 웹 브라우저 : UI를 처리하는 작업과 표시할 데이터를 가져오는 작업이 동시에 발생 | ||
| - 게임 : 그래픽을 실행하는 작업과 UI를 그리는 서버통신을 담당하는 소켓 작업이 동시에 발생 | ||
|
|
||
| ## 프로세스와 스레드 차이점 | ||
|
|
||
| | | 프로세스 | 스레드 | | ||
| | -------------- | ------------------ | -------------------------------------- | | ||
| | 정의 | 프로그램이 실행 중 | 프로세스의 세그먼트 | | ||
| | 프로세스 타입 | 중량 프로세스 | 경량 프로세스 | | ||
| | 종료 시간 | 많은 시간 소요 | 적은 시간 소요 | | ||
| | 생성 시간 | 많은 시간 소요 | 적은 시간 소요 | | ||
| | 문맥 교환 시간 | 많은 시간 소요 | 적은 시간 소요 | | ||
| | 메모리 공유 | 비공유 | 공유. 단, stack과 PC 레지스터는 비공유 | | ||
|
|
||
|
|
||
|
|
||
| ## Reference | ||
|
|
||
| - https://javaconceptoftheday.com/differences-between-program-vs-process-vs-threads/ | ||
| - https://www.guru99.com/program-vs-process-difference.html#3 | ||
| - https://binaryterms.com/process-control-block-pcb.html | ||
| - https://www.geeksforgeeks.org/thread-in-operating-system/?ref=lbp | ||
| - https://www.guru99.com/difference-between-process-and-thread.html | ||
| - https://goodgid.github.io/What-is-Multi-Thread/ | ||
|
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
단일 장소, 단일 명령에 대한 예시는 무엇이 있을까요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
원문에서는 single place, single command 라고 되어있는데요. 구체적인 설명은 없지만 제 생각에는
라고 추측합니다.