哭泣!单链表反转

3 篇文章 0 订阅

新建链表,头节点插入法(我阔怜的面试)

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.静态库与动态库、静态链接方式与动态链接方式

静态链接:在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。

  • 优点:在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行。
  • 缺点:
    1. 程序体积会相对大一些。
    2. 如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。

动态链接:在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。

  • 优点: 多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝。
  • 缺点: 由于是运行时加载,可能会影响程序的前期执行性能。

  5库: 所谓的库就是一些功能代码经过编译连接后的可执行形式,在Windows平台上见到的.dll文件和linux平台下so动态库都输入库。

  库也有静态lib和动态lib之分:

  1. 静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
  2. 动态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编译系统有哪些?特点?
答 自动化编译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值