自学内容网 自学内容网

让上次犯的错反省出梦想

首先就是关于~和home有什么区别(确实我都没想过这个) 

就是这样的区别,个人和整体的区别

 

这我是纯忘了,看一眼会了:

还有是关于很前面很前面学的,也是忘记了:

所以干脆复习下命名空间使用的三种方式: 

然后是关于拷贝构造函数的特点:

知道了(复习了)Linux下如何查看所有用户和组的信息:

cat /etc/passwd
cat /etc/group

还有一些其他的相关命令:

groups
groups switch

查看当前登录用户的组内成员、查看switch用户所在的组和组内成员 

 还有我觉得了解一下即可的知识:

linux 2.6.* 内核默认支持的文件系统有哪些?

以及输出Linux内核版本信息的命令:

uname -r

 还有其余几个指令:

vmstat  报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息

sar帮助我们掌握系统资源的使用情况,特别是内存和CPU的使用情况

stat用于显示文件的状态信息

less指令可以分页显示文件内容,可以灵活移动上下光标和翻页

 more也可以分页显示文件内容,但是通常是向上翻页

在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项:

mkdir -p

-m可以在创建命令的时候设置权限 

 在Linux系统中, 为找到文件try_grep含有以a字母为行开头的内容, 可以使用命令:

grep -E ^a try_grep

 在grep选项中,-E选项可以用来扩展选项为正则表达式:

 $表示匹配文件末尾,字符需要在$之前表示以字符结尾  a$表示以a结尾

^表示匹配文件起始,字符需要在^之后表示以字符起始  ^a表示以a起始

 然后还是命令耶!查看CPU占用的命令:

top

top                     查看cpu资源使用状态

netstat                查看网络连接状态

free                     查看内存资源状态

df                        查看磁盘分区资源状态

 然后是关于删除,批量删除当前目录下后缀名为.c的文件的操作:

可以:

rm *.c

也可以麻烦点这样删:

find . -name "*.c" -maxdepth 1 | xargs rm

这个翻译一下就是: 

找到当前目录下.*结尾的文件,目录深度为1

xargs是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,用于很多不支持|管道来传递参数的命令

相当于将前边命令的执行结果,也就是查找到的文件名,传递给后边的rm指令进行删除

还有yum工具的常用选项:

yum工具的常用选项有:

install 表示安装软件包

list 列出所有可供安装的软件包

search 搜索包含指定关键字的软件包

remove 卸载指定的软件包

 还是关于yum的一些选项的说明:

yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了不用每次都去搜索软件包信息:

可以使用 yum makecache将软件包信息缓存到本地

使用 yum clean all 清理老旧的缓存信息

yum -y update:升级所有包,也升级软件和系统内核

yum -y upgrade:只升级所有包,不升级软件和系统内核,软件和内核保持原样

 然后是在vim编辑器中将字符AAA全部替换成yyy的操作:

:s 表示substitute,也就是替换, 格式为以下

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

range 表示区间 % 用于表示全文, 2,3 表示从第2行开始到第3行

{pattern} 表示字符串匹配规则,要匹配什么样的字符串 , 比如^a 表示以a字符起始的字符串

{string} 表示要将匹配到的字符串替换为的新的string字符串

[flags] s_flags中,g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次

[count] 表示在一行中匹配多少次(很少会用到)

如果想要将文件中所有 nihao 替换为 hello 则命令为:

%s/nihao/hello/g

 还有vim的一些其他选项:

:p 用于打印指定区间的行

:[range]p[rint] [flags]

:i 在指定行上方添加文本

:{range}i[nsert][!]

 vim编辑器在末行模式下,输入:q! 强制退出编辑,但并不保存当前修改

仅仅汇编不生成可执行程序的命令:

gcc -c test.c

 gcc的其他选项:

-c 汇编完成后停止,不进行链接

-E 预处理完成后停止,不进行编译

-S 编译完成后停止,不进行汇编

-o 用于指定目标文件名称

-g 生成debug程序

在gdb调试中的选项:

bt                                                 查看函数调用栈

set scheduler-locking off             多线程调试,关闭调度锁(所有线程同步执行)

info break                                    查看断点信息

show用于显示调试器本身的信息,info是显示被调试任务的信息 

🍍死代码删除是编译最优化技术,指的是移除根本执行不到的代码,或者对程序运行结果没有影响的代码(不是删除被注释的代码)

🍍内联函数,也叫编译时期展开函数, 指的是建议编译器将内联函数体插入并取代每一处调用函数的地方,从而节省函数调用带来的成本,使用方式类似于宏,但是与宏不同的是内联函数拥有参数类型的校验,以及调试信息,而宏只是文本替换而已

