부모 프로세스에서 Fork()시스템 콜을 호출하게 되면 호출 직전까지의 정보들이 자식 프로세스에게 거의 그대로 복제 된다.이때 스택과 힙 영역이 복제 되고 PC값도 복제 된다. 프로세스 별로 또한 파일 디스크립터 테이블을 가지고 있다.27번 fd : 어떤 소켓28번 fd : 또다른 어떤 소켓이런식으로 정리가 되어 있는 테이블이다. 부모 프로세스가 fork를 호출하는 시기는 accept() 시스템 콜을 해서 커넥트 소켓이 생성된 다음이다. 이 커넥트 소켓의 fd가 27번이라고 하면자식 프로세스의 파일 디스크립터 테이블에도 27번에 그 소켓에 대한 링크 정보가 복제가 될것이다. 그렇게 되면 27번 번호표를 받은 그 소켓을 가리키는 번호가 2개가 된 것이다. 부모와 자식 프로세스에서 그 소켓의 번호(27번)는..
클릭
앞선 예제의 서버는 iterative server이다. 이는 daytime server같이 단순한 것에는 괜찮다. 그러나 클라이언트의 요청을 서비스하는 데 긴 시간이 걸릴 때는, 서버가 한 클라이언트에 얽매이는 것 보다 동시에 많은 클라이언트를 처리하는 것이 바람직하다. 유닉스에서 다중접속(concurrent)서버 를 작성하는 간단한 방법은 각각의 클라이언트를 처리할 자식 프로세스를 fork하는 것이다. 다음 예제는 전형적인 다중접속(concurrent)서버의 틀을 보여주고 있다. 연결이 설정되면 accept에서 반환되고, 서버는 fork를 호출한다. 자식 프로세스는 클라이언트와 데이터를 주고 받고 부모 프로세스는 다시 다른 연결요청을 accept하기 위해서 반복문의 맨 위로 돌아가게 된다. 자식 프로세..
fork시스템 콜을 호출하기 전까지 부모 프로세스가 열어놨던 파일들의 정보를 그대로 자식에게도 카피 한다. fork가 호출되면 부모의 context도 복제될 뿐만 아니라 PCB의 내용도 거의 그대로 복제 된다. 부모와 자식의 오픈 파일 테이블을 열어보면 각 프로세스가 파일 디스크립터 번호 몇번을 사용한다는것만 알지 특정fd에 해당하는 소켓이 몇개의 프로세스가 오픈해서 쓰고있는지는 모르니까 이걸 표시할 필요가 있다 . 공유 되어 있는 파일들을 몇개의 어떤 프로세스들이 공유하고 있는지를 커널이 별도로 보관,관리할 필요가 있다. 커널의 오픈파일테이블을 보게 되면 특정 파일이 몇개의 프로세스가 현재 오픈해서 쓰고있는지를 표시해 놓았다. (reference count라고 불린다.) 부모 프로세스가 열고 있던 소켓..
클라이언트 프로그램에서 connect()시스템콜이 실패했을때 다시 소켓을 만든다음에 connect를 해야한다고 권장한다. 그 이유는 connect() 시스템콜이 실행 되었을때 클라이언트가 서버측으로 tcp 3 way handshaking을 시작하기 위해 SYN메시지를 보내게 되는데 어떤 이유에서든 connect()가 완료 되지 못했다면 그 클라이언트의 connect() 실패한 그 소켓은 불안정한 상태가 되었기 때문에 없애고(close()하고) 다시 만들어서 연결설정을 다시 해야한다. 그렇지 않고 내가 connect() 실패한 소켓으로 read/write를 하려고 하면 연결설정이 안된 상태기 때문에 아무리 read/write를 호출해도 서버와 연결이 안되어있기 때문에 데이터 송수신이 불가능하다. 또한 다시..
connect() 시스템 콜의 에러 상황을 재현해 보기 connect () 시스템 콜의 결과로 각각 ETIMEDOUT, ECONNREFUSED, EHOSTUNREACH(또는 ENETUNREACH) 가 return되는 3가지 경우를 재현 타임아웃 - 클라이언트가 소켓을 통해 패킷을 서버에게 보냈는데 중간에 있는 라우터에서 그 서버에 해당하는 네트워크에 도달하지 못하고 중간 라우터들 사이에서 뺑뻉이를 돌기 때문에 발생함. 클라이언트가 SYN를 서버에게 보내면 서버는 SYN+ACK를 보내고 이것을 클라이언트가 받게 되면 클라이언트는 연결이 성공했다고 판단하고 ACK를 다시 서버에게 보낸다. ACK를 받은 서버는 그제서야 클라이언트와 연결이 성공했다고 인지하게 된다. 그런데 SYN를 보낸 클라이언트가 SYN+A..
서버에 있는 프로그램에서는 리슨 소켓을 만들고 나서 accept()시스템 콜을 호출한다. 이 시스템 콜을 호출하게 되면 그 프로세스는 블락 되게 되며 (클라이언트로부터 3way 핸드쉐이크 요청이 올때까지) 클라이언트로 부터 요청이 들어오면 Incompleted Queue에 그 요청정보를 넣어 놓고 나서 다시 클라이언트에게 SYN+ACK를 보내준다. 그리고 나서 클라이언트 프로그램에서 SYN+ACK를 받으면 connect()시스템콜이 정상적으로 리턴 되며 연결이 성공했다고 인지하게 되고 ACK를 다시 서버에게 보내준다. 서버가 마지막 ACK를 받으면 Incompleted Queue에 있던 클라이언트의 연결 요청을 Completed Queue로 옮기게 되고 이 큐에 옮겨 지고 나면, 서버의 커널이 블락 되어..
#include c언어의 버전이 업 되면서 변경된 자료형의 정의들과 시스템마다 int를 표현하는 바이트수가 다르므로 그런것들을 다른 자료형으로 정의하는 typedef문들이 들어있다.(int가 어떤곳에선 2바이트 , 요즘에는 거의다 4바이트이기 때문에 이 두개의 자료형을 구분하는 어떤 타입정의가 필요함) 한마디로 시스템에서 사용하는 자료형에 관한 정보들을 담고있다. #include 에 정의된 소켓 구조체 struct sockaddr_in{unsigned short int sin_family; //16비트uint_16t sin_port; //16비트struct in_addr sin_addr; unsigned char sin_zero[8];} socket(AF_INET, SOCK_STREAM,0) AF_INE..
- Total
- Today
- Yesterday
- state
- javascript
- react
- storybook
- rendering scope
- reflow
- Polyfill
- Next.js
- async
- useEffect
- Babel
- webpack
- useRef
- reactdom
- atomic design
- type alias
- await
- computed
- design system
- mobx
- es6
- return type
- typescript
- props
- hydrate
- promise
- server side rendering
- Action
- react hooks
- reducer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |