Linux高性能编程
文章平均质量分 82
喜欢打篮球的普通人
这个作者很懒,什么都没留下…
展开
-
多线程与volatile关键字
文章目录1.多线程与高并发(四)volatile关键字2.java多线程编程之volatile和CAS3.volatile在多线程中的使用1.多线程与高并发(四)volatile关键字三个特性原子性有序性可见性volatile的使用可见性有序性无原子性实现原理内存语义内存语义的实现链接:多线程与高并发(四)volatile关键字2.java多线程编程之volatile和CASvolatile+CAS的机制能够通过自选乐观锁的情况下实现对共享变量的访问,并且转载 2021-04-22 19:28:07 · 86 阅读 · 0 评论 -
(P24)管道:管道的读写规则
文章目录1.管道大的读写规则1.管道大的读写规则当没有数据可读时(1)O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来为止(2)O_NONBLOCK enable:read调用返回01,errno值为EAGAIN管道写规则(1)当管道满的时候,O_NONBLOCK enable:write 调用非阻塞,fd为非阻塞模式,则返回错误,错误码是EAGAIN;(2)当管道满的时候,O_NONBLOCK disable:write 调用阻塞,fd为阻塞模原创 2020-08-23 21:24:37 · 1010 阅读 · 0 评论 -
(P25)管道:命名管道FIFO、匿名管道与命名管道的区别、命名管道的打开规则
文章目录1.命名管道FIFO2.匿名管道与命名管道的区别3.命名管道的打开规则4.命名管道实例1.命名管道FIFOpipe匿名管道:没有名字,当创建一个管道的时候,内核就为他创建了一个64K的内存缓冲区,并且返回2个fdmknod也可以创建man 3 mkfifo不能用vi打开FIFO管道文件2.匿名管道与命名管道的区别man 7 pipe I/O 打开Pipes and FIFOs也有区别3.命名管道的打开规则09:014.命名管道实例...原创 2020-08-20 13:05:51 · 652 阅读 · 1 评论 -
(P23)管道:匿名管道pipe
文章目录1.管道2.匿名管道3.管道示例程序1.管道连接2个进程的数据流本质:有固定大小的内核缓冲区ls进程将数据写入管道,wc进程从管道读取数据,达到进程间通信的目的当创建了一个管道,就相当于创建了一块内核缓冲区。用户进程获得2个文件描述符,分别对应管道的读端和写端fork之后,子进程的fd[0]和fd[1]共享了父进程管道,也指向了管道的读端和写端子进程可以往管道的写端去写入数据,父进程可以从管道的读端获取数据,11:102.匿名管道3.管道示例程序...原创 2020-08-17 13:10:41 · 328 阅读 · 0 评论 -
(P22)信号:三种不同精度的睡眠、三种时间结构、setitimer、getitimer
文章目录1.三种不同精度的睡眠2.三种时间结构3.setitimer4.getitimer1.三种不同精度的睡眠睡眠多少sman 3 sleep实际上是库函数由于sleep函数在睡眠的过程中被信号中断,则返回的是剩余睡眠的秒数所以让进程确切睡眠n秒,则应该写成下面:睡眠微秒库函数man 3 usleep纳秒睡眠请求睡眠的时间,若在请求的睡眠时间之内被信号中断了,则返回的剩余时间保存在第二个参数中剩余的睡眠时间man nanosleep2.三种时间结构秒秒微秒秒纳秒原创 2020-08-16 22:40:36 · 381 阅读 · 0 评论 -
(P21)信号:sigqueue函数、sigval函数、sigqueue示例
文章目录前2个参数与kill一样,只是它不能向进程组发送信号,pid只能是大于0的值,不能是负数可以将数据从一个进程发送给另一个进程一个进程发送给另一个进程可以传递一个整数,也可以传递一个指针sigqueue发送信号的时候,传递数据?一个用来发送数据的进程,一个用来接收数据的进程先运行接收的进程,再运行发送的进程模拟可靠信号支持排队,不可靠信号不支持排队说明43号可靠信号支持排队不会丢失,2号不可靠信号不支持排队,会丢失...原创 2020-08-16 18:08:02 · 1075 阅读 · 0 评论 -
(P20)信号安装函数:sigaction
文章目录1.sigaction函数2.sigaction结构体3.sigaction实例1.sigaction函数signal函数是对不可靠信号进行安装的2.sigaction结构体3.sigaction实例原创 2020-08-12 22:43:16 · 460 阅读 · 0 评论 -
(P19)信号:信号在内核中的表示、信号阻塞与未决、信号集操作函数、sigprocmask
文章目录1.信号在内核中的表示2.信号阻塞与未决3.信号集操作函数4.sigprocmask1.信号在内核中的表示当进程捕捉到信号后,就直接递交给信号处理函数来进行处理,这就是递达状态前提:进程必须先阻塞某一个信号,信号发生的时候,进程不立刻去执行信号处理函数,而是处于阻塞的状态,这样的状态称之为未决状态2.信号阻塞与未决信号从产生到递达的过程(1)信号屏蔽字,未决状态都是64bit的(2)假设SIGINT信号发送给进程,该信号是否会递达(是否会执行信号所对应的处理函数呢?)取决于bloc原创 2020-08-11 22:33:37 · 241 阅读 · 0 评论 -
(P18)信号:更多发送信号函数、可重入函数与不可重入函数
文章目录1.更多信号发送函数2.可重入函数与不可重入函数1.更多信号发送函数闹钟函数,向本进程只能发送SIGALRM信号:14) SIGALRM闹钟函数(定时器的使用),向本进程可以发送信号 :14) SIGALRM 26) SIGVTALRM 27) SIGPROF向本进程发送信号:6) SIGABRT手工发送信号:也可以人为的发送14号信号(可以用数字,也可以用名称),SIG名称也可以省略每隔1秒发送一个alarm信号2.可重入函数与不可重入函数在中断处理函数中,要尽原创 2020-08-10 23:29:13 · 303 阅读 · 0 评论 -
(P17)信号:信号分类、可靠信号与不可靠信号、信号发送、pause
文章目录1.信号分类2.可靠信号与不可靠信号3.信号发送4.pause1.信号分类可靠信号可靠信号都是实时信号;不可靠信号都是非实时信号不可靠信号实时信号非实时信号2.可靠信号与不可靠信号不可靠信号:若一次性来了多个信号,这些信号是不会排队的,只会保留一个,后续的信号都被丢弃掉可靠信号支持排队,不会丢失可靠信号:又称之为RT信号,实时信号实时信号没有特殊的含义,它的含义由用户来决定man 7 signal3.信号发送kill -9 pid9号信号不能被忽略,也不能被原创 2020-08-09 22:49:05 · 702 阅读 · 0 评论 -
(P16)信号:中断、信号、signal
文章目录中断可以打断当前的任务原创 2020-08-01 11:11:17 · 1224 阅读 · 0 评论 -
(P9)进程:程序、进程、进程数据结构、进程与程序的区别与联系
文章目录程序就是:有序指令的集合程序包含只读代码段,只读数据段(常量数据,已经初始化的非0数据段(已经初始化的数据段),0初始化段(指:静态变量和全局变量,其初始值为0)),零初始化段仅仅是符号信息,并没有存放在磁盘空间中,因为这些数据为0只需要做一些标记即可。当程序加载到内存时,才会为其分配空间。对程序来讲,0初始化段只是一些记号信息,并没有实际为其分配空间。动态执行过程因为进程是程序是依次动态执行过程,当一个进程切换到另一个进程的时候,他需要保存一些现场信息,这些现场信息保存在PCB原创 2020-08-01 11:00:22 · 515 阅读 · 0 评论 -
(P10)进程:进程状态变迁、进程控制块、进程创建、进程创建、进程撤销、终止进程的五种方法
文章目录除了CPU资源未满足,其它资源全都满足了;不仅CPU资源不满足,其它资源也不满足(比如外设,等待别人将外设让出来使用);所有资源都满足了,且投入到计算机中运行了;进程因创建而产生处于就绪状态。进程因调用而运行,运行中的进程可能发生等待事件,比如访问的设备资源未满足,所以进程处于等待状态。等待状态的进程因等待结束,进程就会处于就绪态。另外,运行中的进程可能被剥夺处于就绪态,需要让出CPU时间片(可能操作:给进程分配CPU的时间片用完了或者被更高优先级的进程抢占)另外,运行中的进程可原创 2020-07-30 22:41:25 · 1137 阅读 · 0 评论 -
(P11)进程:复制进程映像、fork系统调用、孤儿进程、僵尸进程、写时复制
文章目录进程包括:代码段+数据段+堆栈段+PCBfork之后,子进程复制父进程的代码段+数据段+堆栈段+PCB,只有PCB中的PID和PPID是不一样的父子进程具有独立的4GB的地址空间(32bit的系统)int shortunsinged short只能用%d的方式输出pid_t调用一次,返回2次为啥父进程fork之后返回>0的值?,不返回=0?返回的就是子进程的id号码因为PCB中不可能保存子进程的id列表,这样会使得PCB膨胀,信息太大父进程加不加sleep,可能出原创 2020-07-29 23:32:24 · 354 阅读 · 0 评论 -
(P12)进程:fork父子进程共享文件,fork与vfork,exit与_exit,atexit,execve
文章目录在父进程中打开的文件,在子进程中也是打开的。父进程打开了两个文件test,test2,然后进行一次fork操作,子进程也指向文件表中的一项,打开了两个文件,就指向了一个文件表的两项,并将引用计数值改为2fork之后父子进程共享文件,共享一个文件表父进程更改文件偏移量,由于文件是共享的,所以子进程会在”parent“之后写入”child“字符串写时拷贝机制:资源在发生改变时,才去拷贝他。若资源没改变,则多个进程是共享同一个资源的。只读资源不需要拷贝,是共享的。在fork之后,exe原创 2020-07-27 23:19:54 · 815 阅读 · 0 评论 -
(P14)进程:SIGCHLD,wait,waitpid,僵进程,system
文章目录子进程退出时,会发送SIGCHLD信号给父进程信号是一种异步通知事件如果父进程还没有查询子进程的退出状态,子进程实际上没有完全退出,此时子进程的状态就称之为僵尸状态,子进程就是僵尸进程等待子进程的退出状态wait等待子进程的退出man 2 wait父进程在等待子进程的退出子进程正常终止,退出值为100子进程异常终止...原创 2020-07-26 10:44:13 · 371 阅读 · 0 评论 -
(P22)socket编程:socketpair、sendmsg/recvmsg、UNIX域套接字传递描述符字
文章目录传递描述字,接收描述字pipe匿名管道:半双工的,只能用于父子进程(通过共享文件描述符的方式来通信,因为子进程继承了父进程的fd),或者亲缘关系的进程间通信会返回2个文件描述符与pipe区别:他是全双工的,其它一样只能用于父子进程,或者亲缘关系的进程间通信会返回2个文件描述符,sv[0]和sv[1]都是既可以读也可以写,而pipe管道,是0作为读端,1作为写端...原创 2020-07-21 22:42:04 · 568 阅读 · 0 评论 -
(P21)socket编程:UNIX域协议
文章目录man unix地址家族,AF_LOCAL地址路径 struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* pathname */ };启动两个客户端,一个服务端客户端1客户端2服务端一般放在/tmp目录下流式套接口要注意粘原创 2020-07-21 22:22:31 · 410 阅读 · 0 评论 -
(P7-P8)文件与IO:文件共享、dup、fcntl
文章目录内核中如何表示打开的文件的?每个进程都有1个文件描述符表refcnt表示文件当前的引用计数stat状态返回的信息都保存在v节点信息上面i节点信息保存了文件存放在磁盘的哪个位置一个进程两次打开同一个文件,V节点信息是共享的文件状态标志是不一样的一个进程两次打开同一个文件,这两次打开文件的文件表的文件状态标志、文件偏移位置的都是独立的,互不影响,相互独立注意:V节点信息是共享的文件2向test.txt文件写入了AAAAA,会改变i节点信息所指向磁盘中的数据。但是偏移量是从5开原创 2020-07-19 23:16:58 · 414 阅读 · 0 评论 -
(P13)exec替换进程映像
文章目录fork的特点:创建一个进程,新进程与原进程是一样的!在shell命令提示符下输入ps的过程:如何加载ps程序?fork会创建一个新进程,但是该进程与原进程是一样的,但是可将新进程用ps程序替换(可称之为加载一个新的程序,用exec系列函数来加载新的程序)为什么错误?Linux不会从当前路径底下搜索源程序,而是从环境变量的路径下搜索源程序!...原创 2020-07-16 23:03:08 · 774 阅读 · 0 评论 -
(P15)守护进程
文章目录进程组组长=进程组主宰man 2 setsid守护进程与控制终端无关,且在后台执行,所以守护进程必须放在一个新的会话期中,所以需要调用setsid函数创建一个新的会话期(如果调用进程不是进程组组长,就可以创建一个新的会话期)因为在shell中创建的第一个进程可能是进程组组长,所以需要退出exit什么是会话期,进程组,控制终端?ls和wc都属于进程组的一员。该进程组的组号码等于第一个进程的进程号。一个会话期可能会有多个进程组,包括前台进程组和后台进程组。一个会话期与一个控制终端原创 2020-07-15 23:02:53 · 291 阅读 · 0 评论 -
(P6)文件与IO:stat、stat结构体
文章目录 struct stat { dev_t st_dev; /* ID of device containing file */设备号:高8位放主设备号,低8位放次设备号 ino_t st_ino; /* inode number */ mode_t st_mode; /* file type and mode */文件权限,文件类型 nlink_t st_nlink; /* number of ha原创 2020-07-15 22:37:14 · 792 阅读 · 0 评论 -
(P4-P5)文件与IO:open、close、creat、read、write,errno的使用
输入/输出是主存和外部设备之间拷贝数据的过程(1)设备——>内存(输入操作)(2)内存——>设备(输出操作)高级I/O:标准C库ANSI C提供的标准库称为高级I/O,通常也称为带缓冲的I/O低级I/O:系统调用IO通常也称为不带缓冲的I/O。原创 2020-07-13 22:26:52 · 590 阅读 · 0 评论 -
(P3)系统编程介绍
文章目录与操作系统的五大模块对应进程调度,会有进程管理和处理器的管理虚拟存储器,对应的就是内存,对设备进行抽象虚拟文件系统网络模块进程间通信模块系统资源的访问主要是通过系统调用完成的系统调用是从用户空间切换到内核空间的一种方式10:06...原创 2020-07-11 23:39:19 · 491 阅读 · 0 评论 -
(P24)进程间通信介绍二:死锁 ,信号量与PV原语 ,用PV原语解决司机与售票员问题 ,用PV原语解决民航售票问题 ,用PV原语解决汽车租赁问题
文章目录进程与进程间的关系互斥:类似人之间的矛盾关系 2个小孩争抢同一个玩具 多个进程排他性的使用他们所共享的资源,这些进程间就构成互斥关系同步:类似人之间的协作关系 公共汽车安全行驶问题 司机 售票员如果一个进程同一时刻,允许多个进程占用的话,就不会构成死锁因为进程要排他性地使用资源,所以防止死锁产生,重点是防止下面的三个条件所需要的资源都得到满足的时候,才能够占有,而不能占有一半的资源;当一个进程请求资源时,可以破坏其它进程所占有的资源进程资源的分配可以模拟银行家算法(原创 2020-07-11 20:41:19 · 2132 阅读 · 0 评论 -
(P23)进程间通信介绍一:进程同步与进程互斥 ,进程间通信目的 ,进程间通信发展 ,进程间通信分类 ,进程间共享信息的三种方式 ,IPC对象的持续性
文章目录顺序性:后一条指令要在第一条指令的基础上才能执行通用寄存器,系统堆栈,进程上下文,不会受其它程序的影响,他是封闭的不管在慢机器还是在快机器,给定程序输入,程序有输出什么时候都可以再现结果共享某些资源排他性地使用资源称之为互斥资源、临界资源互斥:两个进程对共享资源的有序的访问,可用信号量实现进程与进程之间是CPU时间片轮转的当时间片轮转到了B进程,B进程x-1等于0,接着时间片又轮转给了A进程,先前x>0已经做完了,接着做x–,则此时x=-1,相当于一张票卖了2次,这是不原创 2020-07-11 18:52:36 · 384 阅读 · 0 评论 -
(P20)socket编程(十五):UDP聊天室
文章目录1.UDP聊天室的实现1.UDP聊天室的实现C2S_LOGIN:客户端向服务端发送的登录消息S2C_LOGIN_OK:服务端到客户端的相应S2C_ALREADY_LOGINED:用户已经登录乐了,响应登陆失败S2C_SOMEONE_LOGIN:若有一个用户登录服务器,服务器会给其它用户发送有用户登录的消息C2S_ONLINE_USER:任何时刻客户端都可以向服务端发送一个在线用户请求列表的请求S2C_ONLINE_USER:服务器端将在线用户列表返还给客户端C2S_LOGOUT:客户原创 2020-06-23 23:01:44 · 384 阅读 · 0 评论 -
(P19)socket编程(十四):UDP特点,UDP客户/服务基本模型,UDP回射客户/服务器,UDP注意点
文章目录不需要经过三次握手TCP是基于流的传输服务,消息之间没有边界,UDP数据包之间有边界数据包丢失,重复,乱序,以及缺乏流控红色竖线:表示客户端和服务端的边界16:28原创 2020-06-18 23:15:35 · 280 阅读 · 1 评论 -
(P18)socket编程(十三):select vs poll,epoll使用,epoll与select、poll的区别,epoll模式:EPOLLLT,EPOLLET
文章目录poll只有第一个限制cat /proc/sys/fs/file-max因为因为当前内存是512M,所以系统可以打开的最大文件描述符的个数为5万。若是1G,则是10万左右,10G就是百万。select和poll的共同点效率不高的原因:创建一个epoll实例,size不是最大并发数,size仅仅代表内部所创建的hash表的大小epoll_creat1:最新的,而且fd的数量已经由红黑树来控制将一个fd添加到epoll来管理等待事件epoll这块测试代码用c++编写客户原创 2020-06-17 23:42:53 · 535 阅读 · 0 评论 -
(P17)socket编程(十二):select限制,poll
文章目录1.select限制2.poll:与select差不多1.select限制命令:ulimit -n 2048,进程打开的文件描述符的数量编程:头文件中定义的而且需要重新编译内核客户端没有sleep服务端客户端客户端加了sleep服务端:客户端:客户端0 1 2已经被标准输入,标准输出,标准错误输出所占用1021个连接创建第1022个套接字的时候失败了,客户端sleep(4),就不会发送FIN段给对方了服务端收到这1021个连接,会在已完成连接队列中维护原创 2020-06-16 23:28:55 · 384 阅读 · 0 评论 -
(P16)socket编程(十一):套接字I/O超时设置方法,用select实现超时
文章目录1.套接字I/O超时设置方法2.用select实现超时1.套接字I/O超时设置方法2.用select实现超时在都之前设置一个闹钟,若5s钟内没有返回数据(到达5s钟),则会产生一个SIGALRM信号将read打断错误码被打断了因为该闹钟可能会被其它使用,所以一般不使用闹钟来实现超时发送超时时间接收超时时间超时的错误码是EWOULDBLOCK不好移植,因为一些TCP选项不支持这两个选项19:51...原创 2020-06-14 22:16:34 · 550 阅读 · 0 评论 -
(P2)Linux开发工具——gcc入门下
文章目录1.使用外部库2.静态库与共享库3.生成静态库4.生成动态库1.使用外部库2.静态库与共享库3.生成静态库4.生成动态库原创 2020-06-13 21:15:18 · 337 阅读 · 0 评论 -
(P1)Linux开发工具——gcc入门上
文章目录1.什么是gcc2.gcc特点3.gcc编译过程4.gcc常用选项5.gcc编译多文件1.什么是gccgcc(GUN C Compile)编译器的作者是Richard Stallman,也是GNU项目的奠基者什么是gcc?gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compile),现在已经支持多种语言了,如C,C++,Java,Pascal,Ada,COBOL语言等gcc支持多种硬件平台,甚至对Don Knuth设计的MMIX这类原创 2020-06-13 20:33:10 · 543 阅读 · 0 评论 -
(P5)Linux开发工具——gdb入门下
文章目录1.查看运行时的数据2.程序错误3.gdb调试逻辑错误4.gdb调试段错误5.core文件调试1.查看运行时的数据print 查看变量值ptype 查看类型print array 查看数组,查看数组,是查看的是静态数组print *array@len 查看动态内存,查看动态数组,静态数组都可以print x=5 改变运行时的数据eg:p arr1这里数组名是打印整个数组的元素p &arr1打印数组的地址p *arr2@10查看内存的10个元素p arr2原创 2020-06-11 23:46:05 · 266 阅读 · 0 评论 -
(P5)Linux开发工具——gdb入门上
文章目录1.什么是gdb2.gdb功能3.运行程序4.查看源码5.设置断点5.单步调试6.gdb常用命令总结1.什么是gdb什么是gdbgdb是GNU debugger的缩写,是程序的调试工具2.gdb功能启动程序,可以按照用户自定义的要求随心所欲的运行程序可让被调试的程序在用户所指定的调试的断点处停住**(断点可以是条件表达式)**当程序停住时,可以检查此程序中所发生的事动态改变程序的执行环境,可以动态改变变量的值3.运行程序gcc -Wall -g simple.c -o s原创 2020-06-10 22:44:08 · 276 阅读 · 0 评论 -
(P4)Linux开发工具—Makefile下
文章目录1.make常用内嵌函数2.多级目录Makefile1.make常用内嵌函数函数调用$(function arguments)(1)$(wildcard PATTERN) 当前目录下匹配模式的文件eg:src=$(wildcard *.c) 匹配所有的.c文件,所有.c文件列表保存到src变量中(2)$(patsubst PATTERN, REPLACEMENT, TEXT)模式替换函数eg:$(patsubst %.c,%.o,$src) .c的后缀名都替原创 2020-06-09 22:46:41 · 312 阅读 · 0 评论 -
(P3)Linux开发工具—Makefle上
文章目录1.make与Makefile介绍2.Makefile基本规则3.简单的Makefile编写4.Make自动化变量5.Makefile编译多个可执行文件1.make与Makefile介绍make工具利用make工具可以自动完成编译工作。这些工作包括:(1)如果仅仅修改了某几个源文件,则只重新编译这几个源文件;(2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译Makefilemake工具通过一个称为Makefil原创 2020-06-08 22:59:33 · 259 阅读 · 0 评论 -
(P15)socket编程(十):close与shutdown ,进一步改进回射客户程序
文章目录eg:前提:socketA调用了close,socketB没有调用closesocketA向socketB传送数据,socketA调用close是关闭了socketA的发送和接收数据这2个方向(即:socketA不能从套接字中读数据和也不能从套接字中写数据)。相当于socketA向B发送了FIN段,socketB收到后,read返回为0,但是这并不意味着socketB不能通过socket向socketA发送数据,仅仅意味着socketA到socketB的数据传送终止了,并不意味着socket原创 2020-06-07 11:44:53 · 383 阅读 · 0 评论 -
(P14)socket编程(九):select,select函数读,写,异常事件发生条件,用select改进回射服务器程序
文章目录单核CPU是不可以并行处理;select是并发服务器,对于多核CPU而言,select是无法充分利用的,除非使用多进程select,或者多线程select(1)关注前三个对等方发数据过来,填充了套接口缓冲区;对方调用close,返回为0表示对等方关闭;(2)关注第一个大多数时候缓冲区是不满的,会不断产生可写事件;40:41...原创 2020-06-03 23:51:24 · 1912 阅读 · 0 评论 -
(P13)socket编程(八):五种I/O模型,select ,用select改进回射客户端程序
文章目录一递交读操作,读操作就阻塞了,直到对方有数据到来;将套接口接收缓冲区拷贝到用户空间缓冲区buff中,拷贝完成,recv函数就返回了将套接口设置非阻塞方式fcntl(fd, F_SETFL, flag|O_NONBLOCK)recv函数即使没有数据到来,也不会阻塞,因为把他设置为了非阻塞模式了EMOULDBLOCK:改正为:EWOULDBLOCK忙等待:想等待一定的数据,而这些数据又没有到来,又需要占用CPU时间片,这种等待称之为忙等待不推荐使用这种非阻塞IO模型,应用很窄原创 2020-06-01 23:28:44 · 387 阅读 · 0 评论