- 대표적인 swap 예제 이다.

Call by value로 swap을 할경우 swap 함수에서 변수의 값을 전달 받기는 하지만

Num1,과 num2의 값만 넘겨 받았을 뿐 그것이 num1과 num2는 아니기 때문에

함수가 종료되면 main 함수에 직접 영향을 끼치지 못한다.

Call by reference의 경우 주소를 통해 전달 받은 값들을 변경하는 것이므로

종료된 이후에도 참조 했던 주소의 값들이 바뀌어 있으므로 main함수에 있는 num1과

Num2도 영향을 받아 swap이 된다.

그리고 call by value 이용하여 함수에 접근 할 경우 value 값을 저장할 새로운 공간을 할당

받아야 하므로

call by reference에 비하여 시간이 더욱 오래 걸린다.

<예시코드>

<결과창>

 

 

https://www.acmicpc.net/problem/1085

- 현재 한수의 위치 x, y  그리고 직사각형이 가로변의 길이와 높이가 입력으로 차례대로 들어온다.

- 직사각형이므로 가로로 쭉뻗은 두 변과 세로로 쭉 뻗은 두 변이 있을것이다

- 좌표평면을 생각해서 4가지 방향으로 가는 길중 가장 짧은 길을 찾아 그 값을 출력하면 된다.

 

1085번: 직사각형에서 탈출

첫째 줄에 x y w h가 주어진다. w와 h는 1,000보다 작거나 같은 자연수이고, x는 1보다 크거나 같고, w-1보다 작거나 같은 자연수이고, y는 1보다 크거나 같고, h-1보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 11365 !밀비 급일  (0) 2019.11.06
백준 1002  (0) 2019.11.06

 # 메모리 영역의 구성

 

메모리 영역은 위와 같이 구성되는데 "가상 메모리의 구성" 이다.

스택 영역은 주로 지역변수, 매개변수, 함수의 반환값, 함수 호출의 주소 등이 저장된다.

힙영역은 주로 동적 할당을 할 때 사용되는 영역인데 다들 잘 알듯이

c++에서 new, delete이 c 에서 malloc, free 등이 있는데 동적 할당을 하고 사용을 했으면 해제 하는것에도 주의를

기울여 주어야 할것이다. 

 

 

# 다른 영역의 메모리를 사용할 때의 속도의 차이는 어떻게 될까?

- 이를 한번 알아보도록 하자.!

- 배열은  int 형으로 크기는 10000

- 충분한 횟수의 함수 호출(1000001)

-#include<time.h> , clock_t 를 이용한 시간 계산

 

 1. 배열을 정적영역에 선언해서 할당 받는 함수.

 2. 배열을 스택영역에 선언해서 할당 받는 함수.

 3. 배열을 힙영역에 선언해서 할당 받는 함수.

 

코드의 이해는 어렵지 않을 것이다. 다음과 같다.

결과는 어떻게 될까?.....

 

<결과화면>

위와 같다. 시간 자체 값은 변경될수 있지만

비교를 해보면 

정적영역에 선언   <   스택영역에 선언  <  힙영역에 선언

순이다.

 

동적할당의 경우

-컴퓨터의 저장소는 <  레지스터 / 캐쉬 L1 / 캐쉬 L2  /  memory / HDD >

 순으로 왼쪽에 있는 저장장치 일수록 속도가 빠르고 용량이 작으며 용량당 가격이 비싸다.

오른쪽으로 갈수록 느리지만 용량이 크고 값이 싸다

그래서 OS에게 요청해서 memory allocation 은 memory에서 일어나므로 느릴수 밖에 없다.

 

일반적인 힙 성능 문제들이 있다.

- 할당 작업으로 인한 속도 저하

        만약 사용가능한 블록이 사용가능 목록에 없다면 런타임에 더 큰 블록을 찾거나 새블록을 할당 받아와야한다.

- 해체 작업으로 인한 속도저하

- 힙 경합으로 인한 속도 저하 

        두개이상의 쓰레드가 접근 하려고 하는 경우 한 쪽 작업이 완료되어야 접근가능

-힙 손상으로 인한 속도 저하

 

알고 싶었던 내용과 그러한 현상이 나타난 이유를 기재 해보았습니다.

틀린 부분이 있을 수 있습니다. 알려주시면 수정하겠습니다. !

 

 

'학부생 공부 > 생각들' 카테고리의 다른 글

abstract data type 어떤 이유?  (0) 2019.12.01
go to문? 왜 남아 있지?  (0) 2019.11.06

https://www.acmicpc.net/problem/11365

- 한줄 씩 입력을 받으면서

  들어온 문자들의 역순으로 출력을 해주면 된다.

- scanf를 통해서 입력을 받는다 (\n) 이 나올 때 까지 한줄씩

- 길이를 체크해서 반대로 출력해주면 된다.

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 1002  (0) 2019.11.06

https://www.acmicpc.net/problem/1002

- 터렛문제이다.

- 학점에 신경쓰자고... 다른 공부를 하다가 이제 꾸준히 백준을 하루에 조금씩 풀어야겠다고 생각하고

  푼 첫 번째 문제이다.

- 처음에 든 생각은 map을 만들어서 탐색을 할까 했는데

  요구하는 조건(몇개의 위치가 가능 -> 몇개의 점에서 만나는지) 그리고 값의 범위(2만)

  을 보니 이 방법은 좋지 않겠다고 생각.

- 그래서 두 점과 점사이의 거리와 입력으로 들어오는 r1,r2를 비교하면

  원이 어떤식으로 만나는지가 분류가 된다는 생각.

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 15552 빠른입출력  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 11365 !밀비 급일  (0) 2019.11.06

