kernel level & user level lock에 관하여 질문드립니다.

olif의 이미지

안녕하세요.

하나의 메모리를 user-level과 kernel-level에서

동시에 접근하는 프로그램을 구상중입니다.

데이터 동기화를 위해서 lock을 걸어주려고 하는데.

현재로서는 semaphore를 생각하고 있었는데, semaphore가

sleeping, waking overhead 가 크기 때문에 held time이 길때에만

사용한다고 되어 있어서 ㅠㅠ.

locking이 빈번히 일어나고, hold time은 짧을 것이거든요.

semaphore를 선택한 이유는 user-level과 kernel-level에서 동시에

사용할 수 있는 lock이라고 생각되서였습니다.

질문은 이것입니다.

첫째. user-level과 kernel-level에서 동시에 사용할 수 있는 lock이 또 무엇이 있는지?

둘째. 없다면 semaphore를 사용했을때, overhead가 심각한 것인지 입니다.

^^ 많은 도움 부탁 드립니다.

ssehoony의 이미지

커널 모듈을 만드시나요?
커널과 유저레벨 어플은 메모리를 공유하지 않는게 좋을 듯 한데요.
커널과 유저레벨 어플 사이에는 보통 복사를 하는 것이 대부분입니다.
(제가 알고있는 지식 내에서는 100% 모두 복사네요.)

만약 커널이 참조하는 메모리를 유저레벨 단에서 실수해 버리면 커널 panic 이 될테니 유저레벨 어플에 따라
커널의 안정성이 보장되지 않는다면, 안정적인 커널이라고 할 수 가 없으니 좋은 구조가 아닌듯 합니다.

버클리 소켓 api 도 송수신 데이터를 커널에서 유저로 복사하는 것이 매우 비효율적인
부분으로 인식하고 있지만, 그래도 여전히 공유하는 api를 만들지 않는 것을 보면
커널과 유저레벨 어플이 메모리를 공유하는 것은 피하는게 좋지 않을까 합니다.

그리고 세마포어는 프로세스간 공유할 수 있는 메모리가 없기 때문에 사용하는 Lock 입니다.
생각하시는 것 처럼 서로간의 메모리를 접근 할 수 있다면 그 메모리에 Lock 데이터를 기록하고
local lock 처럼 사용하시면 될 듯 한데요. (공유메모리를 이용해서 프로세스간에 이렇게 할 수 있습니다.)

그런데 궁금한건, 커널 소스의 메모리 관리 부분을 많이 수정하지 않고 쉽게 유져레벨 어플과 커널이 메모리를 공유할 수 있는 방법이 있나요?
혹시 이 방법이 없다면, 어떻게 커널레벨과 유저레벨 간의 메모리를 공유할건지 부터 고민해 보셔야 할 것 같네요.

nako의 이미지

ioremap으로 특정 물리 메모리를 가상메모리로 mapping할 수 있고, 이 주소로 driver 내에서 mmap function을 구현하면 kernel과 user space가 동일한 메모리 공간에 access 할 수 있을 것 같습니다.

문제는 lock인데 ssehoony 님의 말씀대로 메모리에 flag를 남겨두는 방법도 있지만 mmap을 통해 넘겨 받은 memory에 프로세스가 access 할 때에 이것이 원자적 접근이라면 문제가 안되겠지만 그렇지 않다면 문제가 좀 복잡해 질 수 있겠습니다. user space의 프로세스가 reading 하고 조건을 판단하는 사이에 interrupt 핸들러쪽에서 동일 공간에 access한다든지 한다면 동기화는 어렵겠지요.

저도 kernel module과 user application 간의 세마포어 공유는 해보지 않아서 모르겠지만 세마포어류의 공인된 커널 동기화 자원을 이용해야만 하는 상황은 맞는 것 같습니다.

olif의 이미지

세마포어 공유는 어찌어찌 될 듯한데, 세마포어로 공유하는 건 오버헤드 문제 때문에 힘들 것 같습니다.

제가 다른 커널 동기화 자원에 대해서 잘 몰라서 ㅠㅠ. 혹시 user_level에서도 사용할 수 있는 커널 동기화 자원에 대해서 아시면 알려주시면 감사하겠습니다 ^^

ssehoony의 이미지

공유되는 메모리에 간단한 flag를 두고 값을 대입하는 방식으로 가면 nako님 말씀하신데로 문제가 발생할 수 있습니다.
뮤텍스용 lock은 test and set 이라고 하는 특정 메모리의 값을 읽음과 동시에 설정하는 어셈블리 인스트럭션을 이용해서 구현이 되는데요. 이 인스트럭션은 atomic 접근이 보장이 됩니다. 만약 직접 구현하시겠다면 앞서 말한 test and set 을 이용하셔서 구현하셔야 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.