0%

消息队列

消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)

消息队列不提供同步与互斥

消息队列不提供同步与互斥

消息队列不提供同步与互斥

mark

Linux进程间通信的基本思想是:让两个进程看到一份公共的资源!

Linux进程间通信的目的

  • 数据传输:⼀个进程需要将它的数据发送给另⼀个进程
  • 资源共享:多个进程之间共享同样的资源。
  • 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程)。
  • 进程控制:有些进程希望完全控制另⼀个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

通信方式之管道

管道是Unix中最古老的进程间通信的形式。 我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个”管道”

  • 管道是面向字节流的
  • 管道的生命周期:与进程一致
  • 管道只能用于单向通信
  • 内核会对管道操作进行同步与互斥

Git基本概念

mark

Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库

内存管理的形式

  • 栈: 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的,当方法和语句块一结束,空间马上释放
  • 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信
  • 堆:堆用于程序运行时动态内存分配,堆是可以上增长的,存放的是成员变量,随着对象而产生,随对象销毁而销毁
  • 数据段:存储全局数据和静态数据
  • 代码段:可执行的代码/只读常量

美国国家航空航天局(NASA)开发人员的工作是编程界最具挑战性的工作之一。 他们编写代码并开发关键任务应用程序,安全是他们主要关注的重点。 在这种情况下,制定严谨的编码准则并遵循,对于他们来说十分重要。这些规则涵盖了软件开发的各个方面,如应该如何编写软件,应该使用哪些语言特性等等。

尽管很难就一个编码标准达成共识,NASA 的 JPL 首席科学家 Gerard J. Holzmann 还是制定了一套名为”发展安全关键代码的十大规则”的代码准则,由所有工作人员共同遵循。

由于 JPL 的工作内容与 C 语言相关,因此本指南主要关注用 C 编程语言编写的代码。但也可以灵活运用到其他语言上。

COW技术初窥

Linux写时拷贝技术(copy-on-write):COW 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢?

在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。

当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。

在网上看到还有个细节问题就是,fork之后内核会通过将子进程放在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。

访问限定符说明

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. class的默认访问权限为private,struct为public(因为struct要兼容C) 注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

C++的class与C的struct的区别:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式是private

auto关键字

C语言中其实就有auto关键字,修饰可变化的量,但是由于平时我们直接使用int a = 10;也是声明变量,编译器已经自动帮我们加上了auto关键字,是C语言中应用最广泛的一种类型,也就是说,省去类型说明符auto的都是自动变量! 随着时代进步,Java10中有一个新特性,就是使用var来定义变量,当然前提是类型可推导,语言总是在演化,C++11也是支持了这个新特性,不过在C++11中是auto关键字:使用auto的时候,编译器根据上下文情况,确定auto变量的真正类型! 接下来演示一下auto的使用:

 1int main() {
 2	auto a = 10;
 3	auto b = 20;
 4
 5	list<string> s;
 6
 7	list<string>::iterator be = s.begin();
 8	list<string>::iterator en = s.end();
 9
10	auto be2 = s.begin(); //很显然使用auto可以减少很多不必要的代码
11	auto en2 = s.end();
12
13	return 0;
14}

很显然使用auto可以减少很多不必要的代码,但是:

  • auto不能作为函数参数
  • auto不能直接用来声明数组
  • auto不能定义类的非静态成员变量
  • 实例化模板时不能使用auto作为模板参数
  • auto作为函数返回值时,只能用于定义函数,不能用于声明函数
  • 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法