myshell 을 구현을 하는 중이다.

표준 입력으로 마지막에 &를 입력해주면 이는 프로세스를 백그라운드로 실행시켜 주라는 뜻이다.

나의 쉘에서도 역시 이를 같은 기능을 해주도록 구현을 해야한다.

처음 든 생각은 나의 쉘 프로세스는 여전히 동작 하여야 하므로 종료가 되어서는 안되고

즉 나의 쉘 프로세스는 계속 나의 일을 하고 백그라운드로 실행을 시킬 프로세스는 

알아서 실행 되도록 해야 한다.

맨 처음 든 직관적인 생각 자식을 만든후 그 자식이 다시 자식 프로세스를 만든후

인수를 전달해서 그 프로세스(손자) 에서 수행하도록 하고 부모 프로세스는 먼저 종료를 한다.

조부모(myshell) 프로세스는 부모 프로세스가 종료를 하면 wait로 받아줄 것이고 

while문을 통해 myshell에서 여전히 작업을 할 수 있게 되고 손자 프로세스는 따로 돌 수 있는 것이다.

문제는 이렇게 부모프로세스가 먼저 죽어버리면 손자프로세스가 수행이 끝난 후

종료를 했을 때 wait를 해줄 부모 프로세스가 없다는 것이 문제이다.

즉 손자프로세스는 부모 프로세스가 죽는 순간 고아 프로세스가 되었다가

수행이 끝나면 좀비 프로세스가 된다.

그리고 좀비 프로세스가 되면 init 프로세스가 이를 입양해서 wait를 시켜준다

하지만 wait 는 systemcall이고 이는 자원이 많이 소모 되는 일이므로

바로 wait를 시켜주지 않고 주기적으로 wait를 시켜준다.

이론상은 이랬는데 코드를 짜고 수행중에 문제가 있다.

 

코드를 짜고 수행을 시켰을 때 예를 들어 sleep 10 & 라는 명령어를 입력했을 때

 

손자 프로세스에서 sleep이 수행되게 되고

10초가 지나면 (예를 들면 11초??) <- 종료 되었으나 init이 wait 시켜주지 않은 상황

가 되었을때 ps를 하면 sleep프로세스가 <defunct> 상태로 보여야 하는데 

여러번 ps를 입력 해보아도 그 상태인 것을 잡아 내지 못했다.

 

한가지 가설은 init 이 system call은 시스템 자원을 많이 드는 일 이므로 주기적으로 (가끔가다)

한번씩 wait 를 해준다고 했는데 이것이 사실 컴퓨터 입장에서는 매우 긴 시간이지만

인간인 우리 입장에서는 굉장히 짧은 시간이라 우리가 그 순간을 명령어를 통해서 확인하기는 굉장히 

어려운 것인가?? 라는 생각을 했고

 

init이 wait해주는 주기적인 시간이 대략 어느정도 됩니까? 라고 질문 했는데

그건 시스템 마다 설정되어 있는 값이 다르다 라고 말해주셔서 ..... 여전히 해결이 되지 않은 상태이다.

 

일단 그래도 표면상으로는 백그라운드로 실행 시켜주는 역할을 충실히 하고 있는 것 같다.

 

이에 해당되는 이유는 찾으면 업데이트 하도록 하겠습니다..

 

## 수정

INIT프로세스는 고아 프로세스상태에서 입양을 하는것 같습니다 그래서 좀비프로세스가 나타나지 않는 것 처럼 보이는 것 같습니다.

-> 손자를 만들어서 좀비프로세스가 눈에 띄지 않게 하는 방향이 아닌 SIGCHILD를 이용하여

    좀비 프로세스가 생기지 않도록 수정 하였습니다.

 

 

수업시간 교수님께 들은 내용을 정리.

 

Dijkstra는

structured programming without GOTO 를 주장

 

Knuth는

structured programming with GOTO 를 주장

 

우리는 goto가 필요없이 프로그램을 짤 수 있다

하지만 goto가 있다면 매우 효율적 인 경우 가 있다.

 

예를 들자면

while(){

...

 while(){

 ...

  while(){

  ... 

}

}

}

등의 코드에서 (반복문을 깊숙히 내려갔을때)

goto 문을 사용가능하면  goto를 통해 이 반복문들을 쉽게 빠져 나올 수 있다.

없다면?

여러개 타고 들어온 반복문들에 빠져나오는 조건을 설정 해주어 나와야 할 것이다.

 

이러한 사항들이 있음을 Knuth는 주장을 했고 

지금 현재 우리는 여전히 goto문을 사용 할 수 있다.

이 자체가 필요성을 인정했기 때문에 남아 있는 것 일 것이다.

 

물론 goto 문을 남용 할 경우 ugly code가 될 수 있고 이는 잘 짠 코드가 아니다

(잘 짠 코드란? - 같은 기능을 하는 프로그램을 더 효율적이고 알아보기 쉽게 짠 코드)

 

그러므로 goto문을 남용 하지는 말되 정말 필요한 순간(goto문이 효율적인) 이 온다면 쓸 수 있다.

그 점을 기억해 두자.!

 

참고) 기억과 조사 그리고 기억해두어야 할 점을 위주로 정리 함으로 사이사이 약간의 오류들이 있을 수 있음.

 

'학부생 공부 > 생각들' 카테고리의 다른 글

abstract data type 어떤 이유?  (0) 2019.12.01
정적영역, 스택영역, 그리고 힙 영역  (0) 2019.11.09

+ Recent posts