스위치는 맥주소를 이용해서 장비를 로컬 네트워크로 연결해주고 라우터는 IP주소를 통해 다른 네트워크에 연결해줍니다.
기기 > 허브 > 스위치 > 라우터 > 인터넷
스위칭: 목적지로 출발한 데이터를 중간에 적합한 경로로 바꾸는 것
보통 OSI 7계층 중 2계층에서 동작하는 장비
1계층(물리 계층)에서 작동
허브는 자신에게 꽂혀있는 모든 장비에게 데이터를 전부 전달한다.
ex. 허브, 더미 허브
2계층(데이터 링크 계층)에서 작동
ex. 스위칭 허브
다른 방식에 비해 가성비가 좋고 구조가 간단하며 신뢰성이 높다
❓패킷에 의해 성능 저하가 발생하는(즉, 라우팅이 불가능한) 단점이 있다.
라우팅
네트워크 대역폭을 확장
L2 스위치+라우팅 기능 = MAC, IP주소를 알고있음
ex. 라우터, 공유기
외부의 요청을 서버들에 분산시킴(로드 밸런싱)
프로토콜을 기반으로 어플리케이션 별로 우선순위를 부여해서 스위칭
IP주소 + TCP/UDP 포트정보를 가지고 있음
보안 스위치
IP주소+TCP/UDP 포트정보+패킷내용으로 로드 밸런싱
IP 주소를 이용하여 라우팅을 하는 3계층(네트워크 계층)의 장비 (≈ L3 스위치)
외부 네트워크를 식별할 수 있다
라우터는 외부 네트워크의 신호를 구분할 수 있다
스위치는 브로드캐스트 도메인을 구분할 수 없지만 라우터는 브로드캐스트 도메인을 구분하여 서로 다른 네트워크 대역을 구분한다.
네트워크를 구분지어 브로드캐스트가 다른 네트워크에 송신되지 않도록 함
https://www.itworld.co.kr/news/167585#csidx1738bf3fcf2ce9389f51ce3515d0e6d
https://m.blog.naver.com/qbxlvnf11/221382123105
https://ojava.tistory.com/200
https://velog.io/@ragnarok_code/%EB%B8%8C%EB%A1%9C%EB%93%9C%EC%BA%90%EC%8A%A4%ED%8A%B8Broadcast%EB%9E%80
https://m.blog.naver.com/qbxlvnf11/221382123105
컴퓨터에서 프로그램을 실행하거나 작업을 할 때 컴퓨터는 메모리에 해당 프로그램을 올리고 실행을 하게 됩니다.
이때 주기억장치에서 빈번하게 기억 장소가 할당되고 반납됨에 따라 메모리의 할당과 제거가 빈번하게 일어나서 메모리 공간이 작은 조각으로 나뉘게 되어 사용 가능한 메모리가 충분함에도 메모리 할당이 불가능한 상태가 발생하는 것입니다
메모리 단편화에는 외부 단편화와 내부 단편화가 있는데 외부단편화는 단편화된 메모리가 여러 주소공간에 분산되어 프로세스에 할당할 수 없는 상태를 말합니다
내부 단편화는 프로세스가 필요이상의 메모리를 할당받아서 프로세스의 메모리 공간 내부에 빈 공간이 생기는 것을 말합니다.
메모리 단편화는 페이징, 세그먼트, 메모리 풀로 해결할 수 있는데 페이징은 프로세스를 일정 크기의 페이지 단위로 쪼개서 순서와 상관없이 적재해서 외부 단편화 문제를 해결할 수 있습니다. 세그먼트는 서로 다른 크기의 세그먼트로 메모리를 나눠서 적재하는 방법으로 내부 단편화를 해결할 수 있지만 외부단편화 문제가 발생합니다.
메모리풀은 고정된 크기의 블록을 미리 할당해 놓고 프로세스가 사용할 때 할당받고 사용후에 반납하는 방식으로 메모리가 미리 할당되어있어 메모리의 누수가 있긴 하지만 외부단편화와 내부단편화를 모두 해결할 수 있습니다
필요한 메모리보다 할당할 수 있는 메모리가 적어서 할당하지 못하는 상태? 이건 그냥 메모리단편화 정의같은데
단편화된 메모리가 분산되어있어서 프로세스에 할당할 수 없는 상태
프로세스가 필요 이상의 메모리를 할당받음
프로세스가 사용하는 메모리 공간 내부에 남는 부분이 생기는 것
프로세스를 일정 크기로 잘게 쪼개서(페이지) 순서와 상관없이 적재하는 것
순서를 고려하지 않으므로 외부 단편화 문제를 해결할 수 있음
내부 단편화 문제가 발생한다
프로세스를 서로 다른 크기로 쪼개서 적재하는 것
고정된 크기의 블록을 미리 할당해놓고 프로세스가 사용하고 반납한다
https://cocoon1787.tistory.com/859
https://daco2020.tistory.com/174
프로세스의 정의와 특징
컴퓨터에서 실행되는 프로그램을 말합니다. 프로그램을 실행하기 위해 메모리를 할당해서 메모리에 올라가면 프로세스가 되며 프로세스는 내부에 최소 하나의 스레드를 가지고 독립된 주소공간과 메모리 영역을 가집니다.
CPU Scheduling이란?
한정된 CPU로 여러 프로세스를 실행하기 위해서 특정 기준에따라 메모리를 할당하는 것
스케쥴링 알고리즘을 통해서 할당 순서 및 방법을 결정합니다.
스케쥴링 방법은 선점형 비선점형이 있으며 스케쥴링 알고리즘은 FCFS, SJF, PRIORITY, ROUND-ROBIN(시분할) 등이 있습니다
FCFS: 선점형
먼저 들어온 프로세스가 먼저 실행됨
SJF: 가장 짧은 프로세스를 먼저 실행 -> 비현실적
ROUND-ROBIN(시분할): 비선점형
처리가 다 끝나지 않아도 할당된 시간이 끝나면 넘어감
PRIORITY: 선점형/비선점형
새로운 프로세스가 우선순위가 높으면 먼저 작업함 -> starvation-> 해결: aging(오래 기다린 프로세스의 우선순위를 증가시킴)
https://zzsza.github.io/development/2018/07/29/cpu-scheduling-and-process/
프로세스 컨트롤 블록
프로세스간 스위칭(다른 프로세스의 스레드 사이의 스위칭)에는 PCB, TCB를 모두 저장해야하고 주소공간을 변경해야한다
스레드 컨트롤 블록
스레드에 대한 정보를 저장
PCB를 가리키는 포인터가 있음
커널 레벨의 컨텍스트 스위칭의 기본 단위
스레드간 컨텍스트 스위칭은 이 정보만 저장하면 됨
같은 프로세스 내의 스위칭은 주소공간을 바꿀 필요가 없다
멀티 스레드는 하나의 프로세스 안에 스레드가 여러 개 있는 것으로 힙을 제외한 프로세스의 메모리 영역을 공유하여 컨텍스트 스위칭으로 발생하는 오버헤드가 적다는 장점이 있지만 자원을 공유하기 때문에 동기화 문제가 발생할 수 있고 이를 고려해 설계(스케쥴링)해야합니다.
https://blockdmask.tistory.com/22
멀티 프로세스나 멀티 스레드를 사용하게 되면 공유자원의 문제가 발생하게 되는데 뮤텍스와 세마포어는 이렇게 여러개의 프로세스나 스레드가 공유자원에 동시에 접근하지 못하도록 하기 위한 동기화 매커니즘입니다. 둘은 동기화 대상이 되는 공유자원의 수에 따라 국분됩니다.
세마포어는 동기화대상(공유자원)이 하나이상일 때 사용하고 카운터라는 변수로 공유자원에 접근하는 프로세스의 갯수를 조절합니다. 뮤텍스는 이진 세마포어라고도 하는데 동기화 대상이 오직 하나뿐일 때 사용합니다
크롬
에서 하나의 탭이 문제가 생겼을 때 그 탭만 끄면 됨
프로세스의 컨텍스트 스위칭에는 IPC가 필요하다
여러개의 CPU가 1개의 메모리에 연결
두개의 코어가 프로세스를 두개씩 병렬로 분담(동시)해서 프로세스를 병행처리하는 것
IE
에서 하나의 탭이 문제가 생겼을 때 전체 창을 종료해야함
멀티스레딩은 여러 코어에서 한 번에 여러 개의 스레드를 처리하는 CPU 성능을 활용하는 프로그래밍의 한 유형입니다. 동시에 여러 개의 작업 또는 명령을 실행합니다.
프로그램 안에서 병렬 처리
스레드 수준뿐 아니라 명령어 수준의 병렬 처리에까지 신경을 쓰면서 하나의 코어에 대한 이용성을 증가
== 단일 CPU 자원을 효율적으로 쓴다
메인 스레드는 프로그램이 시작할 때 실행
병렬
로 실행되며, 대개 실행이 완료되면 메인 스레드와 결과를 동기화여러 개의 작업이 오랫동안 실행되는 경우에 적합
한 번에 실행해야 할 작은 명령이 많이 있는 경우, 각 명령에 대해 스레드를 만들면 그 수가 너무 많아지고 각각의 수명도 짧아져서 CPU 및 운영체제의 프로세싱 능력을 초과할 수 있습니다.
스레드 풀
을 사용해서 수명주기 문제를 완화할 수 있다ex. CPU 코어 < 스레드: CPU 리소스를 놓고 스레드 간에 경쟁 → 컨텍스트 스위칭
횟수 증가
하드웨어 리소스
를 공유할 때 서로를 간섭할 수 있다.CPU 스케쥴링의 단위가 스레드니까 유저 스레드 기준으로 모델을 구상한건가?
하나의 CPU에 코어가 여러 개일 수도 있고
CPU가 두 개 이상일 수도 있다
코어의 면적(트랜지스터의 수) 증가로 성능을 향상시키는 것이 기술의 한계에 부딪혀서 코어 갯수를 늘려서 CPU전체의 성능을 향상시키려고 하다 나온 것이 멀티 코어
멀티 프로세서 = 멀티 CPU
https://docs.unity3d.com/kr/2020.3/Manual/JobSystemMultithreading.html
https://ko.wikipedia.org/wiki/%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%94%A9
concurrent
: 싱글 코어에서 여러 스레드가 스위칭에 의해 동시(처럼 보이게)에 수행되는 것 - 싱글 코어, 멀티 코어에서 모두 가능 멀티도 싱글로 이루어져있으니깐..
simultatneous
: 여러 CPU환경(멀티코어인듯)에서 여러 스레드가 실제로 동시에 수행되는 것
parallelism
: 병렬성. 실제로 동시에 수행되는 것으로 멀티코어에서만 가능 - 물리적으로 코어가 여러 개니까
아니 이거를 왜 그렇게 풀었던거지..? 과거의 나 뭘 한걸까..
def solution(X, Y):
X,Y=str(X),str(Y)
xandy=list(set(X)&set(Y))
if not xandy:
return '-1'
elif xandy == ['0']:
return '0'
xandy.sort(reverse=True)
answer=[xy*min(X.count(xy),Y.count(xy)) for xy in xandy]
return ''.join(answer)
X, Y가 정수이므로 반복문에 쓰기 위해서 스트링으로 바꿔준다
X, Y에 공통되는 부분을 찾아서 탐색 범위를 줄이기 위해 교집합을 구한다
set은 sort()
를 사용할 수 없다
사용하려면 리스트로 변환 후 사용하고 다시 집합으로 바꿔줘야한다
또는 리스트에 세트를 담아도 정렬이 가능하다 이건 좀 신기하다
s = [{5,2,7,1,8}]
s.sort() # [{1, 2, 5, 7, 8}]
sorted(set)
은 가능하고 sorted를 사용하면 리스트로 바뀐다⭐
정렬하는 부분을 축약식 안으로 넣어버리면 한 줄 더 짧게 가능하지만.. 굳이 그럴 필요가 있을까 싶다