# data[].attributes.body
5주차도 제출합니다!!!

# data[].attributes.attachment_link.title
Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.

# data[].attributes.attachment_link.description
A new tool that blends your everyday work apps into one. It’s the all-in-one workspace for you and your team

# data[].attributes.body
https://ff-tb02.tistory.com/97

대박 지각생 5주차 제출합니다 ...

# data[].attributes.attachment_link.readable_text
[ 동기화 ]

프로세스들 사이의 수행 시기를 맞추는 것

시기 1. 실행 순서 제어

: 프로세스를 올바른 순서대로 실행

EX) 워드 프로세스에서 쓰는 과정이 수행되어야 읽는 과정이 수행되는 것

시기 2. 상호 배제

: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근 (동시 사용을 피하기 위해 사용)

EX) 생산자, 소비자 문제
공유자원
EX) 전역 변수, 파일, 입출력장치, 보조기억장치 ... 등등
임계 구역
공유자원 중에서 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
레이스 컨디션
잘못된 실행으로 인해 여러 프로세스가 동시에 임계 구역 코드를 실행해 발생하는 문제

데이터 일관성이 깨지는 문제 발생
상호배제를 위한 동기화
(1) 상호배제

프로세스가 임계 구역에 진입했다면 다른 프로세스는 임꼐 구역에 들어올 수 없음

(2) 진행

임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 함

(3) 유한 대기

한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가 임계구역에 들어올 수 있어야 함

(=임계 구역에 들어오기 위해 무한정 대기하면 안됨)

동기화를 위한 도구 1 - [ 뮤텍스 락 ]

동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구 ( =상호배제를 위한 동기화 도구 )
바쁜 대기
임계구역이 잠겨 있으면 프로세스는 반복적으로 lock를 확인

옷가게 탈의실에서 사람이 있을 때자물쇠를걸고, 사람이 없으면 자물쇠를푸는기능

자물쇠: 전역변수 lock

임계구역 잠그는 역할: acquire 함수

프로세스가 임계 구역에 진입하기 전에 호출하는 함수.

임계 구역이 잠겨 있으면 열릴 때까지(lock이 false가 될 때까지) 임계구역을 반복적으로 확인하고, 임계 구역이 열려 있으면 임계 구역을 잠그는(lock을 true로 바꾸는) 함수

임계구역 잠금 해제 역할: release 함수

임계 구역에서의 작업이 끝나고 호출하는 함수.

현재 잠긴 임계 구역을 열어주는(lock을 false로 바꾸는) 함수

=> 락을 획득할 수 없다면 무작정 대기 / 락을 획득할 수 있다면 임계 구역을 잠그고 임계 구역에서 작업 진행 / 임계 구역에서 나올 땐 임계 구역 잠금 해제 -> 무한정 반복하며 확인하므로 CPU 주기 낭비

동기화를 위한 도구 2 - [ 세마포 ]

뮤텍스 락과 비슷하지만, 좀 더 일반화된 방식

뮤텍스 락은 탈의실이 하나 있는 경우를 가정하지만, 세마포는 탈의실이 여러 개여도 적용이 가능

: 공유 자원이 여러 개 있는 상황도 OK

종류

1. 이진 세마포 (binary semaphore)

2. 카운팅 세마포 (counting semaphore)

멈춤/대기 상태를 알려주는 기차 신호기

임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원 개수) : 전역 변수 S

임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 역할 : wait 함수

임계 구역에 진입할 수 있는 프로세스의 개수가 0이하면 사용할 수 있는 자원이 있는지 반복 확인하고,

임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 하나 감소시키고 임계 구역 진입

임계 구역 앞에서 기다리는 프로세스에게 '이제 가도 됨' 신호를 주는 역할 : signal 함수

임계 구역에서의 작업을 마친 후 S를 1 증가시킴

=> wait 함수는 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다. 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮긴다.

동기화를 위한 도구 3 - [ 모니터 ]

공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리

프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근할 수 있음

매번 임계 구역 앞뒤에 signal, wait 함수를 명시해야 하는 세마포에 비해 사용하기 편리
조건 변수
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수

측정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 할 때 사용 ( EX. wait, signal 함수 )

# data[].attributes.attachment_link.title
[혼공학습단 12기] 12강 - 프로세스 동기화

# data[].attributes.attachment_link.description
동기화 ]프로세스들 사이의 수행 시기를 맞추는 것 시기 1. 실행 순서 제어: 프로세스를 올바른 순서대로 실행EX) 워드 프로세스에서 쓰는 과정이 수행되어야 읽는 과정이 수행되는 것 시기 2. 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근 (동시 사용을 피하기 위해 사용)EX) 생산자, 소비자 문제 공유자원 EX) 전역 변수, 파일, 입출력장치, 보조기억장치 ...

# data[].attributes.attachment_caption
[혼공네트]5주차_응용계층

# data[].attributes.body
5주차 인증

# data[].attributes.attachment_link.readable_text
HTTP 특성

HTTP 메시지 구조

HTTP 메시지 구조1 : 시작라인

✔️ 요청 메시지

요청 라인 = 메서드 (공백) 요청 대상 (공백) HTTP버전 (줄바꿈)

💡 메서드
클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업의 종류를 나타냄

GET : 자원 습득하기 위한 메서드

HEAD : GET과 동일하나, 헤더만을 응답받는 메서드

POST : 서버로 하여금 특정 작업을 처리하게끔 하는 메서드

PUT : 자원을 대체하기 위한 메서드

PATCH : 자원에 대한 부분적 수정을 위한 메서드

DELETE : 자원을 삭제하기 위한 메서드

CONNECT : 자원에 대한 양방향 연결을 시작하는 메소드

OPTIONS : 사용 가능한 메서드 등 통신 옵션을 확인하는 메서드

TRACE : 자원에 대한 루프백 테스트를 수행하는 메서드

💡 요청 대상

✔️ 응답 메시지

상태 라인 = HTTP버전 (공백) 상태코드 (공백) 이유 구문*(줄바꿈)

💡 HTTP상태 코드& 이유구문(상태코드에 대한 문자열 형태 설명)
요청에 대한 결과를 나타내는 세 자리 정수

200번대 : 성공 상태 코드

300번대 : 리다이렉션 상태 코드

400번대 : 클라이언트 에러 상태 코드

500번대 : 서버에러 상태 코드

HTTP 헤더1 : 요청 시 활용되는 HTTP 헤더

HTTP 헤더2 : 응답 시 활용되는 HTTP 헤더

HTTP 헤더3 : 요청과 응답에 모두 활용되는 HTTP 헤더

HTTP 헤더4 : 캐시

HTTP 헤더5 : 쿠키

HTTP 헤더6 : 콘텐츠 협상과 표현

# data[].attributes.attachment_link.title
[혼공네트]5주차_응용계층

# data[].attributes.attachment_link.description
DNS와 자원 HTTP HTTP 특성 요청-응답 기반 프로토콜 미디어 독립적 프로토콜 스테이트리스 프로토콜(상태없음) 지속 연결 프로토콜 HTTP 메시지 구조 HTTP 요청 💡메서드 클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업의 종류를 나타냄 💡

# data[].attributes.body
5주차 작성 완료했습니다

# data[].attributes.attachment_link.title
혼자 공부하는 컴퓨터 구조 + 운영체제 5주차 (프로세스 동기화, 임계 구역, 상호 배제, 뮤텍스 락, 세마포, 모니터, 교착 상태, 자원 할당 그래프, 교착 상태 발생 조건과 해결 방법)

# data[].attributes.attachment_link.description
도서 정보 책 제목: 혼자 공부하는 컴퓨터 구조 + 운영체제저자: 강민철출판사: 한빛미디어책 정보 및 구매 사이트:https://www.hanbit.co.kr/store/books/look.php?p_code=B9177037040 혼자 공부하는 컴퓨터 구조+운영체제어려운 컴퓨터 구조와 운영체제의 원리를 누구나 쉽게 이해할 수 있도록 용어와 개념은 한 번 더 풀어쓰고, 적절한 예시와 이해하기 쉬운 그림으로 재미있게 구성했다. 또한 일상 소재를 활용한www.hanbit.co.kr저자의 유튜브 강의: https://www.youtube.com/playlist?list=PLYH7OjNUOWLUz15j4Q9M6INxK5J3-59GC 혼자 공부하는 컴퓨터구조 + 운영체제 www.youtube.com 목차12…

# data[].attributes.body
늦었지만 제출해봅니다...!ㅠㅠ

# data[].attributes.attachment_link.readable_text
인터페이스interface : 개발 코드와 객체가 서로 통신하는 접점 역할

인터페이스 선언

[public] interface 인터페이스이름 { ··· }

interface 인터페이스이름 { //상수 타입 상수이름 = 값; //추상 메소드 타입 메소드이름(매개변수,···); }

상수 필드 선언

상수 필드 constant field : 데이터를 저장할 수 있는 인스턴스 또는 정적 필드 선언 가능

상수는 인터페이스에 고정된 값으로 실행 시에 데이터를 바꿀 수 없음!

[public static final] 타입 상수이름 = 값;

상수 이름은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우 _로 연결하는 것이 관례

추상 메소드 선언

인터페이스의 메소드는 객체에서 실행됨 → 추상 메소드로 선언

추상 메소드 : 리턴 타입, 메소드 이름, 매개 변수만 기술되고 중괄호 {}를 붙이지 않는 메소드

[public abstract] 리턴타입 메소드이름(매개변수, ···);

인터페이스 구현

구현 implement 객체 : 인터페이스에서 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있음

구현 클래스

public class 구현클래스이름 implements 인터페이스이름 { //인터페이스에 선언된 추상 메소드의 실체 메소드 선언 }

인터페이스로 구현 객체를 사용하려면 인터페이스 변수를 선언하고 구현 객체를 대입해야 함

인터페이스 변수; 변수 = 구현객체;

인터페이스 변수 = 구현객체;

# data[].attributes.body
https://m.blog.naver.com/sewculture/223550888771

죄송합니다!! 대차게 지각입니다!!!

# data[].attributes.body
늦었지만 올려봅니다... 죄송합니당..

# data[].attributes.attachment_link.readable_text
혼공학습단 12기는 7/01일부터 8/18일까지 진행하는 스터디 활동입니다.

★ 이번주 공부할 내용

혼자 공부하는 자바(개정판)

『혼자 공부하는 자바』가 더욱 풍성한 내용을 담아 돌아왔습니다! 개정판은 기존의 자바 8 & 11 버전은 물론, 최신 버전인 자바 21까지 다룹니다. 자바 21 버전의 강화된 언어 기능을 담은 총 260개

www.youtube.com

이번주 공부할 내용은

· Chapter08 인터페이스

· Chapter09 중첩 클래스와 중첩 인터페이스
파트입니다.
■기본 숙제
자바는 다중 상속을 허용하지 않는다고 했는데, 자바는이 문제를 인터페이스를 통해서 해결합니다.
이를 다중 상속이 아니라 다중 구현이라고도 표현합니다.
이전에 클래스를 선언할 때는 클래스 내부에 멤버 변수(필드), 생성자, 메소드가 있었습니다.

그에 반해 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 가집니다.

인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없습니다.
인터페이스에 선언된 필드는 모두 public static final의 특성을 갖습니다.

인터페이스 메서드는 모두 public, abstact이고, 인터페이스는 다중 구현(다중 상속)을 지원합니다.
인터페이스에서 멤버 변수는 public, static, final이 모두 포함되었다고 간주됩니다.
final은 변수의 값을 한 번 설정하면 수정할 수 없다는 뜻입니다.

추상 메서드에서는 추상이라는 의미에 abstract 키워드 필요
추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야합니다.

인터페이스를 순수 추상 클래스라고도 한다고 합니다.

순수 추상 클래스 : 모든 메서드가 추상 메서드인 추상 클래스
순수 추상 클래스를 상속받은 클래스(자식)은 부모의 기능을 모두 오버라이딩해야합니다.

순수 추상 클래스는 다음과 같은 특징을 가집니다.
- 인스턴스를 생성할 수 없습니다.
- 상속시 자식은 모든 메서드를 오버라이딩 해야 한다.
- 주로 다형성을 위해 사용됩니다.
인터페이스를 상속받을 때는 extends 대신에 implements라는 구현이라는 키워드를 사용해야 합니다.
인터페이스를 사용할 때 public abstract 대신 public interface 앞 키워드 생략 가능합니다.
"Cannot reduce the visibility of the inferited method"

단, public 키워드 생략시 컴파일 에러 발생

인터페이스는 모든 메서드가 추상 메서드이기때문에 컴파일 타임에 에러를 발생시켜
문법적으로 개발자가 실수할 수 있는 문제들을 미리 막을 수 있습니다.

인터페이스를 사용하는 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서입니다.

개발 코드 측면에서 코드 변경없이 실행 내용과 리턴값을 다양화할 수 있습니다.

인터페이스는 다형성이라는 특성을 통해 여러 객체로 쉽게 변경이 가능해집니다.

인터페이스가 있고 이 인터페이스를 구현한 객체가 있다고 가정해보겠습니다.

우리는 상황에 따라 인터페이스에 맞는 객체를 갈아 끼울 수 있습니다. TV 리모컨에 있는 건전지함은 AA사이즈(인터페이스) 규격인 건전지라면 어떤 건전지라도 바꿔 끼울수 있습니다.

■ 추가 숙제

p.421 09-1 확인 문제 3번 풀어보기

p 421 확인 문제 3번

#3. 중첩클래스 예시 문제입니다. 중첩 클래스로 정의된 클래스를 어떻게 선언하는지 알아야 합니다.

public class Car { class Tire(); static class Engine(); }

중첩 클래스로 정의된 Car의 Tire클래스는 Car라는 객체가 myCar라는 변수로 선언되어 있어 Tire객체를 생성할 수 있고, 정적으로 선언된 Engine클래스는 static이기에 Car클래스 객체 없이 호출이 가능합니다.

public class NestedClassExample { public static void main(String[] args) { Car myCar = new Car(); Car.Tire tire = myCar.new Tire(); Car.Engine engine = new Car.Engine(); } }

처음에 코드를 따라 쳐보면서 굳이 왜 사용할까? 코드로만 봐서는 이해가 잘 가지 않았습니다. 책에 예시를 계속 생각하다보니 당연한 소리인데도 클래스와는 달라서 어색했던거 같습니다. 새로운 개념을 공부하는게 항상 쉽지 않은거 같습니다. 이번 인터페이스 파트는 오래 기억될 것 같습니다. ㅎㅎ;; 어떤 분야든 일단 이해가 안되면 여러 번 봐야되지만 힘들게 얻은 지식은 쉽지 잊혀지지 않아서 더 오래 기억되는거 같습니다.

# data[].attributes.attachment_link.title
[혼공자] 5주차 (혼공학습단 12기)

# data[].attributes.attachment_link.description
혼공학습단 12기는 7/01일부터 8/18일까지 진행하는 스터디 활동입니다. ★ 이번주 공부할 내용#진도기본 숙제(필수)추가 숙제(선택)5주차(8/5 ~ 8/11)Chapter 08 ~ 09클래스를 선언할 때 인터페이스는 어떻게 선언될 수 있는지 정리하기p.421 09-1 확인 문제 3번 풀어보기 🙋‍♂️Q&A: 신용권 저자님의 네이버 카페💻유튜브 강의: 👉전체 강의 목록 혼자 공부하는 자바(개정판)『혼자 공부하는 자바』가 더욱 풍성한 내용을 담아 돌아왔습니다!

# data[].attributes.body
늦은 5주차 입니다. 요약 정리는 힘드네요...

# data[].attributes.attachment_link.readable_text
메시지를 주고받고자 하는 대상을 식별하는 방법

네트워크의 어떤 호스트를 특정하기 위해 IP 주소를 사용한다. 하지만 IP 주소는 숫자의 조합이라 기억하기도 어렵고, 언제든 바뀔 수 있다는 문제가 있다. 그래서 도메인 네임(domain name)이 사용된다. 도메인 네임은 IP 주소와 대응되는 문자열이다.

수많은 호스트의 도메인 네임과 IP 주소를 관리할 방법이 필요한데, 네임 서버(name server)가 바로 그 역할을 수행한다. 클라이언트가 접속하려는 호스트의 도메인 네임을 네임 서버에 물어보면 네임 서버는 그에 해당하는 IP 주소를 알려주는 것이다.

네임 서버는 계층적 구조를 가지고 있다. 이는 도메인 네임이 계층적인 형태를 띠고 있기 때문인데, 크게 네 가지로 나눠볼 수 있다.

로컬 네임 서버는 클라이언트가 가장 먼저 찾게 되는 네임 서버다. 보통 ISP에서 로컬 네임 서버의 주소를 할당해 주는데, 공개 DNS 서버를 이용할 수도 있다. 클라이언트가 요청한 도메임 네임에 대응되는 IP 주소를 알고 있다면 해당 IP 주소를 알려주고, 모른다면 루트 네임 서버(root name server)에게 요청한다. 루트 네임 서버는 루트 도메인을 관장하며, 클라이언트의 요청에 대해 TLD 네임 서버의 IP 주소를 반환할 수 있다. TLD 네임 서버는 TLD를 관리하며, 요청에 대해 TLD의 하위 도메인 네임을 관리하는 네임 서버 주소를 반환할 수 있다. 하위 도메인 네임을 관리하는 네임 서버는 또 그보다 하위 도메인 네임을 관리하는 네임 서버 주소를 반환할 수 있다.

계층적 형태를 띠는 도메인 네임

네임 서버도 계층적 구조를 띤다. 위 그림은 재귀적 질의 방식의 리졸빙 과정.

송수신하고자 하는 자원을 식별하는 방법

자원(resource)은 네트워크상에서 메시지를 통해 주고받는 HTML, 이미지, 동영상과 같은 대상이다. 특히 현대 인터넷 환경 대부분의 통신은 HTTP 기반이므로, 'HTTP 요청 메시지의 대상'이라고도 한다. 네트워크 상에서 자원을 식별하는 정보를 URI(Uniform Resource Identifier)라 한다. 이는 위치 기반의 URL과 이름 기반의 URN으로 나뉘는데, 일반적으로는 URL이 많이 쓰인다.

URL의 형식

scheme: 자원에 접근하는 방법을 의미한다. 일반적으로 사용할 프로토콜이 명시된다(http, https...)

authority: 호스트를 특정할 수 있는 정보, 즉 IP 주소 또는 도메인 네임이 명시된다

path: 자원이 위치한 경로가 명시된다

query: 필요한 특정 자원을 서버로 요청할 때 사용하는 정보가 명시된다

fragment: HTML 파일과 같은 자원에서 특정 부분을 가리키기 위해 사용된다

HTTP(Hypertext Transfer Protocol)

HTTP는 응용 계층에서 정보를 주고받는 데 사용되는 대표적인 프로토콜이다. HTTP의 네 가지 주요 특성은 아래와 같다

HTTP는 '클라이언트와 서버' 구조 기반의 요청, 응답 프로토콜이다. 클라이언트와 서버가 서로 요청 메시지와 응답 메시지를 주고받는 구조로 동작한다. 이때 주고받는 자원의 종류를 미디어 타입(또는 MIME 타입)이라 하는데, 여기에 특별한 제한을 두지 않아 미디어 타입과 독립적으로 동작이 가능하다. HTTP는 상태를 유지하지 않기 때문에 클라이언트의 모든 요청은 독립적인 것으로 간주된다. 이는 특정 클라이언트가 특정 서버에 종속되는 것을 방지하기 위한 것으로, 서버에 문제가 생겼을 때 쉽게 추가할 수 있고(확장성), 또는 쉽게 다른 서버로 대체가 가능하다.(견고성) 초기의 HTTP는 매번 요청-응답이 일어날 때마다 TCP 연결을 해야 했는데, 이런 방식을 지속 연결 프로토콜이라 한다. 이제는 발전을 거듭해 HTTP 1.1 버전 이상부터는 지속 연결(persistent connection)을 사용한다. 한 번 TCP 연결을 수립한 후 여러 요청-응답을 주고받을 수 있다.

HTTP 메시지는 아래 그림과 같이 구성되어있다.

HTTP 메시지(출처: MDN)

start-line은 요청 메시지의 경우 '요청 라인'이 되고, 응답 메시지라면 '상태 라인'이 된다.

요청 라인의 형식은 메서드 (공백) 요청 대상 (공백) HTTP 버전 (줄 바꿈)으로 구성된다. 위 예시로 보면 POST 메서드로 /(루트 경로)에 HTTP 1.1 버전의 요청을 보낸다. 상태 라인은 HTTP 버전 (공백) 상태 코드 (공백) 이유 구문 (줄 바꿈)의 형식을 띤다. 위 예제 기준으로는 HTTP 1.1 버전으로 403 에러 코드가 난 상태이며, 이유(Forbidden)가 명시되어 있다. start-line 아래로 HTTP 통신에 필요한 부가 정보들이 들어가며, 콜론(:)을 기준으로 헤더 이름과 헤더 값으로 구성되는 헤더(Header)들이 들어간다. HTTP 요청 또는 응답 메시지에서 본문이 필요할 경우에는 더 아래쪽의 body에 명시된다.

1. www.example.com에서 루트 도메인은 com아 아니라 생략된 .(점)이다. com은 최상위 도메인에 해당한다.

2. HTTP 상태 코드 중 300번대는 리다이렉션 상태 코드로, 요청한 자원의 경로가 변경되어 추가적인 조치가 필요한 상태를 나타낸다.

# data[].attributes.attachment_link.description
메시지를 주고받고자 하는 대상을 식별하는 방법네트워크의 어떤 호스트를 특정하기 위해 IP 주소를 사용한다. 하지만 IP 주소는 숫자의 조합이라 기억하기도 어렵고, 언제든 바뀔 수 있다는 문제가 있다. 그래서 도메인 네임(domain name)이 사용된다. 도메인 네임은 IP 주소와 대응되는 문자열이다. 수많은 호스트의 도메인 네임과 IP 주소를 관리할 방법이 필요한데, 네임 서버(name server)가 바로 그 역할을 수행한다.

# data[].attributes.body
[혼공머신]_5주차 비지도 학습 - https://luxmeily.tistory.com/m/14

늦었지만, 제출합니다 !

앞으로는 늦지 않고 잘 제출하겠습니다 ..!

죄송합니다 ..🥺

# data[].attributes.body
방학 후유증이라고 핑계댈거에요~~~~~ 지각 죄송요!

# data[].attributes.attachment_link.readable_text
뭔가 흐름이 끊겼지만, 포기하기는 싫어서 달려보련다!

목차 1

목차 2

06-1 군집 알고리즘 (Clustering)

- 비지도 학습

- 이미지(gray, 2차원) 데이터 다루기

06-2 k-평균 (KMeans)

- 하이퍼파라미터 (k)

- 최적의 k 찾기 : inertia

06-3 주성분 분석 (PCA)

- 차원축소

- PCA

- 설명된 분산 (explained variance ratio)

혼공학습 숙제

[ 기본 숙제 : k-평균 알고리즘 작동 방식 ]

- 비지도 학습(Unsupervised Learning)의 가장 대표적인 사례가 바로 군집화(Clustering)이다.

- 군집화(Clustering)의 가장 대표적인 알고리즘이 바로 K-평균(K-Means) 알고리즘이다.

- centroid(중심점)을 기준으로 데이터들과의 거리를 최소화하는 것을 목표로 한다.

- 거리를 계산하는 여러 방법이 있으나 보통 유클리드 거리(Euclidian Distance) 방식을 사용한다.

- 이를 이용하여 K-Means 알고리즘은 다음과 같은 방식으로 최적화 한다.

[ 추가 숙제 : Ch.06(06-3) 확인 문제 풀고, 풀이 과정 정리하기 ]

1. 특성이 20개인 대량의 데이터셋이 있습니다. 이 데이터셋에서 찾을 수 있는 주성분 개수는 몇 개일까요?
→ 주성분 분석(PCA)라는 것은 차원 축소 방법 중 하나로써, 원본 데이터의 특성 개수와 같거나 적을 수 있다.

그러므로 정답은 ②번이긴 할텐데.... 사실 ①번이라고 해도 틀렸다고 하기 힘들지 않을까 한다.

"이 데이터셋에서 찾을 수 있는 최대 주성분 개수는 몇 개일까요?"라고 하는 것이 맞을 것 같다.
2. 샘플 개수가 1,000개이고 특성 개수는 100개인 데이터셋이 있습니다. 즉 이 데이터셋의 크기는 (1000, 100)입니다. 이 데이터를 사이킷런의 PCA 클래스를 사용해 10개의 주성분을 찾아 변환했습니다. 변환된 데이터셋의 크기는 얼마일까요?
→ 10개의 주성분을 찾아 변환했다고 했으니 당연하게도 ①번이 정답이다.
3. 2번 문제에서 설명된 분산이 가장 큰 주성분은 몇 번째인가요?
→ 분산이 큰 것부터 정렬되므로 ①번 첫 번째 주성분의 분산이 가장 크다.

그냥 문제 풀기만 하니까 아쉬워서 직접 코드로 증명을 해봤다.

여기까지~!!

# data[].attributes.attachment_link.description
뭔가 흐름이 끊겼지만, 포기하기는 싫어서 달려보련다! 06-1 군집 알고리즘 (Clustering)- 비지도 학습- 이미지(gray, 2차원) 데이터 다루기 06-2 k-평균 (KMeans)- 하이퍼파라미터 (k)- 최적의 k 찾기 : inertia 06-3 주성분 분석 (PCA)- 차원축소- PCA- 설명된 분산 (explained variance ratio) [ 기본 숙제 : k-평균 알고리즘 작동 방식 ]- 비지도 학습(Unsupervised Learning)의 가장 대표적인 사례가 바로 군집화(Clustering)이다.- 군집화(Clustering)의 가장 대표적인 알고리즘이 바로 K-평균(K-Means) 알고리즘이다.

# data[].attributes.body
예예 엄청난 지각생이 되어 왔습니다 ㅠㅠ 죄송합니당 이론 정리는 빨리 하고 코드 추가한다고 미루다가 너무 늦어버렸습니다 흑흑 더 이상 미루다가는 안 올려버릴 것 같아 지금 기절하기 전에 일단 8챕터 냅다 제출하겠습니다! 6주 차는 꼭 기간 내에 올릴게요~~~!!!

p.s 책 출간 후 ebook으로 출간하는 주기?는 어떻게 될까요?? 기다리다 구매할지 바로 구매할지 약간 고민이라 남겨봅니다

# data[].attributes.attachment_link.description
8 - 1 인터페이스(interface) 🤔 인터페이스 생각하니 API가 생각나 찾아보니 역시 인터페이스가 맞았다. API(application programing interface) 프로그램 개발에 자주 사용되는 클래스 및 인터페이스 모음. 라이브러리라고도 부른다.- 기본 숙제Q. 인터페이스는 클래스를 선언할 때 어떻게 선언될 수 있는지 정리하기인터페이스는 interface 키워드를 사용해 선언한다. 구성 멤버로는 상수 필드, 추상 메소드를 가질 수 있는데 상수 필드는 자동으로 public static final이 되고, 추상 메소드는 자동으로 public abstract이 된다. 인터페이스를 구현하는 클래스는 implements 키워드를 사용하고 이를 구현 클래스라 한다. 구현 클래스는 인터페이스의…

# data[].attributes.body
대지각.. 하여 늦게 보냅니다! 출시 직전이라 종일 일하다가 주말내내 누워서 잠만 자느라 정말 늦게 냈네요 ㅜㅜ 추가숙제는 못했습니다.. 이제 6주차를 하러 가봐야 하기 때문이죠.. 6주차는 늦지 않게 내겠습니닷!

# data[].attributes.attachment_link.title
Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.

# data[].attributes.attachment_link.description
A new tool that blends your everyday work apps into one. It’s the all-in-one workspace for you and your team

# data[].attributes.body
늦은.. 5주차 올립니당.. 요즘에도 너무 덥네요!! 코로나도 다시 유행하던데 다들 건강하셨으면 좋겠네요🙏

# data[].attributes.attachment_link.readable_text
5주차!

오늘은 늦은 5주차 글 쓰는 날!
방학하는 기간에 열심히 놀고 지금도 여행일정이 많아서 그런가 글을 쓰는게 정말 쉽지가 않다!!(오히려 6주차 글을 5주차보다 먼저 쓰고 있던.. )
이제 고지가 얼마 남지 않았다.
오늘도 간단하게 정리해보자~!

[이번 주차 숙제✍️]

[도메인 네임과 네임 서버에 대한 설명으로 옳지 않은 것을 골라보자]

④ www.example.com 에서 루트 도메인은 com에 해당한다.
→ 루트 도메인은 '.' 을 담당!

[HTTP 상태 코드에 대한 설명으로 옳지 않은 것을 골라보자]

① 300번대 상태 코드는 요청한 자원이 존재하지 않음을 의미한다.
→ 리다이렉션 요청 이 이뤄졌다라는 것을 의미!

[서버와 클라이언트]

저번 글에서 마지막에 언급하고 끝났던 서버-클라이언트가 기억이 날랑가..?

🖥️ 클라이언트 - - (요청 메세지) → 서버
🖥️ 클라이언트 ← (요청 메세지에 대한 응답) - - 서버

이런 과정 덕분에 우리가 URL을 입력하면 해당 웹 페이지를 확인할 수 있는 것이다.

서버와 클라이언트는 서로 '메시지를 누구랑 주고 받을래?' 와 '송수신하는 정보가 뭘까?' 식별할 수 있어야한다.

전자의 물음인 '메시지를 누구랑 주고 받을래?' 에서 '누구' 를 파악하기 위해서는 사용할 수 있는 것은

후자의 물음에서는 위치 기반의 식별자 URL과 이름 기반의 식별자 URN이 있다.

자자, 그럼 본격적으로 도메인 네임에 대해 알아보자.

[도메인 네임과 네임서버]

위에서 '누구'를 특정하기 위해 IP 주소와 도메인 네임을 사용한다고 했다.
하지만 IP만을 사용하기에는 벅찬..
통신할 때마다 모든 호스트의 주소를 기억하기도 어렵고, IP 주소는 바뀌니까!
이러한 이유로 상대방을 특정하기 위해서 도메인 네임을 많이 사용한다.

도메인 네임, IP 주소 ➡️ 네임 서버에서 관리
도메인 네임을 관리하는 네임 서버를 DNS 서버 라고 부른다.

도메인 네임을 네임 서버에 물어보면 해당 도메인 네임에 대한 IP주소를 알아낼 수 있다!

[. 을 기준으로 분루되는 도메인 네임]

루트 도메인(root domain) > 최상위 도메인(TLD: Top- Level D omain) > 2단계 도메인 > 3단계 도메인 ...

최상위 도메인

도메인 네임의 마지막 부분을 최상위 도메인이라고 한다.
예시로 www.say.com 에서 com이 최상위 도메인!

근데 루트 도메인도 도메인 네임의 일부이고, 도메인 네임의 마지막에 '.' 이 찍혀서 표기된다.
(www.say.com. 으로 접속해도 웹사이트에 잘 접속된다는 것! 물론 저거는 예시라 있는 웹페이지는 아님^^,,)

2단계 도메인

최상위 도메인의 하부.
일반적으로 3~5단계까지 있다.

www.say.com. 얘처럼 도메인 네임을 모두 포함하는 도메인 네임을 뜻한다.

호스트 네임

FQDN의 첫번째 부분.
호스트를 식별할 수 있는 도메인 네임!

# data[].attributes.attachment_link.description
더워서 녹아내리는 요즘-

# data[].attributes.body
이번주는 많이 늦었죠 ㅠ 6주차는 일요일까지 제출해보겠습니다!

https://m.blog.naver.com/my_enviromance/223548253049

# data[].attributes.body
휴가를 너무 즐기는 바람에 늦어버렸습니다..! 6주차는 빠르게 제출해보겠습니당

# data[].attributes.attachment_link.description
방학을 너무 즐겨버려서.. 조금 늦었지만 그래두 정리해봅니당..! 추가숙제는 나중에 첨부하겠습니당 +) 6주차는 늦지 않게! 제출하겠습니당 Chapter 12 프로세스 동기화 12-1 동기화란협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기 때문에 동기화 되어야 한다. 1. 동기화의 의미협력적으로 실행되는 프로세스들은 올바르게 실행되기 위해서 동기화가 필수이다.프로세스 동기화란 프로세스의 수행 시기를 맞추는 것을 의미한다. 프로세스들 사이의 수행 시기를 맞추는 것은 크게 두 가지이다.실행 순서 제어프로세스를 올바른 순서대로 실행하기상호 배제동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 즉, 동기화에는 실행 순서 제어를 위한 동기화가 있고, 상호 배제를 위한 동기…

# data[].attributes.body
휴가 잘 다녀왔습니다.

5주차입니다.

# data[].attributes.attachment_link.readable_text
Matplotlib 기본 요소

Figure 객체

Matplotlib에는 Figure라는 모든 그래프 구성 요소를 담고 있는 최상위 객체가 있다. figure() 함수로 명시적으로 Figure 객체를 만들어 활용하면 다양한 그래프 옵션을 조절할 수 있다.

그래프 크기 바꾸기

figure() 함수를 사용하여 Figure 객체를 만들면 그래프 옵션을 조절할 수 있다 figsize 매개변수에 그래프의 크기를 튜플로 지정할 수 있는데, 기본 그래프의 크기는 (6, 4)이고 단위는 inch이다.

import matplotlib.pyplot as plt plt.figure(figsize = (9, 6)) plt.scatter(ns_book7['도서관수'], ns_book7['대출건수'], alpha = 0.1) plt.show()

여러 개의 서브플롯 출력하기

하나의 Figure 객체 안에는 여러 개의 subplot을 담을 수 있다. subplot이란 matplotlib의 Axes 클래스의 객체를 말하며 하나의 subplot은 두 개 이상의 축을 포함한다. 각 축에는 눈금 또는 틱이 표시된다. 또 축의 이름을 나타내는 레이블이 있다.

matplotlib의 Axes 클래스는 2D 플롯의 모든 요소를 포함하는 객체를 나타낸다. 이 클래스는 matplotlib의 핵심 구성 요소 중 하나이며, 플롯이 표현되는 "축"을 관리한다. Axes 객체는 플롯의 좌표계를 정의하고, 그래프의 데이터를 표시하는 데 필요한 메서드들을 포함한다.

Axes 클래스에는 특별히 '객체'라고 부를 만한 여러 가지 타입이 있지만, Axes 자체가 다양한 플롯의 형식을 나타낼 수 있는 방법을 제공하는 일종의 기반 클래스입니다. 이 클래스에서 파생된 주요 객체들은 주로 2D 그래프나 3D 그래프에서 활용되며, 각각의 객체는 다양한 플롯 유형을 생성하는 데 사용된다.

# plt.subplots(nrows=2, ncols=1)와 같은 의미로 해석되어 2행 1열의 배열로 서브플롯을 생성 fig, axs = plt.subplpots(2) axs[0].scatter(ns_bppl7['도서권수'], ns_book7['대출건수'], alpha = 0.1) axs[0].set_title('scatter plot') axs[1].hist(ns_book7['대출건수'], bins = 100) axs[1].set_title('histogram') axx[1].set_yscale('log') fig.show()

fig: 전체 그림을 나타내는 Figure 객체이다. 이 객체는 서브플롯을 포함하는 캔버스를 의미하며, 전체 플롯을 관리하는 역할을 한다.

axs: 2개의 Axes 객체가 담긴 넘파이 배열이다. 이 배열의 각 요소는 개별 서브플롯을 참조한다.

axs[0]: 첫 번째 서브플롯에 대한 Axes 객체

axs[1]: 두 번째 서브플롯에 대한 Axes 객체

서브플롯을 가로로 출력하기

subplot() 함수에 행과 열을 지정하면 원하는 구조의 Figure 객체를 만들 수 있다.

fig, axs = plt.subplots(2, 2, figsize = (10, 4)) axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha = 0.1) axs[0].set_title('scatter plot') axs[0].set_xlable('number of books') axs[0].set_ylable('borrow count') axs[1].hist(ns_book7['대출건수'], bins = 100) axs[1].set_title('histogram') axs[1].set_xlabel('number of books') axs[1].set_ylabel('borrow count') axs[1].y_scale('log') fig.show()

