liunx 에서 spin lock 사용법

ohcell의 이미지

안녕하세요!!
우선 kldp에 자주는 못 오지만 저의 얕은 지식을 가끔 물어 보러 오는 무식쟁이 입니다.
요번에도 많은 도움 부탁 드릴깨요..
본론으로 들어가면요..

현재 재가 간단한 device driver 소스를 짜고 있습니다.
server_app 에서 txt 파일 을 열어 server_dev(/dev/serverdev=>char device)로 문자을 보내면
server_dev 는 EXPORT_SYMBOL_NOVERS()를 사용 client_dev(/dev/clientdev)와 변수를 공유 하여 쓰고 있고
client_app 에서는 그 문자열을 읽어와서 다시 txt에 저장을 하는 간단한 형태 입니다.(이거 하느라 무지 힘들었어요.. ㅠ.ㅠ)
그런데 요구 조건이 여기에 spin lock을 이용하라는 것입니다.
spin lock 이 뮤텍스나 세마포어 처럼 공유 메모리 영역(critical section)을 보호 하는 거니까.. 아마도 server_dev.c 와 client_dev.c 에서 공유된 변수를 읽고 쓰는 곳에서 사용 해야 하겠다는 생각 까진 했는데.. 당최 그 함수를 어떻게 써야 되는지 모르겠습니다.
간단한 예제 소스라도 있으면 참고 하겠는데.. 제가 그런 예제 소스도 못 찾고 있네요..
spin lock 이 어떻게 사용이 되는지.. 간단한 예제소스나 도움이 될 만한 사이트 알고 계시면 답변 좀 부탁드립니다.
^^

powerson의 이미지

spinlock은 일단 SMP 환경에서 사용하기 위한 lock이라는건 아시죠?

spinlock은 일단 lock 변수를 선언하고, 항상 사용하기 전에는 초기화를 해주어야 하는데, 초기화 해주는 방법은 두가지가 있습니다. 정적으로 하는 방법과 동적으로 하는 방법입니다.

spinlock_t example_lock = SPIN_LOCK_UNLOCKED; <== 정적으로 하는 방법.

spinlock_t example_lock;
spin_lock_init( &example_lock ); <== 동적으로 하는 법.

그 이후에 사용방법은 공유하는 데이터 영역에서 lock 걸려고 하시는 구간에

spin_lock( &example_lock );
shared data area
spin_unlock( &example_lock );

이렇게 간단히 사용하실 수 있습니다.
하지만, 단순하게 spin_lock이 이렇게만 있는 것은 아니고, 어떠한 context냐에 따라서 spin_lock_#x/spin_unlock_#x를 사용할 수 있는데, #x는 irq/irq, irqsave/irqrestore, bh/bh 등으로 나뉩니다. 또한 그 위에 read/write lock으로도 구분되는데, 이것은 LDD(Linux Device Driver) 책을 참고하시면 될거 같네요. 또한, spin_lock에 대한 예제는 linux kernel에 엄청나게 많습니다. linux device driver쪽을 개발하시면서 kernel쪽은 아무래도 항상 참고하셔야 하는 referrence라고 생각됩니다. 그럼 수고하세요.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.