/images/avatar.png

Schaepher's Blog

NFS 搭建给 openwrt 扩展存储

raspberry:

groupadd nfs
useradd -m -g nfs nfs

apt-get install rpcbind nfs-kernel-server

vim /etc/exports

/etc/exports :

/home/nfs 192.168.15.0/24(rw,sync,no_subtree_check)
systemctl restart rpcbind
systemctl start nfs-kernel-server

openwrt:

工作的第二和第三年(201807~202007)

2019 年 7 月本来想写 201807201907 的部分,但由于当时项目比较赶,就一拖再拖。另外由于想写得详细一些,需要搜集很多信息,导致一直没进展。以下是 201807202005 这段时间的内容,主要使用 PHP + MySQL。包含了接口设计、日志收集、分布式存储、高可用等内容。

TCP 协议和 TCP Socket

TCP 位于计算机网络七层模型中的传输层。 TCP 协议在操作系统层面实现,实现方式为 TCP Socket。

除了 TCP Socket 之外,还有同样是主要用于主机间进程通信的 UDP Socket 和用于本机进程间通信的 Unix Domain Socket。它们提供的接口是一样的,但底层实现细节不一致。本文主要内容是 TCP Socket ,因此以下默认 Socket 都是表示 TCP Socket。

进程间通信(IPC,Inter-process Communication)

当我们开始执行一个程序时,会创建一个进程。这个进程可能需要与其他进程通信。例如向操作系统发送一条消息,让它展示给用户。

如果只是在自己的机器上通信,那就不有趣了。我们还想跟其他机器的进程通信,比如聊天应用就涉及到了多台机器。这种跨多台机器(主机)的通信通过套接字(Socket)实现。

问题集

  1. 进程间通信方式有哪些?
  2. Socket 通信如何处理并发通信的情况?它的底层结构是怎么样的?
  1. 内存分配中的栈内存、堆内存分别存储什么?TCmalloc 和 Jemalloc 中的内存是申请一大块内存,然后切割成小内存,然后有一块内存用于记录其他内存空间。跟这个是否有关系?
    栈内存分配给定长的数据,例如指针。
    堆内存分配给不定长的对象。
  2. 由于进程隔离,进程会得到一个 4GB 的虚拟地址空间。这是根据 32 位处理器的寻址能力确定的。那么如果是 64 位处理器,这个虚拟地址空间还是 4GB 么?
  3. 内核空间和用户空间分别指什么?
    针对 Linux 操作系统,将最高的1G字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF )供内核使用,称为内核空间,而较低的 3G 字节(从虚拟地址 0x00000000 到0xBFFFFFFF),供各个进程使用,称为用户空间。每个进程都可以通过系统调用进入到内核。其中在 Linux 系统中,进程的用户空间是独立的,而内核空间是共有的,进程切换时,用户空间切换,内核空间不变。—— https://www.cnblogs.com/huansky/p/13170125.html
  4. fork之后,子进程从父进程那继承了什么?
    子进程会获得其父进程所有文件描述符的副本,这些文件描述符在执行 fork 时打开。
  5. 文件描述符是啥?有什么相关的数据结构?
    文件描述符,在 Windows 中被称为文件句柄,是一个整数。它是系统内核打开文件后给出的一个数字索引。内核会在每个进程空间中维护一个文件描述符表。这张表记录着文件描述符和文件的结构体的对应关系。

    https://www.cnblogs.com/xiangtingshen/p/11961434.html

脚本集合

vim 到某一行

#!/bin/bash

onlyRead=''

while getopts ':R' optchar; do
    case "${optchar}" in
        R)
            onlyRead='-R'
            ;;
        *)
            break
            ;;
    esac
done

shift $((OPTIND-1))

act=$1

result=$(grep -n "act=='$act'" /path/to/dir)

fileName=$(echo "$result" | awk -F ':' '{print $1}')
line=$(echo "$result" | awk -F ':' '{print $2}')

vim $onlyRead +$line $fileName

bc - 计算器

echo $(cat a.txt | tr "\n" "+") | bc
cat a.txt | tr "\n" "+" | sed 's/$/\n/' | bc

不加换行会报错