선 그래프와 막대 그래프

선 그래프 그리기(plot() 함수)

matplotlib의 plot() 함수는 선 그래프를 그릴 수 있다. 첫 번째 매개변수에는 x축의 값, 두 번째 매개변수에는 y축의 값을 전달한다.

서브플롯을 사용하지 않을 때는 그래프의 제목과 x축, y축의 이름은 각각 title(), xlable(), ylable() 함수로 지정한다.

선 모양은 linestyle() 매개변수를 사용한다.

color 매개변수를 사용하여 색상을 지정한다.

maker 매개변수도 제공한다.

선 그래프의 눈금 개수는 xticks() 함수를 사용한다.(plt.xticks(range(1947, 2030, 10)))

그래프에 값을 표시할 때는 annotate() 함수를 사용한다. 첫 번째 매개변수에는 그래프에 나타낼 문자를 지정하고, 두 번째 매개변수에는 문자열이 나타날 x, y 좌표를 튜플로 지정한다. 텍스트의 위치를 조절하기 위해 xytext 매개변수를 사용할 수 있다. xytext 매개변수와 함께 textcoords 매개변수를 사용하면 포인트 단위의 상대 위치를 나타내는' offset points'를 지정할 수 있다.

plt.plot(count_by_year, '*-g') plt.title('Books by year') plt.xlabel('year') plt.ylabel('number of books') plt.xticks(range(1947, 2030, 10)) for ids, val in count_by_year[::5].items() plt.annotate(val, (idx, val), xytext = (2, 2), textcoords = 'offset points') plt.show()

막대 그래프 그리기(bar() 함수)

bar() 함수에 x축의 값, y축의 값을 전달한다.

텍스트 위치 조절은 annotate() 함수의 ha 매개변수에 'center'를 지정한다.

fontsize 매개변수로 텍스트의 크기를 조절한다.

텍스트의 색깔은 color 매개변수를 사용한다.

bar() 함수의 막대의 두께는 width 매개변수를 사용한다.

color 매개변수로 색상을 지정할 수 있다.

가로 막대 그래프는 barh() 함수를 사용한다.

가로 막대 그래프에서 막대의 두께는 height 매개변수를 사용한다.

가로 막대 그래프의 텍스트 위치는 annotate() 함수에서 va 매개변수를 사용한다.

plt.bar(count_by_subject.index, count_by_subject.values, width = 0.7, color = 'blue') plt.title('Books by subject') plt.xlabel('subject') plt.ylabel('number of books') plt.xticks(range(1947, 2030, 10)) for ids, val in count_by_year[::5].items() plt.annotate(val, (idx, val), xytext = (0, 2), textcoords = 'offset points', fontsize = 8, va = 'center', color = 'green') plt.show()

plt.barh(count_by_subject.index, count_by_subject.values, height = 0.7, color = 'blue') plt.title('Books by subject') plt.xlabel('number of books') plt.ylabel('subject') plt.xticks(range(1947, 2030, 10)) for ids, val in count_by_year[::5].items() plt.annotate(val, (val, idx), xytext = (2, 0), textcoords = 'offset points', fontsize = 8, va = 'center', color = 'green') plt.show()

# data[].attributes.attachment_link.title
[혼공분석] 5주차_데이터 시각화

# data[].attributes.attachment_link.description
Matplotlib 기본 요소Figure 객체Matplotlib에는 Figure라는 모든 그래프 구성 요소를 담고 있는 최상위 객체가 있다. figure() 함수로 명시적으로 Figure 객체를 만들어 활용하면 다양한 그래프 옵션을 조절할 수 있다. 그래프 크기 바꾸기figure() 함수를 사용하여 Figure 객체를 만들면 그래프 옵션을 조절할 수 있다 figsize 매개변수에 그래프의 크기를 튜플로 지정할 수 있는데, 기본 그래프의 크기는 (6, 4)이고 단위는 inch이다.import matplotlib.pyplot as pltplt.figure(figsize = (9, 6))plt.scatter(ns_book7['도서관수'], ns_book7['대출건수'], alpha = 0.1)plt.show(..

# data[].attributes.body
5주차 제출합니다. 어째 이번 12기 활동은 다 늦게 제출하네요.. ㅠㅠ

# data[].attributes.attachment_link.readable_text
먼저 구문 오류(Syntax Error) 는 프로그램의 문법적인 오류로 프로그램이 실행조자 되지 않게 만드는 오류다.

반면 예외(Exception) 은 프로그램 실행 중에 발생하는 오류로서 try except 구문 등으로 처리 가능하다.

이 둘의 차이로는 구문 오류는 실행 자체가 안되어서 try except 구문으로 처리가 불가능하다.

키워드로 정리하는 핵심 포인트

1. 구문 오류는 프로그램의 문법적인 오류로 프로그램이 실행조차 되지 않게 만드는 오류.

2. 예외(런타임 에러)는 프로그램 실행 중에 발생하는 오류. try except 구문 등으로 처리 할 수 있다. 반대로 구문 오류는 실행자체가 안 되므로 처리가 불가능하다.

3. 기본 예외 처리는 조건문 등을 사용해 예외를 처리하는 기본적인 방법

4. try except 구문은 예외 처리에 특화된 구문.

5. 예외 객체는 예외와 관련된 정보를 담고 있는 객체

6. raise 구문은 예외를 강제로 발생시킬 때 사용하는 구문

7. 깃허브는 많은 사람이 함께 개발하는 소셜 코딩 사이트

8. 표준 모듈은 파이썬이 기본적으로 제공하는 모듈.

9. import 구문은 모듈을 읽어 들일 때 사용하는 구문

10. 모듈을 읽어 들일 때 from 구문을 사용하면 모듈에서 가져오려는 변수나 함수 앞에 모듈 이름을 붙이지 않아도 된다.

11. as 키워드는 모듈을 읽어 들이고 별칭을 붙일 때 사용하는 구문.

# data[].attributes.attachment_link.title
[혼공파] 혼공학습단 5주차

# data[].attributes.attachment_link.description
먼저 구문 오류(Syntax Error) 는 프로그램의 문법적인 오류로 프로그램이 실행조자 되지 않게 만드는 오류다.반면 예외(Exception) 은 프로그램 실행 중에 발생하는 오류로서 try except 구문 등으로 처리 가능하다. 이 둘의 차이로는 구문 오류는 실행 자체가 안되어서 try except 구문으로 처리가 불가능하다. 키워드로 정리하는 핵심 포인트1. 구문 오류는 프로그램의 문법적인 오류로 프로그램이 실행조차 되지 않게 만드는 오류.2.

# data[].attributes.body
늦었지만.. 인증합니다! 최근 자격증 공부로 정신이 없어서 그만.. 밀려버렸네요 ㅠ.ㅠ 남은 챕터도 열심히달려보겠습니다!!

# data[].attributes.attachment_link.title
혤의 IT 입문기록 : 네이버 블로그

# data[].attributes.headline
[당첨자 발표] 럭키 이벤트

# data[].attributes.subject
[당첨자 발표] 럭키 이벤트

# data[].attributes.body
마지막 주차 학습은 잘 진행하고 계신가요? 지루할 때 즈음 지난주 진행한 죄송! 감사! 럭키 이벤트의 행운의 당첨자를 발표합니다. 여러분들의 양심을 믿고 이메일만 중복 제거 후 추첨을 진행했습니다.

# data[].attributes.attachment_link.readable_text
마지막 주차 학습은 잘 진행하고 계신가요? 지루할 때 즈음 지난주 진행한 죄송! 감사! 럭키 이벤트의 행운의 당첨자를 발표합니다. 여러분들의 양심을 믿고 이메일만 중복 제거 후 추첨을 진행했습니다.

당첨된 10명의 혼공족 축하드리며, 개별 연락 드리겠습니다! 다음주에 도서를 보내드릴 예정이며, 읽어보시고 책이 마음에 드셨다면 이 책 완전 짱이라고 주변에 소문 많이 내주세요. ദ്ദി( ◠‿◠ )ദ്ദി

혹시라도 받고 싶었던 도서가 있었는데 아쉽게 당첨이 되지 않았다면 좋은 방법이 있습니다. 바로 혼공학습단 12기를 완주하는 것 ^~^. 완주만 해도 한빛미디어 책을 구매할 수 있는 마일리지 2만 점을 적립해 드리고 있으니까요, 마지막까지 포기하지 마세요! 쪼끔 지각해도 제가 기다리겠습니다.

💚4주차 숙제 제출: https://padlet.com/hbhongong/12-4-ddf588fdbh3ijyjn
🧡5주차 숙제 제출: https://padlet.com/hbhongong/12-5-1sevbod7j0s1nmxe
💚6주차 숙제 제출: https://padlet.com/hbhongong/12-6-eicgd0dughun3dyc
🧡회고 이벤트:

*6주차 제출 후 일정 안내:
1. 회고를 작성하며 6주차 숙제 검사가 끝나길 기다린다
2. 족장에게 완주 확인을 받고 한빛 ID를 제출 후 마일리지를 받는다
3. 회고 이벤트 참여로 받은 간식을 먹으며, 마일리지로 책을 구매한다
(끝)

# data[].attributes.attachment_link.title
[혼공학습단 12기] 죄송! 감사! 럭키 이벤트 | 행운의 당첨자 발표 ㅇ0ㅇ~!!

# data[].attributes.attachment_link.description
안녕하세요, 여러분 혼공족장입니다. 마지막 주차 학습은 잘 진행하고 계신가요? 지루할 때 즈음 지난주 진행한 죄송! 감사! 럭키 이벤트의 행운의 당첨자를 발표합니다. 여러분들의 양심을 믿고 이메일만 중복 제거 후 추첨을 진행했습니다. 당첨된 10명의 혼공족 축하드리며, 개별 연락 드리겠습니다! 다음주에 도서를 보내드릴 예정이며, 읽어보시고 책이 마음에 드셨다면 이 책 완전 짱이라고 주변에 소문 많이 내주세요.

# data[].attributes.body
아고... 신검이랑 수강신청땜에 정신이 없어 늦게 제출해서 죄송합니다. ㅠㅠ

이번 배열 복습 열심히 하고 마지막 파트 포인터까지 완주해보겠습니다!

# data[].attributes.body
믿기지 않으시겠지만

바빴습니다 ..

마지막 주차도 아쟈 ..

# data[].attributes.attachment_link.description
06 - 1 객체의 기본 → 객체: '이름(name)' 과 '값(value)'로 구성된 속성을 가진 자바스크립트의 기본 데이터 타입 객체→ 객체(object): 여러 자료를 다룰 때 사용 (이전의 배열도 객체임)→ 객체는 키 (key)를 사용한다. → 키 : 값 속성과 메소드 → 배열 내부에 있는 값은 요소, → 객체 내부에 있는 값은 속성이라고 한다.

# data[].attributes.body
이번 5주차에 처음 지각했습니다! ㅠㅠ

끼잉...

# data[].attributes.attachment_link.readable_text
시작하기 전에..

책의 마지막 챕터인 네트워크 활용을 제외하고는 TCP/IP 5계층 모델에서는 제일 위의 계층인 응용 계층(Application Layer) 편이다!

면접에서는 DNS, HTTP Status Code 등이 나오는 편이다

독서 & 스터디

이번주는 잠깐 카페에서 공부하고, 집에서 Ebook으로 주로 공부했다

저번주 우수 혼공족으로 선정돼서 베스킨라빈스 쿠폰으로 베라 아이스크림도 먹고, 50% 완주한 기념으로 받은 메가커피 햄앤치즈샌드도 있었는데 이건 전국 매장에서 햄앤치즈가 지금 생산이 안된다고 해서 다른 메뉴(할메가커피)로 바꿔먹었다!

감사합니다. 혼공족장님. 한빛미디어님

도메인 네임과 네임 서버

IP주소만으로는 호스트를 특정하기 어려움(번거로움)

호스트의 IP주소는 언제든지 바뀔 수 있음

상대 호스트를 특정하기 위해 일반적으로 IP 주소보다 도메인 네임(domain name)을 많이 사용

IP 주소와 대응되는 문자열 형태의 호스트 특정 정보

IP 주소에 비해 기억하기 쉬울뿐더러, IP 주소가 바뀌더라도 바뀐 IP 주소에 도메인 네임을 다시 대응하면 됨

호스트의 도메인 네임과 IP 주소를 모아 관리하는 '공용' 전화번호부와 같은 역할

ex) www.example.com, git.kernel.org

DNS(도메인 네임 서버, Domain Name Server)

도메인 네임을 관리하는 네임 서버

DNS 서버라고도 부름

도메인 네임을 네임 서버에 질의하면 해당 도메인 네임에 대한 IP 주소를 얻을 수 있음

반대로 IP 주소를 통해 도메인 네임을 알아내는 것도 가능

'공용' 전화번호부와 같은 네임 서버와 유사하게 개인의 컴퓨터에 저장된 주소록

hosts 파일은 도메인 네임과 IP 주소의 대응 관계를 담은 파일

호스트(컴퓨터)마다 개별적으로 보유하는 파일이므로 마치 개인 전화번호부와 같음

전 세계에 있는 모든 호스트의 <IP-도메인 네임>을 모두 다 알 수는 없기 때문에 공용전화번호부인 네임서버가 필요

host 파일의 위치는 운영체제별 상이

맥OS/리눅스: /etc/hosts

윈도우: %SystemRoot%\System32\drivers\etc\hosts

도메인 네임의 계층적인 형태

www.example.com(.) - 루트 도메인(일반적으로 생략): . - 최상위 도메인: com - 2단계 도메인: example - 3단계 도메인: www - 전체 주소 도메인 네임(FQDN): www.example.com.

루트 도메인(Root Domain)

최상위 도메인(TLD: Top-Level Domain)

n-th 단계 도메인

전체 주소 도메인 네임(FQDN: Fully-Qualified Domain Name)

계층적인 도메인 네임을 효율적으로 관리하기 위해 네임 서버 또한 계층적인 형태를 이룸

네임 서버는 여러 개 존재하며 전 세계 여러 군데에 위치해 있음

계층적이고, 분산된 도메인 네임에 대한 관리 체계를 도메인 네임 시스템, DNS라고 부름

DNS는 호스트가 이러한 도메인 네임 시스템을 이용할 수 있도록 하는 애플리케이션 계층 프로토콜을 의미하기도 함

다른 도메인이 포함된 도메인을 의미

예를 들어 아래는 모두 google.com의 서브 도메인(모두 google.com을 포함하고 있기 때문)

mail.google.com

www.google.com

scholar.google.com

drive.google.com

마찬가지로 google.com은 com을 포함하고 있기에 com의 서브도메인이라 할 수 있음

계층적 네임 서버

로컬 네임 서버

루트 네임 서버(루트 DNS 서버)

TLD(최상위 도메인) 네임 서버

책임(Authoritative) 네임 서버

로컬 네임 서버 - local name server

클라이언트와 맞닿아 있는 네임 서버

클라이언트가 도메인 네임을 통해 IP 주소를 알아내고자 할 때 가장 먼저 찾게 되는 네임 서버

클라이언트가 로컬 네임 서버를 찾을 수 있으려면 로컬 네임 서버의 주소를 알고 있어야 함

로컬 네임 서버의 주소는 일반적으로 ISP에서 할당해 주는 경우가 많음
다만 ISP에서 할당해 주는 로컬 네임 서버 주소가 아닌, 공개 DNS 서버(public DNS server)를 이용할 수도 있음

공개 DNS 서버의 대표적인 예

구글: 8.8.8.8, 8.8.4.4

클라우드플레어: 1.1.1.1

루트 네임 서버 - root name server

TLD 네임 서버 - Top-Level Domain name server

책임 서버 - Authoritative name server

특정 도메인 영역(zone)을 관리하는 네임 서버

자신이 관리하는 도메인 영역의 질의에 대해서는 다른 네임 서버에서 떠넘기지 않고 곧바로 답할 수 있는 네임 서버

다시 말해, 책임 서버는 로컬 네임 서버가 마지막으로 질의하는 네임 서버

