[완료] context switching 이 일어날 때의 read() / write() 버퍼 데이터 관련 질문입니다.

cococo의 이미지

검색을 해 봤는데요...... 검색어가 안 좋아서 그런지 제가 원하는 내용이 나오지 않아서 질문을 올려 봅니다.
혹시 의견 있으신 분들 답변 부탁드립니다.

1. linux c 에서
2. TCP/IP 소켓 통신을 하는데요
3. 하나의 소켓으로 Send/Recv를 해결하기 위해서
4. 쓰레드 2개를 하나는 read() / 하나는 write() 용으로 띄우고 있습니다.( 사실은 모니터링까지 3개지만... 질문하려는 건 read/write니까요.)
5. read / write는 blocking mode로 실행중입니다.
6. 참고로 client 로 돌아가고 있고, server side는 다른 쪽에서 만든겁니다.
7. Send/Recv는 각각 read()/write()함수를 이용해서 읽고 쓰고 있습니다. send()/recv() 함수가 아니구요.

여기서 질문인데요.

만일 read() 쓰레드가 데이터를 읽는 중에 write()쓰레드로 context switching 된다면, read() 버퍼에 남아있는 데이터는 어떻게 되나요?
예를들면
1. 상대방이 100바이트를 우리쪽으로 보내서
2. read( socketFD, buf, 100 )으로 blocking 되고 있던 thread가 깨어나서
3. 읽기 시작.
4. 50바이트까지 읽어냈는데
5. context switching이 일어나서
6. write() thread 가 20byte를 써 버렸습니다.

이렇게 되면,
read()하던 데이터는 어떻게 되나요?

11. read() 함수가 50 을 리턴하고 나머지 50byte는 날라가 버리나요?
12. 혹은 read()함수가 -1 혹은 에러를 리턴하나요?
13. 아님 read()함수가 100byte를 리턴해서 상대방이 보낸 데이터를 다 받을 수 있나요?
14. 혹은 read()는 100byte를 리턴하지만, 그 데이터는 정상 데이터 50 byte + write()의 데이터 20byte() + 정상 데이터 30byte 가 되나요?
15. 그 외????

참고로 현재는 read()/write()에 select(), pthread_mutex_lock() 을 사용하고 있지 않습니다만( 왜 안썼는지까지는 모르겠습니다. ), lock을 쓴다고 해서 문제가 해결이 되는지 안되는 지를 확신할 수 없기 때문에 질문을 올려 봅니다.
혹시 의견 있으시면, 과감히!! 답변 부탁드립니다.

그럼, 좋은 하루 되시기 바랍니다.

drinkme의 이미지

13번이 맞습니다.

일단 혼돈하고 계신게...
write의 buffer하고 read의 buffer는 따로 있습니다. 이게 섞일 이유는 없고요.
read()하던 도중에 왜 write() thread가 깨어야 하는지는 모르겠지만, 설령 이런다 하더라도
read() thread의 context와 write() thread의 context는 다르기 때문에
이게 엉길 이유가 없고요.
즉, write() thread갔다가 다시 read() thread로 와서, 하던거 마저 합니다.

dorado2의 이미지

read()가 100byte를 리턴할지 더 작은 값을 리턴할지는 정해져 있지 않습니다.

cococo의 이미지

답변 감사드립니다! 고맙습니다!

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

댓글 달기

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