操作系统类面试题收集

Linux 基础 进程 如何查找特定进程消耗多少内存 bash 1 ps aux --sort=-%mem 按住 ctrl + c 会发生什么 按下 Ctrl + C 时,会向当前正在运行的前台进程发送一个信号,具体来说是 SIGINT 信号(Interrupt Signal,中断信号)。这个信号的作用是请求进程中断执行,通常会导致进程终止。信号编号是 2。 如果程序有处理信号,那么将不会发生任何事情。 守护、僵⼫、孤⼉进程的概念终端 【答】 守护进程:运⾏在后台的⼀种特殊进程,独⽴于控制终端并周期性地执⾏某些任务。 僵⼫进程:⼀个进程 fork ⼦进程,⼦进程退出,⽽⽗进程没有 wait/waitpid⼦进程,那么⼦进程的进程描述符仍保存在系统中,这样的进程称为僵⼫进程。 孤⼉进程:⼀个⽗进程退出,⽽它的⼀个或多个⼦进程还在运⾏,这些⼦进程称为孤⼉进程。(孤⼉进程将由 init 进程收养并对它们完成状态收集⼯作) 进程间通讯方式有哪些? Pipe:无名管道,最基本的IPC,单向通信,仅在父/子进程之间,也就是将一个程序的输出直接交给另一个程序的输入。常见使用为 ps -ef|grep xxx FIFO [(First in, First out)] 或 有名管道(named pipe):与Pipe不同,FIFO可以让两个不相关的进程可以使用FIFO。单向。 Socket 和 Unix Domain Socket:socket和Unix套接字,双向。适用于网络通信,但也可以在本地使用。适用于不同的协议。 消息队列 Message Queue: SysV 消息队列、POSIX 消息队列。 Signal: 信号,是发送到正在运行的进程通知以触发其事件的特定行为,是IPC的一种有限形式。 Semaphore:信号量,通常用于IPC或同一进程内的线程间通信。他们之间使用队列进行消息传递、控制或内容的传递。(常见SysV 信号量、POSIX 信号量) Shared memory:(常见SysV 共享内存、POSIX 共享内存)。共享内存,是在进程(程序)之间传递数据的有效方式,目的是在其之间提供通信。 BASH和DOS控制台之间的主要区别在于3个方面: 答案: BASH命令区分大小写,而DOS命令则不区分; 在BASH下,/ character是目录分隔符,\ 作为转义字符。在DOS下,/ 用作命令参数分隔符,\ 是目录分隔符 DOS遵循命名文件中的约定,即8个字符的文件名后跟一个点,扩展名为3个字符。BASH没有遵循这样的惯例。 Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的? 答案:...

 ·  · 

kubernetes面试题收集

Kubernetes概念 Ingress和LoadBalancer的区别 Ingress通常用于将HTTP(S)流量路由到Kubernetes群集内部的服务,支持复杂路径路由和负载均衡算法 LB则是通过提供商提供一种外部流量引入到集群内的组件,通常为2 3层 Ingress本身是基于service的,引入流量时依赖 kube-proxy LB则是独立的组件,最小接入单元也是service,而通过2 3层的广播等功能可以提供多节点的引入 功能:Ingress是一个规范,LB则是一种实现 实现方式:ingress通过扩展Kubernetes API+controller, 而LB除此外还需要外部设备提供(软硬件,云组件) kubernetes之最小单元 Pod最小可调度单元,最小部署单元 容器:容器是最小的执行单元 Namespace:最小隔离单元 Service:最小接入单元 etcd用的什么算法,简单解释一下 raft算法 强一致性 同一时间只能有一个leader,所有的操作都在leader上。 Pod 的生命周期 Pod 状态始终处于一下几个状态之一: Pending: 部署 Pod 事务已被集群受理,但当前容器镜像还未下载完或现有资源无法满足 Pod 的资源需求 Running: 所有容器已被创建,并被部署到节点上 Successed: Pod 成功退出,并不会被重启 Failed: Pod 中有容器被终止 Unknown: 未知原因,如 kube-apiserver 无法与 Pod 进行通讯 Kubernetes有哪些不同类型的服务? cluster ip Node Port Load Balancer Extrenal Name 什么是ETCD? Etcd是用Go编程语言编写的,是一个分布式键值存储,用于协调分布式工作。因此,Etcd存储Kubernetes集群的配置数据,表示在任何给定时间点的集群状态。 什么是Ingress网络,它是如何工作的? Ingress网络是一组规则,充当Kubernetes集群的入口点。这允许入站连接,可以将其配置为通过可访问的URL,负载平衡流量或通过提供基于名称的虚拟主机从外部提供服务。因此,Ingress是一个API对象,通常通过HTTP管理集群中服务的外部访问,是暴露服务的最有效方式。 什么是Headless Service? Headless Service类似于“普通”服务,但没有群集IP。此服务使您可以直接访问pod,而无需通过代理访问它。 什么是集群联邦? 在联邦集群的帮助下,可以将多个Kubernetes集群作为单个集群进行管理。因此,您可以在数据中心/云中创建多个Kubernetes集群,并使用联邦来在一个位置控制/管理它们。 联合集群可以通过执行以下两项操作来实现此目的。请参考下图。 kube-proxy的作用 kube-proxy运行在所有节点上,它监听apiserver中service和endpoint的变化情况,创建路由规则以提供服务IP和负载均衡功能。简单理解此进程是Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。 kube-proxy iptables的原理 Kubernetes从1....

 ·  · 

go面试题收集

