美文网首页
面试问题 计算机网络与操作系统

面试问题 计算机网络与操作系统

作者: darkness605 | 来源:发表于2020-09-02 21:17 被阅读0次

    以下知识解答参考了各路网络大佬的分享,主要用于自己复习备考,如有侵权请联系删除,感谢!
    进程的状态和转换:


    答:进程的状态一共有就绪状态,运行状态,阻塞状态;

    运行状态:进程正在处理机上运行。一个处理机在一个时刻最多有一个进程处于运行状态;

    就绪状态:所有资源已经分配完毕,只等处理机空出来。

    阻塞状态:资源还没给到位,还在等待资源(或者等待输入、输出完成),就算处理机为空也不能运行。


    进程与线程的区别:


    答:1.进程是系统进行资源分配和调度的最小单位。线程是进程的一个实体,它是cpu调度进行运算(资源调度)的最小单位,它是比进程更小的能独立运行的基本单位。 2. 线程基本上不拥有资源,线程只能在一个进程的地址空间内活动,但是可以与同一个进程下的线程共享所拥有的资源。并且同一进程下的线程使用的是相同的地址空间,所以cpu切换线程比切换进程方便的多。 3.****线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的方法实现同步。


    多进程与多线程的区别


    image

    强相关的处理用线程,弱相关的处理用进程。


    线程同步方式:


    1.临界区:串行化来访问公共资源的一段代码,就像厕所,一次只能一个人用;

    2.互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,这样可以保证公共资源不会同时被多个线程访问。

    3.信号量:它允许多个线程在同一时刻来访问同一资源,但是要限制最大数量;

    4.事件(信号):通过通知操作的方式来保持多线程的同步;


    进程同步方式:


    (1)信号量(Semaphore)及PV操作

    优:PV操作能够实现对临界区的管理要求;实现简单;允许使用它的代码休眠,持有锁的时间可相对较长。

    缺:信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。加重了程序员的编码负担;核心操作P-V分散在各用户程序的代码中,不易控制和管理;一旦错误,后果严重,且不易发现和纠正。

    (2)自旋锁

    优:旋锁是为了保护共享资源提出的一种锁机制;调用者申请的资源如果被占用,即自旋锁已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持者已经释放了锁;低开销;安全和高效;

    缺:自旋锁是一种比较低级的保护数据结构和代码片段的原始方式,可能会引起****死锁和****过多地占用CPU资源两个问题。

    传统自旋锁由于无序竞争会导致“公平性”问题

    (3)管程

    优:集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。

    缺:如果一个分布式系统具有多个CPU,并且每个CPU拥有自己的私有内存,它们通过一个局域网相连,那么这些原语将失效。而管程在少数几种编程语言之外又无法使用,并且,这些原语均未提供机器间的信息交换方法。

    (4)会合

    进程直接进行相互作用

    (5)分布式系统

    消息和rpc ,由于在分布式操作系统中没有公共内存,因此参数全为值参, 而且不可为指针.


    socket套接字:


    image

    进程间的通信方式:


    **   每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。**
    

    1. 管道/匿名管道(pipe)

    ** 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据,管道一端的进程顺序的将数据写入缓冲区,另一端的进程则顺序的读出数据。****该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了。**


    2. 有名管道(FIFO)

    有名管道不同于匿名管道之处在于它提供了一个路径名与之关联,以有名管道的文件形式存在于文件系统中,这样,即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信,因此,通过有名管道不相关的进程也能交换数据。值的注意的是,有名管道严格遵循先进先出(first in first out),对匿名管道及有名管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾。

    ** 管道类似与数据结构中的队列。**

    **无名管道阻塞问题:无名管道无需显示打开,创建时直接返回文件描述符,在读写时需要确定对方的存在,否则将退出。如果当前进程向无名管道的一端写数据,必须确定另一端有某一进程。如果写入无名管道的数据超过其最大值,写操作将阻塞,如果管道中没有数据,读操作将阻塞,如果管道发现另一端断开,将自动退出。** 
    

    ** 有名管道阻塞问题:有名管道在打开时需要确实对方的存在,否则将阻塞。即以读方式打开某管道,在此之前必须一个进程以写方式打开管道,否则阻塞。此外,可以以读写(O_RDWR)模式打开有名管道,即当前进程读,当前进程写,不会阻塞。**


    3. 信号(Signal)

    信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。

    如果该进程当前并未处于执行状态,则该信号就有内核保存起来,知道该进程回复执行并传递给它为止。

    如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消是才被传递给进程。

    Linux系统中常用信号:

    (1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。

    (2)SIGINT:程序终止信号。程序运行过程中,按Ctrl+C键将产生该信号。

    (3)SIGQUIT:程序退出信号。程序运行过程中,按Ctrl+键将产生该信号。

    (4)SIGBUS和SIGSEGV:进程访问非法地址。

    (5)SIGFPE:运算中出现致命错误,如除零操作、数据溢出等。

    (6)SIGKILL:用户终止进程执行信号。shell下执行kill -9发送该信号。

    (7)SIGTERM:结束进程信号。shell下执行kill 进程pid发送该信号。

    (8)SIGALRM:定时器信号。

    (9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。


    信号来源

    信号是软件层次上对中断机制的一种模拟,是一种异步通信方式,

    硬件来源:用户按键输入Ctrl+C退出、硬件异常如无效的存储访问等。

    软件终止:终止进程信号、其他进程调用kill函数、软件异常产生信号。


    信号生命周期和处理流程

    信号被某个进程产生,并设置此信号传递的对象(一般为对应进程的pid),然后传递给操作系统;如果对应进程没有阻塞,操作系统将传递此信号。目的进程接收到此信号后,将根据当前进程对此信号设置的预处理方式,暂时终止当前代码的执行,保护上下文(主要包括临时寄存器数据,当前程序位置以及当前CPU的状态)、转而执行中断服务程序,执行完成后在回复到中断的位置。


    4. 消息(Message)队列

    消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。

    消息队列特点总结:

    (1)消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识.

    (2)消息队列允许一个或多个进程向它写入与读取消息.

    (3)管道和消息队列的通信数据都是先进先出的原则。

    (4)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。

    (5)消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。

    (6)目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,系统V消息队列目前被大量使用。系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。


    5. 共享内存(share memory)

    使得多个进程可以可以直接读写同一块内存空间,是最快的可用IPC形式。

    为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。延伸阅读:Linux支持的主要三种共享内存方式:mmap()系统调用、Posix(可移植性操作系统接口)共享内存,以及System V(在内核中维护)共享内存实践。


    6. 信号量(semaphore)

    信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。信号量是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ;

    为了获得共享资源,进程需要执行下列操作:

    (1)创建一个信号量:这要求调用者指定初始值,对于二值信号量来说,它通常是1,也可是0。

    (2)等待一个信号量:该操作会测试这个信号量的值,如果小于0,就阻塞。也称为P操作。申请

    (3)挂出一个信号量:该操作将信号量的值加1,也称为V操作。释放


    7. 套接字(socket)


    Socket是应用层和传输层之间的桥梁,套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。

    套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

    (1)套接字的域

    它指定套接字通信中使用的网络介质,一是AF_INET,它指的是Internet网络。另一个域AF_UNIX,表示UNIX文件系统。

    (2)套接字的端口号

    每一个基于TCP/IP网络通讯的程序(进程)都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息。

    (3)套接字协议类型

    一是流套接字,流套接字在域中通过TCP/IP连接实现,同时也是AF_UNIX中常用的套接字类型。流套接字提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有一定的出错后重新发送的机制。

    二个是数据报套接字,它不需要建立连接和维持一个连接,它们在域中通常是通过UDP/IP协议实现的。它对可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能会丢失、复制或错乱到达,UDP不是一个可靠的协议,但是它的速度比较高,因为它并不需要总是要建立和维持一个连接。

    三是原始套接字,原始套接字允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备。


    套接字通信的建立


    服务器端

    (1)创建socket,不能与其他的进程共享。

    (2)给套接字起名为bind,然后服务器进程就开始等待客户连接到这个套接字。

    (3)接下来,系统调用listen来创建一个队列并将其用于存放来自客户的进入连接。

    (4)最后,服务器通过系统调用accept来接受客户的连接。它会创建一个与原有的命名套接不同的新套接字,这个套接字只用于与这个特定客户端进行通信,而命名套接字(即原先的套接字)则被保留下来继续处理来自其他客户的连接(建立客户端和服务端的用于通信的流,进行通信)。


    客户端

    (1)创建一个未命名的socket,然后将服务器的命名套接字作为一个地址来调用connect与服务器建立连接。

    (2)一旦连接建立,我们就可以像使用底层的文件描述符那样用套接字来实现双向数据的通信(通过流进行数据传输)。


    linux内核态和用户态

    内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。

    内核态和用户态的最大区别在于特权级不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

    用户态切换到内核态的3种方式:1、系统调用(主动) 2、异常(被动) 3、外围设备中断(中断)

    linux中grep、awk、sed、fork

    答:awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。

    grep功能:用于过滤/搜索特定字符。可使用正则表达式 能多种命令配合使用。

    fork函数:通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

    1)在父进程中,fork返回新创建子进程的进程ID;

    2)在子进程中,fork返回0;

    3)如果出现错误,fork返回-1;

    信号量及PV操作
    答:

    image.png 进程三个状态之间的转换就是靠PV操作来控制的。
    信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。
    而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

    使用PV操作实现同步操作
    用一个信号量S与一个消息(或者资源)联系起来,当信号量的值为0时,表示期望的消息尚未产生(或者资源不可用);当信号量的值S>0时,表示期望的消息已经存在(有资源可用)。用P V操作实现进程同步时,调用P操作测试消息是否到达(是否有资源可用),调用V操作发送消息(添加资源)。

    使用PV操作实现进程(线程)同步时:
    1.分析进程(线程)间的制约关系,确定信号量种类。在保持进程(线程)间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。
    2.信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。
    3.同一信号量的P、V操作一般必须要成对出现,但它们分别在不同的进程(线程)代码中。

    使用PV操作实现互斥操作时:
    1.同一信号量的P、V操作必须要成对出现,且出现在同一的进程(线程)代码中。
    2.每个互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性, 否则会造成死锁。
    3.P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
    互斥信号量的初值一般为1。

    吞吐率和吞吐量、事务TPS
    答:单位时间内服务器处理的请求数来描述其并发处理能力。称之为吞吐率(Throughput),单位是 “req/s”。吞吐率特指 Web 服务器单位时间内处理的请求数。另一种描述,吞吐率是单位时间内网络上传输的数据量,也可以指单位时间内处理客户请求数量。它是衡量网络性能的重要指标。通常情况下,吞吐率 “字节数/秒” 来衡量。
    吞吐量,是指在一次性能测试过程中网络上传输的数据量的总和。
    事物是用户某一步或几步操作的集合。
    TPS是指每秒钟系统能够处理事务或交易的数量,它是衡量系统处理能力的重要指标。

    image.png image.png
    image.png

    网关是什么?
    答:网关又称为协议转换器。网关的功能是实现网络之间的相互连接。网关不仅可以让广域网之间相互连接,也可以让局域网之间相互连接。网关在计算机和设备之间起转换的作用,相当于一个翻译器,可以使不同的协议、语言、数据在不同的系统之间进行转换。

    DHCP协议
    答:对一个临时加入的设备,它是不知道自己的ip地址是多少的。这个设备在加入时会先采用UDP协议广播DHCP发现报文,通过这个DHCP发现报文来查找DHCP服务在哪。这个设备使用了UDP协议,那肯定使用了IP协议,但是他的IP地址是什么确定的呢?他是通过把主机号全填写为1,来发送广播报文。DHCP服务器收到这个报文以后,就会发出DHCP提供报文,告诉这个设备可以提供IP地址。设备收到DHCP提供报文之后,发出请求报文,DHCP服务器收到之后就回应并提供IP地址。

    线程间的通信方式:
    答:线程通信是通过读写同一进程的数据进行通信的。
    锁机制:包括互斥锁、条件变量、读写锁
    互斥锁:提供了以排他方式防止数据结构被并发修改的方法。
    读写锁:允许多个线程同时共享数据,而对写操作是互斥的。
    条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
    信号量机制(Semaphore):包括无名进程信号量和命名线程信号量
    信号机制(Signal):类似进程间的信号处理

    输入一个url之后的具体过程:
    答:浏览器中输入一个URL:
    (1) 首先浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有给本地DNS发送查询请求。DNS的查询方式有两种,一种是递归查询,一种是迭代查询。如果是迭代查询,本地的DNS服务器,向根域名服务器发出查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议。
    (2) 得到IP地址以后,浏览器就要与服务器建立一个HTTP连接,因此要用到HTTP协议,HTTP协议报文格式上面已经提及到。HTTP生成一个get请求报文,将该报文传给tcp层处理。如果采用到HTTPS还会对数据进行加密。TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。
    (3) TCP的数据包然后会发送给IP层,用到IP协议。IP层通过路由选择,一跳一跳发送到目的地址。当然在一个网络内的寻址是通过以太网协议实现,以太网协议需要知道目的IP地址的物理地址,有需要ARP协议。

    fork函数
    **答:fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
    在父进程中,fork返回新创建子进程的进程ID;
    在子进程中,fork返回0;
    如果出现错误,fork返回一个负值;
    fork出错可能有两种原因:
    (1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
    (2)系统内存不足,这时errno的值被设置为ENOMEM。(关于errno的意义,请参考本系列的第一篇文章。)
    **
    fork函数和vfork函数的区别
    **

    1. fork ():子进程拷贝父进程的数据段,代码段
      vfork ():子进程与父进程共享数据段
    2. fork ()父子进程的执行次序不确定
      vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
      或exit 之后父进程才可能被调度运行。
    3. vfork ()保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
      调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
      **
      孤儿进程、僵尸进程
      孤儿进程
      一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
      孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。
      由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。

    僵尸进程
    一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。
    僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。
    系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
    要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。

    软连接和硬链接

    软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软链接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)

    硬连接是不会建立inode的,他只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反是软连接会重新建立一个inode,当然inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息。一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查inode link count的数值,如果他大于等于1,那么inode不会被回收。因此文件的内容不会被删除。

    硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。

    多线程和多进程的优点:
    答:
    多线程的优点:内存和资源共享更为方便、高效,同步和通信简单。因为是属于同一个进程,地址空间是相同的,所以在上下文切换时更为方便。

    多进程的优点:更强的容错性,进程之间互不影响。更好的多核可伸缩性。

    在linux中,如果需要进行大量共享数据或者频繁通信时,使用多线程,其他情况下尽量使用多进程,能用多进程就用多进程。

    select、poll、epoll
    **

    相关文章

      网友评论

          本文标题:面试问题 计算机网络与操作系统

          本文链接:https://www.haomeiwen.com/subject/vnaosktx.html