![](https://img-blog.csdnimg.cn/20201011171258920.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux操作系统
文章平均质量分 78
Linux操作系统
路上的追梦人
尽人事,听天命
展开
-
Linux网络编程errno的EAGAIN和EINTR
在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。EAGAIN和EWOULDBLOCK等效!从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返回,read函数会返回一个错误EAGAIN,提示你..转载 2021-08-24 22:18:41 · 6504 阅读 · 0 评论 -
Linux网络编程
本文的笔记来自于b站视频的爱编程的大丙,博客链接:https://subingwen.cn/,有做了相应的补充!转载 2021-08-18 15:24:42 · 987 阅读 · 0 评论 -
线程池的工作原理及C++实现
本文的笔记来自于b站视频的爱编程的大丙,博客链接:https://subingwen.cn/,有做了相应的补充!一、线程池的原理线程池是一种多线程处理的形式,处理过程中将任务添加到队列,任何在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件的发生),则线程池将插入另外一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段..转载 2021-08-17 18:46:12 · 1990 阅读 · 0 评论 -
Shell编程-输入输出重定向
一、重定向的作用一个进程默认会打开标准输入(STDIN)、标准输出(STDOUT)、错误输出(STDERR)三个文件描述符,对于的数字分别为:0、1、2。重定向可以让我们的程序的标准输出、错误输出的信息重定向文件里,那么么这里还可以将文件的内容代替键盘作为一种标准输入的方式,在C语言的函数为:dup。重定向的符号:输入重定向符号“<” 输出重定向符号“>”,“>>”,“2>”,“&>”1、输入重定向功能输入重定向会把文件的内容当做参数原创 2021-08-16 11:29:12 · 3350 阅读 · 0 评论 -
Valgrind内存泄露检测
参考资料:Valgrind官方网站:http://www.valgrind.org/ 内存调试技巧:http://www.ibm.com/developerworks/cn/aix/library/au-memorytechniques.html 如何在 linux 下检测内存泄漏:http://www.ibm.com/developerworks/cn/linux/l-mleak/体系结构Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Va...原创 2021-08-16 00:10:19 · 597 阅读 · 0 评论 -
C++服务编译原理分析
为了更好地理解编译优化方案,在介绍优化方案之前,我们先简单介绍一下编译原理,通常我们在进行C++开发时,编译的过程主要包含下面四个步骤:预处理器:宏定义替换,头文件展开,条件编译展开,删除注释。gcc -E选项可以得到预处理后的结果,扩展名为.i 或 .ii。 C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情。 预处理之后,得到的仅仅是真正的源代码。编译器:生成汇.原创 2021-01-07 15:49:01 · 189 阅读 · 0 评论 -
深入理解操作系统之页面置换算法
1.最佳(Optimal)置换算法1.1算法原理其选择淘汰的页面将是以后永不使用的,或许是在最长时间内不再被访问的页面.采用最佳置换算法通常可以保证获得最低的缺页率.但由于人们目前还无法预知,一个进程在内存的若干个界面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用它来评价其他算法.例如:假定系统为某进程分配了三个物理块,并考虑有以下页面号引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1进程在运行...原创 2020-12-10 13:12:39 · 1392 阅读 · 0 评论 -
一文弄懂原子性、临界区、临界资源
原子性原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败。是一种独立不可分割的操作,不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。临界资源、临界区临界资源:是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件:打印机,磁带机等;属于临界资源的软件:消息队列,变量,数组,缓冲区等。各个进程间采取互斥访问的方式,实现对这种资源的共享。 临.原创 2020-11-19 22:50:17 · 1237 阅读 · 0 评论 -
C++lock、unlock、lock_guard和condition_variable锁
lock、unlocklock()和unlock()函数必须同时成对存在,不存在一多一少的情况;lock()调用线程将锁住该互斥量;若该互斥量当前没有被锁住,则进行加锁; 若当前互斥量被其他线程锁住,则当前的调用线程被阻塞; 若当前互斥量被当前调用的线程锁住,则会产生死锁,因为同一个线程不允许锁两次;unlock()进行解锁操作,释放互斥量的所有权;#include <iostream>#include <thread>#include <m.原创 2020-11-18 16:08:27 · 2876 阅读 · 1 评论 -
Go实现简单的多并发服务器
互联网通信本质上是应用进程之间的通信、连接,必须知道通信双方的IP以及端口Port;本文选用流式套接字的模式,利用Go语言实现简单的多并发任务,原理的流程图大致如下:服务器的建立建立socket,申明自身的端口port和IP,并绑定到socket,使用listen监听,然后不断用accept去查看是否有连接。如果有,捕获socket,并通过recv获取消息的内容,通信完成后调用closeSocket关闭这个对应accept到的socket。如果不需要等待任何客户端连接..原创 2020-10-27 14:44:54 · 796 阅读 · 0 评论 -
详细了解-select...from... for update
前言近期开发与钱相关的项目,在高并发场景下对数据的准确行有很高的要求,用到了for update,故总结一波以便日后留恋。for update的使用场景如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止转载 2020-10-20 16:01:57 · 1235 阅读 · 0 评论 -
一文搞定内核态与用户态
1、假如linux进程有4GB地址空间,如图所示:3G-4G大部分是共享的,是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。其实缓冲区分为用户空间和内核空间。2、特权级的概念:对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问翻译 2020-10-11 17:30:24 · 233 阅读 · 0 评论 -
笔记—内存映射
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示: 由上图可以看出,进程的虚拟地址空间,由多个虚拟内存区域构成。虚拟内存...转载 2020-09-27 14:27:50 · 917 阅读 · 0 评论