新建链表,头节点插入法(我阔怜的面试)
public ListNode reverseList2(ListNode head) {
3 ListNode dummy = new ListNode(-1);
4 ListNode pCur = head;
5 while (pCur != null) {
6 ListNode pNex = pCur.next;
7 pCur.next = dummy.next;
8 dummy.next = pCur;
9 pCur = pNex;
10 }
11 return dummy.next;
12 }
1.linux里的线程和进程
进程是一个任务,是一个正在执行的程序实例。它由执行程序、它的当前值、状态信息以及通过操作系统管理此进程执行情况的资源组成; 从更小的角度看,进程是由一个地址空间和在这个地址空间内执行的一个或多个线程,以及这些线程所需要的系统资源组成; 所有的进程都是由其他进程启动的(除了init,它是由Linux内核启动的),这是一个树层次结构,可以用pstree查看;
进程是一个能独立运行的单位,是系统进行资源分配和调度的基本单位。
线程是隶属进程的一个实体,是比进程更小的一个运行单位,一个进程可以有一个或多个线程。
2.
管道: 管道"|"(pipe line):上一个命令的stdout接到下一个命令的stdin;
一个进程的输出作为另一个进程的输入;
例如:ls | wc -l ; ls | grep 'txt';
3.1)概念:环境变量是在操作系统中一个具有特定名字的对象,它 包含了一个或者多个应用程序所将使用到的信息。环境变量相对于给系统或用户应用程序设置的一些变量。比如在Windows或DOS操作系统中的path变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找;
4.静态库与动态库、静态链接方式与动态链接方式
静态链接:在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。
- 优点:在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行。
- 缺点:
-
- 程序体积会相对大一些。
- 如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。
动态链接:在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。
- 优点: 多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝。
- 缺点: 由于是运行时加载,可能会影响程序的前期执行性能。
5库: 所谓的库就是一些功能代码经过编译连接后的可执行形式,在Windows平台上见到的.dll文件和linux平台下so动态库都输入库。
库也有静态lib和动态lib之分:
- 静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
- 动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持。
6)makefile描述模块间的依赖关系,定义了整个工程的编译规则,实现了自动化编译(make命令执行Makefile脚本)
make命令根据makefile对程序进行管理和维护;make判断被维护文件的时序关系;
参照:https://blog.csdn.net/haoel/article/details/2886/
7GCC编译器为啥要分前端后端
将编译器分为前端和后端,前端的功能在于产生一个可以让后端处理的语法树,后端翻译语法树成为GCC的暂存器转换语言(RTL),这样使得前后端独立,使得后端无须考虑多种源语言和目标语言而专注于其他工作,消除了重复开发的工作量,提高了编译系统的开发效率
8.硬链接:ln 源文件 目标文件 不同的文件名对应同一个inode,不能跨越文件系统,对应系统调用link
软链接:ln -s 源文件 目标文件 存储被链接文件的文件名与路径,可跨越文件系统,对应系统调用symlink
9.系统调用和库函数都以C函数的形式出现;
1)系统调用:
- Linux内核的对外接口
- 用户程序与内核之间的唯一接口
- 提供最小接口
2)库函数
- 依赖于系统调用
- 提供较复杂功能
例如标准I/O库
3)基本I/O系统调用
open/create,close,read,write,lseek
dup/dup2
fcntl
ioctl
10 文件描述符
文件描述符:在Linux系统中打开文件就会获得文件描述符,它是一个很小的正整数。每个进程在PCB(process control block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针;
文件指针FILE*:C语言中使用文件指针FILE*作为I/O的句柄。文件指针指向进程用户区的一个被称为FILE结构的数据结构.FILE结构包括一个缓冲区和一个文件描述符,而文件描述符是文件描述符表的一个索引,因此某种意义上说文件指针就是句柄的句柄。
11 标准IO函数
文件流
流与FILE结构:FILE* fp;预定义的指针:stdin,stdout,stderr;
缓冲I/O:三种类型——全缓冲、行缓冲、无缓冲
12.Linux内核的能力:
- 内存管理,文件系统,进程管理,多线程支持,抢占式,多处理器支持
13.
用户态与内核态:
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(简称内核态)。此时处理器处于特权级最高的0级(x86的特权级分为4级,0级最高,3级最低)。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
当进程执行用户自己的代码时,处于用户态,特权级为3.进入内核态:
- 系统调用
- 中断处理
- 异常
14问:为什么Linux引入makefile?和其他脚本的区别?使用makefile编译系统有哪些?特点?
答 自动化编译