일반적으로 로컬 네임 서버는 책임 네임 서버로부터 원하는 IP 주소를 얻어냄

위에서 첨부했던 이미지에서 살펴보면.. authoritative answer라고 나온다!!

도메인 네임 리졸빙 방법 2가지(How to Get IP Address byDomain Name)

재귀적 질의(recursive query)

클라이언트가 로컬 네임 서버에게 도메인 네임 질의

로컬 네임 서버가 루트 네임 서버에게 질의

루트 네임 서버가 TLD 네임 서버에 질의

TLD 네임 서버가 다음 단계에 질의

위의 과정을 반복하여 최종 응답 결과를 역순으로 전달

반복적 질의(iterative query)

클라이언트가 로컬 네임 서버에게 도메인 네임 질의

로컬 네임 서버는 루트 도메인 서버에게 질의해서 다음으로 질의할 네임 서버의 주소를 클라이언트에게 응답

다음으로 TLD 네임 서버에게 질의해서 다음으로 질의할 네임 서버의 주소를 응답

위의 과정을 반복하다가 최종 응답 결과를 클라이언트에 알려주는 방식

1, 2과정을 요약해보면
1번 - [루트네임서버 -> TLD -> 책임] Top-down & Bottom-UP 으로 Request/Response

2번 - [로컬네임서버 -> Root], [로컬네임서버 -> TLD], [로컬네임서버 -> 책임네임서버]로 Request/Response

위의 과정을 계속 반복한다면 루트 도메인에 과부하가 계속 생기고, 속도도 느릴것!

DNS 캐시: 실제로는 네임 서버들이 기존에 응답받은 결과를 임시로 저장하고, 추후 같은 질의에 이를 활용

DNS 캐시를 저장하는 용도로만 사용되는 서버도 존재

DNS 캐시를 활용해서 더 짧은 시간 안에 원하는 IP 주소 획득 가능

DNS 캐시는 영원히 저장되지 않고 TTL(Time To Live) 값과 함께 저장되며, 이 TTL은 도메인 네임의 결과를 임시로 저장하는 시간
(패킷의 TTL과는 다른 의미)

자원을 식별하는 URI

네트워크상의 메시지를 통해 주고받는 대상

HTML 파일, 이미지, 동영상, 텍스트 파일, XML, JSON

두 호스트가 네트워크를 통해 서로 정보를 주고받을 때, 송수신하는 대상

RFC 9110 - The Target of an HTTP request is called a "resource".

URI(Uniform Resource Identifier)

자원을 식별할 수 있는 정보

이름 그대로 자원(Resource)을 식별(Identifier)하는 통일된 방식(Uniform)

URL(Uniform Resource Locator)

[ 일반적인 URL 형식 ] foo://www.example.com:8042/over/there?name=ferret#nose - scheme: foo:// - authority: www.example.com:8042 - path: /over/there - query: ?name=ferret - fragment: #nose

위치를 이용해 자원을 식별

오늘날 인터넷 환경에서 자원 식별에 더 많이 사용되는 방법

URL 표기 설명

scheme: 자원에 접근하는 방법, 사용할 프로토콜 명시, ex) http://, https://

authority: 호스트를 특정할 수 있는 정보. IP 주소 또는 도메인 네임 명시, ex) www.google.com

path: 자원이 위치한 경로. 자원의 위치는 /를 기준으로 계층적으로 표현, ex) /home/images/a.png

query: 자원을 요청할 때 사용하는 변수(쿼리). 쿼리 문자열(query string) 또는 쿼리 파라미터(query parameter). ?로 시작해서 &를 이용해 and조건을 더할 수 있음. ex) ?name=boki&age=30

fragment: 자원의 한 조각을 가리키기 위한 정보. 보통 HTML에서 id를 찾아서 갈때 #을 통해 찾아갈 수 있음. ex) https://docs.spring.io/spring-ai/reference/getting-started.html#spring-cli

URN(Uniform Resource Name)

urn:isbn:0451450523

이름을 이용해 자원 식별

URL만큼 아직 널리 채택된 방식은 아님

자원의 위치가 언제든 변할 수 있는 URL의 고질적인 문제를 해결 가능

자원에 고유한 이름을 붙이는 이름 기반 식별자이기에 자원의 위치와 무관하게 자원 식별 가능

DNS 자원 레코드(DNS resource record): 네임 서버가 저장하는 정보

단순히 DNS 레코드라고 부르기도 함

도메인 네임을 구입하고, 웹 사이트에 도메인 네임을 적용시킬 때 사용

도메인 네임 example.com을 구입하고 1.2.3.4에 대응된다는 사실을 네임 서버에 알려야 함

-> 도메인 레코드를 추가해서 해결 가능

HTTP(Hypertext Transfer Protocol)

미디어 타입(Media Type): HTTP에서 메시지로 주고받는 자원의 종류

MIME 타입(Multipurpose Internet Mail Extensions Type)이라고도 부름

HTTP를 통해 HTML, JPEG, PNG, JSON, XML, PDF 등 다양한 종류의 자원을 주고받을 수 있음

즉, HTTP는 주고받을 미디어 타입에 특별히 제한을 두지 않고 독립적으로 동작이 가능한 미디어 독립적인 프로토콜

미디어 타입은 타입/서브타입(type/subtype) 형식으로 구성

ex) text/plain, text/html, text/css, text/javascript, image/png...

*문자를 통해 여러 미디어 타입을 통칭할 수 있음 ex) text/*, image/*, */*

;매개변수=값 을 통해 추가적인 정보를 전달할 수도 있음 ex) text/html;charset=UTF-8

HTTP는 상태를 유지하지 않는 stateless 프로토콜

클라이언트의 모든 HTTP 요청은 기본적으로 독립적인 요청으로 간주

상태를 유지하지 않는 특성은 언뜻 효율적이지 않아 보일 수도 있지만, 실제로는 장점이 더 명확함

동시에 처리해야 할 요청 메시지의 수가 수천~수백만개가 된다면, 모든 클라이언트의 상태 정보를 유지하는 것은 서버에 큰 부담

서버는 하나가 아니라 여러 대로 구성될 경우, 모든 서버가 모든 클라이언트의 상태를 유지할 경우 각 서버마다 클라이언트의 상태를 공유하기 위해 Sync를 하는 것은 큰 부담

HTTP가 처음 만들어졌을 때부터 오늘날까지 이어지는 중요한 설계 목표

서버는 하나가 아니라 여러개가 있을 수 있음 -> 상태를 유지하지 않고 모든 요청을 독립적인 요청으로 처리하는 것은 특정 클라이언트가 특정 서버에 종속되지 않도록 하며, 서버의 추가나 문제 발생 시 대처가 용이하도록 함.

언제든 쉽게 서버를 추가할 수 있기 때문에 확장성이 높음

서버 중 하나에 문제가 생겨도 쉽게 다른 서버로 대처가 가능하기 때문에 견고성이 높음

HTTP는 지속해서 발전 중인 만큼, 여러 버전이 있음

오늘날 많이 사용되는 버전: HTTP 1.1 / HTTP 2.0

기본적으로 HTTP는 TCP 위에서 동작

HTTP는 비연결형 프로토콜, but TCP는 연결형 프로토콜

초기의 HTTP버전(1.0 이하)은 3-way handshake를 통해 TCP 연결 수립 후, 요청에 대한 응답을 받으면 연결을 종료하는 방식으로 동작했었음, 추가적인 요청-응답을 하기 위해서는 다시 TCP 연결을 수립해야 했었다[비지속 연결]
(TCP -> HTTP)

하지만 최근 대중적으로 사용되는 HTTP버전(1.1 이상)은 지속 연결(persistent connection)이라는 기술을 제공함

다른 표현으로 킵 얼라이브(kee-aplive)라고도 부름

keep-alive: 하나의 TCP 연결상에서 여러 개의 요청-응답을 주고 받을 수 있는 기술

HTTP 메시지 구조

[ HTTP 메시지 ] 시작 라인(줄바꿈) 필드 라인* (줄바꿈) (줄바꿈) 메시지 본문** ------------------ * 0개 이상 ** 선택적

HTTP 메시지는 (HTTP Reqeust 메시지 or HTTP Response 메시지) 일수도 있음

HTTP 메시지가 요청 메시지일 경우 시작 라인은 '요청 라인'

HTTP 메시지가 응답 메시지일 경우 시작 라인은 '상태 라인'

[ 요청 라인 ] 메서드 (공백) 요청대상 (공백) HTTP 버전 (줄바꿈)

메서드(method): 클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업을 종류를 나타냄. ex) GET, POST, PUT, DELETE

요청 대상(request-target): HTTP 요청을 보낼 서버의 자원을 의미. ex)http://www.example.com/hello?q=world
만약 하위 경로가 없더라도 요청 대상은 슬래시(/)로 표기해야 함. ex)클라이언트가 http://www.example.com으로 요청할 경우 요청 대상은 /가 된다

HTTP 버전(HTTP-version): 'HTTP/<버전>'이라는 표기 방식을 따름. ex) HTTP 버전 1.1: HTTP/1.1

[ 상태 라인 ] HTTP 버전 (공백) 상태 코드 (공백) 이유 구문* (줄바꿈) ------------------------------------------- * 선택적

GET /example-page HTTP/1.1 ----------------------------- Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firfox/118.0 Accept: text/html ------------------ 아래부터가 HTTP 헤더

0개 이상의 HTTP 헤더(HTTP header)가 명시

-> 그래서 이 필드라인을 헤더 라인(header-line)이라 부르기도 함

HTTP 헤더: HTTP 통신에 필요한 부가 정보

필드 라인에 명시되는 각 HTTP헤더는 콜론(:)을 기준으로 헤더 이름과 하나 이상의 헤더 값으로 구성

HTTP 요청 or 응답 메시지에서 본문이 필요한 경우 이 영역에 명시

메시지 본문은 존재하지 않을 수도 있고, JSON 또는 HTML 등 다양한 콘텐츠 타입이 사용될 수도 있음

HTTP/1.1 200 OK Content-Type: application/json { "id": 12345, "name": "John Doe", "email": "johndoe@example.com" } ---------------------------------- JSON HTTP/1.1 200 OK Content-Type: text/html <!DOCTYPE html> <html> <head> <title>Example HTML Page</title> </head> <body> <h1>Welcome to our website</h1> <p>This is a simple HTML page.</p> </body> </html> ---------------------------------- HTML

HTTP 메서드

주로 사용되는 메서드: GET, HEAD, POST, PUT, PATCH, DELETE

어떤 URL로 어떤 요청을 받았을 때 서버는 어떻게 응답할 것인가?

이를 가장 잘 보여주는 문서: API 문서

ex) 유튜브 API 예시, 네이버 뉴스 검색 결과 API 예시

HTTP 상태 코드

200번대 상태 코드는 '요청이 성공했음'을 의미

300번대 상태 코드는 리다이렉션(redirection)과 관련한 상태 코드

영구적인 리다이렉션(permanent redirection) / 일시적인 리다이렉션(temporary redirection)으로 구분

400번대 상태 코드는 '클라이언트에 의한 에러가 있음'을 알려주는 상태 코드

500번대 상태 코드의 원인은 '서버'

클라이언트가 올바르게 요청을 보냈을지라도 발생할 수 있는 서버 에러에 대한 상태 코드

502번 에러는 보통 게이트웨이를 통한 포워드/리버스 프록시를 적용했을 때 자주 발생할 수 있다
ex) httpd(apache web server), nginx

503번 에러는 서버가 과부하 상태에 있거나 일시적인 점검 상태일때 볼 수 있는 상태 코드이다

HTTP의 발전: HTTP/0.9에서 HTTP/3.0까지

지금은 거의 사용되지 않는 초창기 HTTP 버전

사용 가능한 메서드가 GET뿐이었음

요청 메시지는 1줄로 구성되어 있었음

헤더가 지원되지 않았음

공식적으로 지속 연결이 지원

파이프라이닝 기능 (특정 요청에 대한 응답이 수신되기 전에 다음 요청을 보낼 수 있는 기능)

콘텐츠 협상 기능 추가

다양한 편의 기능 및 사용 가능한 헤더가 추가

오늘날까지 널리 사용되는 버전

HTTP/1.1의 효율과 성능을 높이기 위한 버전

송수신 효율을 높이기 위해 헤더를 압축하여 전송하는 기능

텍스트 기반의 메시지를 송수신한 이전 버전과는 달리 바이너리 데이터 기반의 메시지를 송수신

클라이언트가 요청하지 않았더라도 미래에 필요할 것으로 예상되는 자원을 미리 전송해 주는 서버 푸시 기능 제공

HTTP/1.1까지의 고질적인 문제였던 HOL 블로킹(Head-Of-Line Blocking)이라는 문제를 완화한 버전

HOL 블로킹: 같은 큐에 대기하며 순차적으로 처리되는 여러 패킷이 있을 때, 첫 번째 패킷의 처리 지연으로 인해 나머지 패킷들의 처리도 모두 지연되는 문제 상황

멀티플렉싱(multi-plexing) 기법을 도입해 완화

HTTP 멀티플렉싱: 여러 스트림(stream)을 이용해 병렬적으로 메시지를 주고받는 메시지

요청과 응답을 주고받는 단위는 하나의 스트림에서 처리, 이러한 스트림을 여러 개 활용하는 동시에 스트림별로 독립적인 송수신이 가능하며, 스트림별 메시지들은 꼭 일정한 순서를 유지할 필요가 없음

결국, 별도의 스트림을 통해 여러 데이터를 병렬적으로 주고받아서 HOL 블로킹을 상당 부분 완화하는 것

이전의 HTTP 버전들은 모두 TCP를 기반으로 동작했다면, HTTP/3.0은 UDP를 기반으로 동작함

정확히는 UDP를 기반으로 구현된 QUIC(Quick UDP Internet Connections) 프로토콜을 기반으로 동작

연결형 프로토콜인 TCP에 비해 비연결형 프로토콜인 UDP는 상대적으로 더 빠르기 때문에, HTTP/3.0은 속도 측면에서 큰 개선이 이루어짐

HTTP/3.0은 현재 빠르게 성장하는 프로토콜로, 이에 따라 QUIC의 중요성도 점차 커지는 중

HTTP 헤더

언어코드와 국가코드를 혼합해서 사용: 언어코드-국가코드

ex) ko-KR(한국어, 한국에서 사용하는), en-US(영어, 미국에서 사용하는), en-GB(영어, 영국에서 사용되는)

캐시

불필요한 대역폭 낭비와 응답 지연을 방지하기 위해 정보의 사본을 임시로 저장하는 기술

정보의 사본을 임시로 저장하는 것 자체를 캐시(cache)한다, 캐싱(caching)한다 라고도 표현하며, 캐시된 데이터를 캐시라 부름

개인 전용 캐시(private cache): 웹 브라우저에 저장된 캐시

공용 캐시(public cache): 클라이언트와 서버 사이에 위치한 중간 서버에 저장된 캐시

캐시된 사본 데이터가 얼마나 최신 원본 데이터와 유사한지를 나타내는 정도

신선도를 유지하는 가장 기본적인 방법: '캐시된 데이터에 유효 기간을 설정하는 방법'

유효기간을 부여하는 방법 - 응답 메시지의 헤더 사용

Expires 헤더(날짜)

Cache-Control 헤더의 Max-Age 값(초)

Etag / 엔티티 태그 / Entity Tag (버전)

HTTP/1.1 200 OK ... Expires: Tue, 06 Feb 2024 12:00:00 GMT ---- HTTP/1.1 200 OK ... Cache-Control: max-age=1200 ---- GET /index.html HTTP/1.1 Host: www.example.com If-None-Match: "abc"

쿠키(Cookie)

서버에서 생성되어 클라이언트 측에 저장되는 데이터

상태를 유지하지 않는 Stateless 프로토콜인 HTTP를 보완하기 위한 수단

서버가 클라이언트의 상태를 알 수 있게끔 하는 특별한 데이터

쿠키는 <key, value> 쌍 형태를 띄고 있음

적용 범위와 만료 기간 등 다양한 속성을 갖고 있음

서버 -> 쿠키생성 -> 클라이언트에게 전송

클라이언트 -> 요청 메시지 + 쿠키 -> 서버에 요청

Set-Cookie: name=boki Set-Cookie: phone=010-5555-8888 Set-Cookie: message=Hello

GET /next-page HTTP/1.1 Host: example.com Cookie: name=boki; phone=5555-8888; message=Hello ...

Set-Cookie: name=boki domain=example.com

Set-Cookie: name=boki path=/study

쿠키의 폐기 날짜 설정(Expires) - 유효 기간

Set-Cookie: sessionID=abc123; Expires=Fri, 23 Aug 2024 09:00:00 GMT

Set-Cookie: sessionID=abc123; Max-AGe=25920000

Secure: HTTPS 프로토콜이 사용되는 경우만 쿠키를 전송하도록 하는 속성

HttpOnly: HTTP 송수신을 통해서만 쿠키를 이용하도록 제한하는 속성
(JavaScript를 통해 쿠키에 접근하는 것을 방지 == 악성 스크립트를 통해 쿠키 값에 접근하는 것을 방지)

세션 아이디(session id): 쿠키를 통해 전달되는 대표적인 정보

세션 인증(session authentication)

클라이언트는 서버에게 id, pw와 같은 인증 정보를 전송

인증 정보가 올바른 경우, 서버는 세션 아이디를 생성해 클라이언트에게 전송

서버는 생성한 세션 아이디를 데이터베이스 혹은 HttpSession 등에 저장

클라이언트는 추후 요청을 보낼 때 쿠키 내에 세션 아이디를 포함하여 전송

서버는 쿠키 속 세션 아이디와 저장된 세션 아이디를 비교하여 클라이언트를 식별

내 말 덧붙임; 종종 쿠키와 세션 인증을 아예 다른 것으로 보는 개발자들이 많은데, 결국 세션 인증을 하려면 쿠키로 세션 아이디를 내려보내줘야 하기때문에 세션 인증은 쿠키와 무관한 방식이 아님!!

쿠키 이외에도 클라이언트가 저장하고 클라이언트의 상태를 추측할 수 있는 <키-값> 쌍의 정보

웹 스토리지: 웹 브라우저 내의 저장 공간으로, 일반적으로 쿠키보다 더 큰 데이터를 저장 가능

웹 스토리지의 정보는 서버로 자동 전송되지 않음

종류

로컬 스토리지(local storage): 별도로 삭제하지 않는 한 영구적으로 저장이 가능

세션 스토리지(session storage): 브라우저가 열려 있는 동안 유지되는 정보(같은 도메인이더라도 새 탭을 열때마다 초기화됨!)

콘텐츠 협상과 표현

한국에서 접속하거나 한국어 계정으로 구글에 접속하면 한국어로 된 웹 페이지를 볼 수 있고, 다른 지역에서 접속하거나 영어 계정으로 같은 URL에 접속하면 영어로 된 웹 페이지를 볼 수 있는 상황을 경험해본 적이 있을 것이다

콘텐츠 협상(Content Negotiation)

같은 URI에 대해 가장 적합한 '자원의 형태'를 제공하는 메커니즘을 의미

같은 URI로 식별 가능한 HTML 문서라고 해도, 영어로 요청하면 영어로 된 형태로 제공하고, 한국어로 요청하면 한국어로 된 형태를 제공

https://www.rfc-editor.org/rfc/rfc9110.html#name-get

RFC 9110: HTTP Semantics

The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of

www.rfc-editor.org

The GET method requests transfer of a current selected representation for the target resource.

[ 요청 메시지 ] GET /index.html HTTP/1.1 Host: example.com Accept-Language: ko Accept: text/html

선호도에 우선순위 반영 가능

우선순위는 콘텐츠 협상 관련 헤더의 q값으로 표현(q: Quality Value)

특정 표현을 얼마나 선호하는지를 나타내는 값

생략되었을 경우 1을 의미

범위: 0~1

값이 클 경우 우선순위가 높음

ex) 한국어(ko-KR, ko), 영어(en-US, en)순으로 선호하고, HTML, XML, 일반 텍스트 순으로 선호하는 경우

[ 요청 메시지 ] GET /index.html HTTP/1.1 Host: example.com Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 Accept: text/html,application/xml;q=0.9,text/plain;q=0.6,*/*;q=0.5

숙제

Ch.05(05-1) 확인 문제 1번(p.271), (05-2) 확인 문제(p.307) 풀고 설명하기

Q. 도메인 네임과 네임 서버에 대한 설명으로 옳지 않은 것을 골라보세요.

1) 8.8.8.8은 대표적인 공개 DNS 서버로, 구글이 관리합니다. 2) 도메인 네임은 호스트를 특정할 수 있는 문자열 형태의 정보입니다. 3) DNS는 계층적이고 분산된 도메인 네임에 대한 관리 체계이자 이를 관리하는 프로토콜입니다. 4) www.example.com에서 루트 도메인은 com에 해당합니다.

사실상 www.example.com로 접속하는 것은 www.example.com(.)으로 접속하는 것과 같다!

.com은 TLD(Top Level Domain)이다

Q. HTTP 상태 코드에 대한 설명으로 옳지 않은 것을 골라보세요.

1) 300번대 상태 코드는 요청한 자원이 존재하지 않음을 의미합니다. 2) 400번대 상태 코드는 클라이언트에 의한 에러를 의미합니다. 3) 500번대 상태 코드는 서버에 의한 에러를 의미합니다. 4) 200번대 상태 코드는 요청이 성공했음을 의미합니다.

300번대 상태코드는 리다이렉션 상태 코드이다

요청한 자원이 존재하지 않는 상태 코드는 400번대의 404 에러이다.

추가숙제

개발자 도구 열기: 윈도우에서는 F12, 맥에서는 cmd + option + I 또는 Fn(펑션키) + F12

네이버로 들어가서 개발자 도구를 확인해봤다

참고로 웹 개발자라면 반드시 알아야 될 지식으로.. 개발자도구 네트워크 탭에서 Fetch/XHR을 체크해야 API만 필터링 해서 볼 수 있다

이 중에서 auth요청을 확인해봤는데, POST(Http Method)로 요청을 했고 상태코드가 200으로 응답을 성공했다는 것을 알 수 있었다

후기

이번에는 일반인, 개발자 포함 우리 모두한테 가장 친숙한, 응용 계층을 공부해봤다

백엔드 개발자는 HTTP Status 부분에서 친숙함을 느꼈을 것이고, 프론트엔드 개발자는 개발자 도구에서 친숙함을 느꼈을 것 같다

책을 거의 완독해간다.. 이제 100쪽 조금 덜 남았는데, 앞으로 힘 내서 달려본다!!

사실 약간 아쉬웠던 포인트는 로컬 스토리지와 세션스토리지에 대해서 조금 더 부가적인 설명이 있었으면 했다

< 세션 스토리지에 데이터를 저장하면 같은 주소로 접속했더라도 새로운 탭을 만들어서 접속하면 데이터가 달라진다 >는 특징도 넣어줬음 했다

추가로 다국어를 지원하기 위한 부가적인 내용으로 i18n(internationalization)이나 HTTP 주소에서 좀 더 사용자를 위한 표현 방식인 RESTful, HateOS, 그리고 CORS도 나왔으면.. 아주 쬐끔 아쉬웠다

하지만 개발책이 아니고 네트워크 책이니까 괜찮다!!!

그리고 쿠버네티스에서도 IP기반이 아닌 DNS기반으로 접속을 만드는 경우가 많기 때문에 DNS와 관련 명령어 학습을 추천한다!

DNS 레코드 타입도.. 내 첫 회사에서 도메인을 관리하고 인증서를 관리해주는 유료 사이트에서 등록하는 기능이었다

또 내 블로그로 같이 공부를 하는 사람들이 있다면 로컬스토리지vs세션스토리지, i18n, RESTful, HateOS 키워드로 검색해서 추가적인 공부를 해보는 것도 추천한다

네트워크에 대해 공부하면 할수록 더 깊이있어지는것 같아서 정말 좋다~!!

그리고 한빛미디어를 통해 지금 혼공단을 하면서 동시에 한빛미디어의 여러 행사도 참여하고 있는데...

거기에서 받은 고양이 웹캠커버이다! 2개를 받아서 하나는 지인 주고 하나는 내 노트북에 달아놓았다

다른분들도 한빛미디어x한빛앤 등 여러 강연이나 행사에 참여해서 좋은 경험을 얻으면 좋겠다..쿠쿠

ㅋㅋㅋㅋ 넘 귀여워!!!

이제 남은 마지막주도 힘내서 잘 마무리해보고, 복습도 꾸준히 해서 현업에서 내가 공부한 지식들을 잘 녹여냈으면 좋겠다

화이팅!!!
https://www.yes24.com/Product/Goods/125830483

혼자 공부하는 네트워크 - 예스24

혼자 해도 충분하다!1:1 과외하듯 배우는 네트워크 자습서『혼자 공부하는 네트워크』는 개발자의 필수 지식인 네트워크를 기본부터 제대로 학습할 수 있도록 돕는 입문서이다. 다수의 네트워

www.yes24.com

# data[].attributes.attachment_link.title
혼공네트 5주차 - 응용 계층(DNS, URI/URL, HTTP Message, HTTP Header, 캐시, 쿠키, 콘텐츠 협상)

# data[].attributes.attachment_link.description
시작하기 전에..책의 마지막 챕터인 네트워크 활용을 제외하고는 TCP/IP 5계층 모델에서는 제일 위의 계층인 응용 계층(Application Layer) 편이다!면접에서는 DNS, HTTP Status Code 등이 나오는 편이다 독서 & 스터디이번주는 잠깐 카페에서 공부하고, 집에서 Ebook으로 주로 공부했다저번주 우수 혼공족으로 선정돼서 베스킨라빈스 쿠폰으로 베라 아이스크림도 먹고, 50% 완주한 기념으로 받은 메가커피 햄앤치즈샌드도 있었는데 이건 전국 매장에서 햄앤치즈가 지금 생산이 안된다고 해서 다른 메뉴(할메가커피)로 바꿔먹었다!감사합니다.

# data[].attributes.body
5주차 제출합니다! 늦어서 죄송해요!

# data[].attributes.attachment_link.description
기본숙제(필수): 클래스를 선언할 때 인터페이스는 어떻게 선언될 수 있는지 정리하기인터페이스 선언은 interface 키워드를 사용하여 선언상수 필드 선언추상 메소드 선언인터페이스 구현 클래스5주차 후기한주 방학을 너무 잘 보냈더니 과제제출을 깜빡했습니다🫥벌써 마지막

# data[].attributes.body
지각 제출입니다. 죄송합니다. 지각 안하고 싶었는데 ㅠㅠ... 최근 챗gpt 활용 강의를 듣고 있는데요. 강사님이 실습 시키면서 패들렛을 이용하더라고요. 괜히 반가웠던..! 그 때 혼공학습단이 생각났지만..! 지각을 해버렸고...ㅠ_ㅠ... 패들렛 사용하니까 저와 같은 java를 공부하는 분들을 손쉽게(?) 찾아볼 수 있어서 좋네요!

# data[].attributes.attachment_link.description
5주차 학습이 늦었다 ㅠ 지각 제출 ㅠ --------- 인터페이스 : 개발 코드와 객체가 통신하는 접점. 코드가…

# data[].attributes.body
혼공분석 5주차 과제 제출합니다~

# data[].attributes.attachment_link.title
[혼공분석 12기] 5주차 스터디 및 과제

# data[].attributes.attachment_link.description
5주차 계획커리큘럼일정 : 8/5 ~ 8/11진도 : Chapter 05기본 미션 : p. 314의 손코딩(맷플롯립에서 bar()함수로 막대 그래프 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기추가 미션 : p. 316의 손코딩(텍스트 정렬, 막대 조절 및 색상 바꾸기)을 코랩에서 출력하고 화면 캡처하기미션기본 미션p. 314의 손코딩(맷플롯립에서 bar()함수로 막대 그래프 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기-> 포스트 하단 내용 참고추가 미션p. 316의 손코딩(텍스트 정렬, 막대 조절 및 색상 바꾸기)을 코랩에서 출력하고 화면 캡처하기-> 포스트 하단 내용 참고Chapter 05. 데이터 시각화하기학습목표파이썬의 대표적인 시각화 라이브러리인 맷플롯립의 사용 방법을 배운다.맷플롯립을…

# data[].attributes.body
늦게 제출해서 제송합니다2😭

https://velog.io/@red-orange/%ED%98%BC%EA%B3%B5-5%EC%A3%BC%EC%B0%A8

# data[].attributes.attachment_link.readable_text
배열

int a, int b, int c, int d, int f = 0
우리는 무더기로 많은 배열을 필요로 할때가 있다.
그럴때마다 독립변수를 하나씩 잡는다면 가독성과 시간이 낭비된다.

그래서 전체로 붙어있는 것을 만들기로 했다.

int a[5]; 이렇게 선언하면 int형 저장공간이 만들어지고 배열의 시작주소는 배열의 이름과 같다.

배열은 이어진 형태이므로 방이 있을 것이고 위의 'a'라는 배열은 int형 5개가 합쳤기에 20byte다.

각 배열의 요소에는 index가 있으며, 순서가 0부터 시작한다. 그러기에 배열 크기-1 만큼 사용한다.

int a[5] = 0; 첫 요소만 0으로 초기화
int a[5] = {0}; 전체 요소 0으로 초기화

배열초기화

sizeof 연산자

반복문을 다룰때, 배열 개수 조건을 동적으로 사용하기 위한다.
배열 요소의 개수를 구하기 -> sizeof(배열명)si##zeof(배열 요소)

null표기

문자열을 저장할때 사용, 문자열 끝에 붙어서 끝을 알리는데에 사용
널은 아스키 문자가 0인 것을 의미
문자열보다 크거나 +|1인경우가 많은 듯 싶다.

# data[].attributes.attachment_link.description
5주차(8/5 ~ 8/11)Chapter 06p. 310 인덱스 생성하고 key_name이 PRIMARY로 출력된 결과 화면 캡처하기인덱스 생성, 제거하는 기본 형식 작성하기 use market_db;SELECT * FROM member;SHOW INDEX FROM member;

# data[].attributes.body
조금 늦었지만 마지막까지 파이팅!

# data[].attributes.attachment_link.description
기본 숙제p. 244 확인 문제 2번 풀고 인증하기 추가 숙제p. 261 확인 문제 4번 풀고 인증하기자꾸 에러가 뜨는데 정상적으로 보인다!5주차 끝!

# data[].attributes.body
마지막까지 고고씽합니다

# data[].attributes.attachment_link.provider_name
네이버 블로그 | 기록과 기억, 그리고

# data[].attributes.attachment_link.title
[혼공알코 5주차] 프로그래밍 언어분류를 알아보자, <혼자 공부하는 얄팍한 코딩 지식>

# data[].attributes.attachment_link.description
안녕하세요 에드우드입니다. 7월부터 한빛미디어의 혼공학습단을 통해 <혼자 공부하는 얄팍한 코딩지식&…

# data[].attributes.body
아잇 조금 지각했습니다.

마지막 6주차도 화이팅!

# data[].attributes.attachment_link.title
[혼공네트] 5주차_응용 계층

# data[].attributes.body
5주차 제출합니다:) 마지막 남은 6주차도 화이팅!

# data[].attributes.attachment_link.readable_text
안녕하세요, 컴퓨터구조+운영체제 5주차 리뷰를 들고 온 2024년 8월입니다.

시간은 순간순간에는 참 천천히 흐르는 것 같다가도 멀리서 보면 빠르게 흘러가는 것 같아요.

이번 5주차에서는 프로세스, 스레드에 자원 할당하는 방법, 생길 수 있는 문제들,

그리고 해결하는 방법 위주로 학습을 진행했습니다.

그래서 제목도 '어떻게 해야 자원할당을 잘했다고 소문이 날까?'

ㅋㅋㅋㅋ 찰떡이죠?

그럼 지금부터 학습 리뷰, 레츠고~!

먼저 숙제인증 가보겠습니다~

- 기본 숙제(필수): p. 363의 확인 문제 1번 풀고 인증하기

- 추가 숙제(선택): Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기

1. 임계구역

임계구역에 대한 이해를 위해서는 공유 자원에 대한 배경지식을 아는 것이 필요하다.

거창할 것 없이 공유자원은 일종의 '전역변수' 개념을 떠올리면 이해가 편하다.

자원에 접근할 수 있는 프로세스/스레드의 제한이 없는(공개된) 경우, 공유자원이라고 부른다.

이러한 공유자원 중 동시에 여러 프로세스/스레드가 접근하면 오류가 발생하는 자원이 있는데

이들을 '임계구역'으로 구분한다.

2. 상호 배제

그렇다면 상호 배제란 무엇인가? 어렵게 생각할 것 없다.

이미 우리가 살펴 본 임계구역을 사용하기 위해 지켜야 할 조건이라고 볼 수 있다.

정의는 '한 프로세스가 임계구역에 진입했을 시, 다른 프로세스는 임계 구역에 진입 불가함'.

즉, 임계구역에 해당하는 자원을 원활히 사용하기 위해 지켜야 할 조건으로 이해 가능하다.

비교적 간단한 숙제 인증이 끝났다. 조금 아쉬우니 학습을 더 리뷰해 보자.

이번엔 사진으로 리뷰해 보는 시간을 가져보겠다.

상호배제가 잘 이루어진 임계구역 사용방법을 위해 이용하는 도구 종류인 세마포를 학습하면서

wait함수와 signal함수를 공부하다가, signal함수의 if 조건문이 처음에는 이해가 되지 않았다.

프로세스가 작업하기 전 wait 함수를 호출하여 공유자원(S)을 1 감소시키고,

임계 구역 작업완료 후 signal 함수를 호출하여 공유자원(S)를 1 증가시키면,

if 문의 조건문은 S<=0이 아니라 S>=0 이여야 되는 것이 아닌가 의문을 가졌다.

그러나 옆 페이지에 나온 예시를 읽어보며 구체적 상황에 대입하여 바라보니

공유자원(S)의 개수가 프로세스 개수보다 작을 때, 다시 말해 프로세스의 개수가 많을수록

공유자원은 계속해서 감소되어(공유자원을 할당받지 못한 프로세스는 큐에 적재되어야 함)

사용 가능한 공유자원이 생겨 signal 함수를 호출했을 때에도 S가 마이너스일 경우가 발생하기 때문에

S는 S>=0이 아닌 S<=0의 조건을 가져야 한다는 것이다.

만약 전자의 조건으로 함수를 실행하면 사용가능한 공유자원이 생겨도 큐에 있는 프로세스에 자원을 할당할 수 없다.

이번 학습에서 나는 구체적인 상황 대입, 예시가 주는 학습의 힘을 제대로 경험했다 ㅋㅋ

프로세스 할당 중 발생할 수 있는 교착 상태에 대해 학습하면서

대표적인 예시로 '식사하는 철학자' 문제를 접했다. 전에 학교 전공으로 운영체제를 학습하다가

부족함을 느껴서 개인공부, 혼공컴운을 시작했다는 말을 한 적이 있는데, 그때 본 예시라 괜히 반가웠다.

그리고 그때 완전한 이해를 하지 못했다고 생각했는데 작가님의 설명으로 다시금 찬찬히 살펴보며

교착 상태에 대한 이해를 다질 수 있어서 좋았다. (왜 교착상태 문제가 발생한 것인지에 대한 이해 굿)

더하여 교착상태 해결방법(예방, 회피, 검출 후 회복)을 학습할 때 이 철학자 예시 문제를

거듭 설명하며 해결 방법을 적용한 결과를 함께 살펴볼 수 있어서 정말 좋았다. 👍

여담으로, 매주 학습 방식이 바뀌어서 나름의 스트레스, 신경이 쓰였는데 오히려 좋다.

다양한 방식으로 시도해 보면서 학습을 정리하니 기억도 더 잘 남는 것 같고

내가 어떤 방식으로 정리했을 때 더 잘 정리되는지 or 기억에 남는지를 직접 경험으로 파악할 수 있어

학습에 대한 분석이 명확해진다. (완전 럭키비키잖아~~?)

혹시 망설이거나 고민인 분들이 있다면 주저하지 말라는 조언을 남긴다.

# data[].attributes.attachment_link.title
[혼공컴운] 5주차_어떻게 해야 자원할당을 잘했다고 소문이 날까?

# data[].attributes.attachment_link.description
안녕하세요, 컴퓨터구조+운영체제 5주차 리뷰를 들고 온 2024년 8월입니다.시간은 순간순간에는 참 천천히 흐르는 것 같다가도 멀리서 보면 빠르게 흘러가는 것 같아요.이번 5주차에서는 프로세스, 스레드에 자원 할당하는 방법, 생길 수 있는 문제들,그리고 해결하는 방법 위주로 학습을 진행했습니다.그래서 제목도 '어떻게 해야 자원할당을 잘했다고 소문이 날까?'ㅋㅋㅋㅋ 찰떡이죠?그럼 지금부터 학습 리뷰, 레츠고~! 먼저 숙제인증 가보겠습니다~- 기본 숙제(필수): p.

# data[].attributes.body
감사합니다~~

# data[].attributes.attachment_link.readable_text
타깃을 모를 때 유사한 샘플들을 같은 클러스터로 묶어 분류하는 알고리즘이다. 작동 방식은 다음과 같다.

1. 입력 데이터를 임의의 k개 클러스터(그룹)로 나눈다.

2. 각 클러스터의 무게중심을 구한다.

3. 각 데이터로부터 각 클러스터 무게중심까지의 유클리드 거리를 계산하여 해당 데이터를 가장 가까운 무게중심이 있는 클러스터로 배당한다.

4. 그렇게 새로 만들어진 클러스터에 있는 데이터들의 무게중심 값을 다시 구한다.

5. 새로 구한 무게중심과 각 데이터의 유클리드 거리를 계산하고, 또 클러스터를 만든다.

6. 클러스터의 무게중심과 가까운 데이터들이 한 클러스터에 모두 모여, 점들이 소속된 클러스터를 바꾸지 않거나 무게중심이 변하지 않는 상태가 될때까지 1~5 를 반복한다.

참고- 무게중심(mi)을 구하는 식 (Si 는 클러스터에 속하는 데이터의 집합)

# data[].attributes.attachment_link.description
K-평균 알고리즘 작동 방식: 타깃을 모를 때 유사한 샘플들을 같은 클러스터로 묶어 분류하는 알고리즘이...

# data[].attributes.body
조금 늦었습니다. 죄송합니다ㅠㅠ

# data[].attributes.attachment_link.title
안녕하세요. 이재석입니다. : 네이버 블로그

# data[].attributes.body
요즘 아르바이트도 한두번씩 봐주고 기본숙제만 해봤습니다 ㅜㅜ!

# data[].attributes.attachment_link.title
릴센트의 인생 재개발 : 네이버 블로그

# data[].attributes.body
https://qkd-infor.tistory.com/6

5주차 제출이 늦었습니다...ㅠㅡㅠ

# data[].attributes.attachment_link.description
1. 배열의 선언과 사용동일한 자료형을 저장할 저장 공간이 많이 필요한 경우, 그리고 그 데이터들을 하나의 범주에 묶을 수 있는 경우 사용하는 자료형 자료형 배열명[요소 개수]int arr[5];: 정수 자료형의 요소 5개 배열 선언. - 대괄호 안의 숫자: 선언할 때는 배열 요소의 개수, 즉 배열의 크기를 정하는 것. 사용할 때는 배열에서의 위치, 인덱스를 나타내는 것. 배열의 특정 위치에 접근할 때는, 크기가 n인 배열에서 0에서부터 n-1으로 접근할 수 있음. - 배열 초기화: 변수를 선언할 때처럼, 선언한 직후 할당된 저장 공간에는 쓰레기 값이 저장되어 있음. 초기화가 필요함!! (1) int arr[5] = {1, 2, 3, 4, 5}; (2) 배열 요소보다 초기화 개수가 적은 경우,…

# data[].attributes.body
안녕하세요. 미국에서 업무 때문에 혼자 공부하는 아기 아빠입니다.

이제 한 주 남았네요. 덥지만 모두 힘냅시다.

# data[].attributes.body
5주차 제출입니다!

# data[].attributes.attachment_link.readable_text
동기화(synchronization)

프로세스들 사이의 수행 시기를 맞추는 것이다.
협력하여 실행되는 프로세스 간 실행 순서와 자원의 일관성을 보장하기 위해 동기화를 해 주어야 한다.

How?
1. 실행 순서 제어: 프로세스 올바른 순서로 실행
2. 상호 배제(mutual exclution)동시에 접근해서는 안 되는 자원 하나의 프로세스만 접근하도록 하기
Consumer / producer problem
생산자 프로세스와 소비자 프로세스가 제대로 동기화 되지 않으면 공유되는 데이터의 값이 손상될 수 있다.

그렇다면 공유된 자원 이란?

공유 자원(shared resource): 전역 변수, 파일, 장치 등등
이 공유자원을 통해 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section) 이라고 한다.

여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하면 race condition 발생

OS가 race condition을 해결하는 방법

상호 배제(mutual exclusion): mutex를 통해 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.

진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

유한 대기(bounded wating): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다(임계 구역에 들어오기 위해 무한정 대기해서는 안 된다.)

동기화 기법들

1. mutex lock

임계 구역에 진입하는 프로세스는 임계 구역에 진입한 후 mutex lock을 통해 임계 구역을 잠굴 수 있다.
이를 통해 다른 프로세스는 해당 프로세스의 임계 구역 사용이 끝날 때 까지 임계 구역에 진입 할 수 없다.

간단하게 구현하기

자물쇠 역할(공유 전역 변수 lock)

임계 구역 잠구기(acquire 함수)

임계 구역에 진입할 때 호출되며 변수 lock이 true라면(임계 구역이 사용 중이라면)false가 될 때까지 임계 구역을 반복적으로 확인(이것을 busy wating 이라고 부른다.){하고 임계 구역이 열려 있다면 변수를 true로 변경하는 함수이다.

임계 구역의 잠금을 해제하는 역할(release 함수)

임계 구역에서의 작업이 끝나고 호출하는 함수(lock을 false로 바꿈)

2. Semaphore

공유 자원이 여러 개 있는 상황에서 mutex lock은 적용이 힘들기 때문에
이를 보완하기 위해 도입되었다.(binary semaphore, counting semaphore 등등)

 wait(){ while( S <= 0)	//사용 가능한 자원 개수 루프를 통해 확인 ; S--;	//사용 가능한 자원이 생길 경우 루프를 탈출한 뒤 자원 갯수 하나를  사용하면서 임계 구역 진입 } signal(){ S++ //임계 구역에서의 작업이 끝난 뒤 S를 1 증가 }

계속 자원 개수를 조회할 시 CPU 낭비 이슈 -> 자리가 없을 경우 대기 큐에 넣고 진행 중 작업이 끝나면 signal 함수가 이 대기 큐에서 불러오는 방식

 wait(){ S--; if( S < 0){ add this process to queue; sleep(); } } signal(){ S++; if (S <= 0){ remove a process p from Queue; wakeup(p); } }

3. 모니터

공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리 -> 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근

모니터에 진입하는 위한 큐와
모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리기 위해 만들어진 큐
condition variable(조건 변수): 모니터가 semaphore처럼 실행 순서 제어를 위한 동기화를 제공할 때 이 조건 변수를 사용한다.

//유튜브 영상 참조

교착 상태(deadlock)

식사하는 철학자 문제(dining philosophers problem)

원탁 위 철학자들이 양쪽의 포크를 사용해야 식사를 할 수 있을 때 모두 동시에 식사를 할 경우 포크가 부족하여 식사를 진행 할 수 없다.
이렇게 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상을 deadlock:교착상태 라고 한다.

deadlock 발생 조건:

1. 상호 배제(mutex)
-> 식사하는 철학자 문제처럼 mutex상태에서 발생
2. 점유와 대기(hold and wait)
-> 자원을 할당받은 상태에서 다른 자원 할당받기를 기다리는 상태
3. 비선점(non-preemptive)
-> 강제로 빼앗지 못해서 교착 상태 발생(철학자들 중 한명이 뺏어서 순서 만들면 해결됬을 것)
4. 원형 대기(circular wait)
-> 꼬리를 무는 형태로 자원 대기가 무한반복되는 형태

Deadlock을 해결하는 방법:

1. deadlock 예방
앞선 발생 조건 4가지의 조건을 피하면서 deadlock을 예방할 수는 있지만
그럴경우 여러 부작용이 따르게 된다.
2. deadlock 회피
deadlock이 발생하지 않을 정도로만 자원을 할당하는 방식
safe sequence라는 deadlock없이 안전하게 프로세스들이 자원을 할당할 수 있는 순서에 따라 배분하게 되면 안전하다.
그러나 이러한 safe sequence가 없는 경우 unsafe state에 빠질 수 있다.
3. deadlock 검출 후 회복
3.1 선점을 통한 회복은 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다.
교착상태가 해결될 때까지 다른 프로세스로부터 자원을 강제로 빼앗고 한 프로세스에 할당하는 방식.
3.2 프로세스 강제 종료를 통한 회복 잠재적 문제를 무시하고 대처하는 방식이기 때문에 위기를 느낄 시 땅에 머리를 박는 타조와 닮아 ostrich algorithm이라고도 부른다.

숙제

1. p. 363의 확인 문제 1번 풀고 인증하기

1. 참
2. 참
3. 참
4. 거짓(PCB대기 큐를 활용함으로써 바쁜 대기를 피할 수 있다.)
정답 4

2. Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기

임계 구역(critical section)이란 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 지칭한다.
//해당 자원을 shared resource, 공유 자원이라고 부른다.

상호 배제(mutual exclusion)
공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘이다.
mutex라는 약자로도 부르며 mutex lock등 동기화 기법에 사용된다.

느낀 점 및 차주 목표

운영체제 파트는 대학교 강의를 통해 한번 배웠던 터라 생소했던 부분(동기화 파트의 모니터 기법)위주로 다른 자료도 참조해서 복습하는 느낌으로 가볍게 볼 수 있었다.
오히려 오는 학기에 수강할 컴퓨터구조가 계속 신경쓰여서 1~3주차 컴퓨터구조를 다시 복습하는 중이다. 개강까지 탄탄하게 개념 적립 파이팅!

# data[].attributes.attachment_link.title
[혼공학습단 12기]혼자 공부하는 컴퓨터구조+운영체제 (5주차)

# data[].attributes.attachment_link.description
동기화(synchronization) 프로세스들 사이의 수행 시기를 맞추는 것이다. 협력하여 실행되는 프로세스 간 실행 순서와 자원의 일관성을 보장하기 위해 동기화를 해 주어야 한다. How? 실행 순서 제어: 프로세스 올바른 순서로 실행 상호 배제(mutual

# data[].attributes.body
영차~!. 이제 마지막 6주차만 남았네요~

# data[].attributes.attachment_link.title
[혼공자] 5주차 : 네이버 블로그

# data[].attributes.body
마지막까지 파이팅 하겠습니다!

# data[].attributes.attachment_link.title
공부하는 토끼 : 네이버 블로그

# data[].attributes.body
5주차 제출합니다. 아직 월요일 새벽이니 지각 아니죠? ㅎㅎㅎ

# data[].attributes.attachment_link.readable_text
와 올해의 2/3인 순간이 다가왔습니다.
날씨가 아직 더워서 실감은 안나지만 벌써 연말이 다가옴니다...
아직 아무것도 못하고 반복되는 삶에 무기력하게 살아가면서 걱정만 많이 늘어가는 삶이지만
그래도 내가 할 수 있는 일에 최선을 다하면서 살아가보겠습니다.
벌써 혼공단을 5주차나 했으니까요 물론 지난 4주간 지각한건 비밀 ㅎㅎ

이번 주는 예전 혼공컴운이 생각나는 챕터였네요.
하드웨어들과 쓰레드 프로세스 ㅎㅎ 모두다 기억나고 좋았습니다
이전에 올린 글들을 보시려거든 요기 링크로 들어가서 확인해주시길 바랍니다.(티스토리에 있어요)

기본 숙제(필수): Ch.04(04-3) 확인 문제 풀고 인증하기(p. 308 ~ 309)

다음 중 틀린 것을 고르세요.

컴파일 언어는 인터프리터 언어에 비해 프로그램 실행이 빠릅니다.

인터프리터 언어는 자료형에 있어 컴파일 언어보다 자유롭습니다.

객체지향은 절차지향과 상반되는 개념입니다.

함수형으로 프로그래밍하면 변수 사용을 최소화할 수 있습니다.

자바로 작성한 프로그램은 컴퓨터마다 다르게 컴파일할 필요가 있습니다.

정답 : 5번 자바로 작성한 프로그램은 JVM이라는 가상머신에 의해 모든 OS에서 동일하게 컴파일되고 동작한다.

다음 문장에 들어갈 알맞은 단어를 보기에서 알맞은 것을 찾아 작성해 보세요

함수형 프로그래밍을 사용하면 ( 스레드 )가 많이 사용되는 환경에서 변수 문제로부터 안전한 코드를 작성할 수 있습니다.

객체지향 프로그래밍에서는 ( 상속 )을 사용해서 기본이 되는 부모 클래스로부터 추가 속성이나 기능이 있는 자식 클래스를 파생할 수 있습니다.

다음 중 프로그래밍 언어와 가장 연관이 깊은 개념을 이어 보세요

절차지향/객체지향/함수형 프로그래밍 특징 정리하기(p. 292 ~ 303)

절차지향 언어 특징 : 대표 언어 C언어 폭포수처럼 위에서 아래로 순서대로 코드가 동작한다.
모든 구성요소가 연결되어 있어 문제가 생기면 동작하지 않음
실행 순서가 정해져있어 순서가 바뀌면 결과값이 달라진다.

객체지향 언어 특징 : 대표 언어 자바
다양한 객체를 만들어 프로그램을 구성하여 동작한다
객체간에 관계를 만들어 동작시킨다.

장점 : 고장나있는 해당 객체만 고치면 끝!
->따라서 유지보수가 쉽고 생산성이 높다.
단점 : 처음부터 객체들을 설계하고 시작해야하기에 많은 시간이 걸린다.
처리속도가 절차지향보다 느리다.
객체지향언어는 난이도가 높다

특징 : 클래스,상속
클래스 : 객체를 만들어내는 붕어빵틀과 같은 명세서
상속 : 상위 클래스의 기능을 물려받고 기능을 추가하거나 재정의함

함수형 언어 특징 : 대표 언어 클로저,F#,얼랭 변수 사용을 최소화하는 프로그래밍 언어 프로그래밍 언어가 제공하는 기능들을 이용하여 변수를 최소화하여 내부에서 연쇄적으로 기능을 사용해서 결과를 연산함 즉 외부변수의 사용을 줄여서 기능들간에 간섭을 없애는게 목적 대부분의 언어들에서 함수형기능들을 추가하고있음 - 파이썬,자바스크립트

# data[].attributes.attachment_link.description
혼공단이 벌써 5주차?!

# data[].attributes.body
5주차 미션 제출합니다.

# data[].attributes.attachment_link.readable_text
커리큘럼

이 글은 한빛미디어의 ⟪혼자 공부하는 파이썬 2019 개정판⟫을 참고하여 작성되었음을 알려드립니다.

기본 미션

구문 오류와 예외의 차이 설명하기
구문 오류(Syntax Error)

코드가 파이썬 문법에 맞지 않을 때 발생한다. 즉, 코드가 잘못 작성되어 해석할 수 없는 경우.

ex) 괄호가 맞지 않거나, 잘못된 키워드를 사용하는 경우입니다.

이 오류는 프로그램이 실행되기 전에 발생하며, 코드를 수정해야만 실행할 수 있다.

예외(Exception)

코드가 실행되는 중에 발생하는 오류. 이 경우 문법은 올바르지만, 실행 시에 문제가 발생하는 경우.

ex) 0으로 나누기, 파일을 찾을 수 없는 경우 등.

예외는 try-except 블록을 사용하여 처리할 수 있습니다.

요약하자면, 구문 오류는 코드 작성 시의 문법적 문제이고, 예외는 코드 실행 중 발생하는 문제이다.

# data[].attributes.attachment_link.title
혼자 공부하는 파이썬 5주차

# data[].attributes.attachment_link.description
혼자 공부하는 파이썬 5주차

# data[].attributes.body
5주차 숙제 인증합니다!

족장님 패들렛 너무 편해요

# data[].attributes.attachment_link.provider_name
네이버 블로그 | 콩콩

# data[].attributes.attachment_link.title
[혼공컴운][혼공학습단 12기]5주차 컴퓨터구조+운영체제

# data[].attributes.body
5주차 제출합니다!!

# data[].attributes.attachment_link.readable_text
Chapter 12 프로세스 동기화

동기화synchronizatioin : 프로세스들의 실행 순서와 자원의 일관성을 유지하면서 수행 시기를 맞추는 것.

프로세스 동기화를 하려면 ?

1. 실행 순서 제어 : 프로세스들을 올바른 순서대로 실행하기

2. 상호 배제: 동시 접근이 안되는 자원에 하나의 프로세스만 접근하게 하기가 필요합니다.

제대로 동기화 되지않는다면 에러가 발생하거나 예상치 못한 결과 가 나올 수 있습니다. -> 데이터의 일관성이 깨짐

공유 자원 : 프로세스들이 공동으로 이용하는 변수, 파일, 장치

임계 구역 : 동시 실행 시 문제가 발생하는 자원에 접근하는 코드 영역

레이스 컨디션 : 잘못된 실행으로 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 것.
동기화를 위해서 지켜야하는 원칙
1. 상호 배제 : 진입했다면 들어올 수 없다.

2. 진행 : 진입하고자 하면 들어갈 수 있도록.

3. 유한 대기 : 언젠가든 임계 구역에 접근. 무한정 대기X

상호 배제를 위한 동기화 도구

뮤텍스 락MUTual EXclusion lock : 자물쇠처럼 임계 구역을 잠궈 임계 구역 진입을 막는 기능. -> 상호 배제

변수 lock : 전역 변수, 자물쇠 역할

acquire 함수 : 잠금

release 함수 : 잠금 해제

쉴 새 없이 잠김을 확인하는 것을 바쁜 대기라고 합니다. -> CPU 주기를 낭비한다.

세마포semaphore : 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 도구. 뮤텍스 락과 비슷. -> 상호 배제

전역 변수 S : 임계구역에 진입가능한 프로세스 개수

wait 함수 : 들어가도 될 지, 기다려야 할 지 알려주기

signal 함수 : 가도 좋다는 신호 주기

일일이 함수를 명시하는 것이 번거롭고, 누락하거나 호출순서를 헷갈리거나, 중복으로 사용하면 마찬가지로 에러가 발생할 수 있습니다.

모니터monitor : 공유자원과, 인터페이스(공유 자원에 접근하기 위한 통로)를 묶어서 관리 하는 도구. -> 상호 배제

모니터에 진입하는 큐(상호 배제를 위한 큐)를 만들고, wait으로 인해 실행 중단된 프로세스들이 삽입되는 큐(조건 변수에 대한 큐)를 만들어서 모니터 안에는 항상 하나의 프로세스만 접근 할 수 있도록 합니다.

Chapter 13 교착 상태

교착 상태dead lock : 어떤 프로세스도 더 이상 진행할 수 없는 상태. 일어나지 않을 사건을 기다리며 진행이 멈추는 현상

ex) 식사하는 철학자 문제

자원 할당 그래프resource-allocation graph : 자원의 개수는 점, 기다리는 프로세스와 자원 & 사용중인 프로세스와 자원을 화살표로 표현한 그래프. 교착 상태가 발생하면 원 모양이 됩니다.
교착 상태 발생 조건 조건이 모두 만족될 때 교착 상태가 발생할 가능성이 생깁니다.
1. 상호 배제mutual exclusion : 프로세스가 자원을 이용 중일때, 다른 프로세스가 사용할 수 없는 것

2. 점유와 대기hold and wait : 자원을 보유한 채 기다리는 것

3. 비선점nonpreemptive : 작업이 끝나야만 비로소 이용이 가능한 것(강제로 빼앗지 못하는 것)

4. 원형 대기circular wait : 자원 할당 그래프가 원 형태인 것

교착 상태 해결 방법 3가지

예방, 회피, 검출 시 회복

예방 : 조건에 부합하지 않도록 자원 분배

상호 배제를 없애기(모든 자원이 공유 가능하게 하기) -> 현실적으로 어려움.

점유와 대기 없애기 -> 자원의 활용률이 낮아 질 수도 있습니다. (기아 현상)

비선점 조건을 없애기 -> 모든 자원이 선점 가능한 것이 아니므로 범용성이 떨어짐.

원형 대기 조건을 없애기(번호를 붙이고 오름차순으로 자원 할당) -> 번호를 붙이는 것은 번거롭고, 번호 숫자에 따라 활용률이 떨어질 수 있습니다.

회피 : 교착 상태가 발생하지 않을 정도로만 자원 할당(무분별한 할당 방지)

안전 순서열safe sequence : 교착 상태 없이 안전하게 자원 할당할 수 있는 순서

안전 상태safe state : 안전 순서열에 따라 배분하여 교착 상태가 일어나지 않는 상태 <-> 불안전 상태 : 안전 순서열이 없는 상태

안전 상태일때만 자원을 할당!

회복 : 교착 상태 발생을 인정하고 사후 조치하는 것. 그때그때 할당하고 주기적으로 발생 여부를 검사합니다.

1. 교착 상태가 해결될 때까지 자원을 강제로 빼앗고 한 프로세스에 할당

2. 프로세스 강제 종료를 통한 회복

모두 강제 종료 - 확실하지만 작업 내역을 잃을 수 있습니다.

한 프로세스씩 강제 종료 - 교착 상태가 없어졌는지 여부를 계속 확인하므로 오버헤드가 발생할 수 있습니다.

+ 타조 알고리즘ostrich algorithm : 잠재적 문제, 교착 상태를 무시로 대처

숙제

# data[].attributes.attachment_link.title
[혼공컴운] 5주차_프로세스 관리하기

# data[].attributes.attachment_link.description
Chapter 12 프로세스 동기화동기화synchronizatioin : 프로세스들의 실행 순서와 자원의 일관성을 유지하면서 수행 시기를 맞추는 것.프로세스 동기화를 하려면 ?1. 실행 순서 제어 : 프로세스들을 올바른 순서대로 실행하기2. 상호 배제: 동시 접근이 안되는 자원에 하나의 프로세스만 접근하게 하기가 필요합니다.제대로 동기화 되지않는다면 에러가 발생하거나 예상치 못한 결과가 나올 수 있습니다.

# data[].attributes.body
회사일때문에 내용이 많이 부족합니다ㅠ

# data[].attributes.attachment_link.description
K-MEANS 알고리즘 설명하기지겹도록 학교 수업시간에 다루었던 내용이다. 회사 일 때문에 바쁘니 간단하게 정리하고 마무리하겠다. K-means 군집 알고리즘은 평균값을 자동으로 찾아준다. 이 평균값이 클러스터의 중심에 위치하기 때문에 클러스터 중심 또는 센트로이드라고 부른다. 작동방식은 다음과 같다. 1. 무작위로 k개의 클러스터 중심을 정한다.2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정한다.3. 클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경한다.4. 클러스터 중심에 변화가 없을 때 까지 2번으로 돌아가 반복한다. k-평균 알고리즘의 단점 중 하나는 크러스터 개수를 사전에 지정해야한다는 것이다. 회사 일때문에 넘 피곤하다. 나중에 내용 보완하겠다.

# data[].attributes.body
https://www.instagram.com/p/C-iNZUXSxLY/?igsh=MTN5dGM0OWd2cXljNA==

# data[].attributes.attachment_link.title
게임 on Instagram: "중간부터는 방학숙제 아닙니다
if랑 while할때까지만해도 아 ㅋㅋ 껌이네 이러고있었는데 for은 확실히 좀 어렵네요 다량의 데이터를 처리할 때 for이 유용하게 쓰일 것 같습니다
저는 여태 새개념이 나오면 미연시로 치환해서 생각했었는데 for은 어디에 어떻게 쓰여야 유용하게 사용될 지 아직 못 찾아서 이해가 덜 된 느낌입니다 ㅠㅠ
벌써 이 책만 4번째 대출이네요
다음주가 마지막이라니 시간이 참 빠르게 느껴집니다"

# data[].attributes.attachment_link.description
0 likes, 0 comments - wjwjjwd.p on August 11, 2024: "중간부터는 방학숙제 아닙니다
if랑 while할때까지만해도 아 ㅋㅋ 껌이네 이러고있었는데 for은 확실히 좀 어렵네요 다량의 데이터를 처리할 때 for이 유용하게 쓰일 것 같습니다
저는 여태 새개념이 나오면 미연시로 치환해서 생각했었는데 for은 어디에 어떻게 쓰여야 유용하게 사용될 지 아직 못 찾아서 이해가 덜 된 느낌입니다 ㅠㅠ
벌써 이 책만 4번째 대출이네요
다음주가 마지막이라니 시간이 참 빠르게 느껴집니다". 

# data[].attributes.body
https://fan-antlion-1bf.notion.site/5-58cf1d2810e14957b9b14763e4ce4b04?pvs=4

혼공족장님 감사합니다!

# data[].attributes.body
[혼공머신]6-3 | ICE-ICE-BEAR-BLOG

[혼공머신]6-1 | ICE-ICE-BEAR-BLOG

혼공머신 5주차 제출합니다!

# data[].attributes.body
5주차 혼공분석 제출합니다 :>

# data[].attributes.body
이제 한 주 남았네요 ㅎㅎ

# data[].attributes.attachment_link.readable_text
도메인 네임 : 호스트의 IP 주소와 대응되는 문자열 형태로 서버 호스트를 특정할 수 있는 정보

DNS(Domain Name System) : 계층적인 도메인 네임을 효율적으로 관리하기 위한 관리 체계

네임 서버 : 호스트의 도메인 네임과 IP 주소의 짝을 모아서 관리하는 서버(로컬 네임 서버, 루트 네임 서버, TLD(Top Level Domain) 네임 서버, 책임 네임 서버)

계층적으로 구성된 도메인을 찾아 나가는 과정 ex) https://www.saramin.co.kr.

클라이언트와 맞닿아 있는 로컬 네임 서버로 해당 호스트 (www.google.com.)의 IP주소를 찾기 위해 질문을 보냄 / 로컬 네임 서버는 일반적으로 ISP(Internet Service Provider / SKT, KT, LG 등)에서 할당해주는 서버를 이용함. 세계적으로 유명한 공개 DNS 서버는 구글의 8.8.8.8과 클라우드플레어의 1.1.1.1이 있음(ISP의 DNS 서버 대신 로컬 서버로 이용 가능)

로컬 네임 서버에서 최상위 네임 서버인 루트 네임 서버(.)로 질의를 보냄. 보통 루트 네임 서버는 도메인 네임에서 생략됨.

루트 네임 서버(.)에서 TLD 네임 서버(kr)로 질의를 보냄.

이를 쭉 반복

책임 네임 서버(saramin)에 도착 후 IP 주소를 반환받음.

URI(Uniform Resource Identifier) : 해당하는 서버의 IP 주소 또는 도메인 주소를 포함한 자원을 식별하는 통일된 방식.(URL(Uniform Resource Locator)과 URN(Uniform Resource Name)이 있음. 보통 URL 사용)

URL ex) http://www.example.com:8080/insta/post?date=240811&page=1

schema = 자원에 접근하는 방법(http://)
authority = 호스트를 특정할 수 있는 정보(www.example.com / IP주소도 가능, 포트 번호를 추가하는 경우도 있음)

path = 해당 호스트 내에 파일이 있는 위치(insta/post / 화면에 보여지는 html 파일이나 이미지 등)

query = 해당 url에서 추가적인 디테일한 정보(?date=240811&page=1 / 240811에 올린 글만 모아서 그중 1페이지)

fragment = html 파일과 같은 자원에서 특정 부분(ex) https://datatracker.ietf.org/doc/html/rfc3986#section-1.1.2 / 이렇듯 보통 목차별로 정리된 문서에서 사용.)

위의 전체적인 url은 개발자가 설계하기 나름임.

HTTP의 특성

요청-응답 기반 프로토콜 : 클라이언트와 서버가 서로 HTTP 요청 메시지와 응답 메시지를 주고받는 구조로 동작.

미디어 독립적 프로토콜 : 자원의 특성(html, png, json 등)을 제한하지 않으며 그저 자원을 주고받을 수단의 역할만 수행

스테이트리스 프로토콜 : 서버가 HTTP 요청을 보낸 클라이언트와 관련된 상태를 기억하지 않음 / 보통 서버는 수많은 클라이언트와 상호작용을 하므로 이런 상황에서 모든 클라이언트의 상태 정보를 유지하는 것은 서버에 큰 부담임.

지속 연결 프로토콜 : 초기의 HTTP 버전(1.0 이하)는 HTTP 요청, 응답을 위해 매번 TCP 연결을 새로 해야 했음.(비지속 연결) 1.1 이상의 HTTP는 지속 연결 기능을 통해 하나의 TCP 연결상에서 여러 개의 요청-응답을 주고받을 수 있게 됨.

캐시 : 클라이언트가 같은 자원(이미지, html 등)을 요청할 때, 서버가 반복적으로 자원을 보내는 것은 비효율적이므로, 해당 자원을 임시로 저장해두고, 해당 자원이 업데이트 됐을 때에 새로운 자원을 받을 수 있게 해줌.

해당 클라이언트의 웹브라우저에 저장하는 개인 전용 캐시와 클라이언트와 서버 사이에 위치한 중간서버에 저장하는 공용 캐시가 있음.

쿠키 : 서버에서 생성되어 클라이언트 측에 저장되는 데이터로 적용 범위와 만료 기간 등 다양한 속성을 가지고 있으며, 해당 서버의 웹페이지를 이용할 때마다 인증을 하지 않도록 해줌.(스테이트리스를 보완)

접기 시작

p271 확인문제 1번

HTTP 요청 메서드에 대한.

네트워크에 대한 이해는 프로그램을 만드는 고정에 도움을 주지 않습니다. 도움을 줍니다.

네트워크에 대한 이해는 프로그램을 유지 보수하는 과정에 도움을 줄 수 있습니다.

많은 프로그램이 네트워크를 통해 다른 장비와 상호 작용하며 실행됩니다.

채용 시 네트워크에 대한 지식을 강조하거나 검증하는 기업이 존재합니다.

p.307 확인문제 2번

HTTP 상태 코드에 대한 설명으로 옳지 않은 것을 골라 보세요.

300번대 상태 코드는 요청한 자원이 존재하지 않음을 의미합니다.

TCP/IP 모델은 3개의 계층으로 통신 과정을 구분합니다. 4개의

네트워크 참조 모델은 네트워크 구성과 설계를 용이하게 합니다.

네트워크 참조 모델은 네트워크 문제 진단과 해결을 용이하게 합니다.

# data[].attributes.attachment_link.title
[혼공네] 5주차 응용 계층 정리

# data[].attributes.attachment_link.description
✅혼자 공부하는 네트워크 | 📖용어노트5주차 (8/5 ~ 8/11)Chapter 05Ch.05(05-1) 확인 문제 1번(p.271), (05-2) 확인 문제 2번(p.307), 풀고 설명하기HTTP 요청 메시지 확인해 보기6주차 (8/12 ~ 8/18)Chapter 06~07Ch.06(06-2) 확인 문제 1번(p.379), (07-2) 확인 문제 2번(p.407) 풀고 설명하기와이어샤크에서 실제 TCP/UDP 패킷 확인해 보기 도메인 네임 : 호스트의 IP 주소와 대응되는 문자열 형태로 서버 호스트를 특정할 수 있는 정보 DNS(Domain Name System) : 계층적인 도메인 네임을 효율적으로 관리하기 위한 관리 체계 네임 서버 : 호스트의 도메인 네임과 IP 주소의 짝을 모아서 관리하는 서..

# data[].attributes.body
안뇽하세요~

# data[].attributes.body
5주차 제출합니다.

# data[].attributes.attachment_link.readable_text
객체 : 여러가지 속성을 가질 수 있는 대상

속성 : 객체 내부에 있는 값

배열 내부에 있으면 요소, 객체 내부에 있으면 속성이라고 함.

* delete 키워드 : 객체의 속성을 제거할 떄 사용

메소드 : 객체의 속성 중에 함수 자료형인 속성

* this 키워드 : 객체 내부의 매소드에서 자기 자신이 가진 속성을 표시할 때 사용

객체 자료형 : 객체를 기반으로 하는 자료형. new 키워드를 사용하여 생헝

일급 객체 : 자바스크립트에서 함수는 객체의 특성을 모두 갖고 있으므로 일급 객체에 속함.

(다른 객체들에게 적용가능한 연산을 모두 지원하는 객체)

기본 자료형 : 실체가 있는것 중에 객체가 아닌것 (숫자, 문자열, 불)

객체가 아니기 때문에 속성과 메도스를 추가할 수 없다.

* 승급 : 기본 자료형의 속성이나 메소드를 사용하면 일시적으로 객체 자료형으로 변화하는 것.

ex) 숫자 자료형에 속성이나 메소드를 사용하면 일시적으로 Number 객체로 변환되면서, 기본 자료형이나 속성이나 메소드를 사용할 수 있다. 하지만 직접 추가한 것이므로 추가하자마자 버려진다. (이때 프로토타입으로 바꾸면 속성과 메소드를 추가할 수 있다.)

객체, 속성, 메소드가 무엇인지 설명하기

배열 내부에 있으면 요소, 객체 내부에 있으면 속성이라고 함.

* delete 키워드 : 객체의 속성을 제거할 떄 사용

* this 키워드 : 객체 내부의 매소드에서 자기 자신이 가진 속성을 표시할 때 사용

[추가숙제]

p. 288 확인 문제 3번 풀고, 풀이 과정 설명하기

방학이 오히려 독이 된 케이스, 다른 책으로 또 신청하고 싶은데 방학이 있으면 별로일거같아요. 진도를 더 여유롭게 잡는게 좋을거같아요.

# data[].attributes.attachment_link.description
5주차 진도 [Chapter 06] p.245 객체객체 : 여러가지 속성을 가질 수 있는 대상 속성 : 객체 내부에 있는 값 배열 내부에 있으면 요소, 객체 내부에 있으면 속성이라고 함.* delete 키워드 : 객체의 속성을 제거할 떄 사용 메소드 : 객체의 속성 중에 함수 자료형인 속성* this 키워드 : 객체 내부의 매소드에서 자기 자신이 가진 속성을 표시할 때 사용 객체 자료형 : 객체를 기반으로 하는 자료형.

# data[].attributes.body
혼공단 네트워크 5주차 과제 제출합니다!
링크를 여러개 달 수 없어서 우선 제 블로그 링크의 혼공 네트워크 카테고리를 투척해두고,
아래에 링크를 추가해두었습니다~ 새롭게 패들렛 시스템을 체험해봤는데, 훨씬 좋은 것 같아요!!! ㅎㅎㅎ 더 좋은 플랫폼으로 옮겨주셔서 감사합니다~!

P.S 다만 만드시느라 고생많으셨겠어요 ㅜㅠ 수고 많으셨습니다.

학습정리글 :

링크 : https://uomnf97.tistory.com/88

미션 :

링크 : https://uomnf97.tistory.com/92

# data[].attributes.attachment_link.title
‘혼공 학습단/혼자 공부하는 네트워크’ 카테고리의 글 목록

# data[].attributes.attachment_link.description
사회적 가치를 창출하는 ML Engineer를 꿈꿉니다. 지속가능한 성장을 추구하며 성장의 발자취를 블로그에 남기려고 합니다. 오늘도 방문해주셔서 감사드려요.

# data[].attributes.body
세이프.. 5주차 과제 업로드합니다:)

# data[].attributes.attachment_link.title
몽쉘통통 고양이님의블로그 : 네이버 블로그

# data[].attributes.body
늦었지만, 5주차 숙제 제출합니다.

# data[].attributes.attachment_link.title
자유로운 영혼 : 네이버 블로그

# data[].attributes.body
혼공머신 5주차 제출합니다!

# data[].attributes.attachment_link.readable_text
Ch.06-1 군집 알고리즘
비지도 학습
- 머신러닝의 한 종류로 훈련 데이터에 타깃이 없음 ( 타깃이 없어서 외부의 도움 없이 스스로 유용한 무언가를 학습 )
- 대표적인 비지도 학습 작업 : 군집, 차원 축소 등

히스토그램 - 구간별로 값이 발생한 빈도를 그래프로 표시한 것 ( x축 : 값의 구간(계급) / y축 : 발생 빈도(도수) )

군집- 비슷한 샘플끼리 하나의 그룹으로 모으는 대표적인 비지도 학습 작업 ( 클러스터 : 군집 알고리즘으로 모은 샘플 그룹 )

Ch.06-2 k-평균

k-평균 알고리즘

- 처음에 랜덤하게 클러스터 중심을 선택하고 점차 가장 가까운 샘플링 중심으로 이동하는 알고리즘

- 방법

무작위로 k개의 클러스터 중심을 정한다.

각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정한다.

클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경한다.

클러스터 중심에 변화가 없을 때까지 2번으로 돌아가 반복한다.

클러스터의 중심 (센트로이드)

- k-평균 알고리즘이 만든 클러스터에 속한 샘플의 특성 평균값

- 가장 가까운 클러스터 중심을 샘플의 또 다른 특성으로 사용하거나 새로운 샘플에 대한 예측으로 활용 가능
엘보우 방법
- 최적의 클러스터 개수를 정하는 방법 중 하나 ( 이너셔 : 클러스터 중심과 샘플 사이 거리의 제곱 합 )

- 클러스터 개수에 따라 이서녀 감소가 꺾이는 지점이 적절한 클러스터 개수 k가 됨

Ch.06-3 주성분 분석

차원 축소- 원본 데이터의 특성을 적은 수의 새로운 특성으로 변환하는 비지도 학습의 한 종류 ( 저장 공간을 줄이고 시각화하기 쉬움, 다른 알고리즘의 성능을 높일 수 있음 )
주성분 분석
- 차원 축소 알고리즘의 하나로 데이터에서 가장 분산이 큰 방향( 주성분 )을 찾는 방법

- 원본 데이터를 주성분에 투영하여 새로운 특성을 만들 수 있으며, 일반적으로 주성분은 원본 데이터의 특성 개수 보다 작음

설명된 분산 - 주성분 분석에서 주성분이 얼마나 원본 데이터의 분산을 잘 나타내는지 기록한 것 ( 사이킷런의 PCA 클래스 : 주성분 개수나 설명된 분산의 비율을 지정해 주성분 분석을 수행 )

# data[].attributes.attachment_link.title
혼공머신 5차시 _ 비지도 학습

# data[].attributes.attachment_link.description
Ch.06-1 군집 알고리즘비지도 학습 - 머신러닝의 한 종류로 훈련 데이터에 타깃이 없음 ( 타깃이 없어서 외부의 도움 없이 스스로 유용한 무언가를 학습 ) - 대표적인 비지도 학습 작업 : 군집, 차원 축소 등히스토그램 - 구간별로 값이 발생한 빈도를 그래프로 표시한 것 ( x축 : 값의 구간(계급) / y축 : 발생

# data[].attributes.body
5주차 과제 업로드합니다.

# data[].attributes.attachment_link.title
[혼공파] 5주차_함수 : 네이버 블로그

# data[].attributes.body
5주차 업로드입니닷

# data[].attributes.attachment_link.title
이진 : 네이버 블로그

# data[].attributes.body
5주차 업로드 합니다!!

# data[].attributes.body
5주차입니다

# data[].attributes.attachment_link.title
집을 원하는 자 : 네이버 블로그

# data[].attributes.body
5주차까지 함께 달려주셔서 많은 힘이 됐습니다 여러분! 다들 더위 조심하세요!!🫶

# data[].attributes.attachment_link.title
대학생 일기 : 네이버 블로그

# data[].attributes.body
5주차 제출입니다!

# data[].attributes.attachment_link.readable_text
휴,, 어느새 혼공S 5주차를 마무리하는 시점이 되었고, 인턴 3주차에 접어들었다.

분명 모두 굉장히 친절하시고 편안하게 해주셔서 정말 감사한데... 뭔가 아주아주아주 피곤하다.

새로운 환경에 적응하는건 늘 두렵고 긴장되지만, 실무를 피부로 느끼며 하루하루 많은 양의 경험치를 먹고 있는 것 같아 굉장히 보람 찬 하루를 보내고 있다.

짬날때 마다 혼공S를 공부하며 부족했던 부분을 다시 정리하고 있는데 이번 주 내용도 나중에 다시 정리해야 할것 같다...!

멈추지만 않으면 언젠간 도달하겠지.. 1bit씩 쌓아서 peta가 될때까지

(각 단원별 학습 내용 정리는 '혼공학습단 12기' 카테고리 안에 있습니다!)

기본 숙제
p. 310 인덱스 생성하고 key_name 이 PRIMARY로 출력된 결과 화면 캡처하기

SHOW INDEX ~를 사용해서 테이블에 생성된 인덱스 정보를 확인하였다. Key_name이 PRIMARY인 것을 확인 할 수 있는데 이는 클러스터형 인덱스 를 의미한다.

선택 숙제
인덱스 생성, 제거하는 기본 형식 작성하기 오늘 하루도 쌓였다!

# data[].attributes.attachment_link.title
[혼공S] 5주차를 마무리 하며

# data[].attributes.attachment_link.description
휴,, 어느새 혼공S 5주차를 마무리하는 시점이 되었고, 인턴 3주차에 접어들었다. 분명 모두 굉장히 친절하시고 편안하게 해주셔서 정말 감사한데... 뭔가 아주아주아주 피곤하다. 새로운 환경에 적응하는건 늘 두렵고 긴장되지만, 실무를 피부로 느끼며 하루하루 많은 양의 경험치를 먹고 있는 것 같아 굉장히 보람 찬 하루를 보내고 있다.

# data[].attributes.body
5주차 입니다.

# data[].attributes.attachment_link.title
garam-obsidian-blog/서적/혼자 공부하는 자바스크립트/Chapter 6. 객체/1. 객체의 기본.md at main · garamflow/garam-obsidian-blog

# data[].attributes.attachment_link.description
블로그 정리 레포. Contribute to garamflow/garam-obsidian-blog development by creating an account on GitHub.

# data[].attributes.body
벌써 5주 차인지 몰랐어요!
다음 주면 끝난다는 게 믿기지 않아요
이런 걸 싱숭생숭하다고 하던가요...

끝나가는게 좋기도하고 아쉽기도 해요

완주까지 파이팅~!!

＼＿＿＿＿＿＿＿＿＿＿＿＿＿／

ｏ

。

｡

∧＿∧

(*　･ω･)

＿(__つ/￣￣￣/_

＼/　　　/

# data[].attributes.body
5주차 과제 제출합니다!

# data[].attributes.attachment_link.readable_text
동기화(Synchronization)

동기화는 특정 자원에 접근할 때 한 번에 하나의 프로세스만 접근하거나, 프로세스를 올바른 순서대로 실행되도록 제어하는 것을 의미한다. 이는 시스템의 안정성을 보장하고, 자원 충돌을 방지하기 위해 필수적인 개념이다.

공유 자원(Shared Resources)

공유 자원은 여러 프로세스가 공동으로 사용하는 자원으로, 전역 변수, 파일, 입출력 장치, 보조 기억 장치 등이 될 수 있다. 이러한 자원은 동시에 여러 프로세스가 접근하면 문제가 발생할 수 있으므로, 접근에 대한 관리가 필요하다.

임계 구역(Critical Section)

임계 구역은 공유 자원에 접근하는 코드 중에서 동시에 실행하면 문제가 발생할 수 있는 코드 영역을 의미한다. 임계 구역에 한 프로세스가 들어가 있다면, 다른 프로세스는 임계 구역 밖에서 대기해야 한다. 이는 자원 접근의 안전성을 보장하기 위한 중요한 개념이다.

상호 배제(Mutual Exclusion)

상호 배제는 한 프로세스가 임계 구역에서 작업 중일 때 다른 프로세스가 임계 구역에 진입하지 못하도록 제어하는 것을 말한다. 이를 통해 여러 프로세스가 동일한 자원에 동시에 접근하는 것을 방지하고, 데이터 일관성을 유지할 수 있다.

뮤텍스 락(Mutex Lock)

뮤텍스(Mutex) 락은 임계 구역을 잠금으로써 프로세스 간의 상호 배제를 구현하는 대표적인 방법이다. 뮤텍스는 단순하지만 효과적인 동기화 도구로, 하나의 프로세스가 자원을 사용하고 있는 동안 다른 프로세스가 해당 자원에 접근하지 못하도록 한다.

세마포(Semaphore)

세마포(Semaphore)는 뮤텍스보다 더 확장된 동기화 도구로, 여러 개의 공유 자원을 관리할 수 있다. 세마포는 카운터를 사용하여 특정 자원에 대해 여러 프로세스가 접근할 수 있도록 하거나, 자원이 부족할 때 대기 상태로 만드는 등의 동작을 제어할 수 있다.

모니터(Monitor)

모니터(Monitor)는 세마포에 비해 사용하기 편리한 동기화 도구로, 내부적으로 조건 변수를 사용하여 동기화를 관리한다. 모니터는 객체 지향 프로그래밍 환경에서 주로 사용되며, 동기화와 관련된 복잡한 로직을 간단하게 처리할 수 있다.

교착 상태(Deadlock)

교착 상태(Deadlock)는 프로세스들이 서로가 필요로 하는 자원을 기다리며 무한히 대기하는 현상을 의미한다. 교착 상태는 시스템의 정지 상태를 유발할 수 있으므로, 이를 예방하고 관리하는 방법이 필요하다. 식사하는 철학자 문제는 이러한 교착 상태의 발생을 보여주는 전형적인 예시이다.

자원 할당 그래프(Resource Allocation Graph)

교착 상태를 표현하기 위해 자원 할당 그래프(Resource Allocation Graph)를 사용할 수 있다. 이 그래프는 프로세스와 자원 사이의 관계를 시각적으로 나타내어, 교착 상태 발생 가능성을 분석하는 데 도움을 준다.

교착 상태 발생 조건(Conditions for Deadlock)

교착 상태 발생 조건은 네 가지로 구분된다: 상호 배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 원형 대기(Circular Wait)이다. 이 중 하나라도 충족될 경우, 교착 상태가 발생할 가능성이 있다.

교착 상태 예방(Deadlock Prevention)

교착 상태 예방은 교착 상태 발생 조건 중 하나를 충족하지 못하게 하는 방법이다. 이를 통해 교착 상태를 미리 방지할 수 있다.

교착 상태 회피(Deadlock Avoidance)

교착 상태 회피는 시스템이 안전 상태를 유지할 수 있는 경우에만 자원을 할당하는 방법으로, 교착 상태의 위험을 줄인다.

교착 상태 검출 후 회복(Deadlock Detection and Recovery)

교착 상태 검출 후 회복은 교착 상태 발생 여부를 주기적으로 검사하고, 교착 상태가 확인되면 적절한 조치를 통해 시스템을 복구하는 방법이다.

기본 숙제

1. p. 363의 확인 문제 1번

뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.

뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.

세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.

세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.

세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.

답 : 4번

# data[].attributes.attachment_link.title
[혼공컴운] '혼자 공부하는 컴퓨터구조 + 운영체제' 스터디 5주차

# data[].attributes.attachment_link.description
동기화(Synchronization)동기화는 특정 자원에 접근할 때 한 번에 하나의 프로세스만 접근하거나, 프로세스를 올바른 순서대로 실행되도록 제어하는 것을 의미한다. 이는 시스템의 안정성을 보장하고, 자원 충돌을 방지하기 위해 필수적인 개념이다.공유 자원(Shared Resources)공유 자원은 여러 프로세스가 공동으로 사용하는 자원으로, 전역 변수, 파일, 입출력 장치, 보조 기억 장치 등이 될 수 있다.

# data[].attributes.body
피곤한 관계로 우선 기본 숙제만 제출합니다. 빠른 시일 내에 (족장님 보시기 전에) 수정해볼게요...!

# data[].attributes.body
혼공스터디, 혼공머신 5주차 흔적 남깁니다. ^^ 모두 화이팅입니다.

# data[].attributes.body
5주차 업로드합니다!

스터디 얼마 안 남아서 너무 아쉽구...

9월까지 얼마 안 남았다는 걸 믿을 수 없어요ಥ_ಥ

# data[].attributes.attachment_link.readable_text
수강신청을 앞두고 있습니다

무려 12일 ... 내일.....

공강은 없네요....... ( ͠° ͟ʖ ͡°)

다 신청되기만 한다면.. 풀학점 되겠지만

그래도 올클 기원합니다 ......

영강 수학 강의 3개 듣는 사람됨

그런 김에 플레이리스트 공유합니다 🎧
https://music.youtube.com/playlist?list=PL2IFPDOX52cFwlz78y9fxla3rt0faOFQA&si=usQlFFuliZmrADbj 배열이란?
같은 형태의 많은 데이터를 반복문으로 처리하려고 할 때, 메모리에 연속적으로 저장해 놓고 쪼개서 사용하는 방법

선언을 통해 저장 공간을 확보하는데, 하나의 이름으로 한꺼번에 선언해야 한다.

배열 선언 예시는 다음과 같음

// 정수형 배열 int num[5]; // 실수형 배열 float precipitations[6]; // 문자형 배열 char letters[3]; char name[4] = "Chaeyeon";

대괄호([]) 속 숫자에 따라 개수나 순서가 달라진다.

이 값을 첨자(배열에서의 위치)라고 하며, 0부터 시작한다는 것을 기억해야 한다.

int num[3];이라면 0, 1, 2를 의미하는 것!

num[0] = 10;이라면?

0은 첫 번째를 의미한다고 했다.

따라서 첫 번째 배열 요소(순서)의 값은 10이 되는 것이다.

기억하자!

// 첫 번째 배열 요소에 10 대입 num[0] = 10; // 두 번째 배열 요소에 20 대입 num[1] = 20; // 첫 번째와 두 번째 요소를 더해 세 번째 요소에 저장 num[2] = num[0] + num[2] // 만약 num[3]을 출력시키면 어떻게 될까? // 값을 저장하지 않았으므로 쓰레기 값이 출력된다
배열 초기화
배열 요소를 지워야 하는데 값이 너무 많은 경우에는 초기화를 사용한다.

// 초기화 int num[100] = {0};

첨자에 값이 없으면 컴파일러가 알아서 할당한다.

이런 식으로!

sizeof 연산자를 활용한 배열 처리
배열 요소의 개수를 직접 계산해 반복문에 사용함

char형 배열의 선언과 초기
** 저장할 문자열의 길이보다 최소한 하나 이상 크게 배열 선언하기!

널 문자를 저장하기 위해 여분의 공간이 필요하기 때문

이런 식으로! 널 문자는 문자열의 끝을 확인하기 위해 필요함

int main() { char str[80] = "applejam"; printf("최초 문자열 : %s\n", str); printf("문자열 입력 : "); scanf("%s", str) printf("입력 후 문자열 : %s\n", str); return 0; }

주의할 점이 있다면

1. 배열의 크기는 최대한 넉넉하게 선언

2. 배열 요소의 개수는 최소한 '문자열 길이 + 1'이어야 함
strcpy 함수 : 문자열 복사

strcpy(str1, "tiger"); // str1는 첫 번째 인수, tiger는 두 번째 인수 // tiger를 str1에 대입하는 개념

char형 배열에 저장된 문자열을 다른 char형 배열에 대입하기

int main() { char source[] = "Hello, World!"; char destination[50]; strcpy(destination, source); printf("문자열 입력 : %s\n", source); printf("입력된 문자열 : %s\n", destination); return 0; } // 결과 /* 문자열 입력 : Hello, World! 입력된 문자열 : Hello, World! */
빈칸을 포함해 문자열을 입력하는 gets 함수
인수로 char형 배열의 배열명을 줌

