반응형

수많은 리눅스 오픈프로젝트 사용자 통계 10순위 안에 드는 단종 앞둔 CentOS  
저는 레드햇 계열은 Centos와 데비안 계열로는 Ubuntu을 가장 좋아합니다!

단종을 앞둔 CentOS를 대안할 OS는 과연 무엇일까요?
최근에 네이버 클라우드에서 CentOS를 대안해 록키(ROCKY LINUX)을 선정했다고 하네요.
CentOS대안으로 떠오르는 Rocky Linux(록키 리눅스)는 현재 홈페이지에서 배포되고 있습니다.

아래 링크를 통해 PC환경에 맞는 ISO 설치 파일을 다운로드할 수 있습니다.

 

https://rockylinux.org/download/

 

Downloads | Rocky Linux

Rocky Linux is an open enterprise Operating System designed to be 100% bug-for-bug compatible with Enterprise Linux.

rockylinux.org

저는 Torrent로 설치하였습니다만 원하시는 항목을 선택하여 ISO파일을 다운로드 합니다.

저는 vmware으로 받은 iSO파일을 마운드 하여서 가상공간에 록키 리눅스를 설치를 진행하였습니다.

언어를 한국어로 설정 하고 계속 진행(C) 버튼을 누릅니다.

 

설치 요약에는 언어지원, 시간 및 날짜, 소프트웨어 선택, 네트워크 설정, 사용자 설정을 하고 설치를 진행 하시면 됩니다.

록키 리눅스의GUI를 보고싶어 서버-GUI로 사용하여 설치를 합니다!

 

설치 진행을 나타내주며 프로그래스바가 100%가 되기만을...기다립니다! 

설치가 완료되면 시스템을 재시작 합니다.

 

설치 요약에서 설정한 계정 정보, 키보드, 개인 정보, 온라인 계정 연결을 필요에따라 설정하시면 됩니다. 

저는 모든 설정을 기본값으로 하였으며 "준비됐습니다!" 저를 반겨주네요

자..록키 리눅스(Rocky)을 시작 합니다!!!!!!

 

터미널을 열어서 현재 록키의 버전을 확인할 수 있습니다.

CentOS 대안책인 록키OS에 대해서 짧은 소개와 설치과정을 보여드렸습니다. 
CentOS에서 록키로 데이터마이그레이션 및 여러 패키지를 설치하는 그러한 게시물도 작성해보려 합니다. 
다들 어려움 없이 록키로 넘어오시길!!

반응형

루아에서의 스레드(Thread)를 설명 드리겠습니다.

이글은 스레드에 대한 개념이 있으셔야 이해하실 수 있습니다. 앞서 설명드린 스레드에 대하여를 우선 읽어 보시기 바랍니다.

 

루아의 코드는 루아 가상머신이 돌려줍니다. 즉 루아 가상 머신이 스레드를 돌려줘야 합니다.

엄밀히 말하면 C/C++ 로 만든 스레드와는 다릅니다. C/C++ 로 만든 프로그램은 CPU 가 직접(OS 가 직접) 실행하는 코드이지요. 그러나 루아의 코드는 루아 가상머신이 중간에서 돌려주는 역할을 하기때문에, 실질적인 C/C++ 의 스레드를 생각하시면 약간의 오류를 범하실 수 있습니다.

단, 루아의 스레드 역시 하나의 가상머신(이것도 하나의 머신이니까요)에서 돌아주는 스레드 역할을 한다는 것이죠.

루아에서는 스레드를 Coroutine 이라고 합니다.

 

루아의 coroutine은 간단하게 이렇습니다.

 

  1. 루아의 스레드는 함수에서 출발한다.
  2. 루아의 스레드는 함수단위로 만들수 있다.
  3. 루아의 스레드는 coroutine 에 의하여 관리된다.
  4. 루아의 스레드는 c/c++ 에 의하여 만들어지는 스레드와는 다르지만 그 역할을 갖다.

정도로 요약할 수 있습니다.

 

루아원문에 보면

What are coroutines?

 

Coroutines allow us to execute several tasks at once. This is done in a controlled manner by passing control to each routine and waiting until the routine says it has finished. We can reenter the routine to continue at a later time and by doing this repeatedly we achieve multi-tasking.

이라고 나와 있습니다. 즉 한번에 여러가지의 일을 실행할 수 있도록 해주는 것이며, 이러한 루틴들이 서로 실행하며, 또는 대기하면서 기다리며 , 하는 동작을 하게 됩니다.

 

