multithreading을 공부하시다 보면, GIL에 대해 한 번 정도는 들어보시게 됩니다. Global Interpreter Lock의 줄임말입니다. 그런데 이것이 있으면 Lock이 필요 없을까요? 관련 질문을 봐도, 답은 한결같이 아닐 수도 있다는 것이였습니다. [관련글] 원자성을 만족하는 연산을 n번 호출하는 연산은 원자적일까요? 이 문서를 읽어 보시면, 각각의 byte code가 어쩌고 저쩌고 언급을 하다가 atomic 하다는 언급을 하고 있어요. 아래 예제를 보도록 하겠습니다. foo는 global 변수 x에 diff를 100번 더합니다. main 부분을 보겠습니다. diff가 1, -1, 1, -1이 들어감을 알 수 있어요. 18번째 줄에 target이 foo 메서드이고, args가 li의 ..
OS 검색 결과
저번에 seq 명령어에 대해서 이야기 한 적이 있었습니다. 이것을 이야기 하면서, 쉘 프로그래밍에서 꽤나 유용하게 쓰일 법 하다고 언급을 했는데요. 예제를 통해서 알아보도록 하겠습니다. [관련글] 쉘 스크립트에서 $()과 $의 차이점이 뭔가요? seq 명령어에 대해 알아봅시다. 먼저, 1 row, 2 row, ... , 10 row를 출력해야 한다고 생각해 보겠습니다. 그럴 때 어떻게 하면 좋을까요? 단지, for in 문을 곁들이면 됩니다. 1부터 10까지 도는 것은 $(seq 10)에서 처리합니다. 이 글을 보시면, $()는 명령어의 실행 결과로 대치된다고 설명이 되어 있어요. 예를 들자면 $(seq 10)은 단지 1 2 3 4 5 6 7 8 9 10으로 대치될 뿐입니다. 그래서, 사실 이 쉘 프로그..
안녕하세요. 오늘은 리눅스 seq 명령어를 알아봅시다. 먼저 man 페이지를 봅시다. 이 명령어는 number의 순서를 출력합니다. LAST만 주는 것이 있고, FIRST와 LAST를 주는 것이 있고, FIRST, INCREMENT, LAST 3개를 주는 것이 있습니다. 이 중에, INCREMENT는 step을 의미해요. 예제를 보면서 이해해 보도록 하겠습니다. 먼저 seq 10을 입력했더니 1부터 10까지 출력되었습니다. LAST만 주어진 경우인데요. 이 때에는 default로 시작 수가 1이 됩니다. 이것을 c언어의 for loop로 치면 위와 같아요. 다음에 seq 5 10은, FIRST와 LAST가 주어진 상황입니다. 시작 수가 5이고, 끝 수가 10이니까, 5부터 10까지 출력되었습니다. 이 프..
안녕하세요. 이번 시간에는 race condition과 관련이 깊은 toctou에 대해서 알아보려고 합니다. 검사 시점과 사용 시점을 주의깊게 보시면 됩니다. 예제 프로그램을 하나 보겠습니다. 유저 객체 하나가 있습니다. Task는 유저 객체 하나를 받습니다. 그리고 Thread에 유저 객체 u가 들어간 task를 넘겨줌을 알 수 있어요. Thread를 다 돌리고, 유저의 포인트가 0보다 작아지면 u.getPoint()의 값을 출력하고 break를 걸어요. 여기서 질문. 0보다 작아지는 경우가 생길 수 있을까요? Task는 간단한 일을 수행해요. 단지, run에서 7포인트를 소비할 뿐이에요. consumePoint는 현재 포인트가 a보다 클 때, 현재 포인트에서 a를 빼게 됩니다. 사실, 우리는 결과를 ..
최근댓글