배열의 크기보다 긴 문자열 입력하지 않도록 주의

gets와 짝을 이뤄 문자열을 출력하는 puts 함수
문자열 상수나 char형 배열의 배열명을 주면 문자열을 화면에 출력함

printf("문자열 입력 : "); // 메시지 출력하고 줄 바뀜 x gets(str); // 출력한 문자열 바로 옆에 입력

# data[].attributes.attachment_link.description
수강신청을 앞두고 있습니다무려 12일 ... 내일.....공강은 없네요....... ( ͠° ͟ʖ ͡°)다 신청되기만 한다면.. 풀학점 되겠지만그래도 올클 기원합니다 ......영강 수학 강의 3개 듣는 사람됨 그런 김에 플레이리스트 공유합니다 🎧https://music.youtube.com/playlist?list=PL2IFPDOX52cFwlz78y9fxla3rt0faOFQA&si=usQlFFuliZmrADbj 배열이란?같은 형태의 많은 데이터를 반복문으로 처리하려고 할 때, 메모리에 연속적으로 저장해 놓고 쪼개서 사용하는 방법선언을 통해 저장 공간을 확보하는데, 하나의 이름으로 한꺼번에 선언해야 한다.

# data[].attributes.body
5주차입니다!

# data[].attributes.body
히히히 호이호이 5주차입니다.