스레드의 생성

루아에서는 스레드를 다음과 같이 생성 합니다.

co = coroutine.create(함수명)

 

즉, 어떠한 함수를 스레드 함수로 만들 수 있습니다. return 되는 값은 thread 인식자라 생각하시면 됩니다.

function foo()
 print("foo",1)
end


co = coroutine.create(foo)

print(co)

위의 코드를 돌려보면

thread: 0137C300

와 같이 결과가 나옵니다. 물론 숫자는 인식자로 각각 다르게 나올 것 입니다.

 

위의 코드는 foo() 라는 함수를 coroutine.create 에 의하여 하나의 스레드함수로 만든 것이고 그 식별자를 co 라는 변수에 담아 놓은 것 입니다.

 

하나의 스레드는 그 상태가 있습니다. 즉 스레드가 어떤 상태이냐 즉, 살아 있나, 죽었나, 돌고 있나, 잠시 멈추어 있나 등의 상태를 가집니다.

 

생성된 스레드의 상태를 알아보는 함수는

coroutine.status(스레드인식자)

 

입니다.

function foo()
 print("foo",1)
end


co = coroutine.create(foo)

print(coroutine.status(co))

 

결과

suspended

위와 같이 coroutine.status() 함수에 의하여 스레드 함수의 상태를 알아 볼 수 있습니다.

스레드 함수는 생성 당시에는 "suspended" 라는 상태에 있습니다. 즉 멈추어 있는 상태 입니다.

 

스레드 함수를 실행하는 방법은

coroutine.resume(스레드인식자)

 

입니다.

function foo()
 print("foo",1)
end


co = coroutine.create(foo)

coroutine.resume(co)

 

결과

foo 1

 

위와 같은 코드로 생성된 thread 함수를 호출하는 것 입니다. 그냥 foo() 라고 함수를 호출하면 스레드로 호출되는 것이 아닙니다.

반드시 coroutine.resume() 로 해당 함수의 스레드 식별자를 이용하여 호출해 주어야 합니다.

위의 결과는 그냥 foo() 함수를 호출하는 것과 별 차이가 없습니다.

 

function foo()
 print("foo",1)

 -- 무엇인가 여기서 다른일을 하고 싶어요
 print("foo",2)
end

foo()

 

결과

foo 1
foo 2

위의 함수를 생각해보죠. foo() 함수가 호출되면 print 함수에 의하여 foo 1 이라는 결과가 나오고 바로 다음의 print 함수에 의하여 foo 2 라는 결과가 나오겠죠. 당연한 결과 입니다.

우리의 목적은 foo 함수가 호출될때 첫번째 print 를 수행하고, 어떤 다른일을 기다리며 , 그 다른일이 끝난후 두번째 print 함수를 수행하고 foo 함수를 종료하고 싶은것 입니다.

 

어떤 함수가 진행을 하다, 다른 프로세스가 돌도록 멈추는 것을

coroutine.yield()

 

라는 것으로 처리 합니다. 즉 프로세스가 위의 라인을 만나면 , 프로세스 진행을 더이상 하지 않고 기다립니다.

물론 위의 함수는 thread 함수가 아닌 일반 함수로 호출하면 오류가 납니다. 그러므로 해당 함수를 thread 로 호출해 줘야 합니다.

 

function foo()
 print("foo",1)
 coroutine.yield()
 print("foo",2)
end

co = coroutine.create(foo)
coroutine.resume(co)

결과

foo 1

위와 같이 foo 함수를 스레드로 만들고 coroutine.resume 으로 해당 스레드 함수를 호출하면 결과가 첫번째 print 함수의 결과만 나옵니다. 그 이유는 resume 에 의하여 해당 foo() 함수가 호출되다가 coroutine.yield() 에서 해당 함수를 돌려주는 프로세스가 멈추게 되는 것이죠.

위의 코드는 coroutine.resume(co) 에 의하여 처음 실행만 되었지, 중간에 yield 된 즉 suspended 된 스레드를 더이상 수행하지 않고 코드가 종료 됩니다. 그러므로 foo() 함수는 suspended 된 후 모든 루아코드가 종료되어 끝나 버린 경우 입니다.

 

function foo()
 print("foo",1)
 coroutine.yield()
 print("foo",2)
end

co = coroutine.create(foo)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))

 

결과

suspended  

foo 1            
suspended
foo 2
dead

위와 같이 코드를 바꾸어보죠. 결과를 잘 살펴보시기 바랍니다.

