반응형

✔️  유투버 알렉님이 공부하신 운영체제의 pdf파일을 받아 적은 글 입니다.

✔️ 비전공자인 제가 느끼기에 전문용어는 쉽게 풀어서 쓸 예정입니다.

✔️ 총 20개로 나눠서 업로드 할 예정입니다.

 

컴퓨터 시스템을 이루는 3대 구성요소 : CPU, 메모리, 디스크

+ 여기에 I/O까지 추가 된다면 그것을 컴퓨터를 이루는 기본 골격이라고 한다.

 

- 특징

1. 순차적 수행 : 명령 / 데이터를 로드 / 실행 / 저장

2. 데이터 / 프로그램 메모리를 하나의 버스로 접근 (아직 몰라도 됨)

 

CPU

: 각종 연산을 수행하고, 기억장치(메모리)에 기억되어 있는 명령어들을 실행

 

✔️ 알아야 할 단어

주파수 : 1 초에 몇 번이나 진동하는 가?

Hz(헤르츠) : 1초에 한번 왕복 운동이 반복됨을 의미 (100Hz는 1초에 100번 반복 혹은 진동)

 

CPU는 일정한 속도로 동작하기 위해서는 일정한 간격으로 전기적 신호를 공급하는데, CPU에 전기적으로 공급되는 신호를 Clock이라 함.

Clock : 주기적으로일정한 신호를 보내주는

 

CPU는 이 신호(클락)을 받고 데이터를 주거나 받고 처리

+ 이 신호 한번에 의해서 CPU에서 한 개의 명령이 처리된다.

 

 

CPU의 내부 구성

1. 산술 / 논리 연산 장치 : 덧셈, 곱셈 등 수행

2. 제어 장치 : 신호를 통해서 데이터 흐름(순서 등)통제

3. 레지스터 : CPU 내부의 메모리

 

하는 일

1. 산술 / 논리 연산 장치 : 레지스터에 저장된 데이터를 이용하여 덧셉, 곱셈 등 산술 연산 수행

2. 제어 장치 : CPU나 주변기기들을 컨트롤하는 장치

3. 레지스터 : 캐시(자주사용 하는 데이터나 값을 저장한 임시장소) 또는 메모리로부터 읽어 온 데이터 저장

 

 

레지스터 구성 놈놈놈!

1. IR : 현재 수행 중에 있는 명령어 부호를 저장하고 있는 놈 (저장놈)

2. PC : 명령저장메모리주소를 가리키는 놈 (가리키놈)

3. AC : 산술 및 논리 연산의 결과를 임시로 기억하는 놈 (기억놈)

 

명령어 구조

: 시스템이 특정 동작을 수행시키는 작은 단위

 

구성

1. 동작 코드 : 실행 동작 구분

2. 오퍼랜드 : 명령어 실행을 위한 자료나 저장 위치

 

 

 

CPU가 하나의 명령을 처리하는 과정 

1. 읽기 : 메모리에서 명령 가져옴

2. 해석 : 명령 해석 

3. 실행 : 명령 수행 

4. 기록 : 결과 기록

 

 명령 배달의 민족 주!문! -> 조리법으로 치킨 튀기기 완료 -> 배달중~ -> 별다섯개!!

 

이때, 배달(명령을 수행)을 하기 위해서 영수증에 있는 집주소를 가져오는데(명령어 가지고오기) 이를, Fetch라 한다.

 

.

.

명령어 호출 사이클 (순서)

레지스터를 구성하는 놈중 하나인 PC(가리키놈)는 다음으로 fetch할 명령어 주소를 갖고 있다.

1. 프로세스는 PC가 가리키는 주소 위치에서 명령어를 가져오면서 PC를 증가시키고 명령문은 IR(저장놈)에 Load된다.

2. load된 명령어는 수행이 진행되는데, 명령어를 수행하는 과정해서 가져오는 명령어를 실제 ALU(산술/연산)에서 처리하게 된다.

 

즉, PC가 가리키는 다음 명령어를 프로세스가 가져옴 -> PC증가 -> IR에 Load됨.(게임 로딩중.. 할때 그 로드 맞음.)

-> ALU에서 명령어 수행. 


명령어 처리의 두가지 방식 (RISC, CISC)

 

RICS : 단순한 명령을 조합해서 하나의 기능을 수행, 하나의 사이클로 명령어 수행

(여럿이 모여 하나가 되어 한놈을 두까팸..)

 

 

CISC : 하나의 기능에 하나의 명령, 여러 사이클로 명령어 처리

 

 

 

병렬 처리

: 명령어를 병렬로 동시에 처리하는 것을 의미 

 

방법

1. 실행 할 수 있는 코어를 여러개 두기

2. 쓰레드를 여러 개 하기

3. 기본 명령어를 여러개 수행 

 

기본 명령어 수행과정에서의 한계

이 과정에서, 각각 하나의 클럭(주기적으로 전기 신호를 공급)을 소비하게 된다.

하나의 명형을 수행하는데 4개의 클럭이 소비된다는 말이다.

 

문제점 : 읽기 -> 해석 

읽기를 처리하는 유닛은 유휴상태(아무것도 안함)가 된다. 말 그대로, 비효율성을 갖게 된다.

 

해결 방법 1

파이프 라인 : 읽기가 끝나면 밑에 있는 읽기가 실행 되는 과정(쉬... 쉬지말고 일하라 !!!)

CPU에서 하나의 명령을 처리하는 과정에서 미리 다음에 실행할 명령을 가져오는 것.

 

해결 방법 2

슈퍼스칼라(양) : 슈퍼양! 양으로 밀어 붙여!!

ALU(산술/연산)을 여러 개 포함시켜 cycle마다 한 개 이상의 명령어들이 동시에 실행 될 수 있도록 하는 기술

 

해결 방법 3

슈퍼파이프라인 : 단계세분화. 각 단계를 엇갈리게 중첩 시키는 것

 

해결 방법 4

슈퍼스칼라 + 슈퍼파이프라인 = 슈슈슈슈슈슈슈슉발라..ㅁ아!!!

양많이 + 여러개 중첩함으로써 명령어를 여러 개 처리! (2-way)

해결 방법 5

3-way VLIW

- 동시에 수행될 수 있는 명령어들을 컴파일 수준에서 추출하여 하나의 명령어로 압축하여 실행

- 컴파일러가 동시실행 가능한 놈들을 검출해서 하나의 명령어로 압축!

- VLIW의 명령어로 압축되므로, 기존 하드웨어나 소프트웨어와의 호환성 결여 발생

 

 

파이프라인 기법의 문제점과 보안책

- 문제점

1. 병령수행의 동작이 서로 독립적이어야 한다는 점.

2. 명령어 오동작 우려가 있다.

3. 결과가 다음 명령어에 영향을 미칠 때, 처리가 어렵다.

 

간단하게 읽어보자!

 

간단하게 읽어보자2!

 

 

EPIC

 

반응형
반응형

링크 : https://console.cloud.google.com/apis

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

 

 

 

반응형
반응형

깃헙

https://github.com/namsehoon/DoWoom

GitHub - namsehoon/DoWoom: 도움프로젝트

도움프로젝트. Contribute to namsehoon/DoWoom development by creating an account on GitHub.

github.com

안드로이드 서비스

.
.
.

안드로이드 기술 스택

- MVVM
- Firebase
- Retrofit2
- PreferenceCompat
- datastore-preferences
- storage
- cloud function
- glide
- coroutines
- auth
- livedata

.
.
.


IOS 서비스

IOS는 회원가입, 홈화면, 대화, 설정만 구현이 되었습니다. (게임, 커뮤니티 구현 중 )

.
.
.

느낀점

아직 추가 해야할 것들이 남았지만, 6개월간 개발해 보았던 느낀점은 생각보다 시간이 많이 걸렸습니다.

기능 하나하나 추가하는 것들도 고려해야하는 것들도 많았습니다. 시간은 곧 돈이라는 말을 체감했습니다.

그래도 좋은 경험이 되었고, 써보고 싶었던 MVVM 패턴 등을 사용 할 수 있어서 좋은 경험이 되었습니다.