# data[].attributes.attachment_link.title
혼공컴운 - 5주차 혼공학습단 숙제

# data[].attributes.attachment_link.description
5주차 4주차와 5주차 사이에는 1주간의 방학이 있었어요. 그래서 지난주에는 올리지 않았어요. C12 동기화는 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나 프로세스를 올바른 순서대로 실행하게 하는 것을 의미해요. 공유 자원은 공동으로 사용하는 자원으로, 전역 변수가 될 수...

# data[].attributes.body
벼락치기 완료..!!

세이브 맞나요?

# data[].attributes.body
5주차 숙제 제출합니다.

# data[].attributes.attachment_link.title
[혼공학습단12기] 혼공네트-5주차ch5

# data[].attributes.attachment_link.description
필수 숙제p.2711. 도메인 네임과 네임 서버에 대한 설명으로 옳지 않은것은?④ 루트 도메인은 .이다. p.3072. http 상태코드에 대한 설명으로 옳지 않은 것을 골라보세요.①DNS와 자원 핵심 포인트도메인 네임, DNS, 네임서버,DNS 캐시, DNS 캐시, 자원, URI, URL도메인 네임: ip 주소와 대응되는 문자열 형태의 호스트 특정 정보네임서버: 로컬네임서버, 루트네임서버, TLD 네임서버, 책임네임서버DNS 캐시: 도메인 네임의 질의 결과를 임시 저장자원: 네트워크상의 메시지를 통해 송수신하는 대상URI: 자원을 식별할 수 있는 정보URL: scheme, authority, path, query, fragment 구성최상단: 루트 도메인최상위 도메인 5-2 HTTPHTTP, HT…

# data[].attributes.headline
[혼공컴운] 5주차_손*주

# data[].attributes.subject
[혼공컴운] 5주차_손*주

# data[].attributes.body
5주차 제출합니다.

# data[].attributes.attachment_link.title
[혼공컴운] 5주차_운영체제 : 네이버 블로그

# data[].attributes.body
5주차 제출합니다

# data[].attributes.attachment_link.title
의문과 해결의 블로그 : 네이버 블로그

# data[].attributes.body
5주차 제출합니다.

# data[].attributes.attachment_link.readable_text
이번 주차는

▶ Chapter 12 프로세스 동기화

▶ Chapter 13 교착 상태 이다.

먼저 Chapter 12 프로세스 동기화 를 살펴보자.

동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 협력해야 한다. 이러한 프로세스들은 실행 순서와 자원의 일관성을 보장해야하므로 동기화 돼야 한다.

여기서 프로세스 동기화란, 프로세스들 사이의 수행 시기를 맞추는 것 이다.

1. 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기

2. 상호 배제: 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기

* 실행의 흐름을 갖는 모든 것은 동기화의 대상이 된다.

상호 배제 에 대해 좀 더 알아보자.

상호 배제는 공유가 불가능한 자원의 동시 사용을 피하기 위한 알고리즘이다. 이것을 상호 배제를 위한 동기화 라고 하며 생상자와 소비자 문제를 대표적인 예시로 꼽을 수 있다.

[ 생산자와 소비자 문제 예제 코드 ]
https://github.com/kangtegong/self-learning-cs/blob/main/producer_consumer/producer_consumer.md

self-learning-cs/producer_consumer/producer_consumer.md at main · kangtegong/self-learning-cs

『혼자 공부하는 컴퓨터구조 & 운영체제』 (한빛미디어) 심화자료. Contribute to kangtegong/self-learning-cs development by creating an account on GitHub.

github.com

동시에 접근이 안되는 자원은 무엇일까?

- 동시에 실행하면 문제가 발생하는 자원에 접근하려는 코드 영역을 임계 구역 이라고 한다.

- 동시에 실행되는 프로세스들이 공동으로 사용하려는 자원은 공유 자원 이라고 하며 이는 전역 변수 / 파일 / 입출력 장치 / 보조기억장치 등이 될 수 있다.

두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야 하며, 먼저 진입한 프로세스의 작업이 마무리 될 경우에 기다리던 프로세스가 임계 구역에 진입할 수 있다.

잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 발생하는 문제를 레이스 컨디션 이라고 한다. 해당 문제가 발생하면 일관성이 깨질 수 있다.

레이스 컨디션이 발생하는 근본적인 이유는 무엇일까?

=> 컴퓨터는 고급 언어가 아닌 저급 언어를 실행한다. 따라서 고급 언어가 여러 줄의 저급 언어로 변환되어 고급 언어 한 줄을 실행하는 과정에서 문맥 교환이 일어날 수 있다는 점이다.

운영체제는 임계 구역 문제를 3가지 원칙 하에 해결한다.

1. 상호 배제 : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.

2. 진행 : 임계 구역에 어떤프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

3. 유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가 임계 구역에 들어올 수 있어야 한다.

=> 상호 배제를 위한 동기화를 위해서는 이 3가지 원칙이 반드시 지켜져야 한다.

프로세스의 동기화는 어떻게 이루어질까?

프로세스 동기화를 위한 대표적인 도구에 대해 알아보자.

1. 뮤텍스 락

=> 자물쇠 기능 을 코드로 구현한 것이다. 임계 구역에 진입하는 프로세스는 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어둘 수 있다.

- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock

- 임계구역의 잠금을 해제하는 역할 : release 함수

# acquire 함수란, 임계 구역에 진입하기 전에 호출하는 함수 이다. 임계 구역이 잠겨 있으면 열릴 때까지 임계 구역을 반복적으로 확인한다. 열려 있으면 임계 구역을 잠근다.

--> 잠겨 있는지 쉴 새 없이 반복하며 확인하는 대기 방식을 바쁜 대기 라고 한다.

# release 함수란, 임계 구역에서의 작업이 끝나고 호출되는 함수로 현재 잠긴 임계 구역을 열어주는 함수이다.

2. 세마포

=> 뮤텍스 락과 비슷하나 세마포는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.
[ 세마포를 이용한 상호 배제를 위한 동기화 기법 ]
- 임계 구역에 진입할 수 있는 프로세스의 개수 : 전역 변수 S

- 임계 구역에 들어가도 좋을지. 기다려야 할지. 알려주는 wait 함수

- 기다리는 프로세스에 이제 가도 된다는 신호를 주는 signal 함수

* 세마포는 바쁜 대기 대신 더 좋은 방법을 사용한다.

- wait 함수는 사용할 수 있는 자원이 없을 경우, 해당 프로세스 상태를 대기 상태로 만든다. 그리고 해당 PCB를 세마포를 위한 대기 큐에 넣는다.

- 임계 구역의 작업이 끝나고 다른 프로세스가 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 준비 상태로 변경한 뒤 준비 큐로 옮긴다.
[ 세마포를 이용해 프로세스의 순서를 제어하는 방법 ]
- 세마포의 변수 S를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수를 붙인다.

- 다음에 실행한 프로세스 앞에 wait 함수를 붙인다.

3. 모니터

=> 세마포에 비해 사용자가 사용하기 훨씬 편리한 도구이다.

[ 상호 배제를 위한 동기화 ]

- 모니터는 공유 자원 & 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리한다.

* 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.

- 공유 자원에 접근하고자 하는 프로세스를 큐( 모니터 진입 위한 큐)에 삽입한다.

- 큐에 삽입된 순서대로 하나씩 공유 자원을 이용한다.
[ 실행 순서 제어를 위한 동기화 ]
=> 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위한 조건 변수 를 사용한다. 조건 변수로는 wait와 signal 연산을 수행할 수 있다.

- wait는 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐 에 삽입하는 연산이다.

* 해당 큐는 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 중단되어 기다리기 위해 만들어진 큐이다.

상호 배제를 위한 큐 != 조건 변수에 대한 큐

- wait 연산으로 일시 중지된 프로세스는 다른 프로세스의 signal 연산을 통해 실행이 재개될 수 있다.

교착 상태 란, 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상을 말한다.

교착 상태는 자원 할당 그래프 를 통해 표현할 수 있다.

1. 프로세스는 원으로, 자원의 종류는 사각형으로 표현한다.

2. 사용할 수 있는 자원의 개수는 자원 사각형 내 점으로 표현한다.

3. 프로세스가 어떤 자원을 할당받아 사용 중이면, 자원에서 -> 프로세스를 향해 화살표를 표시한다.

4. 프로세스가 어떤 자원을 기다리고있다면, 프로세스에서 -> 자원으로 화살표를 표시한다.

=> 교착 상태가 발생한 상황은 자원 할당 그래프가 원의 형태를 띄고 있다.

이번에는 교착 상태가 발생하는 근본적인 이유 에 대해 알아보자.

* 교착 상태가 발생하는 조건에는 상호 배제, 점유와 대기, 비선점, 원형 대기가 있다. 해당 조건 중 하나라도 만족하지 않으면 교착 상태가 발생하지 않는다. 하지만 모두 만족한다면 교착 상태가 발생할 가능성이 있다.

1. 상호 배제 : 교착 상태의 근본적인 원인은 해당 자원을 한 번에 하나의 프로세스만 이용 가능하기 때문이다.

2. 점유와 대기 : 프로세스가 하나의 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태이기 때문이다.

3. 비선점 : 어떤 프로세스가 다른 프로세스의 자원을 강제로 빼앗지 못하는 비선점 자원이기 때문이다. 비선점 자원은 자원을 이용하는 프로세스의 작업이 끝나야만 이용할 수 있다.

4. 원형 대기 : 프로세스들과 프로세스가 요청 및 할당받은 자원이 원의 형태를 이루었기 때문이다. \

이러한 교착 상태를 운영체제는 어떻게 해결할까?

운영 체제는 교착 상태를 예방하거나 회피할 수 있으며, 검출 후 회복할 수 있다.

1. 교착 상태 예방 : 이는 교착상태 발생 필요 조건 4가지 중 하나를 충족하지 못하게 하는 방법과 같다.

a. 자원의 상호 배제 제거 : 모든 자원을 공유 가능하게 만든다는 것과 같다. 따라서 실현하는 것은 무리다.

b. 점유와 대기 제거 : 특정 프로세스에 자원을 모두 할당하거나 아예 할당하지 않는 방식으로 배분한다. (단)=>당장 자원이 필요해도 기다릴 수 밖에 없는 프로세스, 사용되지 않으면서 오랫동안 할당되는 자원을 다수 양산하기에 자원의 활용률이 낮아진다. 결국 많은 자원을 필요로 하는 프로세스가 무한정 기다리는 기아 현상을 야기할 수 있다.

c. 비선점 조건 제거 : 선점하여 사용할 수 있는 일부 자원에는 효과적이다. 하지만 모든 자원이 선점 가능한 것은 아니므로 범용성이 떨어진다.

d. 원형 대기 조건 : 모든자원에 번호를 붙이고 오름차순으로 자원을 할당한다. (단)=>컴퓨터 시스템 내 수많은 자원에 번호를 붙이는 것은 간단하지 않으며, 특정 자원의 활용률이 떨어질 수 있다.

2. 교착 상태 회피 : 프로세스들에 배분할 수 있는 자원의 양을고려하여 교착 상태가 발생하지 않을 정도의 양만큼 자원을 배분하는 방법이다.

* 안전 상태 : 교착 상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태

* 불안전 상태 : 교착 상태가 발생할 수도 있는 상황

* 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서

(따라서 안전 상태는 안전 순서열대로 프로세스들에 자원을 배분하여 교착 상태가 발생하지 않는 상태 / 불안전 상태는 안전 순서열이 없어 교착 상태가 발생할 수 있는 위험이 있는 상태이다.)

3. 교착 상태 검출 후 회복 : 교착 상태 발생을 인정하고 사후에 조치하는 방식이다.

=> 운영체제는 프로세스들이 자원을 요구할 때마다 그때그때 모두 할당하고, 교착상태 발생 여부를 주기적으로 검사한다. 그리고 교착 상태가 검출되면 그 때! 다음과 같은 방식으로 해결한다.

a. 선점을 통한 회복 : 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식

b. 프로세스 강제 종료를 통한 회복 : 교착 상태에 놓인 프로세스를 모두 강제 종료하거나 / 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료한다. (=> 전자는 한 방에 해결할 수 있으나 작업 내역을 잃을 가능성이 있고, 후자는 작업 내역을 잃는 프로세스는 최대한 줄일 수있으나 교착 상태가 없어졌는지 여부를 확인하는 과정에서 오버헤드를 야기한다.)

# data[].attributes.attachment_link.title
[혼공컴운] 5주차 | 프로세스 동기화, 교착 상태

# data[].attributes.attachment_link.description
이번 주차는▶ Chapter 12 프로세스 동기화▶ Chapter 13 교착 상태 이다.먼저 Chapter 12 프로세스 동기화를 살펴보자. 동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 협력해야 한다. 이러한 프로세스들은 실행 순서와 자원의 일관성을 보장해야하므로 동기화돼야 한다. 여기서 프로세스 동기화란, 프로세스들 사이의 수행 시기를 맞추는 것이다.수행 시기를 맞춘다는 것은 실행 순서 제어와 상호 배제를 의미한다.1.

# data[].attributes.body
5주차 과제 제출합니다.

# data[].attributes.attachment_link.description
[혼공학습단] - [혼공학습단 12기] 혼자 공부하는 SQL - 1주차[혼공학습단] - [혼공학습단 12기] 혼자 공부하는 SQL - 2주차[혼공학습단] - [혼공학습단 12기] 혼자 공부하는 SQL - 3주차[혼공학습단] - [혼공학습단 12기] 혼자 공부하는 SQL - 4주차 - 인덱스인덱스: 데이터를 빠르게 찾을 수 있도록 도와주는 도구클러스터형 인덱스: 기본키로 지정하면 자동생성되며 테이블에 1개만 생성가능예) 영어 사전보조 인덱스: 고유키로 지정하면 자동 생성되며 여러개를 생성가능(자동 정렬기능은 없다.)예) 책의 뒤의 찾아보기 * 필요없는 인덱스를 만들면, DB가 차지하는 공간만 더 늘어나고 인덱스를 이용해 데이터를 찾는 것이 전체 테이블을 찾아보는 것보다 느려진다. (인덱스는 테이블크기의 1…

# data[].attributes.body
5주차 과제 후딱 했습니다~~!!! 앞으로 안 미뤄지도록 노력할게요! 완주까지도 얼마 안남았네염 ㅎㅅㅎ

# data[].attributes.body
안녕하세요 가입인사 드려요.

# data[].attributes.attachment_link.readable_text
커리큐럼

k-평균 알고리즘 소개

k-평균 알고리즘 작동 방식은 다음과 같다
1. 무작위로 k개의 클러스터 중심을 정함
2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정함
3. 클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경하
4. 클러스터 중심에 변화가 없을 때까지 2번으로 돌아가 반복함

그림으로 나타내면 아래와 같음
K평균

모델훈련

# data[].attributes.attachment_link.title
[혼공] 혼공12기 혼공머신 5주차 기본미션

# data[].attributes.attachment_link.description
기본미션] Chapter06 k-평균 알고리즘 작동 방식 설명하기k-평균 알고리즘 소개 k-평균 알고리즘 작동 방식은 다음과 같다1. 무작위로 k개의 클러스터 중심을 정함 2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정함 3. 클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경하 4.