진행 과정은

    <ol dir="ltr" style="list-style-position: initial; list-style-image: initial; margin: 0px 7px 13px 40px; padding: 0px 7px;">
  1. 스레드가 만들어지고 바로 suspended 상태 입니다.
  2. resume 에 의하여 foo 1 이 출력 됩니다.
  3. coroutine.yield() 에 의하여 진행을 더이상하지 않고 멈추어 제어권을 다른곳으로 넘깁니다.
  4. suspended 상태로 있습니다.
  5. resume 에 의하여 앞서 멈춘 thread가 다시 돌아 갑니다. 즉 앞서 정지한 위치부터 프로세스가 돌게되어 foo 2 가 출력됩니다.
  6. thread 함수 즉 foo() 함수가 모두 종료되고 해당 스레드는 죽게 됩니다. (dead 상태)
  7. </ol>

루아에서의 스레드에 대하여 이해가 되셨는지 모르겠습니다.

 

반응형
[루아스크립트/프로그래밍]루아(LUA)Thread 에 대하여



thread 가 무엇인지 잘 모르시는 , 이해가 잘 않되시는분들을 위하여 thread에 대하여 잠깐 적고 넘어가겠습니다.


윈도우즈에서 하나의 프로그램을 실행하면 하나(때에 따라서 하나이상)의 프로세스를 만듭니다. 이 프로세스는 CPU가 아닙니다. 실행 하나라고 보시면 됩니다.

어떤 프로세스가 CPU를 점유하게 되면 다른 프로세스는 멈추게 됩니다.

쉽게 생각하여 무한 루프를 돌리는 코드가 돌고 있다고 생각해보면, 이 무한루프는 컴퓨터의 CPU자원을 혼자 사용하게 됩니다

그러므로 다른 프로세스는 멈추어 있어야 합니다. 컴퓨터가 아무리 성능이 좋아도 하나의 프로세스를 돌리면 다른 프로세스는 순간적으로 멈추어야 합니다.

 

그러면, 여러 프로세스가 동시에 같이 돌아야 하는 상황에서는 어떨까요? 솔직히 이는 불가능 합니다. 동시라는 것은 과학적 물리적 시간에서 정확한 동시여야 하지만, 우리는 컴퓨터 프로그램에서 동시에 라고 하면 해당 컴퓨터를 운영하는 사람이 인지못하는 범위에서 약간의 시간을 주고 조금조금씩 수행하는 것을 의미 합니다.

 

우리가 벽돌로 두개의 탑을 쌓는다고 생각해보죠. 물론 두손으로 동시에 벽돌 하나씩 양손에 쥐고 쌓으면 됩니다. 그러나 컴퓨터는 손이 하나입니다. 즉 손이 하나라고 생각해보죠. 그러면 한번에 벽돌 하나만 집어 두 탑중 한곳에 쌓아야 합니다.

간단하게 하기 위하여 두개의 탑을 1 과 2라고 생각해보조.

한번 벽돌을 집어 탑 1 에 올립니다. 다음번 벽돌을 집어 탑2에 올립니다. 다시 벽돌을 집어 탑 1에 올립니다.

이러한 과정을 계속 하다 보면 탑1 과 탑2 가 동시에 올라가는 것을 경험할 수 있습니다.

어느 탑을 우선시 하느냐에 따라 탑이 동시에 올라가도 그 속도는 차이가 있을 수 있습니다만. 어쨌든 동시에라는 것은 이러한 약간의 시간차를 두면서 거의 동시에 올라가는 것을 의미 합니다.

 

우리가 벽돌을 손으로 집어 탑에 올리는 동작을 컴퓨터에서는 프로세스 라고 합니다. 이러한 프로세스를 두개의 탑에 쌓거나

아니면 두개의 프로세스를 만들어 탑을 쌓는것이 우리가 말하는 thread 입니다.

 

일반적인 프로세스는 한번 프로세스에 들어가면 idle상태(대기상태) 가 될때까지 멈추지 못합니다. 멈춘다면 컴퓨터가 멈추는, 흔히 "프로그램이 죽었다, 다운됬다" 하는 상황이 되는 것 입니다. 살아 있는 프로세스는 계속 도는 것입니다. 설령 그 프로세스가 idle(대기 상태)에 있어도 말입니다.

 

이러한 일반적인 프로세스는 스레드가 아닙니다.

동시에 돌아가는 프로세스가 필요합니다.

