Home

0

쓰레드

목차 Thread Safe 쓰레드와 메모리구조 쓰레드 프로세스 동기화 프로세스 스케줄링 알고리즘 프로세스 상태와 스케줄러 Inter Process Communication(프로세스간의 통신) 프로세스 메모리 영역 Process (프로세스) Thread 란? CPU에서 실행되는 실행 단위 한 프로세스 내에 여러개의 쓰레드가 존재할 수 있다. 같은 프로세스 환경에서 여러개의 쓰래드가 동일하게 발생할 수 있다.(멀티 쓰레드) a) 하나의 프로세스에 하나의 쓰레드가 존재하는 경우 각각의 프로세스는 독립적으로 움직인다. b) 하나의 프로세스내에 여러가지 쓰레드가 존재하는 경우(multi thread) 쓰레드는 결국 프로세스내의 수행 단위이기 때문에 프로세스단의 Address Space들을 공유한다. 대신, 각각의 쓰레드마다 PC(Program Counter), register, stack을 갖는다. 각각의 쓰레드는 하나의 프로세스를 수행하기 위해 상호 협력적인 관계를 갖는다. 쓰레드와 관련된 Procedures

0

프로세스 스케줄링 알고리즘

목차 Thread Safe 쓰레드와 메모리구조 쓰레드 프로세스 동기화 프로세스 스케줄링 알고리즘 프로세스 상태와 스케줄러 Inter Process Communication(프로세스간의 통신) 프로세스 메모리 영역 Process (프로세스) 프로세스 스케줄링 알고리즘 프로세스 스케줄링이란? 이름에서 알 수 있듯이 프로세스 실행 순서 를 정해주는 것을 의미한다. 프로세스 실행 순서는 자원(CPU, Memory) 를 할당 받는 순서에 따라 실행된다. 프로세스 스케줄링의 목적은 Cpu나 Memory 같은 한정된 자원을 효율적으로 사용해 동일한 시간에 더 높은 처리 능력 을 갖기 위함이다. 스케줄링 알고리즘은 크게 비 선점 스케줄링 과 선점 스케줄링 으로 나뉜다. 비 선점 스케줄링 실행 중인 프로세스로 부터 CPU 자원 을 뺏어 올 수 없다. 한 프로세스에 CPU가 할당 되면 해당 작업이 끝나거나 대기상태로 전활될 때까지 CPU자원을 계속해서 차지한다. 비 신점 스케줄링으로는 FCFS, SJF, HRN 방식이 있다. FCFS(First Come, First Served) - 들어온 순서

0

프로세스 상태와 스케줄러

목차 Thread Safe 쓰레드와 메모리구조 쓰레드 프로세스 동기화 프로세스 스케줄링 알고리즘 프로세스 상태와 스케줄러 Inter Process Communication(프로세스간의 통신) 프로세스 메모리 영역 Process (프로세스) 운영체제 - 프로세스 상태와 스케줄러 시스템이 실행하고자 하는 프로세스에 CPU를 할당하는 과정 프로세스의 상태 프로세스는 Run, Ready, Wait라는 3가지 상태를 갖는다. Run CPU가 해당 프로세스를 수행하고 있는 상태 Ready 다른 프로세스를 실행하기위해 잠시 멈춘상태(실행가능한 상태) Wait 실행 불가능한 상태, 디스크를 읽거나 문자를 입력하는 등의 외부 이벤트가 발생할 때까지 멈춰있는 상태이다. Running Process가 어떤 값을 입력 받기 전까지는 Wait 상태가 된다. 스케줄러가 다른 프로세스를 선택한 경우 Running 프로세스는 Ready 상태가 된다. 스케줄러에의해 Ready 상태의 프로세스를 선택한 경우 다시 Running 상태가 된다. 값을 입력받을 경우 Wait 된 프로세스는 Ready 상태가 된다. 스케줄링이란

0

프로세스 메모리 영역

