Linux
文章平均质量分 72
GP-Bullet
渊默而雷声
展开
-
系统调用的实现
系统调用是内核与用户空间程序交互的接口很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于。原创 2022-07-19 11:33:18 · 860 阅读 · 0 评论 -
TCP流量控制_(滑动窗口)
一、TCP vs. UDPTCP可提供可靠的数据传输而UDP无法做到,那我们为什么还用UDP?·使用UDP传送单条消息的开销要比TCP小·响应式通信,UDP的速度要比TCP快。DNS是应用UDP的绝好例子。但使用UDP又需要可靠性保证的应用程序必须自行实现可靠性保障功能。如果需要更高级的流量控制和拥塞控制,最好直接用TCP。下面我们粗浅的了解一下TCP的流量控制二、滑动窗口(Sliding Window)请仔细阅读下图(上图在接收端用小方块表示1K数据,.原创 2022-05-30 21:31:01 · 204 阅读 · 0 评论 -
TCP状态转移图
先回顾一下三次握手和四次握手1、建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。(2)服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。(3)客户必须再次回应服务段一个ACK报文,这是报文段3。2、连接终止协议(四次握手) 由于TCP连接是全双工的,因此每个方向原创 2022-05-30 21:08:08 · 433 阅读 · 0 评论 -
Unix进程原语(1)
在写进程池之前,我们再来看看进程原语函数。(之前没有整理出来)1.forkfork会创建出一个子进程,子进程有自己的虚拟地址空间0-4G,父进程继续执行后面的代码,子进程完全复制(clone)了父进程一份(0-3G),那么如何标识子进程父进程的区别,PCB中的pid号不同。fork函数十分简洁没有参数, 返回用来存放pidfork:(1)调用一次,返回两次。因为是clone,所以整段代码在父子进程中都有,在父进程中调用返回子进程的PID,在子进程中调用则返回0。读时共享,原创 2022-05-16 22:36:08 · 167 阅读 · 0 评论 -
信号量实现生产者消费者
我们用条件变量和互斥量实现了生产者消费者之后,也可以试试用信号量。甚至会更加简单。可能大家对信号量还比较陌生1.介绍信号量信号量与互斥量信号量相当于初始化值为N的互斥量。互斥量保护了共享数据,但也使并行的线程变成串行,执行效率变低了。互斥量一次只有一个线程可以访问公共区域,信号量可以同时有N个线程访问共享数据信号量与信号:信号量(semaphore)和信号(signal)无关,完全是两回事。O(∩_∩)O哈哈~信号量不只能用于线程中,也可以用于进程间同步。2.函数用法原创 2022-05-08 13:36:37 · 463 阅读 · 0 评论 -
服务器端客户端最小模型(TCP)
前两天我们已经知道了服务器端和客户端交互的过程那么废话不多说,talk is cheap,直接上代码。(已做代码详细注释)(先不考虑出错处理)server.c#include<stdio.h>#include<sys/socket.h>#include<netinet/in.h>#include<string.h>//bzero#include<arpa/inet.h>//inet_ntop#inclu...原创 2022-05-06 22:23:24 · 466 阅读 · 0 评论 -
网络IPC:socket引入
本文开始引入网络进程间通信(network IPC),套接字网络进程间通信接口,进程用该接口能够和其他进程通信,无论它们是在同一台计算机上还是在不同的计算机上。同样的接口既可以用于计算机间通信,也可以用于计算机内通信。socket函数为了了解本函数,我们要先理解一些概念。socket这个词可以表示很多概念:在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。在TC...原创 2022-05-05 21:58:40 · 1354 阅读 · 0 评论 -
ARP协议(网络基础)
1.模型网络TCP/IP模型TCP/IP通信过程2.数据包封装封装是分层联网协议的一个重要原则。传输层及其以下的机制由内核(内核中的TCP/IP协议栈)提供,应用层由用户进程提供应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。 不同的协议层对数据包有不同的...原创 2022-05-03 15:37:30 · 2366 阅读 · 1 评论 -
文件究竟是如何被存储/删除的?
我们的磁盘很大,我们日常存储删除的文件又非常多,磁盘一个是扇区512字节它们用来存数据,能存进去还能读出来,那么这么多文件是如何被找到的呢?这就需要一个复杂的文件系统。本文章以ext2文件系统为例做具体讲解(ext4原理类似)首先我们需要先把文件系统组成搞清楚。结构图:我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息linux把磁盘分成.原创 2022-04-24 21:29:40 · 432 阅读 · 0 评论 -
文件I/O(3)
lseek记录读写位置fseek文件流指针 偏移量 SEEK_SET文件最开头,当前,末尾基准坐标偏移量off_t返回偏移指针位置到文件最开头有多少个字节怎么看里面内容od -tcx abc拓展文件一定要有一次写操作#include<stdio.h>#include<fcntl.h>#include<sys/types.h>#include<unistd.h>#include<sys/stat.h>#incl原创 2022-04-24 18:34:13 · 184 阅读 · 0 评论 -
补充:线程分离态
pthread_detach一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL。如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。...原创 2022-04-20 22:11:52 · 65 阅读 · 0 评论 -
线程创建、终止、回收
学习了线程概念之后,我们就可以学习一些函数了。1.pthread_create 创建线程pthread_t *thread:传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID)const pthread_attr_t *attr:线程属性设置,如使用默认属性,则传NULLvoid *(*start_routine) (void *):函数指针,指向新线程应该加载执行的函数模块返回值:成功返回0失败返回errno,当函数调用失败多线程的时候,再去设.原创 2022-04-19 22:39:06 · 911 阅读 · 0 评论 -
把线程概念讲清
要了解线程,首先就要联系我们学过的进程1、线程和进程的关系1.线程是一个轻量级进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都是clone。2.从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三级页表是相同的。Unix中如何管理内存,PCB记录地址表,采用三级页面每个页面默认4096字节大小每四个字节看成一个指针,一个页面1024个指针,指向1024个页面。三级页面寻址到G(Linux实际用的四原创 2022-04-19 18:16:13 · 584 阅读 · 0 评论 -
错误处理机制
errno是一个全局变量#include <stdio.h>void perror(const char *s);#include <errno.h>#define EPERM1 /* Operation not permitted */#define ENOENT2 /* No such file or directory */#define ESRCH3 /* ...原创 2022-04-18 21:50:35 · 249 阅读 · 0 评论 -
文件I/O(2)
进程控制块,操作系统把每一个进程当一个PCB去管理进程控制块是一个结构体cd /find -name sched.hvi ./usr/src/linux-headers-5.13.0-37/include/linux/sched.h在里面找到task_struct的结构体靠结构体成员去描述进程的状态FILE*有对应的文件描述符,文件描述符和真正的设备文件发生关联在file_struct找到对应的文件描述符file_struct结构体,指针指向数组文件.原创 2022-04-18 19:53:40 · 213 阅读 · 0 评论 -
C标准函数与系统函数--文件I/O
1.C标准文件IO工作位置:理论上可在任何操作系统上运行,工作在操作系统之上2.工作原理:例如:printf先去调系统函数write,再去调内核中的函数,再去调驱动层C标准库并不知道如何操作当前显示设备它是通过操作系统,操作系统提供了应用层的API接口write。应用层API自动向下调内核层API,内核层API知道如何操作显示设备这就是为什么windows下的.exe放到linux下不能正常运行,因为没有相应的系统函数需要把源代码在linux下重新编译。.原创 2022-04-18 12:03:36 · 541 阅读 · 2 评论 -
信号怎么产生?
信号是软件中断。信号提供了一种处理异步事件的方法。通过 kill -l 查看所有信号前32个(习惯上称)信号为操作系统使用的信号,后32个为实时信号,做驱动编程可能用到。man 7 signal那么信号是如何产生的?1.终端按键ctrl+c SIGINT 终端中断符ctrl+z SIGTSTP (terminal stop)终端停止符 进程暂停 通过fg 1 继续运行 通过bg 1 后台运行ctrl+\ SIGQ...原创 2022-04-17 17:35:07 · 507 阅读 · 0 评论 -
mmap—存储映射I/O
1.基本概念存储映射I/O(memory-mapped I/O)能将一个磁盘文件映射到存储空间中的一个缓冲区上。于是,当从缓冲区中取数据是,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区时,相应字节就自动写入文件。这样就可以在不使用read和write的情况下执行I/O。为实现该功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。原理如下:2.mmap函数完成该功能该函数参数较多首先对于内存而言:addr参数,用于指定映射存储区的起始地址。通.原创 2022-04-17 11:46:34 · 1185 阅读 · 0 评论 -
FIFO—进程通信(2)
1.基本概念FIFO被称为命名管道。未命名的管道只能在两个相关进程间使用。但是,通过FIFO,不相关的进程也能交换数据。2.实质是磁盘中创建一个节点,用来标记内核中一个pipe。3.小例子:(1)fifo_w.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<fcntl.h..原创 2022-04-16 20:42:51 · 852 阅读 · 0 评论 -
pipe管道—进程通信
1.基本原理管道是最基本的IPC(InterProcess Communication)进程间通信我们知道进程有4G的虚拟内存,其中0到3G是独立的进程空间,每个进程不相互通,而3G-4G是公用的内核空间。要实现在进程间传递数据,管道就是利用这公用的内核空间来完成,即利用内核的一块缓冲区2.基本使用#incldue<unistd.h>int pipe(int fd[2]);fd返回两个文件描述符fd[0]为读,fd[1]为写。fd[1]的输出是fd[0].原创 2022-04-14 20:58:13 · 1129 阅读 · 0 评论