어떤 프로세스가 진행, 즉 자신의 고유한 일을 하다가 어느순간 잠시 멈추어 CPU 점유를 풀어주고 다른 프로세스에게 넘겨 주는 작업이 있고, 다시 다른 프로세스가 멈추어 있을때 자신이 멈추었던 것을 이어서 계속 진행할 수 있는 프로세스가 필요합니다.

이러한 프로세스를 스레드(Thread) 또는 스레드 프로세스라고 합니다.

다른말로는 Coroutine 이라고도 합니다.

 

추후 설명하겠지만, 루아에서는 thread라기 보다는 coroutine 이라는 말이 더 적합한 형태 입니다.

루아는 가상 머신입니다. 이러한 가상머신에서 스레드같이 돌도록 하는 것을 coroutine이라는 것으로 처리하고 있습니다.

 

스레드는 다음과 같은 동작을 할수 있는 프로세스 입니다.

 

  1. 스레드의 생성     -- create
  2. 스레드의 실행     -- execute
  3. 스레드의 정지     -- suspend, yielding
  4. 스레드의 재실행  -- resume
  5. 스레드의 종료     -- terminate / dead

일반적인 프로세스는 생성-실행-종료  의 단계만 있습니다. 그러나 스레드 프로세스는 정지 및 재실행 , 즉 suspending, resume 이라는 상태를 더 가지고 있습니다.

이를 이용하여 여러가지의 일을 동시에 처리하는 능력을 부여하는 것이죠.

반응형

[루아스크립트/프로그래밍]루아(LUA)루아의 print 함수에 대하여 print 함수를 잠시 설명하겠습니다.

print 는 루아엔진에서 기본으로 제공하는 함수로 어떠한 값 또는 객체(변수)의 값을 화면에 출력해주는 기능을 수행 합니다.

기본적으로 print 함수는 stdout 으로 출력합니다. 그러나 LuaWin 에서는 이를 redirection 하여 프로그램의 아래에 있는

Consol 부분에 출력하게 되어 있습니다. 흔히 루아 코딩에 있어서 디버깅용, 내용 확인용으로 사용합니다.

 

print(2)     -- 숫자 2를 출력 합니다.

2

 

print("hello")  -- 문자열 "hello" 를 화면에 출력 합니다.

hello

 

print 문은 그 스스로 CR/LF 를 마지막으로 출력 합니다. 그러므로 print 문장은 다음 print 문장에 대하여 cr/lf 로 라인을 갱신하게 됩니다.

 

print 문이 취하는 인수의 갯수는 정해지지 않았습니다.

 

문법은

 

     print ([arg1,arg2,.....])

 

print 문은 입력되는 각 인수를 tab 으로 구분하여 화면에 출력 합니다. 즉

 

print (1,2,3)

 

이라 하면

화면에

 

1[tab]2[tab]3[cr/lf]

 

가 되겠죠.  화면에는    1    2    3    이렇게 나옵니다.

 

인수가 없는 print 문은??

print()

하면 그냥 한줄 생기는 것 입니다.

 

print(1)

print()

print(2)

 

1

[한줄추가]

2

 

이렇게 되겠죠.

 

print문은 흔히 자신의 코드를 확인하거나 디버깅, 검사 하는 용도로 사용합니다.


 

print 는 C/C++ 에서의 printf 함수가 아닙니다. 그러므로 변환 문자형태로 사용할 수 없습니다.

printf 와 같은 것을 찾는다면 루아의 string.format 을 참고하시기 바랍니다.


반응형

루아에서 사용하는 8가지의 type 에 대해서 알아 보겠습니다.

  1. number
  2. string
  3. boolean
  4. table
  5. function
  6. nil
  7. userdata
  8. thread

 

Numbers

루아는 사칙연산(더하기/빼기/곱하기/나누기)에 적용하는 숫자를 제공 합니다.

 

print(2+2)

4

 

print(2-7)

-5

 

print(7*8)

56

 

print(7/8)

0.875

 

주의 할 점은 루아에서의 숫자는 정수가 없습니다. 즉 정수 같지만, 실수로 처리 합니다.

즉 정수든 실수든 모두 그냥 number 입니다.

 

Number 는 = (대입 연산자) 에 의하여 변수에 대입될 수 있습니다.

 

x = 7

print(x)

 

7

 

 

변수는 할당 될때 생성 됩니다.

c/c++ 에서는 변수가 할당될때는 여러 부분에서 있습니다. 컴파일시/로딩시/실행중 등등..

그러나 루아에서는 변수의 선언이 없습니다. 또한 컴파일러가 아니기에