🍍for循环的循环控制变量,通常被cpu访问频繁,因此如果调度到寄存器中进行访问则不用每次从内存中取出数据,可以提高访问效率

🍍强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令,比如 num % 128 与 num & 127 相较,则明显&127更加轻量

🍍编译过程为 扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化

  • 扫描程序进行词法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型
  • 语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,分析树parse tree,语法树syntax tree
  • 语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解成语法分析就是描述一个句子主宾谓是否符合规则,而语义是用于检测句子的意思是否是正确的
  • 目标代码生成:把中间代码变换成为特定机器上的低级语言代码

makefile相关操作:

🍍makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系。make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出

🍍Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释

  • 显式规则说明如何生成一个或多个目标文件
  • make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写makefile,比如源文件与目标文件之间的时间关系判断之类
  • 在makefile中可以定义变量,当makefile被执行时,其中的变量都会被扩展到相应的引用位置上,通常使用 $(var) 表示引用变量
  • 文件指示。包含在一个makefile中引用另一个makefile,类似C语言中的include
  • 注释,makefile中可以使用 # 在行首表示行注释

🍍默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件

🍍make的执行规则是,只生成所有目标对象中的第一个,当然make会根据语法规则,递归生成第一个目标对象的所有依赖对象后再回头生成第一个目标对象,生成后退出

🍍make在执行makefile规则中,根据语法规则,会分析目标对象与依赖对象的时间信息,判断是否在上一次生成后,源文件发生了修改,若发生了修改才需要重新生成

🍍makefile中的伪对象表示对象名称并不代表真正的文件名,与实际存在的同名文件没有相互关系,因此伪对象不管同名目标文件是否存在都会执行对应的生成指令

伪对象的作用:

1. 使目标对象无论如何都要重新生成

2. 并不生成目标文件,而是为了执行一些指令

🍍makefile中使用 .PHONY 来声明伪对象, .PHONY: clean

🍍内联函数是一种建议,如果函数内部包括循环,递归,或者代码量大且复杂,这些函数即使设置了内联函数,系统也不会当做内联函数来处理

inline函数不支持声明和定义分离开,因为编译器一旦将一个函数作为内联函数处理,就会在调用位置展开,符号表中不会有inline函数的符号名,不存在链接冲突,即该函数没有地址,也不能在其他源文件中调用,故一般都是直接在源文件中定义内联函数的

🍍this指针代表了当前对象,能够区分每个对象的自身数据,保证每个对象拥有自己的数据成员,但共享处理这些数据的代码,单纯的对this赋空是不可以的,可以强转直接赋空(一般不这么玩)

🍍构造函数可以是私有的,只是这样之后就不能直接实例化对象,可以带参数,还可以有多个构造函数构成重载

🍍Cache是缓存(一种技术),并不属于冯诺依曼体系结构的必要组成部分

CPU --  运算器与控制器             RAM --  内存(存储器)          ROM --  磁盘(输入输出设备)

冯诺依曼体系结构中数据输入设备有键盘、磁盘(可以从硬盘读取数据也可以向硬盘写入数据)

冯诺依曼体系结构计算机的基本原理是存储程序和程序控制(计算机按照指定的指令执行流程完成对指定数据的处理)

🍍系统调用是操作系统向上层提供的用于访问内核特定功能的接口,应用程序通过系统调用将自己需要完成的功能传递给内核,系统调用的运行过程是在内核态完成的,操作系统并不允许用户直接访问内核(用户运行态并不满足访问内核的权限),系统调用是上层提供用于完成特定内核服务或功能的,用户只需要将自己的请求以及数据通过系统调用接口传递给内核,内核中完成对应的设备访问过程,最终返回结果正确

系统向上层提供系统调用接口用于访问内核服务或功能是因为这样可以最大限度的保护内核的稳定运行

🍍read是系统提供的用于从输入设备获取数据的接口

🍍在抢占式多任务处理中,进程被抢占时,这些运行环境需要被保存下来:

所有cpu寄存器的内容                 cpu上正在处理的数据

页表指针                                     程序切换时会将页表起始地址加载到寄存器中

程序计数器                                 下一步程序要执行的指令地址

🍍 程序是静态的指令集合,保存在程序文件中,

进程是程序的一次运行过程中的描述

作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合

🍍进程是操作系统对于程序运行过程的描述,学名进程控制块-PCB,它是操作系统操作系统管理以及调度控制程序运行的唯一实体

