随笔分类 - 系统编程
摘要:典型的一次IO 服务器编程基本框架 接收客户端数据->解析-> I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模
阅读全文
摘要:上层协议使用下层协议提供的服务 数据链路层 实现网卡接口的网络驱动程序,不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口 网络层 实现数据包的选路和转发 WAN(广域网) LAN(局域网) 通信的两台主机一般不是直接连接的,而是通过多个中间节点(路由器)连接
阅读全文
摘要:信号量相当于加强版的互斥锁 mutex实现的同步是串行的,既能提供进程间的同步,还能提供线程间的同步 /* 信号量的类型 sem_t int sem_init(sem_t *sem, int pshared, unsigned int value); - 初始化信号量 - 参数: - sem : 信
阅读全文
摘要:生产者消费者模型(简略) //效率不高,引入条件变量 #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> // 创建一个互斥量 pthread_mutex_t mutex; struct No
阅读全文
摘要:造成死锁的原因:1.重复上锁(自己锁自己) 2.没有解锁 死锁的几种场景:忘记释放锁重复加锁多线程多锁,抢占锁资源 读写锁 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但
阅读全文
摘要:原子操作是不被打断的操作,即它是最小的执行单位 通过加锁,可实现原子操作
阅读全文
摘要:线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。 原子操作 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存
阅读全文
摘要:服务器程序通常需要处理三类事件:I/O 事件、信号及定时事件。有两种高效的事件处理模式:Reactor和 Proactor,同步 I/O 模型通常用于实现 Reactor 模式,异步 I/O 模型通常用于实现 Proactor 模式。 Reactor 要求主线程(I/O处理单元)只负责监听文件描述符
阅读全文
摘要:socket是套接字,通过套接字,进行网络数据的收和发套接字就像网络中的“手机” 套接字是网络数据传输用的软件设备 errno获得出现的错误 既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux 系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作
阅读全文
摘要:I/O设备 用户态,内核态(内核缓冲区) read函数 阻塞和非阻塞描述的是用户线程调用内核IO操作时的用户线程的状态:阻塞表示在调用内核IO时,用户线程会挂起,直到调用返回到用户空间才继续执行;非阻塞表示在调用内核IO时立即返回一个状态码或者数据,用户线程一直处于忙的状态 阻塞:当我们调用read
阅读全文
摘要:用netstat来查看网路状态 客户端连接进来后 断开服务器端,服务器端处于FIN_WAIT2 断开服务器端和客户端,查看状态 服务器端处于TIME_WAIT,此时如果再去启动服务端,会出现bind错误 端口复用由来:是在服务器端主动结束,想立刻运行能够重新绑定上 设置在bind之前 setsock
阅读全文
摘要:int bind(int sock, struct sockaddr *addr, socklen_t addrlen); //Linux int bind(SOCKET sock, const struct sockaddr *addr, int addrlen); //Windows bind函
阅读全文
摘要:#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> // 打开一个已经存在的文件 int open(const char *pathname, int flags); 参数: - pathname:要打开的文件路径 - fl
阅读全文
摘要:ipconfig 点分十进制字符串和用网络字节序整数表示的IPV4地址的转换 #include <arpa/inet.h> // p:点分十进制的IP字符串,n:表示network,网络字节序的整数 int inet_pton(int af, const char *src, void *dst);
阅读全文
posted @ 2021-09-11 18:25
wsq1219
摘要:◼ 线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。◼ 临界区是指访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,也就是同时访问同一共享资源的其他线程不应终端该片段的执行。
阅读全文
摘要:1.终端 ◼ 在 UNIX 系统中,用户通过终端登录系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端(Controlling Terminal),进程中,控制终端是保存在 PCB 中的信息,而 fork() 会复制 PCB 中的信息,因此由 shell 进程启动的其它进程的
阅读全文
摘要:共享内存使用步骤 ◼ 调用 shmget() 创建一个新共享内存段或取得一个既有共享内存段的标识符(即由其他进程创建的共享内存段)。这个调用将返回后续调用中需要用到的共享内存标识符。◼ 使用 shmat() 来附上共享内存段,即使该段成为调用进程的虚拟内存的一部分。◼ 此刻在程序中可以像对待其他可用
阅读全文
摘要:◼ 信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。 对于前台进程,用户可以通过输入特殊的终端字
阅读全文
摘要:linux系统下每个进程都拥有自己的页表,父进程fork出新的子进程时,子进程拷贝一份父进程的页表,且父子进程将页表状态修改为写保护。当父进程或子进程发生写操作时将会发生缺页异常,缺页异常处理函数将会为子进程分配新的物理地址。 Linux 的 fork() 使用是通过写时拷贝实现。写时拷贝是一种可以
阅读全文
浙公网安备 33010602011771号