지난 포스트에서 다룬 내용은 그냥 빈 파일을 생성하고 그 파일이 제대로 hdd에 저장되는지를 확인해보았다. 하지만 저번에 잠깐 이야기 했다시피 프로그램이란 코드의 집합체이며, 그 말은 이전과 같이 빈 파일안에 코드라고 정의되어야 할 무언가가 들어있어야 한다는 것이다. 결국은 파일에 어떤 내용을 집어넣을 수 있어야 하고 그를 위해서 파일에 접근할 수 있는 입출력함수가 필요하다. C에서는 따로 stdio.h에서 파일의 입출력과 관련한 fopen()이나 fwrite(), fclose()같은 함수를 제공한다. 책에서도 이를 구현했다. 아무튼 이걸 구현하기 위해서는 따로 FILE과 DIRECTORY에 대한 자료구조가 필요하다. 당연히 파일입출력이기 때문에 검색에 대한 기능이 필요하며, 이를 위해서는 지난 포스트에..
지난 번 포스트에서는 하드디스크를 인식시키는 과정을 했다. 물론 그 과정만으로 데이터를 저장할 수도 있겠지만, 파일의 저장과 관리를 효율적으로 하기 위해서는 그 데이터 저장에도 원칙이 있어야 한다. 그 원칙이 File system이고, 몇년전까지만 해도 가장 일반적으로 쓰인 File system이 이른바 Table을 만들어서 관리하는 규약인 File Allocation Table (FAT) 방식이다. 여기서 등장하는 Table 의 Size에 따라서 뒤에 숫자가 붙는다. 예를 들어 FAT32인 것은 Table size가 32bit인 fileSystem인 것이다. *nix 규격에서는 따로 ext라는 file System을 사용한다. 이 책에서는 독자적으로 File system을 만들되 전체적으로는 Table..
Memory도 저장 매체이고, pc 구동에서 중요한 역할을 차지하지만 문제는 전원이 나가면 그 데이터가 없어진다는 것이다. 말그대로 휘발성이라는 것이다. 사람이 필요로 하는 작업의 특성상 데이터를 지속적으로 저장하고 유지할 공간이 필요한 것이고 오랫동안 그 역할을 하고 있는 것이 바로 HardDiskDrive다. 물론 요즘에는 SSD가 등장해 점점 점유율을 넓혀가고는 있지만 가격이나 용량적인 측면에서 대중화는 아직까지는 먼 듯 하다. 아무튼 지금 거의 쓰고 있는 컴퓨터에는 이 하드디스크가 들어가 있을 것이다. 하드 디스크의 내부에는 platter가 겹겹이 쌓인 Cylinder 형태를 취하고 있고, 특정영역에 대해 Access Arm이 데이터를 읽고 쓰는 방식을 취하고 있다. 그 특정영역에 접근하기 위해서..
컴퓨터에서 뭔가를 하려면 항상 메모리를 거쳐야 한다. 연산을 하는 본연의 능력은 프로세서가 가지고 있지만 그걸 읽어오고 저장하는 것은 메모리가 있기에 가능한 것이다. 물론 요즘에는 그런 메모리의 가격이 싸지고 개인이 사용하는 용량도 과거에 비해서 커졌지만 과거에는 이 메모리를 효율적으로 다루는 것, 소위 Memory Management가 무척 중요했다. 그중 어플리케이션의 동작을 위해서 동적으로 메모리를 할당받는 Dynamic Memory Allocation이 이번 절에서 다룬 주제였다. 분명 자신이 명령한 process를 수행하기 위해서는 일일이 Memory를 할당받아야 한다. 하지만 그렇게 하고 끝난 후에는 다른 task가 그 Memory 영역을 쓸 수 있도록 반드시 해제해줘야 한다. 컴퓨터에 장착되..
지금까지는 순전히 정수만 다뤘다. 사실 메모리의 비트도 하나하나가 정수이고, 거기에 메모리를 이동할 때도 비트연산만 했기 때문에 실질적으로 실수를 다룰 일은 거의 없었다. 하지만 컴퓨터의 원래 목적은 실험의 데이터를 뽑아내는데 있었고, 이때는 정확성 측면에서 실수가 필요하다. 물론 요즘에 와서는 실수 연산을 필요로 하는 프로그램은 적어졌지만, 그때의 그 흔적이 프로세서에 남아있는데 이걸 FPU(Floating Point Unit) 라고 한다. 흔히 부동소수점 연산기라 불리는데 과거에는 x87 coprocessor라는 이런 실수 연산에 특화된 장치를 현재의 프로세서에 이식되어 있다. 일단 프로세서가 주로 하는 일은 연산이다. 연산을 하기위해서는 당연히 인자가 필요할 것이고, 이 인자를 계속 가지고 있을 그..
지금까지 task를 효율적으로 처리할 수 있는 방안에 대해 이야기 했었는데 그러면 어떤 원리로 처리가 되는지를 알아봐야 할 것 같다.일단 task는 하나의 실행단위이다. 프로그램이 코드로 작성되어있는 집합일 뿐 이걸 pc가 동작시키기 위해서는 메모리상에 load를 시켜야 한다. 그 memory 상에서 대기하는 형태가 바로 task 인 것이다. 이 걸 다르게 말하면 Process라고도 할 수 있는데 실질적으로 큰 차이를 나타내는 것 같진 않다. 찾아보니까 task와 process의 구분은 MultiTasking의 개념을 설명하기 위해서 한다고는 하는데 자세히는 잘 모르겠다. 아무튼 이런 process가 동시에 처리 되는 것을 앞에서 잠깐 언급한 MultiTasking / MultiProgramming 이란..
연구실 갔다와서 쉬고 있는데 택배가 왔습니다. 덕분에 저도 moleskiner가 되었습니다. 에버노트 버전이라 3개월 이용권이 동봉되어 있습니다. 그리고 그 귀하다는 Make 컵도 같이 왔네요. Make Magazine은 보통 간단하게 만들수 있으면서도 신기한 기기를 소개하는 잡지인데, 저도 공식적인 루트는 아니더라도 찾아서 보고 있습니다. 우리나라에서는 한빛미디어에서 공식적으로 배포하고 있습니다. 지난 5개월 동안 저는 한빛 리더스라는 활동을 했었고, 이번 기수가 5기였었습니다. 간단하게 말하자면 한빛미디어에서 출간되는 서적에 대해서 미리 읽어보고 그에 대한 리뷰를 게시함으로써 독자가 미리 구입하기 전에 정보를 얻을 수 있게 하는 제도입니다. 그래서 제 블로그에서도 몇번 책에 대한 리뷰를 다뤘었습니다...
이제 Task가 multilevel Queue 구조에 따라서 우선 순위가 결정되고 효율적으로 처리되는 것을 구현했는데, 다시 원론으로 돌아가 생각해볼 게 있다.task를 수행하기 위해서는 시스템내의 resource를 점유한다. 그런데 이전 예제처럼 수백 수천개의 task가 수행될때 가끔 같은 resource를 사용해야 할 경우가 발생할 수 있을 것이다. 분명 자기 task를 수행하기 위해서 resource를 점유한 상태에서 다른 task의 요청을 받게 되면 어떻게 해야 되는지에 대해 고민할 필요가 있다. 물론 운이 좋게 resource를 넘겨줄 수 있을 수도 있겠지만, 운영체제 구동에 운을 개입시키기에는 너무 큰 개체다. 이때 필요한 것이 Process synchronization( 동기화)라는 것이다...
지난 포스트에서 이야기 했던 것처럼 Round-Robin 방식을 쓰면 그냥 단순한 방식보다는 효율적으로 Task를 처리할 수 있다. 하지만 어떤 경우에는 기존 방식과 차이가 없는 경우도 발생하는데 이 때문에 조금더 발전한 방식이 바로 지난 포스트에서 잠깐 언급했던 우선순위를 도입한 방식이다. 이를 단계를 여러개로 구분했다 하여서 multilevel Queue Scheduler 이다. 당연한 이야기이겠지만 분명 queue가 필요하다는 말은 처리해야 될 task가 여러개 있다는 것이고 이걸 나눠서 처리하기 위해서는 따로 상태를 저장해둘 공간이 필요하다. 그리고 어떤 우선순위의 기준으로 볼것인가를 정해야 한다. 생각해볼 것은 큐에서도 여러 큐중 우선 순위가 높은 큐를 찾는 것이 우선이 되어야 할 것이고 그 안..
개인적으로 MS 하드웨어를 "매우" 좋아합니다. 물론 성능적인 면으로 따지면 고려 대상이 더 넓어지긴 하지만 무엇보다 좋은 건 3년간 AS가 보장된다는 겁니다. 거기에 이유 불문하고 무조건 1:1 교환이기 때문에 만족합니다.그런데 참... 아크마우스는 이야기 안할 수가 없겠네요. 제 아크마우스 흰둥이입니다. 아크마우스의 고질적인 문제는 바로 휠이 제대로 동작하지 않는다는 겁니다. 진짜 이 문제로 두세번 정도 교환받은 거 같습니다. 교환 받는 내내 이 문제가 해결되지 않은거 보면 참.. 할 말이 없네요.. 외국에선 이 문제를 개인적으로 수리하는 방법을 공개했네요. 참고하시기 바랍니다.http://dompruitt.com/2008/11/24/fixing-the-scroll-wheel-on-the-micros..
지난 포스트에서 임의의 task를 두개 만들고 서로 번갈아가면서 switch 하는 모습을 봤다. 그런데 이런 task가 두개 였으니까 이렇게 쉽게 switch가 되겠지만 실질적으로 처리하는 task는 엄청 많다. 이를 한꺼번에 다루기 위해서 뭔가의 도구가 필요하고 그 순서를 가를 기준이 필요하다. 그게 바로 scheduler 이다. 여러가지 이유가 있겠지만 기준을 정해서 task의 우선순위를 정하게 되면 시스템은 효율적으로 일할 수 있기 때문에 근본적으로 성능이 향상된다. 마치 계획성있는 사람이 더 효율적인 것처럼... 그 scheduler도 내부 구조와 기준에 따라서 나눠지는데 가장 쉽게 구현할 수 있는 기준이 바로 Round-Robin 기법이다. 그냥 전체 프로세스를 일정시간단위로 끊어가면서 task..
이번에 새로 가져온 제품은 Leto 사의 DiskClone이라는 제품입니다. 이게 하는 역할은 보통 두개의 하드를 외장 드라이브로 연결해주는 일종의 도킹스테이션입니다. hot Swap을 지원하기 때문에 그냥 쓰고 싶을 때 하드를 그냥 꽂으면 됩니다. 전송방식은 USB 2.0과 eSATA 방식을 지원하는데.. 제 메인보드에 eSATA를 지원하지 않는 걸 생각하지 않았네요.. 사실 eSATA를 지원하게 되면 내부에서 SATA2를 사용하는 속도와 동일하게 3Gbps 의 속도로 데이터를 전송합니다. 반면 USB 2.0 규격을 사용하게 되면 480Mbps의 속도로 전송되기 때문에 조금 느리지요. 일반적으로 usb에서 데이터 옮기는 속도를 생각하시면 될 듯 합니다. 메인보드를 교체하지 않는 한 당분간은 usb 2...
작년 7월쯤에 찰스 페졸드씨가 윈도우 8에 대한 책인 Programming Windows 6th edition을 출간한다는 이야기와 함께 싼 가격에 예약 판매를 진행한다는 공고가 올라왔었습니다. 그때 10불이었는데.. 한창 윈도우 8에 대한 개발 공부를 하는 입장에서는 좋은 기회가 될거라 생각하고 질렀었지요. 그와중에 윈도우 8의 버전이 Developer Preview, Consumer Preview , Release Preview 를 거쳐서 드디어 RTM 버전까지 거치게 되었고, 이 책도 최종 출간이 늦어졌었습니다. 언제 출간될까 생각나는 즈음에 정식 버전이 출간되었습니다. 그런데 늘어난 책 장 수가 생각외로 많이 늘어났습니다. 원래 RP 버전 책이 550여장이었던데 비해서 이번에 출간된 책은 무려 1..
OS에서 가장 중요한 요소 중 하나가 바로 task를 처리하는 방법이다. task는 그냥 하나의 작업 단위라고 보면 될거 같고 각각의 state와 관장 영역이 있다. 가까이에선 Task Manager를 살펴보면 된다. 보면 각 task마다 각각 cpu와 ram resource를 확인할 수 있다. 그런데 여기서 터미널 하나를 죽여도 다른 상태는 별 영향이 없다. 이렇듯 테스크를 다루는 프로세서의 상태는 제각각 다르다. 이전에 잠깐 나왔던 context의 개념이 바로 그렇다. 이 context만 유지된다면 여러 task가 수행되어도 다 개별적으로 이뤄진다는 것이다. 다르게 생각해보면 이 테스크를 공유할 수 있게 하면 하나의 task에서 또다른 context를 만들 필요가 없다는 점이 있다. 여기서 멀티테스킹..
- Total
- Today
- Yesterday
- Windows Phone 7
- SketchFlow
- Kinect for windows
- windows 8
- bias
- Variance
- PowerPoint
- Pipeline
- ColorStream
- End-To-End
- arduino
- reward
- 파이썬
- 강화학습
- dynamic programming
- Off-policy
- Distribution
- Expression Blend 4
- 딥러닝
- DepthStream
- processing
- ai
- 한빛미디어
- Kinect SDK
- Offline RL
- Policy Gradient
- Gan
- Kinect
- RL
- TensorFlow Lite
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |