• 자신의 OS 정보 확인
[root@localhost ~]$ hostnamectl
   Static hostname: localhost
	...
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

 

  • 하단 링크 연결하여 오라클 클라이언트 버전에 맞춰 Basic 과 Sqlplus 의 RPM 파일을 다운로드 한다.

https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

 

★ 여기서 주의 ★

내가 연결하려는 원격 Oracle 버전을 확인하자!

해당 버전에 맞는 클라이언트 버전을 설치해줘야 한다.!!

 

  • root 계정으로 rpm 파일을 설치한다. (basic 먼저 설치한 후, sqlplus 설치한다.)
$ yum install -y oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm
$ yum install -y oracle-instantclient-sqlplus-10.2.0.5-1.x86_64.rpm

 

ERROR: Failed dependences: libaio is needed by oracle_instantclient10.2.0.5.-1.x86_64

에러 경우 의존성 라이브러리 파일이 없어서 발생하는 것이므로 아래 라이브러리 설치하면 된다.

$ yum install -y libaio

 

  • ORACLE_HOME, TNS_ADMIN 환경변수를 위한 설정파일을 추가한다.
$ vi /etc/profile.d/oracle.sh

export ORACLE_HOME=/usr/lib/oracle/10.2.0.5/client64
export TNS_ADMIN=/usr/lib/oracle/10.2.0.5/client64/bin

  • .bash_profile 하단에 ORACLE_HOME, TNS_ADMIN, PATH 설정 추가 후 .bash_profile 을 적용한다.
vi ~/.bash_profile

export ORACLE_HOME=/usr/lib/oracle/10.2.0.5/client64
export TNS_ADMIN=/usr/lib/oracle/10.2.0.5/client64/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=KOREAN_KOREA.AL32UTF8

설정 후, 바로 적용을 위해 source 명령어를 사용한다.

$ source ~/.bash_profile

정상적으로 적용된 것을 확인하려면 env 명령어를 사용해보자.

$ env
  • oracle instant client 에서 oracle server 로 접속하기 위해서 tnsnames.ora 를 설정한다. 
    TNS(Transparent Network Substrate) 는 오라클에서 사용하는 네트워크 기술이다.
    Client/Server 또는 Server/Server 간에도 Data 전송을 가능하게 해주는 기술이다.

    ★ tnsnames.ora 파일은 오라클 클라이언트 측에서 오라클 서버로 접속할 때 필요한 프로토콜 및 포트번호, 서버주소, 인스턴스 등을 설정해주는 파일이다.
    ★tnsnames.ora 파일은 우리가 TNS_ADMIN 경로로 잡아둔 곳 아래에 위치해 있어야 한다.
    나는 TNS_ADMIN  경로를 /usr/lib/oracle/10.2.0.5/client64/bin 으로 잡았기에, 해당 폴더 아래에 tnsnames.ora 파일을 두었다.
더보기

원하는 TNS 이름(별명) = 

   (DESCRIPTION = 

      (ADDRESS_LIST = 

          (ADDRESS = (PROTOCOL = TCP)(HOST = 아이피주소)(PORT = 1521)

 

예제)

ORA_DB(별명)=
  (DESCRIPTION =
    (ADDRESS = 
      (PROTOCOL = TCP)
      (HOST = 아이피주소)
      (PORT = 1521)
     )

    (CONNECT_DATA =
      (SID = 접속할 SID)
    )
  )

  • oracle client 에서 oracle server 로 sqlplus 명령어로 접속해보자!! (root 계정으로 접속해야 한다!!)
$ sqlplus id/passwd@별명

 

★ 여기서 주의 ★

아래와 같은 에러를 마주쳤다면, 내가 연결하려는 원격 Oracle 버전을 확인하자!

해당 버전에 맞는 클라이언트 버전을 설치해줘야 한다.!!

 

: 내가 연결하려는 오라클 DB 버전이 10 버전대였는데, 서버에 붙으려서 클라이언트 버전은 그보다 높은 12버전이라 발생한 문제였다.

 

 

출처 

https://gomu92.tistory.com/72

https://bangu4.tistory.com/13

 

'리눅스&네트워크' 카테고리의 다른 글

[운영체제] 프로세스와 스레드  (0) 2022.12.11
마운트  (0) 2022.07.20

1. 프로세스

[ 공부하기 전 나 ]

프로세스? 실행중인거!

1) 프로그램과 프로세스의 차이

생명이 있냐, 없냐

프로그램은 보조기억장치(SSD,하드디스크)에 존재하는, 실행되기를 기다리는 코드와 정적인 데이터의 묶음이다.

요것이 메모리에 적재되면 생명이 있는 '프로세스'가 된다.

즉, 실행파일이 메모리에 적재될 때 프로그램은 프로세스가 된다라고 할 수 있다.

 

프로세스란 쉽게 말해 프로그램 실행 그 자체를 의미한다.

 

2) 동시 실행의 착각