목차 Thread Safe 쓰레드와 메모리구조 쓰레드 프로세스 동기화 프로세스 스케줄링 알고리즘 프로세스 상태와 스케줄러 Inter Process Communication(프로세스간의 통신) 프로세스 메모리 영역 Process (프로세스) 프로세스의 Address Space(주소공간) 프로그램이 실행되면 Process Address Space가 할당된다. Process Address Space는 Text(Code), Data, Stack, Head 4가지 영역으로 구분된다. 프로세스가 생행되면 각 프로세스는 운영체제로부터 독립된 메모리영역을 할당 받습니다. 때문에 한 프로세스 메모리 영역에 다른 프로세스가 접근할 수 없습니다. 프로세스 메모리 영역은 Code, Data, Heap, Stack 4가지 영역으로 구분됩니다. Text(Code) 프로그램 코드가 저장되는 메모리 영역 프로그램이 실행될 때 할당 됐다가 프로그램이 종료하면 해제된다. (고정된 영역) Read Only Data

0

Process (프로세스)

목차 Thread Safe 쓰레드와 메모리구조 쓰레드 프로세스 동기화 프로세스 스케줄링 알고리즘 프로세스 상태와 스케줄러 Inter Process Communication(프로세스간의 통신) 프로세스 메모리 영역 Process (프로세스) 프로세스의 정의 Process(프로세스) 는 현재 실행중인 프로그램을 의미한다. Process Control Block (프로세스 제어 블록) 운영체제(OS) 가 프로세스를 제어 하기 위해 정보를 저장해 놓은 곳, 프로세스의 상태 정보 를 저장하는 자료구조다. 프로세스 상태 관리 와 Context Switch(문맥 교환) 을 위해 필요하다. 프로세스 ID (PID) 프로세스의 고유 번호 프로세스 현재 상태 생성, 준비, 실행, 대기, 소멸등 프로세스의 상태를 저장한다. 프로세스 Counter(PC) 다음 실행될 명령어의 주소를 저장하는 Counter CPU에서는 PC를 통해 프로세스 명령어를 실행한다. Process 생성 새로운 프로세스는 현재 실행하고 있는 프로세스가 프로세스 생성 System Call을 실행할 때만 만들 수 있다. 프로세스를 생성하는 주요 event들

0

Spring Rest API - Spring Boot Swagger 사용하기

목차 Spring Rest API - Spring Boot Swagger 사용하기 Spring Rest API - ExceptionHandling Spring Rest API - HTTP Status Code 다루기 Spring Rest API - 도메인 및 서비스 로직 작성하기 Spring Rest API - Rest API 시작하기 Controller 작성 Spring Boot Rest API - Spring Boot Swagger 사용하기 Swagger 란 Open API Specification(OAS) 를 위한 프레임워크다. 개발자가 REST API 서비스를 설계, 빌드, 문서화 할 수 있도록 도와준다. Swagger를 사용하기 위한 의존성 추가하기implementation "io.springfox:springfox-boot-starter:3.0.0" Swagger를 사용하기 위한 설정 추가 Docket Swagger 설정의 핵심이 되는 Bean apis ApiSelectorBuilder 를 생성 명시된 Package나 어노테이션를 대상으로 Swagger API 문서를 만든다. RequestHandlerSelectors 클래스 메소드를 통해 설정한다. any : 전부 basePackage : 명시된 패키지를 대상으로 Swagger API 문서를 만든다. withClassAnnotation : 명시된 어노테이션이 붙은 Class만 Swagger API 문서를 만든다. withMethodAnnotation : 명시된 어노테이션이 붙은 Method만 Swagger API 문서를 만든다. paths apis 에서 명시된 대상에서 paths 조건에 맞는 것만 Swagger API 문서를 만들 수 있도록 필터링 한다. Open API 3.0 사용한 방법

0

객체 지향 3요소

컴파일 언어, 인터프리터 언어, 하이브리드 언어 객체 지향 3요소 객체 지향 설계 5원칙 SOLID 객체 지향 3요소1. 캡슐화 정보의 은닉 관련이 있는 변수와 함수를 묶는 작업 객체는 접근제어자를 이용해 외부에서 접근할 수 있는 정보 와 외부에서 접근할 수 없는 정보 를 분리해 관리할 수 있다. private : 클래스 내부에서만 접근 가능 public : 클래스 외부에서 접근 가능 protected : 자기 클래스 혹은 상속 받은 클래스에서만 접근이 가능 2. 상속 자원의 상속 자식 클래스가 부모 클래스의 모든 자원 (Field, Method) 를 물려 받는 것을 의미한다. 하나의 부모클래스는 여러개의 자식 클래스를 가질 수 있지만 그 반대는 안된다. 개발자는 상속을 통해 불필요한 코드를 줄일 수 있고 공통 자원 관리를 집중시킬 수 있다. (유지 보수가 편리하다.) 3. 다형성 여러가지 형태를 가질 수 있게 하는 특성대표적으로 오버라이딩 과 오버로딩 이 있다.