# data[].attributes.body
혼공네트워크 5주차 제출합니다!! :)

# data[].attributes.attachment_link.title
[혼공학습단 12기]혼공 네트워크 스터디 5주차 - 응용 계층

# data[].attributes.attachment_link.description
저번주에는 혼자 공부하는 네트워크 4주차 스터디를 통해 컴퓨터 네트워크의 전송 계층 내용에 대해 알아보았다.이번 5주차에는 OSI 7계층 중에 응용 계층에 대한 내용을 살펴보도록 하자!DNS와 자원개요서버와 클라이언트는 ‘메시지를 주고받고자 하는 대상’ & ‘송수신하고자 하는 정보’ 이렇게 2가지를 식별할 수 있어야 한다. 메시지를 주고받고자 하는 대상을 파악하기 위해서는 우리가 흔히 아는 IP 주소 외에도 도메인 네임을 사용할 수 있다! 송수신하고자 하는 정보를 식별하기 위한 방법은 위치 기반의 식별자인 URL과 이름 기반의 식별자인 URN이 있다. - 메시지를 주고받고자 하는 대상 식별 : IP 주소 & 도메인 네임 - 송수신하고자 하는 정보 식별 : URL(위치 기반 식별자) & URN(이름 기반…

# data[].attributes.body
혼공네트 5주차 제출합니다.

# data[].attributes.attachment_link.title
카너먼의 블로그입니다 : 네이버 블로그

# data[].attributes.body
5주차 제출합니다!

# data[].attributes.attachment_link.title
혼공머신5주차_박다현-2

# data[].attributes.body
https://blog.naver.com/timkawa/223544265380

5주차 과제 제출합니다. 배열까지 가니 새삼 그동안 많은 양을 학습했다고 느껴지네요! 더 파이팅합시다ㅎㅎ

# data[].attributes.body
5주차 제출합니다.

# data[].attributes.attachment_link.readable_text
Ch12. 프로세스 동기화

동기화

동기화: 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서로 실행하게 하는 것

실행 순서 제어를 위한 동기화: 프로세스들이 특정 순서대로 실행되도록 조정함.
ex) reader 프로세스는 writer 프로세스 실행이 끝나야 실행될 수 있음.

상호 배제 (mutual exclusion)를 위한 동기화: 동시에 여러 프로세스가 공유 자원에 접근하는 것을 방지함.

공유 자원과 임계 구역

공유 자원 (shared resource): 여러 프로세스가 공동으로 사용하는 변수, 메모리, 파일 등의 자원
임계 구역 (critical section): 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 영역
레이스 컨디션 (race cindution): 여러 프로세스가 공유 자원에 동시에 접근하는 상황.
여러 프로세스가 동시에 임계구역의 코드를 실행하는 상황.

임계 구역 문제 해결 조건:

상호 배제 (mutual exclusion): 한 프로세스가 임계 구역에 진입한 동안 다른 프로세스는 해당 구역에 진입할 수 없음.

잔행 (progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 함.
자원을 필요로 하는 프로세스는 계속해서 진입할 수 있어야 함.

유한 대기 (bounded waiting): 어떤 프로세스도 임계 구역에 들어오기 위해 무한 대기해서는 안 됨.

동기화 기법

뮤텍스 락 (Mutex lock; MUTual EXclousion lock)

상호 배제를 위한 동기화 도구로, 하나의 공유 자원에 하나의 프로세스만 접근할 수 있도록 보장함.

형태:

전역 변수 lock: 공유 자원을 보호하기 위해 사용되는 자물쇠 역할의 변수

acquire 함수: 임계 구역에 들어가기 전에 호출되며, lock이 잠겨 있는지 확인한 후, 잠겨 있지 않으면 lock을 잠그고 진입함.

release 함수: 임계 구역에서 작업이 끝난 후 호출되며, lock을 해제하여 다른 프로세스가 접근할 수 있도록 함.

바쁜 대기 (busy waiting): acquire 함수가 반복적으로 lock의 상태를 확인하면서 대기하는 방식. CPU 자원을 지속적으로 소모하므로 비효율적임.

 acquire() { while (S == true) ;	// 바쁜 대기 lock = true; } release() { lock = false; } acquire(); // 임계 구역 release();

세마포 (semaphore)

공유 자원이 여러 개 있는 상황에서도 적용 가능한 동기화 도구

형태:

전역 변수 S: 현재 사용 가능한 자원의 수를 나타냄.

wait 함수 (P): 프로세스가 임계 구역에 진입하기 전에 호출되며, 자원이 있으면 S를 감소시키고 진입, 자원이 없으면 대기 큐에 프로세스를 추가하고 프로세스 상태를 대기 상태로 전환함.

signal 함수 (V): 임계 구역에서 작업이 끝난 후 호출되며, S를 증가시키고 대기 중인 프로세스를 준비 상태로 전환하여 준비 큐에 추가함.

 wait() { while (S <= 0) ; S--; if (S < 0) { add this process to Queue; sleep;	// 바쁜 대기 없이 프로세스를 대기 상태로 전환 } } signal() { S++; if (S <= 0) { remove a process p from Queue; wakeup(p);	// 대기 중인 프로세스를 깨움 } } wait(); // 임계 구역 signal();

모니터 (monitor)
- 프로세스가 인터페이스를 통해서만 공유 자원에 접근 가능하도록 하여 자원을 보호하고 프로세스 간에 동기화 제공함. 이는 세마포의 잘못된 코드 사용으로 발생할 수 있는 문제를 개선함.
- 작동 원리:
1. 임계 구역에 접근하고자 하는 프로세스는 모니터에 작업을 요청함.
2. 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고, 결과만 해당 프로세스에 알림.
- 조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수로, 모니터가 실행 순서 제어를 위한 동기화에 사용함.
- wait와 signal 연산을 수행
- 모니터 큐와는 별개로, 조건 변수에 대한 큐를 사용함. 이 큐는 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행을 중단시키기 위한 큐임.
- 작동 원리: 조건 변수에 대한 wait 연산이 호출되면 해당 프로세스는 조건 변수 큐에 삽입되며, signal 연산이 호출되면 큐에 대기 중이던 프로세스가 실행을 재개함.

Ch13. 교착 상태

교착 상태

교착 상태 (deadlock): 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상. 여러 프로세스가 작업을 진행하면서 발생하는 자연적인 현상임.

자원 할당 그래프

자원 할당 그래프 (resource-allocation graph): 프로세스가 어떤 자원을 사용 중이고, 어떤 자원을 기다리고 있는지 표현하는 방향성이 있는 그래프

프로세스는 원, 자원은 사각형으로 표현함.

자원 사각형 내에 사용할 수 있는 자원 개수를 점으로 표현함.

프로세스가 자원을 할당받은 경우, 자원에서 프로세스를 향해 화살표로 표시함.

프로세스가 자원을 기다리는 경우, 프로세스에서 자원을 향해 화살표로 표시함.

교착 상태 발생 필요 조건

상호 배제 (mutual exclusion): 한 프로세스가 사용하는 자원을 다른 프로세스가 동시에 사용할 수 없는 경우, 즉 상호 배제 상황에서 교착 상태가 발생할 수 있음.

점유와 대기 (hold and wait): 프로세스가 어떤 자원을 할당 받은 상태에서 다른 자원을 기다리는 경우 교착 상태가 발생할 수 있음.

비선점 (nonpreemptive): 한 프로세스가 점유 중인 자원을 다른 프로세스가 강제로 빼앗을 수 없는 경우 교착 상태가 발생할 수 있음.

원형 대기 (circular wait): 자원을 점유한 프로세스들이 서로 다른 자원을 기다리며 원형으로 대기하는 경우 교착 상태가 발생할 수 있음.

교착 상태 해결 방법

교착 상태 예방: 교착 상태 발생 피료 조건 네 가지 중 하나를 충족하지 못하게 하는 방법. 현실적으로 여러 제약이 있어 사용이 어렵거나 부작용이 있을 수 있음.

상호 배제 예방: 모든 자원을 공유 가능하게 함
-> 현실적으로 자원을 보호해야 하므로 대부분의 자원은 상호 배제가 필요

점유와 대기 예방: 특정 프로세스에 자원을 모두 할당하거나 아예 할당하지 않음
-> 자원의 활용률이 낮아지고, 기아 현상이 발생할 수 있음.

비선점 예방: 모든 자원을 빼앗을 수 있도록 함
-> 비선점 조건의 무력화 어려움.

원형 대기 예방: 모든 자원에 숫자를 부여하여 오름차순으로 자원 할당
-> 자원에 번호를 부여하는 게 복잡하고, 특정 순서로만 자원을 요청할 수 있어 유연성이 떨어질 수 있음.

교착 상태 회피: 프로세스에 교착 상태가 발생하지 않을 정도의 양만큼만 자원을 배분하는 방법.
자원의 총수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 상태와 불안정 상태로 나눔.
- 안정 상태: 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태 (안전 순서열 존재)
- 불안전 상태: 교착 상태가 발생할 수도 있는 상태 (안전 순서열 없음)
- 안전 순서열: 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
=> 시스템이 안정 상태를 유지하도록 자원을 할당하는 방법

교착 상태 검출 후 회복: 교착 상태 발생 여부를 주기적으로 검사하고, 교착 상태가 발생하면 이를 회복하는 방법

선점을 통한 회복: 교착 상태가 해결될 때까지 다른 프로세스의 자원을 빼앗아 한 프로세스에 자원을 몰아주는 방식

프로세스 강제 종료를 통한 회복: 교착 상태에 놓인 프로세스를 모두 강제 종료하거나, 교착 상태가 없어질 때까지 순차적으로 프로세스를 종료하는 방식

기본 문제

p.363 확인 문제 1번

세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.
세마포는 대기 큐를 사용해 자원이 사용 가능해질 때까지 프로세스를 대기 상태로 전환하여 관리하기 때문에 바쁜 대기가 필수적이지 않음.

추가 숙제

임계 구역과 상호 배제 개념 정리하기

# data[].attributes.attachment_link.description
Ch12. 프로세스 동기화 동기화 동기화: 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서로 실행하게 하는 것 실행 순서 제어를 위한 동기화: 프로세스들이 특정 순서대로 실행되도록 조정함. ex) reader 프로세스는 write

# data[].attributes.body
5주차 인증

# data[].attributes.attachment_link.title
[혼공머신] 5주차_비지도 학습

# data[].attributes.attachment_link.description
Chapter 6) 비지도 학습문제 : 타깃을 모르는 사진을 종류별로 분류하기비지도학습 : 타깃이 없을 때 사용하는 머신러닝 알고리즘군집 : 비슷한 샘플끼리 그룹으로 모으는 작업클러스터 : 군집 알고리즘에서 만든 그룹과일의 픽셀을 분석하여 구분해보기절대값을 이용하여,

# data[].attributes.body
사실 아직 공부 다 못해서 정리를 못했지만 과제 지각은 싫어서 올립니다..

# data[].attributes.body
5주차 과제 제출합니다!

# data[].attributes.body
5주차 제출합니다!

# data[].attributes.attachment_link.readable_text
혼공단 12기 5주차 학습 기록

응용 계층(Application Layer)의 개념과 DNS, HTTP에 대해 알아보자.

네트워크상에서 통신할 때는 IP 주소를 이용해 상대 호스트를 특정한다. 그러나 IP 주소는 언제든지 변할 수 있고 모든 호스트의 IP 주소를 외우고 있긴 어렵기 때문에 일반적으로는 도메인 네임(domain name)이라는 정보를 사용한다. 우리가 특정 사이트에 접속하기 위해 사용하는 www.example.com 과 같은 문자열 말이다.

도메인 네임과 IP 주소는 서로 대응된 관계로 도메인 네임 서버에서 관리된다.

도메인 네임은 점을 기준으로 뒤에서부터 계층적으로 구성되어 있다. 점(.)으로 표현되는 최상단에 위치한 루트 도메인(root domain)을 시작으로 최상위 도메인(TLD; Top-Level Domain) -> 2단계 도메인 -> 3단계 도메인 순으로 구성된다.

*일반적으로 루트 도메인은 생략되어 표기하지만, www.example.com. 으로도 접속할 수 있다. com, net, org와 같은 도메인은 루트 도메인이 아니라 최상위 도메인이다.

도메인 계층은 보통 3~5단계 정도로 구성되며 도메인 네임을 모두 포함한 것을 전체 주소 도메인 네임(FQDN; Fully-Qualified Domain Name)이라고 한다.

DNS는 계층적이고 분산된 도메인 네임 서버에 대한 관리 체계이다. 대표적인 네임 서버 유형은 아래와 같다.
로컬 네임 서버(Local Name Server)
로컬 네임 서버는 클라이언트가 도메인 네임으로 IP 주소를 요청할 때 처음으로 응답하는 서버이다. 캐시에 해당 도메인 네임이 존재하는지 여부를 확인한 후, 존재하지 않다면 상위 네임 서버인 루트 네임 서버로 요청을 전달한다.
루트 네임 서버(Root Name Server)
루트 네임 서버는 DNS 계층 구조에서 최상단에 위치하며, 어떤 TLD 네임 서버를 조회해야 하는지 정보를 제공하는 역할을 한다.

e.g. 로컬 네임 서버로부터 www.example.com.에 대한 질의를 받았을 경우, .com TLD 네임 서버의 주소를 반환
TLD 네임 서버(Top-Level Domain Name Server)
TLD 네임 서버는 이름 그대로 TLD에 대한 권한을 가진 서버이다. 요청받은 도메인에 대한 책임 네임 서버의 정보를 제공한다.

e.g. .com TLD 네임 서버는 로컬 네임 서버에게 example.com 도메인에 대한 책임 네임 서버의 주소를 전달
책임 네임 서버(Authoritative Name Server)
책임 네임 서버는 특정 도메인 네임에 대해 최종적인 권한을 가지는 네임 서버로, 해당 도메인 네임에 대한 정확한 IP 주소를 제공한다.

e.g. www.example.com 책임 네임 서버는 93.184.216.34 라는 IP 주소를 반환

도메인 네임에 대응하는 IP 주소를 알아내는 리졸빙 과정에 사용되는 질의 방식은 크게 두 가지로 나눌 수 있다.
재귀적 질의(Recursive query)
클라이언트가 로컬 네임 서버에 질의하면 루트 네임 서버 -> TLD 네임 서버 -> 책임 네임 서버 등을 순차적으로 조회하여 IP 주소를 얻는 방법이다. 해당 방법은 클라이언트가 단일 요청으로 필요한 IP 주소를 받게 되므로 중간 과정을 신경 쓸 필요가 없어 사용하기 편리하다는 장점이 있다.
반복적 질의(Iterative query)
클라이언트가 로컬 네임 서버에 질의하면 질의를 받은 서버가 직접적으로 다음 서버에 질의하는 것이 아닌, 다음 네임 서버의 주소를 반환하는 방식이다. 로컬 네임 서버가 질의하고 주소를 응답받는 과정을 반복하며 최종적인 IP 주소를 얻게 된다. 이 방식은 네임 서버들이 각자 역할을 분담하여 처리하므로, 특정 서버에 과부하가 걸리지 않는다는 장점이 있다.

두 방법 모두 각자의 장점이 있지만, 결국 도메인 네임을 리졸빙하기 위해서는 여러 단계를 거쳐야 하기 때문에 루트 네임 서버에 과부하가 생길 가능성이 있다. 그래서 실제로 네임 서버들은 기존에 응답받은 결과를 캐시로 저장하여 다음 질의에 사용하는 DNS 캐시(DNS cache) 를 활용한다.

위의 내용은 클라이언트가 메시지를 주고 받을 호스트를 특정하는 과정이라면, 송수신하려는 정보를 특정하기 위한 방식으로는 URI가 있다. URI는 자원을 식별할 수 있는 정보를 의미하며, 위치 기반 식별자인 URL과 이름 기반 식별자인 URN으로 나눌 수 있다.

자세한 내용은 이전에 포스팅한 글을 읽어보면 좋다.

HTTP는 응용 계층에서 정보를 주고받기 위해 사용되는 프로토콜이다.

HTTP의 주요 특성은 크게 4가지가 있다.

요청-응답 기반 동작
클라이언트와 서버는 HTTP 요청 메시지와 응답 메시지를 주고받으면서 통신한다.

미디어 독립성
HTTP는 클라이언트와 서버 간 통신에서 주고받을 자원의 종류(media type/MIME type)에 제한을 두지 않고 독립적으로 동작할 수 있다.

MIME type에 관한 자세한 정보는 아래 포스팅에서 확인할 수 있다.

스테이트리스(stateless)
각각의 HTTP 요청과 응답은 독립적으로 처리되므로 서버는 클라이언트의 이전 요청이나 상태를 기억하지 않는다. 그래서 서버의 부담은 줄어들고 네트워크 자원의 효율적 관리가 가능해진다.

요청과 응답을 독립적으로 처리한다는 것은 특정 클라이언트가 특정 서버에 종속되지 않는다는 것을 의미하며, 언제든 쉽게 서버를 추가하거나 다른 서버로 대체할 수 있다는 확장성(scalability)과 견고성(robustness) 이 높다는 것을 나타낸다.

지속 연결(persistent connection)
TCP 상에서 동작하는 HTTP는 1.0 이하 버전에서는 매번 HTTP 요청-응답을 진행할 때, TCP 연결을 설정하고 해제하는 과정을 반복해야 했었다. (비지속 연결)

그러나 최근 사용되는 HTTP(1.1 이상)에서는 지속적인 연결로 한 번의 TCP 연결에서도 여러 개의 요청을 전송할 수 있어 네트워크 효율성이 크게 개선되었다.

HTTP 요청 메시지 예시로 메시지 구조를 파악해 보자.

GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br GET /index.html HTTP/1.1
요청 라인(Request Line)
HTTP 요청 메시지의 시작인 요청 라인은 ${메서드} ${요청 리소스 경로} ${사용 중인 HTTP 버전} 으로 구성된다. 메서드는 GET, POST, PUT, DELETE 등이 대표적이고 요청 리소스 경로는 보통 URL 경로가 명시된다. 경로는 하위 경로가 없더라도 슬래시(/)로 표기해야 한다.

Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br
헤더(Header)
헤더는 위 내용 말고도 여러 종류가 있으며, HTTP 메시지에는 본문(Body)이 포함될 수도 있다.

HTTP 응답 메시지 구조도 간단하게 살펴보면,

HTTP/1.1 200 OK Date: Sat, 10 Aug 2024 12:00:00 GMT Server: Apache/2.4.29 (Ubuntu) Last-Modified: Mon, 05 Jul 2024 15:00:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 305 <!DOCTYPE html> <html> <head> <title>Welcome to Example</title> </head> <body> <h1>Hello, World!</h1> <p>This is a simple HTML page.</p> </body> </html> HTTP/1.1 200 OK
상태 라인(Status Line)
HTTP 응답 메시지의 시작인 상태 라인은 ${사용 중인 HTTP 버전} ${상태 코드} ${상태 메시지} 로 구성된다.

Date: Sat, 10 Aug 2024 12:00:00 GMT Server: Apache/2.4.29 (Ubuntu) Last-Modified: Mon, 05 Jul 2024 15:00:00 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 305
헤더(Header) 본문(Body)
응답 본문에는 요청된 리소스 내용이 포함된다.

HTTP 요청 메시지에서 사용할 수 있는 메서드와 응답 메시지에서의 상태 코드를 간단하게 정리해 보면 아래와 같다.

각 메서드 사용 방법은 이전 포스팅에서 확인할 수 있다.

1. 도메인 네임과 네임 서버에 대한 설명으로 옳지 않은 것을 골라 보세요. (p.271)

(1) 8.8.8.8은 대표적인 공개 DNS 서버로, 구글이 관리합니다. (2) 도메인 네임은 호스트를 특정할 수 있는 문자열 형태의 정보입니다. (3) DNS는 계층적이고 분산된 도메인 네임에 대한 관리 체계이자 이를 관리하는 프로토콜입니다. (4) www.example.com 에서 루트 도메인은 com에 해당합니다.

정답: (4). 루트 도메인은 마지막에 .으로 표기하며 생략될 수 있다. com은 루트 도메인이 아니라 TLD(Top-Level Domain)이다.

2. HTTP 상태 코드에 대한 설명으로 옳지 않은 것을 골라 보세요. (p.307)

(1) 300번대 상태 코드는 요청한 자원이 존재하지 않음을 의미합니다. (2) 400번대 상태 코드는 클라이언트에 의한 에러를 의미합니다. (3) 500번대 상태 코드는 서버에 의한 에러를 의미합니다. (4) 200번대 상태 코드는 요청이 성공했음을 의미합니다.

정답: (1) 300번대 상태 코드는 리다이렉션 관련 상태 코드이다.

Q. HTTP 요청 메시지 확인해 보기

Chrome에서 개발자 도구를 사용하면 HTTP 요청을 확인해 볼 수 있다.

macOS 기준, command+option+I 단축키를 눌러 개발자 도구를 열고, Network 탭을 선택한다. Network 탭에서 확인하고 싶은 요청을 클릭하면 오른쪽에 세부 정보가 나타나고, Headers 섹션에서 HTTP 요청 메시지의 메서드, URL, 헤더 등을 확인할 수 있다.

[📚book] 혼자 공부하는 네트워크

# data[].attributes.attachment_link.description
혼공단 12기 5주차 학습 기록 응용 계층(Application Layer)의 개념과 DNS, HTTP에 대해 알아보자. 도메인과 네임 서버 네트워크상에서 통신할 때는 IP 주소를 이용해 상대 호스트를 특정한다. 그러나 IP 주소는 언제든지 변할 수 있고 모든 호스트의 IP 주소를 외우고 있긴 어렵기 때문에 일반적으로는 도메인 네임(domain name)이라는 정보를 사용한다.

# data[].attributes.body
5주차 제출합니다.. 너무 더워요

# data[].attributes.attachment_link.readable_text
동기화란!

운영체제의 프로세스 관리 서비스 중 가장 중요한 두가지를 꼽자면 스케줄링과 동기화이다.

동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해서 서로 협력하여 실행되며, 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화(synchronization)되어야 한다.

동기화의 의미

프로세스 동기화 란 프로세스들 사이의 수행 시기를 맞추는 것을 의미한다. 프로세스들 사이의 수행 시기를 맞추는 것은 무엇을 의미할까?

실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기

상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

첫째, 실행 순서 제어를 위한 동기화

가령 파일에 값을 저장하는 Writer라는 프로세스와 파일에 저장된 값을 읽어 들이는 Reader라는 프로세스가 동시에 실행 중이라고 가정한다면, 이 두 프로세스는 무작정 아무 순서대로 실행되어서는 안 된다. Reader프로세스는 Writer프로세스 실행이 끝나야 비로소 실행 될 수 있기 때문이다. 이렇게 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 첫 번째 프로세스 동기화 이다.

둘째, 상호 배제를 위한 동기화

상호 배제(mutual exclusion)는 공유가 불가능 자원의 동시 사용을 피하기 위해 사용하는 알고리즘이다. 예시를 들어보면 10만원이 있는 계좌에 프로세스 A는 2만원을 저축하고, 프로세스 B는 5만원을 저축하는 프로세스이다. 둘의 수행순서는 다음과 같다.

프로세스 A와 B가 동시에 실행되었다고 가정하면 당연히 17만원이 계좌에 남을 것이라고 예상되지만, 동기화가 제대로 이루어지지 않은 경우 아래와 같은 결과가 나올 수 있다.

왜 이런 일이 발생할까? A와 B는 '잔액'이라는 데이터를 동시에 사용하는데, A가 끝나기도 전에 B가 잔액을 읽어버렸기 때문이다. A와 B를 올바르게 실행하기 위해서는 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 한다.

생산자와 소비자 문제

생산자와 소비자 문제는 물건을 계속해서 생산하는 프로세스인 생산와 물건을 계속해서 소비하는 프로세스인 소비자로 이루어져 있습니다.

생산자와 소비자는 '총합'이라는 데이터를 공유하고 있습니다. 생산자는 버퍼에 물건을 넣은 후, 물건의 총합에 해당하는 변수를 1 증가시키고, 소비자는 1 감소시킨다.

총합의 변수가 10이라고 가정하고, 위와 같은 상태에서 생산자와 소비자를 각각 100,000번 동시에 실행해 보자. 총합 변수가 10으로 변하지 않을거라 예상되지만 예상치 못한 결과를 받을 수 있다.

이는 생산자 프로세스와 소비자 프로세스가 제대로 동기화 되지 않았기 때문에 발생한 문제이다. 계좌 잔액 문제와 생산자 소비자 문제는 동시에 접근해서는 안 된느 자원에 동시에 접근 했기에 발생한 문제 라고 볼 수 있다.

공유자원과 임계구역

계좌잔액문제와 생산자 소비자 문제 예시에서 동시에 실행되는 프로세스들은 '잔액', '총합'이라는 공동의 자원을 두고 작업을 했다. 이러한 자원을 공유 자원(shared resource)라고 한다. 공유 자원은 전역변수가 될 수 도있고, 파일, 입출력장치, 보조기억장치가 될 수 있다.

그리고 이 공유 자원 중에는 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원이 있다. 앞서 '잔액', '총합'변수가 이러한 경우이다. 이렇게 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)이라고 한다.

두 개 이상의 프로세스가 임계구역에 진입하고자 하면 둘 중 하나는 대기해야한다. 임계구역에 먼저 진입한 프로세스의 작업이 마무리되면 그제서야 비로소 기다렸던 프로세스가 임계 구역에 진입한다.

하지만 잘못된 싱행으로 인해 여러 프로세스가 동시 다발적으로 임계구역의 코드를 실행하여 자원의 일관성이 깨지는 등 문제가 발생하는 경우를 레이스 컨디션(race condition)이라고 한다.

레이스 컨디션이 발생하는 근본적인 이유는 우리가 사용하는 코드인 고급 언어를 컴퓨터 내부에서 여러 줄의 저급 언어로 변환되어 실행하는 과정에서 문맥 교환이 일어나 문제가 발생하는 것이다.

이때, 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것을 의미한다.

상호 배제를 위한 동기화를 위해서는 아래 세가지 원칙이 반드시 지켜져야한다.

상호배제mutual exclusion : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.

진행progress : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

유한 대기bounded waiting : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안된다.)