앞으로도 꾸준히 업데이트 하게 될 저에게 첫 큰 프로젝트였습니다.
.
.
.
하지만, 그에 앞서
개발을 잠시 멈추고, 읽으려고 사두었던 clean architecture을 읽으려고 합니다. 아이젠하워의 매트릭스처럼,
긴급하지는 않지만 중요한.
미뤄두었던 좋은 아키텍처를 위해 좀 더 공부해야 할 필요성을 더 느꼈습니다. 과연 내가 만든 이 앱은,
유지보수가 쉬운가?
확장성은?
메모리 관리는?
객체지향에 맞게 설계된건가?
이에 대한 고민이 좀 더 필요할 것 같습니다. 도움톡에 대한 리팩토링과 기능의 추가는 clean architecture 책을 흡수한 후에 이루어질 계획입니다. 감사합니다.

반응형
반응형

음.. 3시간 소요.

 

 

                        <a href="https://gezip.net/////" class="item">
                        <span class="orange visi pull wr">
                        <i class="fa fa-comment lightgray"></i>
                        <b>4</b>
                        </span>
                        <span class="wr-icon wr-image"></span>				주인 없는 가게에 혼자 방치된 강아지									<span class="count orangered hidden-xs">4</span>
                        </a>

출처 : 커뮤니티 개집.

 

 

개집의 멍멍이로서 개집을 retrofit과 jsoup으로 하던 중...

 

개집왕의... 코드에 욱했다가..

 

일단 해보자 해서 하던중..

 

유머게시판의 title을 얻기 위함이였다.

 

보면 태그가 <a> <span></span> 주인없는가게에... <span></span> </a>

 

여기서 타이틀을 뽑으려했지만, a내에 있는 저 <b>4</b>가 계속 뽑혔다.

 

해결 : 

 val title = content.select("a").first().ownText()

그렇다. a태그에 있는 ownText()만 뽑으면 된다..  ㅅ삽ㅂ..질 ㅅㄱ

반응형
반응형

음.. 몇번을 시도해봤지만, 기존 코드로는 많은 이미지들을 불러올 수가 없었다.

 

그래서 라이브러리를 사용하기로 했다.

 

라이브러리 : https://github.com/zhihu/Matisse?utm_source=android-arsenal.com&utm_medium=referral&utm_campaign=5632 

 

 

 

일단. mutable(값이 변함)로 받을 uri 배열 변수를 선언 했다.

 //이미지 리스트
    var uriList : MutableList<Uri> = mutableListOf<Uri>()

버튼 클릭 시, 바로 사진 document로 이동

//이미지 선택기 라이브러리
            Matisse.from(this@CreateGameActivity)
                .choose(mimeType) //이미지 타입
                .countable(true) //이미지 카운터
                .maxSelectable(6) //이미지 선택 최대 개수
                .thumbnailScale(1f)
                .imageEngine(GlideEngine())
                .showPreview(false)
                .forResult(CHOOSE_IMAGES) 
                
                
                // CHOOSE_IMAGES : 이건 따로 resultcode임 
                // 전역 변수로 CHOOSE_IMAGES = 123; 
                // 아무렇게나 ㄱ ㄱ

사진 받을 때 결과..따로 startactivityforresult안해도줘도 됨.!

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == CHOOSE_IMAGES && resultCode == RESULT_OK) {
                    uriList = Matisse.obtainResult(data)

                    if (uriList.isEmpty()) { //만약 사진이 한장도 없다면,,
                        Toast.makeText(this@CreateGameActivity,"사진을 선택 해주세요.",Toast.LENGTH_SHORT).show()
                    } else {
                   
                    }
        }
    }

자세한건 첨부한 url에서

반응형

'개발언어 > Kotlin' 카테고리의 다른 글

도움톡  (0) 2022.07.28
jsoup 태그 사이 텍스트 얻기  (0) 2022.06.24
사진 업로드 uri to bitmap 및 Context 얻는 법  (0) 2022.04.18
스위프트 메모장 만들기 1  (0) 2021.12.16
스위프트 메뉴 타이틀 크기 조정  (0) 2021.12.01
반응형

 

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == TAKE_IMAGE_CODE) {
            when(resultCode) {
                RESULT_OK -> {
                    //프로필 사진 설정
                    var bitmap:Bitmap? = null
                    val uri:Uri = data?.data!!
                    try {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                            bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(contentResolver,uri))
                        } else {
                            bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
                        }
                    } catch (e:IOException) {
                        e.printStackTrace()
                    }
                    binding.ivProfile.setImageBitmap(bitmap!!)
                    HandleImage(application,bitmap)

                }

            }
        }
    }

 

 