数据结构 数据类型总结 Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。 基础数据类型包括: 基础类型: 布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型。 复合数据类型包括: 指针、数组、切片、字典、通道、结构体、接口。 什么是反射 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。 在go中,编译时不知道类型的情况下,可更新变量、运行时查看值、调用方法以及直接对他们的布局进行操作的机制,称为反射。 场景:无法透视一个未知类型的时候,这时候就需要有反射来帮忙你处理,反射使用TypeOf和ValueOf函数从接口中获取目标对象的信息,轻松完成目的。 rune与byte的区别 byte是uint8、rune为uint32,一个仅限于ascii码的值,一个支持更多的值。rune比byte能表达更多的数。 golang默认使用utf8编码,一个中文占用3字节,一个utf8数字占用1字节,utf8字母占用1字节 切片 切片的扩容:切片扩容,一般方式:上一次容量的2倍,超过1024字节,每次扩容上一次的1/4 切片的截取:在截取时,capacity 不能超过原slice的 capacity new() 与 make() 的区别 new(T) 和 make(T, args) 是Go语言内建函数,用来分配内存,但适用的类型不用。 new函数用于分配指定类型的零值对象,并返回指向其内存地址的指针。例如,new(int)将分配一个类型为int且值为0的对象,并返回一个指向该地址的指针。可以使用*运算符访问指针指向的值。 make函数用于创建和初始化内置类型(如map、slice、channel)的数据结构,并返回其指针。它比new函数更加复杂很多,因为它需要知道类型的大小和结构,以便为其分配内存并初始化其字段或元素。例如,make(map[string]int)将创建一个空的map。它有一个string类型的键和一个int类型的值。 nil切片和空切片指向的地址一样吗? nil切片和空切片指向的地址==不一样==。nil空切片引用数组指针地址为0(无指向任何实际地址) 空切片的引用数组指针地址是有的,且固定为一个值 什么是Receiver Golang的Receiver是绑定function到特定type成为其method的一个参数,即一个function加了receiver就成为一个type的method。 构体方法跟结构体指针方法的区别(Receiver和指针Receiver的区别) T 的方法集仅拥有 T Receiver。 *T 方法集则包含全部方法 (Receiver + *Receiver)。 sync.once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似。但也有所不同 init 函数是在文件包首次被加载的时候执行,且只执行一次 sync.Onc 是在代码运行中需要的时候执行,且只执行一次 当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once 实现:sync.Once 的源码实现非常简单,采用的是双重检测锁机制 (Double-checked Locking),是并发场景下懒汉式单例模式的一种实现方式 首先判断 done 是否等于 0,等于 0 则表示回调函数还未被执行 加锁,确保并发安全 在执行函数前,二次确认 done 是否等于 0,等于 0 则执行 将 done 置 1,同时释放锁 疑问一: 为什么不使用乐观锁 CAS 简单的来说就是 f() 的执行结果最终可能是不成功的,所以你会看到现在采用的是双重检测锁机制来实现,同时需要等 f() 执行完成才修改 done 值 疑问二: 为什么读取 done 值的方式没有统一 比较 done 是否等于 0,为什么有的地方用的是 atomic....

 ·  · 

WSL与Windows环境共享

在使用 wsl 时,总是需要执行 windows 的 cmd,但是windows命令行对于大多数人使用起来还是不习惯,微软提供了在 windows 中Linux与Windows的命令互通,即可以使用cmd shell执行Linux命令,也可以使用bash shell来执行windows命令。 WSL可对 Windows 与 Linux 之间的集成操作: 从 Linux shell(如 Ubuntu)运行 Windows 工具(任意 .exe)。 从 Windows shell(即 PowerShell or cmd )运行 Linux 命令(如 cd ls grep)。 在 WSL与windows之间共享环境变量。 (版本 17063+) 满足上述要求,可以很好地使用windows的软件在WSL中畅快的操作,即空WSL环境拥有了python解析器 docker等操作。 如何在 WSL和 Windows 之间共享环境变量 从Build 17063 开始,可以利用 WSLENV 来增强 Win/WSL 之间的环境变量互操作。 什么是WSLENV WSLENV 是一个以冒号分隔的环境变量列表,当从 WSL 启动 WSL进程或 Win进程时包含的变量 每个变量都可以以斜杠作为后缀,后跟标识位以指定它的转换方式 WSLENV 可以在 WSL 和 Win32 之间转换的路径 WSLENV。在WSL中,是以冒号分隔的列表。在Win中,是以分号分隔的列表 可以在.bashrc或者windows自定义环境变量中设置WSLENV 例如:一个WSLENV应该设置为 text 1 WSLENV=GOPATH/l:USERPROFILE/w:SOMEVAR/wp 在17063之前,WSL访问Windows环境变量唯一方法是使用全路径(可以使用全路径从WSL下启动Win32可执行文件)。但是没有办法在WSL中设置环境变量,调用Win进程,并期望将该变量传送到进程。...

 ·  · 

windows递归复制指定时间后修改过的文件

因为在拷贝web站点时,也会存在更新,需要定期覆盖新的内容,就是上次覆盖的时间和到这次时间内修改过的文件都复制。 实现命令xcopy text 1 2 3 4 5 6 xcopy src dest $ xcopy D:\WWW\back1\* D:\WWW\back4 /D:05-22-2018 /F /E /y D:\WWW\back1\db_qbe.php -> D:\WWW\back4\db_qbe.php D:\WWW\back1\docs.css -> D:\WWW\back4\docs.css D:\WWW\back1\test\changelog.php -> D:\WWW\back4\test\changelog.php 复制了 3 个文件 /D:mm-dd-yyyy /F 打印复制过程 /E 递归复制目录和子目录包括空目录 /Y 禁止提示

 ·  ·