컴퓨터에서 프로세스가 동시에 실행된다는 건 당연하지 않은 일.

하나의 CPU(프로세서) 는 한 순간에 하나의 프로세스만 실행할 수 있기 때문이다.

 

그러면 프로세스가 동시에 실행된다라고 말할 수 없는거 아닌가?

맞다.

물 속에서 헤엄치는 오리를 생각해보자.

 © yxelle, 출처 Unsplash

둥둥 떠있는 오리는 사실 물 속에서 엄청나게 발을 휘저으며 헤엄친다.

프로세스가 동시에 실행될 수 있는 건 운영체제가 엄청난 속도로 CPU가 실행할 프로세스를 교체하고 있기 때문이다.

눈 깜박할 사이에 이 교체가 수십번~수천번 일어나기 때문에 사람은 동시에 여러개의 프로세스가 실행되고 있다고 느끼는 것이다.

 

그럼 도대체 운영체제는 어떻게 이렇게 빨리 휘리릭 프로세스 교체를 할 수 있는 것일까?

프로세스의 구성 관리에 대해 알아보면 해답이 나올지도 모르겠다.

 

3) 프로세스 구성

프로세스에 대한 정보는 프로세스 제어블록(PCB,Process Control Block) 이라고 부르는 자료구조에 저장이 된다.

이 PCB 에는 다음과 같은 정보가 담겨있다. ( 운영체제가 프로세스를 관리하기 위해 필요한 정보를 저장함 )

PID
운영체제가 각 프로세스를 식별하기 위해 부여된 식별번호
프로세스 상태
진행중인 상태인지, 대기중인 상태인지, 종료된 상태인지
프로그램 카운터
CPU가 다음 실행할 명령어의 주소를 담고 있는 레지스터이다.
프로그램의 순차적 흐름을 위해 필요하다고 한다...
스케줄링 우선순위
운영체제가 CPU 에서 실행될 여러 개의 프로세스 순서를 정해주는 것을 스케줄링 이라고 한다.
스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 한다.
권한
프로세스가 접근할 수 있는 자원을 결정하는 정보이다.
프로세스마다 어디까지 접근할 수 있는지에 대한 권한이다.
프로세스의 부모와 자식 프로세스
최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제하여 생성되고 이 계층관계는 트리를 형성한다.
그래서 각 프로세스 자식프로세스와 부모프로세스에 대한 정보를 가지고 있다.
프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터
프로그램 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다.
프로세스는 프로그램의 실행이기 때문에 실행하기 위해서는 프로그램 주소에 대한 정보가 필요한 것이다.
실행문맥
마지막에 실행된 프로세스의 레지스터 내용을 담고 있다.
운영체제에 의해 교체되었다가 다시 자신의 차례가 되어 실행될 때 중단된 적 없고 마치 연속적으로 실행된 것처럼 보이기 위해 해당 레지스터 정보를 가지고 있다.

 

4) 프로세스 관리

- 프로세스 상태

  • New: 프로그램이 메인 메모리에 할당된다.
  • Ready: 할당된 프로그램이 초기화와 같은 작업을 통해 실행되기 위한 모든 준비를 마친다.
  • Running: CPU가 해당 프로세스를 실행한다.
  • Waiting: 프로세스가 끝나지 않은 시점에서 I/O로 인해 CPU를 사용하지 않고 다른 작업을 한다. (해당 작업이 끝나면 다시 CPU에 의해 실행되기 위해 ready 상태로 돌아가야 한다.)
  • Terminated: 프로세스가 완전히 종료된다.
위 그림은 프로세스 상태 전이도의 모습이다. new에서부터 프로세스가 어떤 작업에 의해 상태가 변하는지 나타낸다.

running에서 ready로 변할 때는 time sharing system(시분할,각 사용자들에게 컴퓨터 자원을 시간적으로 분할)에서 해당 프로세스가 CPU시간을 모두 소진하였을 때 인터럽트에 의해 강제로 ready상태로 변하고, CPU는 다른 프로세스를 실행시킨다.