Context 얻는 법

 

-Activity

1. Activity activity;

2. act = 액티비티명.this;

 

 

-Context

1. Context mContext;

2. mContext =  getApplicationContext(); 

반응형

'개발언어 > Kotlin' 카테고리의 다른 글

jsoup 태그 사이 텍스트 얻기  (0) 2022.06.24
안드로이드 다중 이미지 선택  (0) 2022.06.16
스위프트 메모장 만들기 1  (0) 2021.12.16
스위프트 메뉴 타이틀 크기 조정  (0) 2021.12.01
코틀린 개념 잡기  (0) 2021.06.20
반응형

- 알고리즘을 캡슐화해서, 서브클래스에서 언제든 필요할 때마다 가져다가 쓸 수 있도록 하겠습니다.

 

가정) 공통점을 찾고, 공통점을 캡슐화한다.

카페에서 커피와 홍차를 만드는 법.

 

커피

1. 물을 끓인다.

2. 끓는 물에 커피를 우려낸다.

3. 커피를 컵에 따른다.

4. 설탕과 우유를 추가한다.

 

public class Coffee {

    void prepare() {
        boiledWater();
        brewCoffee();
        pourInCup();
        addSugarAndMilk();
    }

    public void boiledWater() {
        Log.d("abcd","물 끓이기");
    }

    public void brewCoffee() {
        Log.d("abcd","커피를 우려내");
    }

    public void pourInCup() {
        Log.d("abcd","컵에 담");
    }

    public void addSugarAndMilk(){
        Log.d("abcd","설탕과 우유 추가");
    }
}

 

홍차

1. 물을 끓인다.

2. 끓는 물에 차를 우려낸다.

3. 차를 컵에 따른다.

4. 레몬을 추가한다.

 

 

public class Tea {

    void prepare() {
        boiledWater();
        brewTea();
        pourInCup();
        addLemon();
    }

    public void boiledWater() {
        Log.d("abcd","물 끓이기");
    }

    public void brewTea() {
        Log.d("abcd","커피를 우려내");
    }

    public void pourInCup() {
        Log.d("abcd","컵에 담기");
    }

    public void addLemon(){
        Log.d("abcd","레몬 추가");
    }
}

 

 

 

 

추상화하기!

//추상화 클래스(서브클래스에서 상속한다.)
public abstract class makingBeverage {

	//만드는 순서를 바꾸지 못하게 final로 지정
    final void prepare() {
        boiledWater();
        brewSomething();
        pourInCup();
        addSomething();
    }

	//차와 커피의 공통점
    void boiledWater() {
        Log.d("abcd","물 끓이기");
    }
    
	//차와 커피의 공통점
    void pourInCup() {
        Log.d("abcd","컵에 따르기");
    }

    //우려내기
    abstract void brewSomething();
    //첨가물넣기
    abstract void addSomething();


}
//커피
public class Coffee extends makingBeverage {

    public void boiledWater() {
        Log.d("abcd","물 끓이기");
    }

    public void pourInCup() {
        Log.d("abcd","컵에 담");
    }

    //서브클래스에서 상속받은 메소드
    @Override
    void brewSomething() {
        Log.d("abcd","커피를 우려내기");
    }

    //서브클래스에서 상속받은 메소드
    @Override
    void addSomething() {
        Log.d("abcd","설탕 우유 추가");
    }


}

 

//홍차
public class Tea extends makingBeverage{

    public void boiledWater() {
        Log.d("abcd","물 끓이기");
    }


    public void pourInCup() {
        Log.d("abcd","컵에 담기");
    }

    //서브클래스에서 상속받은 메소드
    @Override
    void brewSomething() {
        Log.d("abcd","홍차를 우려내기");
    }

    //서브클래스에서 상속받은 메소드
    @Override
    void addSomething() {
        Log.d("abcd","레몬 추가");
    }
}

 

 

템플릿 메소드에서는 알고리즘의 각 단계들을 정의하며,
그 중 한개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다.

 

 

.

.

 

추상화 되지 않는 코드와 추상화 된 코드의 다른점

 

