Study · 운영체제 · 소켓 만들기 · 네트워크
소켓은 파일처럼 다뤄진다 — 같은 번호표를 쓴다
장면
소켓을 만들면 돌려받는 것이 파일을 열 때와 같은 종류다. 왜 그렇게 만들었을까?
$ ls -l /proc/<pid>/fd
lrwx------ 1 tghan tghan 64 Sep 21 14:20 3 -> socket:[123456]
# <pid> 자리에는 들여다볼 프로그램의 번호를 넣는다 — 그 번호는 ps 로 찾는다
# 맨 앞 lrwx------ 는 이 칸이 무언가를 가리키는 바로가기라는 표시다
# 3 이 번호표의 3번 칸이고, 화살표 오른쪽이 그 칸에 걸린 것이다
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
장면 · 소켓은 파일처럼 다뤄진다 — 같은 번호표를 쓴다
0 / 10
▶ 를 누르면 socket() 한 줄이 커널 안에서 무엇을 만드는지 따라간다. 10번 항목에서 파일을 열면 fd 표에 번호가 하나 늘었다. 소켓도 똑같이 번호를 하나 받는데, 그게 우연이 아니라 커널이 일부러 같은 길로 보냈기 때문이라는 것이 이 장면의 요지다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
소켓은 파일과 같은 번호표를 쓴다. read 와 write 가 파일에도 소켓에도 똑같이 통하는 이유가 그것이다.
어떻게 확인했나
소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.
- 소켓은 inode 부터 만들어 VFS 위에 얹힌다. 먼저 sock_alloc(net/socket.c:705)이 new_inode_pseudo 로 inode 를 만든다. 그 inode 의 i_mode 를 S_IFSOCK 으로 적는다(717). 그 다음 sock_alloc_file(net/socket.c:550)이 그 inode 로 alloc_file_pseudo 를 불러 struct file 을 붙인다(557).
- fd 를 받는 길이 파일과 같은 함수다. sock_map_fd(net/socket.c:578)가 먼저 get_unused_fd_flags(fs/file.c:619)로 빈 번호를 얻는다. 그 다음 fd_install(fs/file.c:679)로 그 번호 칸에 struct file 을 꽂는다. 파일을 열 때 쓰는 그 함수들이다.
- read·write 가 똑같이 통하는 이유는 함수표 한 칸이다. vfs_read(fs/read_write.c:554)가 573줄에서 file->f_op->read_iter 를 부른다. 소켓의 f_op 는 socket_file_ops(net/socket.c:157)다. 그 표의 .read_iter 칸에 든 것이 sock_read_iter(net/socket.c:1226)다.
- /proc/<pid>/fd 가 socket:[123456] 으로 보이는 것도 함수 하나 때문이다. sockfs_dname(net/socket.c:393)이 "socket:[%llu]" 에 inode 번호를 찍는다.
- python 으로 소켓을 하나 만드니 fd 가 3, 이어서 파일을 여니 fd 가 4 였다. /proc/<pid>/fd 에 3 -> socket:[12697426] 과 4 -> /tmp/f/new.txt 가 나란히 걸린다 — 같은 표다.
항목 지도목차 ›
- 계정과 권한
- 1 로그인 — 로그인하면 무슨 일이 일어나나
- 2 계정 만들기 — 계정을 만들면 어디에 무엇이 쓰이나
- 3 권한 주기 — chmod 가 바꾸는 것은 어디에 있나
- 4 권한 검사 — 파일을 열 때 권한을 언제 보나
- 파일과 디렉터리
- 5 파일 만들기 — 파일을 만들면 무엇이 생기나
- 6 디렉터리 — 디렉터리를 만들면 무엇이 생기나
- 7 파일 읽기 — 파일을 읽으면 어디를 거치나
- 8 파일 지우기 — 파일을 지우면 정말 사라지나
- 프로세스
- 9 명령 실행 — 명령 하나를 치면 무슨 일이 벌어지나
- 10 파일 디스크립터 — 프로세스가 파일을 열면 무엇이 늘어나나
- 11 CPU 나누기 — CPU 하나를 여럿이 어떻게 나눠 쓰나
- 메모리
- 12 메모리 요청 — 메모리를 달라고 하면 바로 주나
- 13 페이지 폴트 — 처음 건드릴 때 무슨 일이 일어나나
- 14 OOM — 메모리가 모자라면 누가 죽나
- 네트워크
- 15 소켓 만들기 — 소켓을 만들면 무엇을 받나
- 16 연결 받기 — 연결이 들어오면 누가 먼저 받나
- 17 주고받기 — 데이터가 오갈 때 무엇이 움직이나