id:进程标识符            进程管理器:对PCB进行管理的程序

🍍

僵尸进程:子进程先于父进程退出,父进程没有对子进程的退出进行处理,因此子进程会保存自己的退出信息而无法释放所有资源成为僵尸进程导致资源泄露。

孤儿进程:父进程先于子进程退出,子进程成为孤儿进程,运行在后台,父进程成为1号进程(而孤儿进程的退出,会被1号进程负责任的进行处理,因此不会成为僵尸进程,产生一般具有目的性,无需特殊处理)

🍍守护进程&精灵进程:特殊的孤儿进程,不但运行在后台,最主要的是脱离了与终端和登录会话的所有联系(默默的运行在后台不想受到任何影响)

🍍

  • syslogd:系统中的日志服务进程
  • init:init进程是内核启动的第一个用户级进程,用于完成处理孤儿进程以及其他的一些重要任务
  • sshd:远程登录服务进程
  • vhand:内存置换服务进程

🍍~/.bash_profile:用户级的环境配置文件,每个用户目录下都会具有各自的,在用户每次登录系统时被读取,里面所有命令都会被shell执行。包括环境变量的配置命令

/etc/progile.d :目录,其中包含了系统级的环境配置文件,任意用户登录时都会执行这个目录下的环境配置文件完成环境配置(不是保存环境变量配置的配置文件)

🍍

echo 用于输出打印一个变量的内容,包括环境变量

env 用于打印所有环境变量信息

set 用于输出打印所有环境配置以及变量信息,不限于环境变量

🍍rm无法删除环境变量,环境变量设置之后,不需要重启shell,也不需要重新加载文件,只要设置换环境变量就能直接生效,可以使运行环境的配置更加灵活简单

🍍

TCB                 线程控制块

MMU               内存管理单元,一种负责处理中央处理器(CPU)的内存访问请求,功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制

CACHE           高速缓存

DMA                直接内存存取

🍍一个分页存储管理系统中,地址长度为 32 位,其中页号占 8 位,则页表长度是2的8次方,页号即页表项的序号,总共占8个二进制位,意味着页表项的个数就是2^8

🍍fork之后紫禁城保留父进程的环境变量和当前工作目录

🍍waitpid默认阻塞等待任意一个或指定子进程退出,当options被设置为WNOHANG则函数非阻塞,且当没有子进程退出时,waitpid返回0

🍍进程的退出返回值不能随意设置,因为进程的退出返回值实际上只用了一个字节进行存储,因此随意设置可能会导致实际保存的数据与设置的数据不同的情况(过大会导致数据截断存储)

waitpid(int pid, int *status, int options); 函数中 status参数用于父进程获取退出子进程的返回值

程序异常退出时,意味着程序并没有运行到return/exit去设置返回值,则返回值不做评判标准,因为返回值的存储位置的数据是一个未知随机值

进程的退出返回值不可以在任意进程中通过wait/waitpid接口获取(不能由任意进程获取子进程退出返回值)

🍍

int main(int argc, char* argv[])
{
   fork();
   fork() && fork() || fork();
   fork();
}

不算main进程自身,总共创建了19个进程:

fork()创建子进程成功,父进程返回子进程的pid>0,为真

子进程返回的是0 为假

根据if语句的与和或逻辑进行判断:

将fork进行编号 2号fork创建子进程后父进程为真,则父进程的3号fork会被执行,

然而其子进程返回0为假,则子进程的3号fork不会被执行。。。

主进程和1号子进程都会创建2号子进程和3号子进程,但是不会创建4号子进程,然后创建5号

主进程每次返回真,创建2号子进程,3号子进程,5号子进程

1号每次返回真,创建2号子进程,3号子进程,5号子进程

2号自己为假,会创建4号子进程和5号子进程

3号自己为假,会创建4号子进程和5号子进程

4号自己为假,只会创建5号

主-1 主进程创建1号后与1号雷同 因此进程数 10 * 2 = 20 减去主进程自身:19

|-2

|-4 2号自己为假,会创建4号子进程

|-5 4号自己为假,只会创建5号

|-5 2号自己为假,会创建5号子进程

|-3 主/1号进程,创建2号返回真后创建3号进程

|-4 3号自己为假,会创建4号子进程

|-5 4号自己为假,只会创建5号

|-5 3号自己为假,会创建5号子进程

|-5

差不多就这样了,爱情转移和富士山下都很好听呢

电影也很好看


原文地址:https://blog.csdn.net/chestnut_orenge/article/details/140680950

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!