변수는 변수에 어떠한 값이 할당될때 생성이 됩니다.

 

x = 10   -- 이때 변수 x 가 할당 됩니다. 숫자로

x = "aaaa"  -- 이때 변수 x 가 다시 할당 됩니다. 문자열로

 

 

Strings

루아는 문자열(텍스트 형)을 지원 합니다.

 

print("hello")

 

hello

 

문자열 역시 변수에 할당될 수 있습니다.

 

who = "Lua user"

print(who)

 

Lua user

 

 

문자열은 .. 연산자에 의하여 합칠 수 있습니다.

who = "Lua user"

print("hello "..who)

 

hello Lua user

 

.. 연산자 역시 연산에 사용됩니다.

 

message = "hello " .. who

print(message)

 

hello Lua user

루아에서는 문자열에 + 연산자를 사용할 수 없습니다.

message = "hello " + who   -- 불가능 합니다.

 

Boolean

boolean 은 true 또는 false 를 값을 가질 수 있습니다. 즉 true 아니면 false 여야 합니다.

b = true
print(b)

 

true

 

b = not true

print(b)

 

false

 

not 연산자는 true 를 false 로, 반대로 false를 true 로 바꾸는 연산자 입니다.

 

boolean 은 논리적인 연산 (논리 연산자) 에 의하여 만들어 질 수 있습니다. 즉 논리 연산자의 결과는 boolean 입니다.

 

print(1==0)

 

false

 

print(1==1)

 

true

Tables

루아는 일반적인 목적의 집합형 데이터를 제공하며 이를 table 이라 합니다. c/c++ 의 struct (구조체) 라 생각하시면 되는데

실제적으로는 이보다 더욱 유연합니다.

 

집합형 데이터는 흔히 list, set,array,associative array 등에 사용합니다.

루아에서의 테이블은 이렇게 집합형 데이터를 처리할 수 있는 단 하나의 타입 입니다.

 

테이블의 생성

테이블은 {} 에 의하여 생성할 수 있습니다.

 

t = {}   -- 비어있는 하나의 테이블을 만듭니다.

 

테이블 자체를 print 하면 그 type 과 주소가 나옵니다.

t = {}
print(t)

 

table: 01429420
* 참고: table: 뒤의 숫자는 다를 수 있습니다.

테이블은 생성 당시 object 들을 설정하여 생성할 수 있습니다.

 

t = { value = 123, text = "hello"}

print(t.value)

print(t.text)

123
hello

테이블은 또다른 테이블을 포함할 수 있습니다.

y = { const={ name="Pi", value=3.1415927 }, const2={ name="light speed", value=3e8 } }
print(y.const.name)
print(y.const2.value)

 

Pi
300000000

 

Functions

루아에서 함수는 number 또는 string 과 같이 변수에 할당되어 집니다. 함수는 function 이라는 키워드에 의하여 생성 됩니다.

function foo() print("hello") end     -- 함수 선언

foo() -- 함수 호출

print(foo)

 

결과

hello
function: 014308F8

함수의 선언은

function 함수명([인수1,인수2,...])

-- 함수 내부

end

함수의 호출은 함수명에 () 를 붙여 호출 합니다.

함수명([인수1,인수2,...])

 

함수도 변수입니다. 그러므로 다음이 가능 합니다.

 

function foo() print("hello") end     -- 함수 선언

myfoo = foo

myfoo() -- 함수 호출

 

결과

hello

nil values

nil 은 참으로 특이한 값 입니다. c/c++ 을 아시는 분들이 혼동하기 쉽습니다. 결론적으로 nil 은 아무것도 아닙니다.

nil 은 c/c++ 의 null  이 아닙니다. c/c++ 의 null 은 0 이죠.. 그러나 루아의 nil 은 0 이 아닙니다. 그냥 nil 입니다.

 

x = 2.5
print(x)
x = nil
print(x)


결과

2.5
nil

nil 은 비교 연산에 사용할 수 있습니다.

 

print(x == nil)
x = 7
print(x == nil)
print(x)

 

결과

true
false
7

할당되지 않은 변수는 nil 입니다.

 

Userdata

userdata 는 기본 루아만으로 사용될수 없습니다. 이는 루아엔진 자체가 다른 어플리케이션에 내제되어(embeded)

C/C++ 과 연동하여 작성될때 사용 됩니다.  추후 설명을 하도록 하겠습니다.

 

Thread

Thread 역시 추후 설명 도록 하겠습니다.

 


+ Recent posts