확인문제

동기화의 의미에 대한 옳은 설명을 다음 보기에서 찾아 쓰세요

(1)를 위한 동기화 : 프로세스를 올바른 순서대로 실행하기

(2)를 위한 동기화 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

답 : 1 - 실행 순서 제어, 2 - 상호배제

임계 구역에 대한 설명으로 옳지 않은 것을 고르세요.
① 임계 구역에서 여러 개의 프로세스가 동시에 실행해도 무방하다.
② 임계 구역에서 여러 프로세스가 동시에 실행할 경우 레이스 컨디션이 발생한다.
③ 임계 구역에서 실행되는 프로세스가 있다면 다른 프로세스는 기다려야 한다.
④ 운영체제는 임계 구역을 관리한다.

답 : 1 - 동시에 실행하면 레이스 컨디션이 발생한다. 문제가 생길 수 있고, 이를 방지하기 위해 상호 배제를 위한 동기화를 한다.

동기화 기법

동기화는 어떻게 이루어져 있을까? 어떻게 해야 임계 구역에 오직 하나의 프로세스만 진입하게 하고, 올바른 실행 순서를 보장 할 수 있을까? 이를위해 뮤텍스 락, 세마포, 모니터 를 학습하자

뮤텍스 락

상호배제를 위한 동기화 도구이다. 예시로 한명의 인원만 들어갈 수 있는 탈의실은 '임계 구역', 손님들은 '프로세스' 이다. 탈의실을 이용하기 위해서는 일단 탈의실을 열어 보고 자물쇠가 걸려 있다면 탈의실에 사람이 있다고 판단한다.

이 자물쇠 기능을 코드로 구현한것이 뮤텍스 락(Mutex lock)이다. 뮤텍스 락은 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구이다. 뮤텍스 락의 매우 단순한 형태는 하나의 전역 변수와 두 개의 함수로 구현할 수 있다.

자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock

임계 구역을 잠그는 역할 : acquire 함수

임계 구역의 잠금을 해제하는 역할 : release 함수

aquire 함수 는 프로세스가 임계구역에 진입하기 전에 호출하는 함수이다. 만일 임계 구역이 잠겨져 있다면 임계 구역이 열릴때까지 반복적으로 확인하고 열려 있다면 임계구역을 잠그는 함수이다.

release 함수 는 임계 구역에서의 작업이 끝나고 호출하는 함수이다. 현재 잠긴 구역을 열어주는 함수라고 보면된다

acquire() { while (lock == true) // 임계 구역이 잠겨있는 동안 ;   // 잠겨있는지를 반복적으로 확인 lock = true;  // 잠겨있지 않다면 잠금 } release() { lock = false; // 임계 구역 작업이 끝났으니 작업해체 }

하지만 acquire 함수를 다시보면 임계구역이 잠겨있을 경우 프로세스는 반복적으로 lock을 확인하는 것을 알 수 있다. 이는 쉴 새없이 반복하며 확인해 보는 것으로 이런 대기방식을 바쁜 대기(busy waiting)이라고 한다.

세마포

세마포(semaphore)는 뮤텍스락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구이다. 세마포는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.

세마포는 뮤텍스 락과 두 개의 함수로 단순하게 구현할 수 있다.

임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유자원의 개수)를 나타 내는 전역 변수 S

임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수

임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수

세마포도 사용할 때 임계 구역 진입 전후로 wait()와 signal()을 호출한다.
wait 함수는 아래와 같이 만든다.

wait() { while(S <= 0) { ; } S--

만일 임계 구역에 진입할 수 있는 프로세스 개수가 0 이하라면

사용할 수 있는 자원이 있는지 반복적으로 확인하고,

임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1감소시키고 임계 구역 진입한다.

signal 함수는 다음과 같이 만든다

임계 구역에서의 작업을 마친 뒤 S를 1증가시킨다.

여기서 한 가지 문제가 있다. 이는 뮤텍스 락에도 해당하는 문제로, 사용할 수 있는 공유 자원이 없는 경우 프로세스는 무작정 무한히 반복하며 S를 확인해야한다. 이렇게 바쁜 대기를 반복할 경우 CPU주기를 낭비한다는 점에서 큰 손해이다.

그래서 세마포는 더 좋은 방법을 사용한다. wait함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣는다. 그리고 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal함수를 호출하면 signal 함수는 대기중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비상태로 변경한뒤 준비 큐로 옮겨준다.

이를 간단한 코드로 보자.

wait() { S--; if( S < 0) { add this process to Queue; sleep(); } }

signal() { S++; if(S<=0) { remove a process p from Queue; wakeup(p); } }

대기 큐에 있는 프로세스 p를 제거한다.

프로세스 p를 대기상태에서 준비상태로 만든다.

지금까지는 세마포를 이용한 상호 배제를 위한 동기화 기법이었다면, 이번에는 세마포를 이용해 프로세스의 순서를 제어하는 방법에 대해 알아보자.

세마포를 이용한다면 동시에 실행되는 프로세스의 실행 순서도 원하는 대로 제어할 수 있다.

방법은 간단하다. 세마포의 변수 S를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait함수를 붙이면된다.

p1  p2 wait() // 임계 구역	 // 임계구역 signal()

모니터

세마포는 매우 훌륭하지만, 사용하기가 불편한 면이 있다. 임계 구역 앞뒤로 일일이 wait와 signal함수를 명시하는것은 번거로운 일이기 때문이다.

이에 최근에 등장한 동기화 도구가 모니터(monitor)이다. 세마포에 비하면 사용하기에 훨씬 편리한 도구이다. 모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리한다. 그리고 프로세스는 바늗시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.

이를 위해 모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 한다.

이 밖에도 모니터는 세마포와 마찬가지로 실행 순서 제어를 위한 동기화도 제공한다. 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수(condition variable)를 사용한다. 조건 변수는 프로세스나 스페드의 실행 순서를 제어하기 위해 사용하는 특별한 변수이다.

조건 변수로는 wait와 signal 연산을 수행할 수 있다. 우선 wait는 호출한 프로세스의 상태를 대기상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산이다.

여기서 모니터에 진입하기 위해 삽입되는 큐와 wait가 호출되어 실행이 중단된 프로세스들이 삽입되는 큐는 다르다 !

전자는 모니터에 한 번에 하나의 프로세스만 진입하도록 하기 위함

후자는 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행이 중단되어 기다리기 위해 만들어진 큐

모니터에 진입한 어떤 프로세스가 x.wait()를 통해 조건 변수 x에 대한 wait를 호출했다고 가정하면, 조건 변수 x에 대한 큐에 삽입되므로 모니터는 다시 비게된다.

그럼 다른 프로세스가 들어올 수 있고, wait연산으로 일시 중지된 프로세스는 다른 프로세스의 signal연산을 통해 실행이 재개 될 수 있다. 어떤 프로세스가 x.signal()을 통해 조건 변수 x에 대해 대기 상태에 있던 프로세스가 깨어나 모니터안으로 다시 들어 올 수 있게된다.

하지만 모니터 안에는 하나의 프로세스만이 이을 수 있으므로 wait를 호출했던 프로세스는 signal을 호출한 프로세스가 모니터를 떠난 뒤에 실행되거나, signal을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 signal을 호출한 프로세스의 수행을 제개한다.

중요한 점은 모니터는 조건 변수를 이용하여 아래와 같은 프로세스 실행 순서 제어를 위한 동기화를 제공한다는 것이다.
1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.

확인문제

뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룬다.
② 세마포는 공유 자원이 여러 개있는 상황에서도 이용할 수 있다.
③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있다.
④ 세마포를 이용하면 반드시 바쁜 대기를 해야한다.

답 : 4 - 세마포는 바쁜대기를 방지 하기 위해 대기 큐를 사용해서 CPU주기의 낭비를 막을 수 있다.

조건 변수 x와 y가 있다고 할 때, 스레드 A는 실행과정에서 x.wait를 호출하였고, 스레드 B는 y.wait를 호출했다. 스레드 C가 y.signal을 호출했을 때 스레드 A와 B중 실행이 재개되는 스레드는 무엇일까?

답 : B, y.signal을 호출하였으므로 조건변수 y의 wait를 호출한 스레드를 깨우게 된다.

보기 : 실행순서제어, 상호배제, 입출력장치

세마포를 이용하면 동시에 실행되는 프로세스 혹은 스레드간에 ( 1)를 위한 동기화와 ( 2)를 위한 동기화를 할 수 있다.

답 : 상호배제, 실행순서제어

교착 상태란?

러시아워의 교통상태처럼 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작겅 기다린다면 그 어떤 프로세스도 더 이상 진행할 수없는 교착상태가된다. 교착상태 는 정확히 무엇이고, 언제 발생할까?

식사하는 철학자 문제

이 문제는 교착 상태를 설명하기 위한 아주 고전적인 문제이다. 이 문제는 교착상태가 어떤 상황에서 왜 발생하는지, 나아가 교착상태를 어떻게 해결할 수 있는지 엿볼 수 있는 가상의 문제 시나리오이다.

원탁에 다섯명의 철학자가 앉아있고, 식사에 필요한 포크가 철학자들 사이 사이 있다. 그리고 철학자들 앞에 있는 식사는 두개의 포크로 먹을 수 있다. 그리고 이와 같은 순서대로 식사를 한다.

일정 시간 생각을 한다.

왼쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.

오른쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면집어든다.

양쪽의 포크를 잡으면 일정 시간만큼 식사를 한다.

오른쪽 포크를 내려놓는다.

왼쪽 포크를 내려놓는다.

다시 1번으로 돌아간다.

언뜻 보면 위 순서에는 아무런 문제가 없어보이지만, 모든 철학자가 동시에 포크를 집어 실사를 하면 어떤 철학자도 식사를 할 수 없고, 영원이 생각만 해야할 수있다. 이렇게 일어나지 않을 사건을 기다리며 진행이 멈춰버리는 현상을 교착 상태(deadlock)이라고 한다.

식사하는 철학자 문제에서 철학자는 프로세스 혹은 스레드, 포크는 자원, 생각하는 행위는 자원을 기다리는 것에 빗대어 볼 수 있다. 그리고 포크는 한 번에 하나의 프로세스 혹은 스레드만 접근 할 수 있으니 임계 구역이라고 볼 수 있다.

교착 상태는 아주 다양한 상황에서 발생한다. 이러한 교착상태를 해결하기 위해서는 첫째, 교착 상태가 발생했을 때의 상황을 정확히 표현해보고, 둘째, 교착 상태가 일어나는 근본적인 이유에 대해 알아야한다.

자원할당 그래프

자원할당 그래프 (Resource Allocation Graph)의 개념은 교착상태 발견을 위해 프로세스와 자원과의 관계와 할당 상태를 표현하는 그래프이다.

자원 할당 그래프의 구성요소

교착상태 발생 조건

교착 상태가 발생할 조건에는 네 가지가 있다. 바로 상호 배제, 점유와 대기, 비선점, 원형 대기 이다. 즉 조건 중 하나라도 만족하지 않으면 교착 상태가 발생하지 않지만, 조건이 모두 만족될 때 교착 상태가 발생할 가능성이 생긴다고 보면된다.

상호배제

한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때, 즉 상호배체 상황에서 교착 상태가 발생할 수 있다.

점유와 대기

어떠한 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다린다면 교착 상태가 발생할 수 있다. 이렇게 '자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태'를 점유와 대기 라고 한다.

비선점

철학자 문제에서 모두 점잖게 포크를 기다리기만 했다. 이처럼 교착 상태가 발생하게된 또 하나의 근본적인 문제는 프로세스가 자원을 비선점 하고 있었기 때문이다. 비선점 자원은 그 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 이용할수 있다. 즉, 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못했기 때문에 교착 상태가 발생했다고 볼 수 있다.

원형 대기

자원 할당 그래프가 원의 형태로 그려지면 교착 상태가 발생할 수 있다. 이렇게 프로세스들이 원의 형태로 자원을 대기하는 것을 원형 대기 라고 한다.

자원 할달 그래프가 원의 형태를 띄지 않으면 교착 상태는 발생하지 않으나, 원의 형태를 띈다고 해서 반드시 교착 상태가 일어나는것은 아니다!!

확인 문제

교착상태에 대한 설명으로 옳지 않은 것은?
① 교착 상태는 다양한 상황에서 발생할 수 있다.
② 교착 상태는 자원 할당 그래프로 표현할 수 있다.
③ 교착 상태는 일어나지 않을 사건을 기다리며 무한히 대기하는 현상을 의미한다.
④ 식사하는 철학자 문제에서 단 한명의 철학자가 식사를 해도 교착 상태가 발생한다.

답 : 4. 모든 철학자가 동시에 식사를 하려고 해서 교착 상태가 발생한 것이었다.!!

교착 상태가 발생할 수있는 조건 네 가지 조건을 모두 쓰시오.

답 : 상호배제, 점유와 대기, 비선점, 원형 대기

교착 상태 해결방법

운영체제는 애초에 교착 상태가 일어나지 않도록 교착 상태 발생 조건에 부합하지 않게 자원을 분배하여 교착 상태를 예방할 수 있다. 교착 상태가 발생하지 않을 정도로 조금씩 자원을 할당하다가 교착 상태의 위험이 있다면 자원을 할당하지 않는 방식으로 교착 상태를 회피도 할 수있다. 그리고 자원을 제약 없이 할당하다가 교착 상태가 검출되면 교착 상태를 회복 하는 방법을 취할 수 있다.

교착 상태 예방

교착 상태 발생 필요 조건 네 가지 중 하나를 충족하지 못하게 하는 방법과 같다. 네 가지 조건 중 하나의 조건이라도 만족시키지 않게 할당하면 교착상태는 발생하지 않는다.

우선 자원의 상호배제를 없애 볼까?

자원의 상호 배제를 없앤다는 말의 의미는 모든 자원을 공유 가능하게 만든다는 말과 같다. 다만 이론적으로는 교착상태를 없앨 수 있지만, 현실적으로 모든 자원의 상호 배제를 없애기는 어렵기에 현실에서 사용하기는 다소 무리가 있다.

그렇다면 점유와 대기를 없애보자

점유와 대기를 없애면 운영체제는 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분한다. 이 방식도 이론적으로는 교착상태를 해결 할 순 있지만, 단점도 있다.

우선 자원의 활용률이 낮아질 우려가 있다. 점유와 대기를 금지하면 한 프로세스에 필요한 자원들을 몰아주고, 그 다음에 다른 프로세스에 필요한 자원들을 몰아줘야 한다. 이는 당장 자원이 필요해도 기다리는 프로세스와 사용되지 않으면서 오랫동안 할당되는 자원을 다수 양산하기 때문에 자원의 활용률이 낮아진다.

게다가 점유와 대기를 금지하면 많은 자원을 사용하는 프로세스는 자원을 사용할 타이밍을 확보하기가 어렵고, 무한정 기다리게 되는 기아현상을 야기할 우려가 있다.

이번에는 비선점 조건을 없애보자

비선점 조건을 없애면 자원을 이용 중인 프로세스로부터 해당자원을 빼앗을 수있다. 이 방식은 선점하여 사용할 수 있는 일부 자원에 대해서는 효과적이다.

하지만 모든 자원이 선점 가능한 것이 아니다. 한 프로세스의 작업이 끝날 때까지 다른 프로세스가 기다려야 하는 자원도 얼마든지 있다. 그렇기에 비선점 조건을 없애 모든 자원을 빼앗을 수있도록 하여 교착상태를 예방하는 방법은 다소 범용성이 떨어진다.

마지막으로 원형 대기 조건을 없애보자.

모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하면 원형대기는 발생하지 않는다.

이 방식은 앞선 세방식에 비하면 비교적 현실적이고 실용적인 방식이지만, 단점은 있다. 모든 컴퓨터 시스템 내에 존재하는 수많은 자원에 번호를 붙이는 일은 그리 간단한 작이 아니고, 어떤 번호를 붙이는지에 따라 특정 자원의 활용률이 떨어질 수 있다.

교착 상태의 발생 조건을 원천적으로 제거하여 교착 상태를 사전에 방지하는 예방 방식은 교착 상태가 발생하지 않음을 보장할 수는 있지만 여러 부작용이 따른다 !

교착 상태 회피

교착 상태 회피는 교착 상태가 발생하지 않을 정도로만 조심 조심 자원을 할당하는 방식이다. 교착 상태 회피 방식에서는 교착 상태를 한정된 자원의 무분별한 할당으로 인해 발생하는 문제로 간주한다,

프로세스들에 할당할 수있는 자원이 한정된 상황에서 모든 프로세스들이 한 번에 많은 자원을 요구하면 교착 상태가 발생할 위험이 증가한다.

그렇기 때문에 프로세스들에 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 정도의 양만큼만 자원을 배분하는 방법이 교착 상태 회피이다.

교착 상태를 회피하는 방법을 학습하기 위해서는 안전 상태, 불안전 상태, 그리고 안전 순서열이라는 용어를 알아야한다.

안전 상태(safe state) : 교착 상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당 받고 종료될 수 있는 상태

불안전 상태(unsafe state) : 교착 상태가 발생할 수도 있는 상황

안전 순서열(safe sequence) : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서

운영체제가 교착 상태를 회피하기 위해서는 시스템 상태가 안전 상태에서 움직이는 경우에만 자원을 할당하면된다. 즉, 교착 상태 회피 방식은 항시 안전 상태를 유지하도록 자원을 할당하는 방식이라 보면 된다.

교착 상태 검출 후 회복

교착 상태 검출 후 회복은 교착 상태 발생을 인정하고 사후에 조치하는 방식이다.

이 방식에서 운영체제는 프로세스들이 자원을 요구할 때마다 그때그때 모두 할당하며, 교착 상태 발생 여부를 주기적으로 검사한다. 그리고 교착 상태가 검출되면 그때 비로소 다음과 같은 방식으로 회복한다.

선점을 통한 회복

교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식이다. 교착 상태가 해결될 때까지 다른 프로세스로부터 자원을 강제로 뺴앗고 한 프로세스에 할당하는 방식이다.

프로세스 강제 종료를 통한 회복

가장 단순하면서 확실한 방식이다. 운영체제는 교착 상태에 놓인 프로세스를 모두 강제 종료할 수도 있고, 교착 상태가 없어질 떄까지 한 프로세스씩 강제 종료할 수도 있다. 전자는 한 방에 해결할 수있는 강력한 방법이지만, 많은 프로세스들이 작업내역을 잃게 될 가능성이 있고, 후자는 작업 내역을 잃는것을 최대한 줄이지만, 교착 상태가 없어졌는지 여부를 확인하는 과정에서 오버헤드를 야기한다.

# data[].attributes.attachment_link.title
[혼공컴운] 5주차 - 프로세스 동기화, 교착 상태

# data[].attributes.attachment_link.description
프로세스 동기화 동기화란! 운영체제의 프로세스 관리 서비스 중 가장 중요한 두가지를 꼽자면 스케줄링과 동기화이다. 동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해서 서로 협력하여 실행되며, 실행 순서와 자원의 일관성을 보장해야 하기에 반드시

# data[].attributes.body
5주차 제출합니다.

# data[].attributes.attachment_link.readable_text
혼공단

Hocube 2024. 8. 11. 18:09

클래스

객체를 생성하기 위한 틀. 객체가 가져야 할 변수나 메서드를 정의 한, 설계도이다.

객체

클래스에서 정의한 속성과 기능을 가진 실체를 '객체'라고 한다.

인스턴스

속성

객체 내부에 있는 값

메서드

모질라 문서에서 Math 객체와 관련된 내용을 읽고 사인 90도의 값을 구해보세요.

참고로 사인 90도는 1입니다. 아주 단순하게 생각해서 구현하면 0.8939966636005579라는 결과가 나옵니다.

0.8939966636005579가 나왔다면 왜 그런지, 그리고 이를 어떻게 해야 제대로 사용할 수 있는지 구글 검색 등을 활용해서 알아보고 코드를 수정하세요.

<script> const degree = 90; const radians = degree * (Math.PI / 180); console.log(Math.sin(radians)); // 1 출력 </script>

Math.sin() 메소드는 괄호 내부에 라디안 단위를 넣어야 한다.

# data[].attributes.attachment_link.description
기본 미션] 객체, 속성, 메소드가 무엇인지 설명하기 클래스객체를 생성하기 위한 틀. 객체가 가져야 할 변수나 메서드를 정의 한, 설계도이다. 객체클래스에서 정의한 속성과 기능을 가진 실체를 '객체'라고 한다. 인스턴스클래스를 가지고 구체적으로 값을 할당한 것을 '인스턴스'라고 한다. 속성객체 내부에 있는 값 메서드객체의 속성 중 함수 자료형인 속성을 특별히 메서드 라고 한다.

# data[].attributes.body
5주차 제출합니다.

# data[].attributes.attachment_link.readable_text
혼공단

Hocube 2024. 8. 11. 18:09

클래스

객체를 생성하기 위한 틀. 객체가 가져야 할 변수나 메서드를 정의 한, 설계도이다.

객체

클래스에서 정의한 속성과 기능을 가진 실체를 '객체'라고 한다.

인스턴스

속성

객체 내부에 있는 값

메서드

모질라 문서에서 Math 객체와 관련된 내용을 읽고 사인 90도의 값을 구해보세요.

참고로 사인 90도는 1입니다. 아주 단순하게 생각해서 구현하면 0.8939966636005579라는 결과가 나옵니다.

0.8939966636005579가 나왔다면 왜 그런지, 그리고 이를 어떻게 해야 제대로 사용할 수 있는지 구글 검색 등을 활용해서 알아보고 코드를 수정하세요.

<script> const degree = 90; const radians = degree * (Math.PI / 180); console.log(Math.sin(radians)); // 1 출력 </script>

Math.sin() 메소드는 괄호 내부에 라디안 단위를 넣어야 한다.

# data[].attributes.attachment_link.description
기본 미션] 객체, 속성, 메소드가 무엇인지 설명하기 클래스객체를 생성하기 위한 틀. 객체가 가져야 할 변수나 메서드를 정의 한, 설계도이다. 객체클래스에서 정의한 속성과 기능을 가진 실체를 '객체'라고 한다. 인스턴스클래스를 가지고 구체적으로 값을 할당한 것을 '인스턴스'라고 한다. 속성객체 내부에 있는 값 메서드객체의 속성 중 함수 자료형인 속성을 특별히 메서드 라고 한다.

# data[].attributes.body
방학 직후라서 그럴까요. 분량도 평소보다 짧은 것 같고,

수월하게 끝난 한 주 였습니다. 😀

다들 건강 조심하세요!

# data[].attributes.body
혼공네트 5주차 제출합니다.

# data[].attributes.attachment_link.description
5-1 DNS와 자원서버와 클라이언트는 메세지를 주고받고자 하는 대상과 송수신하고자 하는 정보를 식별할 수 있어야 한다.메세지를 주고받고자 하는 대상을 파악하기 위해서는 IP 주소 이외에 도메인 네임을 사용할 수 있다. 그리고 송수신하고자하는 정보를 식별하기 위한 방법으로는 위치 기반의 식별자인 URL과 이름 기반의 식별자인 URN이 있다. 도메인 네임과 네임 서버네트워크 상의 어떤 호스트를 특정하기 위해 IP 주소를 사용하는 것은 번거롭다. 통신하고자 하는 모든 호스트의 IP 주소를 기억하고 있기도 어렵고, 호스트의 IP 주소는 언제든지 바뀔 수 있기 때문이다. 그래서 일반적으로 사용자는 상대 호스트를 특정하기 위해 IP 주소보다는 도메인 네임을 많이 사용한다. 도메인 네임은 호스트의 IP 주소와 대…

# data[].attributes.body
지각안하기 목표 달성

# data[].attributes.attachment_link.title
곽소청바지 : 네이버 블로그

# data[].attributes.body
5주차 제출합니다!

# data[].attributes.attachment_link.title
훈쨩의 블로그 : 네이버 블로그

# data[].attributes.body
5주차

# data[].attributes.attachment_link.title
내 위키, 문서, 프로젝트를 모두 한 곳에서 만나는 커넥티드 워크스페이스 | Notion (노션)

# data[].attributes.attachment_link.description
사용하는 모든 업무 앱을 Notion 하나에 담아 팀원들과 함께하는 올인원 워크스페이스를 꾸려 보세요.

# data[].attributes.body
벌써 5주차네요! 더운데 다들 고생 많으셨습니다~ 마지막까지 힘내요!! 족장님도 화이팅하세요!!

# data[].attributes.body
한 주 남았습니다.

# data[].attributes.body
한주간 고생 많으셨습니다. 😍😆

# data[].attributes.body
5주차도 완료! 그림그리기는 언제나 재밌네요. 앞의 지난한(???) 과정을 거쳐야 즐거운 시간을 가질 수 있다는 삶의 진리...!

# data[].attributes.attachment_link.title
[혼공분석] 5주차_데이터 시각화 하기

# data[].attributes.attachment_link.description
이번 챕터에서는 정리한 데이터를 시각화 하는 방법에 대해서 설명하고 있다. 한땀한땀 모은 데이터를 시각…

# data[].attributes.body
혼공네트 5주차 제출합니다.

# data[].attributes.body
혼공알코 5주차 제출합니다.

# data[].attributes.attachment_link.description
5주차(8/5 ~ 8/11)Chapter 04Ch.04(04-3) 확인 문제 풀고 인증하기(p. 308 ~ 309)절차지향/객체지향/함수형 프로그래밍 특징 정리하기(p. 292 ~ 303) ■ 기본 과제3. 다음중 프로그래밍 언어와 가장 연관이 깊은 개념 연결하기 - 자바 -> JVM L virtual machine안에서 컴파일된 소스 코드가 동작하여서, 여러 OS 에서 동일하게 사용이 가능합니다.