5) 프로세스의 메모리 영역

  • Code 영역

실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역이다.

CPU는 코드영역에 저장된 명령어들을 하나씩 처리한다.

 

  • Data 영역

코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다.

프로그램이 실행되면서 할당되고 종료되면서 소멸한다.

 

  • Stack 영역

함수 안에서 선언된 지역변수, 매개변수, 리터값등이 저장된다.

함수 호출시 기록되고 종료되면 제거된다.

 

  • Heap 영역

관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유공간이다.

 

2. 스레드

스레드는 프로세스 내의 Data, Code, Heap 영역을 공유한다.

운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당한다.

각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

(이미지 출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html)

 

반면에 스레드는 메모리를 서로 공유할 수 있다.

프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 별도로 할당받고,

나머지 Code/Data/Heap 형식으로 할당된 메모리 영역 공유한다.

따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

 

* 단일 스레드와 다중 스레드의 차이

예) 웹서버가 여러 개의 클라이언트 요청을 받는 경우

  • 단일스레드 : 한 번에 하나의 클라이언트만 서비스 할 수 있어 시간이 오래 걸린다.

그러면 매번 요청할 때마다 동일한 요청을 수행하는 별도의 프로세스를 생성하면 되지 않나?

-> But, 프로세스 생성은 많은 시간과 자원이 필요하므로 비효율적이다.

 

새 프로세스 할 일이 기존 프로세스 할 일과 동일하다면 굳이 ?

그. 래. 서.

기존 프로세스 안에다가 여러 개의 스레드를 만드는 것이 더 효율적이다.

 

🟢 멀티스레드의 장점

  1. Context-Switching 할 때 공유하고 있는 메모리만큼 메모리 자원을 아낄 수 있다.
  2. 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신 부담이 적어서 응답 시간이 빠르다.

🔴 멀티스레드의 단점

  1. 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
  2. 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수 밖에 없다. 교착상태가 발생하지 않도록 주의해야 한다.

 

출처

https://ko.wikipedia.org/wiki/%EC%8B%9C%EB%B6%84%ED%95%A0_%EC%8B%9C%EC%8A%A4%ED%85%9C

https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-5.-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC

https://bowbowbow.tistory.com/16

https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C

 

'리눅스&네트워크' 카테고리의 다른 글

Oracle sqlplus 설치하여 원격 DB 접속하기  (0) 2022.12.21
마운트  (0) 2022.07.20

마운트가 몬가요?

기본적으로 우리는 윈도우의 하드디스크, CD롬, 플로피디스크 이런 것들에는 익숙하나,
리눅스의 마운트 관련해서는 굉장 낯설다.
윈도우에 외장하드디스크나 CD롬 같은 디바이스들을 추가하거나 USB 를 꽂으면 우리의 시선은 자연스레 폴더를 열기 알림이 뜨는 우측하단으로 향한다. 이게 바로 윈도우에서 사용자가 마운트를 하지 않아도 되는 이유이다. 윈도우에서 알아서 자동으로 E:\ , D:\ 이런식으로 폴더를 잡아주기 때문이다.
이와 같이 물리적인 장치를 특정 디렉터리에 연결시켜주는 것을 마운트라고 한다.
윈도우에서는 이걸 자동으로 실행해준다고 하니.. 그동안 리눅스처럼 직접 마운트해줄 일이 없었던 것이다.
윈도우의 드라이브 당 하나의 디렉터리 트리 구조를 갖는다고 볼 수 있다.
리눅스에서 마운트를 해주기 위해선 파티션설정 과 포맷에 대한 선작업이 이뤄져야 한다.
디바이스(윈도우의 하드디스크라고 생각하면 될 것 같음)에 연결시켜줄 /drv 디렉터리를 만든다.
mount /dev/sdb1/drv
-> /dev/sdb1 디바이스를 /drv 디렉터리에 마운트(매핑) 시키겠다. 라는 뜻이다.
FileSystem 1K-blocks Used Available Use% Mounted On
/dev/sdb1 6377478 555 555453 1% /drv
mount -t ext4 -o ro /dev/sdb1 /mnt
-> 파일시스템이 ext4인 /dev/sdb1을 /mnt 디렉터리에 읽기 전용으로 마운트 한다.
출처 : https://jhnyang.tistory.com/12

+ Recent posts