- 博客(17)
- 收藏
- 关注
原创 【Linux】读写锁模型
概念引入在生活中,很多时候,写数据和读数据的时间并不是对等的,即有些时候,相比较写数据,读数据的时间反而更多。通常来说,在读的过程中,往往伴随着查找的动作,中间耗时很长,给这种代码加锁,会极大地降低程序的效率。这里就提出了一种读写锁模型,专门处理这种读多写少的问题。读写锁模型也遵循321原则三种关系:写者--写者(互斥关系)、读者--读者(共享关系)、读者--写者(同步或互斥关系)...
2019-01-31 21:27:15 165
原创 【Linux】生产者消费者模型
生产者消费者模型生产者消费者模型就是通过一个容器来解决生产者和消费者的强耦合问题。所谓耦合度是指一件事情的发生对另外一件事情有影响。为什么要使用生产者消费者模型?生产者消费者模型的提出可以提高生产者和消费者的处理能力。生产者和消费者不直接通信,而通过阻塞队列来进行通信,这样的话,生产者生产完数据后,就不用等待消费者处理,而是把消息放到阻塞队列里面,消费者消费时直接从阻塞队列里面取数据,这...
2019-01-22 14:02:07 128
原创 【Linux】线程池
线程池在操作系统中,如果线程过多,每一次调用系统调用接口,都需要向操作系统申请内存,这样会使得执行线程的时间成本大大增加,所以我们就采取一种,提前向操作系统申请一大块空间,等到线程调用的时候,就不用向操作系统要内存,而是直接去拿预申请的内存,这样就会减少从用户切换到内核和从内核切换到硬件的时间成本。而我们通常把存放提前申请好的内存空间的容器叫做线程池。线程池的最根本目的是解决时间成本问题。作...
2019-01-21 20:05:35 195
原创 【Linux】关于静态库和动态库
为什么要使用库?使用库是为了保护自己的源代码,同时也为别人提供服务。如何使用库:提供对应的库文件 提供与库文件对应的头(.h)文件静态库与动态库静态库:是指程序在编译连接的时候把库的代码链接到可执行文件中,一般后缀是.a。 动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码,一般后缀是.so。查找c标准静态库:find /usr/lib -nam...
2019-01-20 19:20:16 130
原创 【日期类】计算日期到天数转换
题目描述:根据输入的日期,计算是这一年的第几天,输入某年某月某日,判断这一天是这一年的第几天?分析:这道题可以使用日期相减的方式实现,用给定的日期减去这一年的1月1日,就可以计算出是第几天,但是这样的话,就要单独实现一个日期类的函数,有点复杂,这里还有另外一种简单的思路,比如要计算2018年11月18日是2018年的第几天,就可以用1月到10月的天数+11月的17天,所以就用一个数组,分别存入...
2019-01-19 22:19:06 514
原创 【Linux】文件系统的理解
在linux下,我们使用ls -l的时候,总是能看到如下信息:这些信息都属于文件的属性信息,而只要是信息,就需要被管理起来,要管理,就得先描述,后组织,因此就有了一个描述文件属性的结构体---inode,也就是说inode是用来保存文件属性的结构。有些人一听到inode可能觉得很陌生,但是inode实际上就是硬盘上的一段内存区域,只不过命名为inode而已,有一个文件,就有一个inode,...
2019-01-18 23:06:06 534
原创 【Linux】匿名管道
概念一提到管道,我们都知道,它是Linux中最古老的进程间通信方式。 我们把从一个进程连接到另外一个进程的数据流称为一个管道。分类匿名管道 命名管道管道这里还有几组概念:临界资源:多个进程看到的一份公共资源称为临界资源 临界区:我们把访问临界资源的那部分代码叫做临界区 互斥:在任意时刻,只允许有一个进程进入临界资源进行资源访问并且在访问期间,其它进程不得访问,这就是互斥...
2019-01-17 22:54:46 295
原创 【Linux】信号的阻塞
信号阻塞 概念信号递达:执行信号的处理过程叫做信号递达(Delivery)。 信号未决:信号从产生到递达之间的状态成为信号未决(Pending)。 信号阻塞:进程可以选择阻塞(Block)某个信号。需要注意的是:被阻塞的信号产生时将保持在未决状态,直到进程解除对该信号的阻塞,才执行递达的动作。 阻塞和忽略是不一样的,阻塞是信号还未被处理,而忽略是信号处理的一种方式。 所...
2019-01-16 17:14:46 193
原创 【Linux】使用共享内存进行进程间通信
共享内存 共享内存是System V版本的一个进程间通信方式。优点:共享内存是进程间通信最快的,因为它能减少进程间数据拷贝的次数。缺点:共享内存不提供任何互斥或同步机制,这个过程由用户自己提供。和共享内存相关函数的头文件:#include <sys/ipc.h>#include <sys/shm.h> 共享内存函数 创建共...
2019-01-15 16:16:42 992
原创 【C++】深浅拷贝问题
首先来看一段代码:#include <iostream>#include <string.h>using namespace std;class String{public: string(const char* str = "wsc") { _str = (const char*)malloc(strlen(strlen) + 1); st...
2019-01-14 15:18:44 142
原创 【Linux】文件描述符
定义 文件描述符是用来访问文件的一个小整数,是操作系统访问特定文件的标志。 用法 #include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>int main(){ ...
2019-01-13 10:52:47 158
原创 【Linux】信号的产生方式
一.通过键盘终端产生信号我们知道2号信号SIGINT的默认处理动作是终止该进程,3号信号SINQUIT的默认处理动作是终止进程并且Core Dump。首先先介绍一下什么是Core Dump。 Core Dump Core Dump叫做核心转储,所谓核心转储是指当进程因为异常而终止时,把进程中的内存数据保存一份到硬盘上的过程。进程异常终止通常是因为有bug,比如野指针,除0等导致段错误...
2019-01-12 21:40:23 926
原创 【Linux】使用命名管道实现server&client通信
什么是命名管道 匿名管道应用的一个限制就是只能在具有亲缘关系的进程之间进行通信,如果我们想在没有关系的两个进程之间进行通信,可以使用fifo来实现,这种实现方式被称为命名管道。命名管道是一种特殊类型的文件。 创建一个命名管道 1.命名管道可以从命令行上创建:$ mkfifo filename2.命名管道也可以使用代码创建,相关函数有:int mkfifo(cons...
2019-01-11 17:01:21 1985
原创 【Linux】在shell中添加重定向功能
我们想要在我们自己实现的shell里面添加重定向功能,首先要掌握什么是重定向,重定向的本质等等。重定向所谓重定向,是指把本来打印在显示器上的内容,通过一定的符号输出到了特定文件中,常见的重定向有输出重定向、输入重定向,追加重定向。重定向的本质用一句话概括重定向的本质就是:把文件描述符组里面的内容覆盖到一个新的文件中。实例:在shell中添加重定向功能具体实现代码如下:...
2019-01-10 16:21:59 495
原创 【Linux】使用命名管道实现简单的文件拷贝
在写代码之前,先介绍一个函数作为代码铺垫:read函数理解: ssize_t read(int fd, void *buf, size_t count);fd:文件描述符,用来指向要操作的文件的文件结构体;buf:一块内存空间;count:希望读取的字节数.具体实现代码如下:makefile: .PHONY:all all : r_file r_fifo r_...
2019-01-09 17:16:22 848
原创 【Linux】实现一个简单的shell
我们想要实现一个简单的shell,就得简单了解一下shell的运行原理:首先从命令行拿到输入信息;然后对信息进行分析处理;之后是fork创建子进程,再让子进程执行程序替换,而父进程只用等待子进程退出就行;更简单的来说,要写一个shell,就需要循环以下过程:1.获取命令行;2.解析命令行;3.建立一个子进程(fork);4.替换子进程(execvp);5.父进程等待子进程退出(wait)。...
2019-01-07 21:52:36 635
原创 【c++】字符串反转
1.编写一个函数,其作用是将输入的字符串反转过来,具体代码如下:class Solution {public: string reverseString(string s) { if(s.empty()) { return s; } size_t begin=0; size_t ...
2019-01-06 19:32:40 674 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人