0

Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 참고 https://spring.io/guides/topicals/spring-security-architecture AbstractAuthenticationProcessingFilter 인증 과정 AbstractAuthenticationProcessingFilter 는 Spring Security Filter에서 인증 과정을 구현한 추상 Class 다. 로그인을 진행하는 URL로 로그인 요청이 들어왔는지 확인한다. 요청에 대한 인증을 진행하고 Authentication 객체를 반환 받는다. Session 전략에 따라 적절한 처리를 진행한다. (Session Id 변경) 인증이 완료 됐으면 Authentication 객체를 SecurityContext에 저장한다. AbstractAuthenticationProcessingFilter.java @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);}private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { // 로그인을 진행하는 URL로 로그인 요청이 들어왔는지 확인한다. if (!requiresAuthentication(request, response)) { chain.doFilter(request, response); return; } try { // 인증을 진행하고 생성된 Authentication 객체를 반환받는다. // AbstractAuthenticationProcessingFilter 를 상속받은 Class에 의해 구현되는 부분 Authentication authenticationResult = attemptAuthentication(request, response); if (authenticationResult == null) { return; } // Session에 대한 설정을 한다. Session Id를 변경 this.sessionStrategy.onAuthentication(authenticationResult, request, response); // Authentication success if (this.continueChainBeforeSuccessfulAuthentication) { chain.doFilter(request, response); } // 인증 후 처리를 진행한다. successfulAuthentication(request, response, chain, authenticationResult); } catch (InternalAuthenticationServiceException failed) { this.logger.error("An internal error occurred while trying to authenticate the user.", failed); unsuccessfulAuthentication(request, response, failed); } catch (AuthenticationException ex) { // Authentication failed unsuccessfulAuthentication(request, response, ex); }}

0

React 로그인 Modal 만들기 9 - Redux Saga 적용

React 로그인 Modal 만들기 9 - Redux Saga 적용 React 로그인 Modal 만들기 8 - Redux 사용하기 React 로그인 Modal 만들기 7 - JWT 적용하기 React 로그인 Modal 만들기 6 - Login 구현 React 로그인 Modal 만들기 5 - 회원 가입 Back end 구현 React 로그인 Modal 만들기 4 - 비동기 처리 React 로그인 Modal 만들기 3 - 회원 가입 React 로그인 Modal 만들기 2 - styled-component 사용하기 React 로그인 Modal 만들기 React 로그인 Modal 만들기 9 - Redux Saga 적용모듈 설치하기yarn add redux-saga Reducer 정의import { SIGNUP_FAILURE, SIGNUP_REQUEST, SIGNUP_SUCCESS } from "../type";const initialState = "";export const signupRequest = (form) => ({ type: SIGNUP_REQUEST, data: form,});const SignupReducer = (state = initialState, action) => { switch (action.type) { case SIGNUP_REQUEST: return { ...state, }; case SIGNUP_SUCCESS: return { ...state, }; case SIGNUP_FAILURE: return { ...state, }; default: return state; }};export default SignupReducer; import axios from "axios";import { LOGIN_FAILURE, LOGIN_REQUEST, LOGIN_SUCCESS } from "../type";const initialState = { token: localStorage.getItem("token"),};export const loginRequest = (loginData) => ({ type: LOGIN_REQUEST, data: loginData,});const LoginReducer = (state = initialState, action) => { switch (action.type) { case LOGIN_REQUEST: console.log("Log In Reqeust"); return { ...state, }; case LOGIN_SUCCESS: console.log("Log In Success"); return { ...state, token: localStorage.getItem("token"), }; case LOGIN_FAILURE: console.log("Log In Failure"); return { ...state, }; default: return state; }};export default LoginReducer; Root Reducer 생성import { combineReducers } from "redux";import LoginReducer from "./LoginReducer";import SignupReducer from "./SignupReducer";const createRootReducer = combineReducers({ LoginReducer, SignupReducer,});export default createRootReducer;

0

Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer

목차 Spring Security 권한 계층 사용하기 - @RoleHierarcy Spring Security - DelegateFilterProxy Spring Security - Remember Me와 관련된 인증 API - RememberMeConfigurer Spring Security - RembmerMeAuthenticationFilter Spring Security - SessionManagementFilter & ConcurrentSessionFilter Spring Security - 인가 API ExpressionUrlAuthorizationConfigurer Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper Spring Security - AuthenticationProvider Spring Security - AuthenticationManager Spring Security - UsernamePasswordAuthenticationFilter & AbstractAuthenticationProcessingFilter Spring Security - SecurityContextHolder 와 SecurityContext Spring Security - Authentication 객체 인가 API ExpressionUrlAuthorizationConfigurer 를 통해 자원에 접근하기 위한 다양한 인가 방식을 지원한다.역할(ROLE) 기반 인가 방식, 권한(Authority) 기반 인가 방식, IP 를 통한 인가 방식등 다양한 API를 제공한다. hasRole 명시된 권한에 접미사 ROLE_ 을 붙이고 해당 권한을 가진 사용자만 자원에 접근을 허용한다. hasAuthority 와 비슷한 개념이지만 hasRole 은 USER, MANAGER, ADMIN과 같은 역할 에 따라 자원에 대한 접근을 허용한다. hasAnyRole 명시된 권한들에 접미사 ROLE_ 을 붙이고 사용자가 하나라도 권한을 갖고 있으면 해당 자원에 대한 접근을 허용한다. hasAuthority 해당 권한을 가진 사용자만 자원에 접근을 허용한다. hasRole 와 비슷한 개념이지만 hasAuthority는 CREATE, READ, WRITE, DELETE 와 같이 권한 에 따라 자원에 대한 접근을 허용한다. hasAnyAuthority 명시된 권한들 중 하나라도 권한이 있는 사용자만 자원에 접근을 허용한다. hasIpAddress 특정 IP 에 대해 자원에 대한 접근을 허용할 때 사용한다. permitAll 권한에 대한 검증 없이 자원에 대한 접근을 허용한다. anonymous 익명 사용자의 접근을 허용 익명 사용자는 기본적으로 ROLE_ANONYMOUS 권한이 부여돼 있다. rememberMe Remember-Me 를 통해 인증된 사용자가 자원에 대한 접근을 허용한다. denyAll 모든 접근을 허용하지 않는다. authenticated 인증된 사용자만 자원에 대한 접근을 허용한다. fullyAuthenticated Remember-Me 를 통해 인증된 사용자를 제외하고 인증된 사용자에 대한 접근을 허용한다. ExpressionUrlAuthorizationConfigurerpublic ExpressionInterceptUrlRegistry hasRole(String role) { return access(ExpressionUrlAuthorizationConfigurer .hasRole(ExpressionUrlAuthorizationConfigurer.this.rolePrefix, role));}public ExpressionInterceptUrlRegistry hasAnyRole(String... roles) { return access(ExpressionUrlAuthorizationConfigurer .hasAnyRole(ExpressionUrlAuthorizationConfigurer.this.rolePrefix, roles));}public ExpressionInterceptUrlRegistry hasAuthority(String authority) { return access(ExpressionUrlAuthorizationConfigurer.hasAuthority(authority));}public ExpressionInterceptUrlRegistry hasAnyAuthority(String... authorities) { return access(ExpressionUrlAuthorizationConfigurer.hasAnyAuthority(authorities));}public ExpressionInterceptUrlRegistry hasIpAddress(String ipaddressExpression) { return access(ExpressionUrlAuthorizationConfigurer.hasIpAddress(ipaddressExpression));}public ExpressionInterceptUrlRegistry permitAll() { return access(permitAll);}public ExpressionInterceptUrlRegistry anonymous() { return access(anonymous);}public ExpressionInterceptUrlRegistry rememberMe() { return access(rememberMe);}public ExpressionInterceptUrlRegistry denyAll() { return access(denyAll);}public ExpressionInterceptUrlRegistry authenticated() { return access(authenticated);}public ExpressionInterceptUrlRegistry fullyAuthenticated() { return access(fullyAuthenticated);}public ExpressionInterceptUrlRegistry access(String attribute) { if (this.not) { attribute = "!" + attribute; } interceptUrl(this.requestMatchers, SecurityConfig.createList(attribute)); return ExpressionUrlAuthorizationConfigurer.this.REGISTRY;}