- 博客(73)
- 收藏
- 关注
原创 生产消费者(CP)模型
CP模型有三个部分:productor和consumer(由线程组成的功能块)还有一个特定结构的内存空间以超市为例,超市货物由供应商提供,超市暂时存储货物,消费者可以在超市购买货物。工作流程;生产者获取数据,生产任务并将任务放到仓库,消费者从仓库获取任务,处理任务“321”原则三种关系:生产者和生产者之间的关系:互斥消费者和消费者之间的关系:互斥生产者和消费者之间的关系:互斥,同步(必须生产者生产之后,消费者才能消费,要有顺序)二种角色:生产和消费一个交易所:特定的内
2024-08-06 16:57:22
188
原创 线程的同步互斥
互斥保证了在一个时间内只有一个线程访问一个资源。先看一段代码:三个线程同时对全局变量val进行--,同时val每自减一次其线程局部存储的全局变量++最终的结果val竟然出现了负数,为什么呢?因为线程函数的操作是非原子的,线程可能在任何一步被切换。这就会导致数据不一致问题,要想解决就必须使用锁。
2024-07-30 20:20:07
390
原创 线程控制
对线程的控制思路和进程相似,创建、等待、终止,只需要调用接口就行。但是在Linux下没有线程的概念,因为Linux的设计者认为,线程是一种轻量级的进程,毕竟创建线程只需要创建PCB。因此Linux中使用多线程必须使用第三方pthread库,线程库为用户提供接口。
2024-07-13 21:38:59
422
原创 线程(vs进程)
那怎么理解之前的进程定义呢?进程内核数据结构等就是操作系统分配的资源,只不过没有多个线程,只有一个执行流罢了。所以一开始的对进程的定义就是进程的一个特例,一个只有一个执行流的特例!
2024-07-13 16:48:53
424
原创 操作系统——信号
信号是由OS向进程发送的,信号就一定保存在进程中。普通信号有31个,以位图的形式储存到进程PCB的一个int类型中。实时信号与普通信号的区别就是:实时信号收到后必须立即处理不会等待,实时信号是存储在进程的一个队列中。所以发信号就是操作系统修改对应的int值或者队列。
2024-06-13 14:16:44
1413
原创 进程通信——共享内存
共享内存有点像动态库创建共享内存:操作系统在物理内存分配一段空间(Shared Memory Segment)将共享内存挂起:通过页表将共享内存映射到两个进程的共享区通信:拿到虚拟地址,写端直接在地址上写数据,读端直接在地址上读数据断开挂起,销毁共享内存和文件一样,共享内存也会有对应的内核结构体来描述,有对应的共享内存描述符。
2024-06-03 15:38:41
627
原创 进程通信——管道
什么是进程通信?进程通信是实现进程间传递数据信息的机制。要实现数据信息传递就要进程间共享资源——内存空间。那么是哪块内存空间呢?进程间是相互独立的,一个进程不可能访问其他进程的内存空间,那么这块空间只能由操作系统提供。进程通信的方式有多种,管道就是一种。管道是一种最简单的通信机制,管道分为匿名管道和命名管道。匿名管道通常用于父子进程之间。命名管道可实现任意两个进程通信。
2024-06-03 11:42:53
871
原创 打开文件,向文件写数据,我们的计算机都干了什么
调用高级语言库函数(例如C语言的fopen),库函数内部调用系统调用接口open,操作系统为其分配文件描述符。
2024-05-21 12:59:41
239
原创 深入理解文件系统
磁盘格式化并不是将磁盘的每个数据块的数据都抹除,不仅会降低效率而且会降低硬件的使用寿命。一般就是将分区的属性删除,将inode和数据块的位图都清除。因此,格式化不会将磁盘的数据都抹除只是修改了属性,如果误删了重要数据,最好的解决方法就是什么都不做,找专业的人使用专业的软件来恢复数据。软连接类似于Windows中的快捷方式,删除目标文件会导致软连接失效。硬连接是文件的等价副本,删除硬连接不影响文件内容,只有当所有硬连接都被删除时,文件内容才会被删除。
2024-05-20 13:25:42
876
原创 操作系统——文件fd
未指定路径会在默认在当前路径,为什么?进程属性cwd(current work directory)会有路径的信息,如果我们修改这个属性,文件就会创建到修改后的路径下:当前路径下并没有创建文件到我们修改的路径下面发现了我们写入的文件。
2024-05-17 12:11:32
686
原创 操作系统——进程控制
fork是一个系统调用函数,用来创建子进程,通过多个执行流完成任务。子进程和父进程共用一份代码,子进程数据使用写时拷贝,即子进程数据在创建的时候和父进程相同,但是当要修改数据的时候,子进程数据会再复制一份数据。函数无参,返回值pid_t是用有符号整形封装的。函数返回值,如果创建成功,父进程就返回子进程的pid,子进程返回0,如果创建失败就返回-1。
2024-05-09 18:37:03
832
原创 进程地址空间
上面的画的简单的数据存储结构就是实际进程的地址空间结构,在Linux操作系统中定义了一个mm_struct结构体用来存储各个数据段的地址,例如:代码段地址可以用两个成员表示,code_start记录代码段的首地址,code_end记录代码段的末尾地址。这样就可以为存储的每个数据段都划分出一个空间。进程的地址是虚拟的和物理地址有一种映射关系,这种关系被放到了页表这个结构中。
2024-04-29 00:07:14
355
原创 操作系统——进程
通俗来讲,进程是操作系统为了管理要运行程序的东西。首先,我们要知道操作系统是干什么的。操作系统对下要管理好软硬件资源,对上提供一个良好的运行环境。那么OS是如何管理的?首先,对于要管理的对象,建立一个struct结构体(操作系统使用C语言写的),这个结构体可以存储对象的各种属性;然后将各个结构体放到相应功能的数据结构中,由此,对对象的管理就变为了对数据结构的增删改查。
2024-04-22 16:49:55
478
1
原创 centos7的git使用方法
git clone https...(图片中复制的内容)git commit -m "提交日志"git首次使用要配置邮箱和用户名。
2024-02-06 15:05:58
736
原创 深入解析C++智能指针:从auto_ptr到weak_ptr
这篇博客为读者提供了从基础到高级的C++智能指针知识,适合希望深入理解这一重要C++特性的开发者。
2023-12-23 12:24:11
384
原创 C++11——包装器
包装器是一种调用类型,本质是类模板。意义:C++中,函数可以有多种实现方法,除了直接实现函数还可以用仿函数和lambda还有类的成员函数。包装器可以对这些调用类进行封装,简化。
2023-12-19 15:53:38
404
原创 C++11——可变参数模板
可变参数模板可以接收不定数量的参数,比如printf函数就是这样,可以传任意数量的参数Args是一个函数模板参数包,args函数形参参数包。
2023-12-17 19:50:06
53
原创 C++——多态
多态是有继承关系的类对象调用相同的函数,会有不同的结果。例如,普通人买高铁票不打折,学生打75折,儿童免费,这种情况就适合使用多态。
2023-10-15 17:30:25
125
原创 C++——多态底层原理
sizeof(Base)是多少?答案是:8因为Base中除了成员变量_b,还有一个虚函数表_vfptr(当类中有虚函数就会生成),虚函数表的本质是函数指针数组,用来存储虚函数的指针派生类虚函数表是这样生成的:先将基类的虚函数表内容拷贝过来,在把派生类中重写的虚函数的地址覆盖到被重写的虚函数地址上,最后将派生类自己增加的虚函数依次增加到虚表的末尾。
2023-10-08 14:07:10
1067
原创 C++——继承
简单记忆:派生类中继承过来的成员的访问权限,是基类成员的访问权限和继承方式中权限最小的,例如,基类private成员通过public继承,二者中private的权限最小,继承的成员在派生类中就是private成员基类和派生类都有自己独立的作用域,如果基类和派生类中有同名的成员函数,注意只需要同名,那么当我们用派生类的对象调用这个函数时,只会调用派生类的函数,基类的函数就被隐藏/重定义了。
2023-10-07 13:28:01
109
原创 C++——模板,template
我们经常会遇到一种情况:用相同的方法处理不同的数据。对于是函数,我们可以用函数重载来解决。虽然重载可以解决这种情况,但还是很繁琐。如果函数重载10次,有一天你突然发现有新的需求,函数需要修改,那你只能把这10个函数依次修改了,麻烦的要死!所以函数模板他来了。函数模板代表了一类函数,函数模板与参数类型无关,在使用时被实例化,根据参数类型产生特定类型的函数版本。函数返回值 函数名 (参数列表)函数体;注:typename可以用class替换,二者基本没有区别。
2023-09-18 14:28:23
125
原创 C++——string使用
rfind如果未给出查找的起始位置,或者起始位置下标越界,会从字符串末尾开始寻找;rfind和find一样,如果未找到目标,就会返回npos。+=运算符重载和append的功能基本相同,append除此之外可以使用迭代器,插入指定数量的字符,但是+=使用更方便。如果pos等于字符串大小,就会返回空字符串;如果pos大于字符串大小,就会抛异常。如果n小于字符串大小时,会将多出的字符直接删除,当n大于字符串大小时,多的空间会用字符c来填充。这个函数是传值返回,需要深拷贝,效率低少用为好。
2023-09-03 15:26:19
179
原创 Linux工具——vim
如果安装失败,提示Could not resolve host:mirrorlist.centos.org: Unkown error的问题,需要替换yum源,可以参考这个。
2023-07-25 16:36:32
137
原创 Linux中常用的指令
ls [选项] [目录或文件]功能:对于目录,列出该目录下所有的子目录和文件;对于文件,列出该文件的文件名和其他属性常用选项:-a:列出目录下的所有文件,包括以.开头的隐藏文件-l:列出文件的详细信息。注:ls -l 可以写成 ll选项可以同时包含多个不常用的选项:-d 将目录象文件一样显示,而不是显示其下的文件。如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件。
2023-07-19 17:01:34
2003
原创 Linux权限
Linux下的权限是指访问者对文件的权限,我们这次的重点就讲是访问者和文件权限的关系。访问者有三种:1.文件拥有者u(user)2.所属组g(group)3.其他用户o(other)文件权限有三种:1.读权限r(read)2.写权限w(write)3.执行权限x(execute)
2023-07-19 16:50:57
612
原创 C++——类和对象
/class是定义类的关键字 name是类名class name//类体:由成员函数(类方法)和成员变量(类属性)组成C语言中的结构体只能定义变量,但是在C++中还可以定义函数,这是因为C++将结构体上升为类int _age;int _score;声明和定义全部放在类体中(函数可能被编译器当作内联函数处理)类的定义和函数声明放在的头文件中,函数的定义放在源文件中,成员函数名前要+类名和" :: "//Person.hint _age;int _score;
2023-06-01 19:17:10
910
原创 C++——inline 内联函数
当程序中大量的调用某个函数时,因为每次调用都会为函数建立栈帧,会造成极大开销。C语言中的解决方法就是用宏代替函数。但是,宏也有缺点,例如不可调试,可维护性差,可读性差,没有类安全性检查等。那么在C++中,是怎么解决的呢?
2023-05-26 16:45:05
97
原创 C++11——auto
一行定义多个变量时,所有变量必须是相同类型。编译器只对第一个变量的类型做推导,用推导出来的类型定义其他变量。int main()//报错,C++ 对于此实体“auto”类型是int,但之前默示为double//int//int//int。
2023-05-26 15:13:43
100
原创 C++——引用
fun2函数返回a时,由于函数栈帧被销毁,会先将a的值传给一个临时变量,再将临时变量传给n,这会涉及两次变量的拷贝。就好比孙悟空有很多外号,例如孙行者,齐天大圣,斗战胜佛,但是它们所指都是孙悟空。同样的,如果齐天大圣大闹天宫,那么孙悟空也大闹天宫,所以引用改变了,相应的变量的值也改变了。引用作函数返回值时,要保证函数调用结束栈帧销毁后,返回的变量不被释放,例如使用静态变量。初步理解:引用相当于给变量取了一个别名,它和引用的变量共用同一块空间。引用作参数可以改变实参的值,与C语言中的指针效果相同。
2023-05-26 11:05:13
728
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人