计算机基础系统篇(面试常见问题)

1.进程/线程
进程:进程是具有一定独立功能的程序,它是系统进程资源分配调度的一个独立单元。(一个内存中运行的应用程序)
线程:线程是进程的一个实体,是CPU调度和分派的基本单元。(线程属于进程,是进程中的一个执行单元)
区别:
(1)一个线程只属于一个进程,一个进程包含一个或者多个线程。
(2)进程拥有独立的内存单元,而多个线程共享内存。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthead_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束。
(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的。
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的资源。

线程和并发有关系,进程和隔离有关系。
线程基本是为了代码并发执行引入的概念,线程上下文切换效率比进程上下文切换会高很多,这样可以提高并发效率。因为要分配cpu时间片,暂停后再恢复要能够继续和没暂停一样继续执行;
进程相当于一堆线程加上线程执行过程中申请的资源,一旦挂了,这些资源都要能回收,不影响其他程序。


<1>死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁?
死锁: 死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象
死锁原因: 系统资源不足、相互竞争资源。请求资源顺序不当
死锁的必要条件:
1.互斥条件:一个资源每次只能被一个进程使用。
2.请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺,只能在进程使用完时由自己释放。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁的方法:
因为互斥是不可改变的,所以只能破坏其他三个条件中的一个来解除死锁,方法:剥夺资源、杀死其中一个线程。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序做操作来避免死锁。

<2>如何在Java中实现线程?
(1)继承Thread类
(2)实现Runnable接口

<3>Thread类中start()和run()方法有什么区别?
(1)start()方法被用来启动新创建的线程,而start()内部调用了run()方法。
(2)直接调用run()方法的时候,只会在原来的线程中调用,没有新的线程启动。

<4>Java中的volatile变量是什么?
volatile关键字的作用是保证变量在多线程之间的可见性(可见性是说每个线程访问用volatile修饰变量时,volatile都保证线程能得到当前最新的值)
volatile是java中提供的最轻量的同步机制

<5>什么是线程安全?Vector是一个线程安全类吗?
线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的一样,就是线程安全的。
Vector是用同步方法来实现线程安全的,而和它相似的ArrayList不是线程安全的。

<6>Java中notify和notifyAll有什么区别?
notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。而notifyAll()唤醒所有线程并允许他们争夺锁确保至少有一个线程能继续运行。

<7>什么是线程池?为什么要使用它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在初始化一个多线程应用程序过程中创建一个线程集合,
然后在需要执行新的任务时重用这些线程而不是新建一个线程,它们被称为线程池,里面的线程叫工作线程。

    为什么需要线程池?
  (1)线程池改进了一个应用程序的响应时间。
  (2)线程池节省了CLR为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成后回收资源。
  (3)线程池根据当前在系统中运行的进程来优化线程时间片。
  (4)线程池允许我们开启多个任务而不用为每个线程设置属性。
  (5)线程池可以用来解决处理一个特定请求最大线程数量限制问题。

2.Apache工作机制和Nginx工作机制对比分析?
同步阻塞
异步非阻塞

3.进程间通信方式? 管道应用场景?
进程间通信:管道、消息队列、信号量、共享内存、套接字、信号

4.Linux文件权限755?(目录的x权限 ls -ld test/ )
755表示该文件所有者对该文件具有读、写、执行权限,该文件所有者所在组用户及其他用户对该文件具有读和执行权限。
用户不具有x的权限,因此不能切换到此目录内!!!

5.查看进程使用的文件

lsof -u lewen    ## 显示指定用户使用的文件
lsof -p 10046  ##显示进程号所打开的文件
lsof -c rsyslog  ##显示指定进程打开的文件
lsof -i tcp:22   ## 显示同时满足TCP和端口为22的进程
lsof -i :80  ## 显示80端口的进程
lsof -i #=查看所有进程

6.软硬链接的区别(实现机制)
ls -li ## 查看节点号
软连接 快捷方式 inode号不同 ln -s
硬链接 新建别名 inode号相同 ln
inode = 文件ID
block (硬链接:文件内容 软链接:inode号)

区别:

  • 硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件(用ls -i查看,这两个文件的inode号是同一个,说明它们是同一个文件)。
    软链接自身就是个链接文件,建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。

  • 软链接可以跨文件系统,硬链接不可以。

  • 软链接可以对一个不存在的文件名(filename)进行链接(此时如果vi这个软链接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在)。

  • 软链接可以对目录进行连接,硬链接不可以。

7.kill和kill -9区别

  • 执行kill(默认kill -15)命令,系统会发送一个SIGTERM信号给对应的程序,大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。

  • kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程
    进程的终止

  • 后台进程的终止:
    方法一:
    通过jobs命令查看job号(假设为num),然后执行kill %num
    方法二:
    通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid

  • 前台进程的终止:
    ctrl+c


后台进程管理命令:

fg        将后台中的命令调至前台继续运行  fg %jobnumbe( job号 不等于 进程号 )
bg        将一个在后台暂停的命令,变成继续执行 (在后台执行) bg %jobnumber
jobs      查看当前有多少在后台运行的命令
&         命令后台执行
ctrl + z  将一个正在前台执行的命令放到后台,并且处于暂停状态,不可执行(挂起)
ctrl + c  中断
ctrl + \
ctrl + d  结束当前程序

先ctrl + z;再bg,这样进程就被移到后台运行,终端还能继续接受命令。

8.buffer和cache的区别(free -h)
写buffer 读cache
写缓冲 读缓存

  • 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。提高内存和硬盘(或其他I/0设备)之间的数据交换的速度而设计的。
  • 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。提高cpu和内存之间的数据交换速度而设计
[oldboy@web01 ~]$ free -h
             total       used       free     shared    buffers     cached
Mem:          222M       216M       6.5M        24K        23M        16M
-/+ buffers/cache:       176M        45M
Swap:         1.0G       359M       664M

total:总的内存量
used:已经被使用的内存量
free:空闲的内存空间
buffer:专门负责操作系统当中,与文件修改类操作有关的内存缓冲区(专门负责写操作的),可以被重复利用的内存区域
cached:专门负责操作系统当中,与文件读取有关的缓存区域(专门负责文件读取操作的)
操作系统可用内存量=free+buffer+cached

SWAP(虚拟内存)是计算机系统内存管理的一种技术,它是从硬盘上划分出一块空间来充当虚拟内存使用。当物理内存接近饱和时,系统会自动将不常用的内存文件转储到SWAP中,但SWAP使用越多的时候对系统性能造成一定影响。

swap分区大小一般为物理内存的1.5-2倍。


9.cpu load x (x代表什么意思)
CPU负载定义为运行队列的长度:当前正在运行的进程数与正在等待(排队)的进程数之和。
系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。
单核处理器的处理规则:

  • 0.70:需要注意并排查原因 。 如果平均负载保持在> 0.70以上,那么应该在情况变得更糟之前进行调查。

  • 1.00: 不紧急,需要处理。如果平均负载保持在1.00以上,需要查找问题原因并立即解决。否则,你的服务器可能在任何时候出现性能问题。

  • 5.0:紧急状态,立即处理。如果平均负载高于5.00,那么你的系统马上就要崩溃了,很有可能系统挂机或者hang死。因此需要立即处理这种情况,千万不要让你的系统负载达到5!

uptime 
top   
cat /proc/loadavg    查看cpu load(负载)以及核数

10.shell脚本中return和exit作用
(1)作用不同。exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。而return是返回函数值并退出函数;
(2)语义层级不同。return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束;
(3)使用方法不用。return一般用在函数方法体内,exit可以出现在Shell脚本中的任意位置。

11.shell脚本中return的取值范围
shell中通过return返回是有限制的(0-255),最大返回255,超过255,则从0开始计算。

#!/bin/bash
fun(){
sum1=23
sum2=33
let sum=$sum1+$sum2
return $sum
}
fun
echo "$?"
运行结果:56

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值