1. 서브클래스에서 코드를 재사용 할 수 있습니다.

2. 알고리즘(makingBeverage)은 한 군데에 모여있기 때문에 그 부분만 고치면 됩니다.

3. 다른 음료를 쉽게 추가할 수 있습니다.

4. makingBeverage 추상클래스에 알고리즘에 대한 지식이 집중되어 있으며, 일부 구현만 서브클래스에 의존합니다.

 

.

.

.

템플렛 메소드 패턴에서는 메소드에서 알고리즘의 골격을 정의합니다.
알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다.
템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의 할 수 있습니다.

.

.

 

후크(hook) : 추상클래스에서 선언되는 메소드이지만,

기본적인 내용만 구현되어 있거나 아무 코드도 들어가지 않은 메소드.

 

예제)

 

public abstract class makingBeverage {

    final void prepare() {
        boiledWater();
        brewSomething();
        pourInCup();
        // 여기 조건을 넣어줌
        if (customerWantCondiments()) {
            addSomething();
        }
    }

    void boiledWater() {
        Log.d("abcd","물 끓이기");
    }

    void pourInCup() {
        Log.d("abcd","컵에 따르기");
    }

    //우려내기
    abstract void brewSomething();
    //첨가물넣기
    abstract void addSomething();

    //후크 : 만약 손님이 첨가물을 원한다면,
    boolean customerWantCondiments () {
        return true;
    }

}
public class Coffee extends makingBeverage {

    public void boiledWater() {
        Log.d("abcd","물 끓이기");
    }

    public void pourInCup() {
        Log.d("abcd","컵에 담");
    }

    //서브클래스에서 상속받은 메소드
    @Override
    void brewSomething() {
        Log.d("abcd","커피를 우려내기");
    }

    //서브클래스에서 상속받은 메소드
    @Override
    void addSomething() {
        Log.d("abcd","설탕 우유 추가");
    }

    public boolean customerWantCondiments() {

        String answer = null;
        answer = getAnswer();

        if (answer.equals("y")) {
            return  true;
        }  else {
            return false;
        }

    }
    public String getAnswer() {

        Log.d("Abcd", "첨가물을 넣어드릴까요?  y/n ");

        // input 창 추가 (사용자 입력)

        if (//만약 사용자의 대답이 y인 경우,) {
            return "y";
        } else {
            return "n";
        }
    }

}

.

.

.

헐리우드 원칙 : 먼저 연락하지 마세요. 저희가 연락드릴게요.

저수준 구성요소(커피)에서 시스템에 접속을 할 수는 있지만, 언제 어떤 식으로 그 구성요소들을 사용할지는 고수준 구성요소(makingBeverage)에서 결정하게 됩니다.

.

.

.

 


코틀린

abstract class MakingBeverage {
    
    fun prepare() {
        boilWater()
        pourInCup()
        brewSomething()
        addSomething()
    }
    
    fun boilWater() {
        Log.d("abcd","물 끓이기")
    }


    fun pourInCup() {
        Log.d("abcd","컵에 따르기")
    }

    abstract fun brewSomething()
    abstract fun addSomething()
}
class Coffee : MakingBeverage() {

    override fun brewSomething() {
       Log.d("abcd","커피 우려내기")
    }

    override fun addSomething() {
        Log.d("abcd","첨가물 추가하")
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

.. 이거 하느라 오전 날렸다 ㅠ

 

 

지금 개발중인 앱이라 코드만 첨부하겠습니다~

 

//상속할 base Fragment
open class BaseFragment(var TAG:String? = null) : Fragment() {

    var FragTag:String? = null

    init {
        this.FragTag = TAG
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        Log.d(FragTag,  FragTag + " onCreate")
        super.onCreate(savedInstanceState)
    }
//상속받는 fragment 
class HomeFrag : BaseFragment(TAG = "HomeFrag") {}

 

이상.. 해산!

반응형

'개발언어 > JAVA' 카테고리의 다른 글

자바 변수  (0) 2021.06.20
MVVM 패턴  (0) 2021.06.20
안드로이드 메모 + 음성녹음 앱  (2) 2021.03.13
안드로이드, 자바 개념 정리2  (0) 2021.02.09
운영체제 6(FCFS, RR)  (0) 2021.01.27

+ Recent posts