首页 > 面试爱考 | OS系统相关
头像
Hcoco
发布于 07-30 14:45 贵州
+ 关注

面试爱考 | OS系统相关


进程是什么?有哪几种状态?

进程是运行中的程序,程序只是静态的指令的集合。 进程包括指令数据段以及PCB(进程控制块)。是操作系统分配资源的最小单位

进程有三种状态:阻塞态就绪态执行态

以read函数进程读取管道中内容为例:

  1. 当管道中没有数据时,进程read等待管道另一端写数据,此时进程为阻塞态。
  2. 写端向管道中写数据,进程read发现数据可读,等待CPU分配时间片,此时进程由阻塞态转为就绪态。
  3. 当CPU分配给read进程时间片,进行读取数据,进程由就绪态变为执行态。

fork的用法?

fork系统调用用于创建一个子进程,首先给子进程分配空间,再将父进程中的所有值复制到子进程中即可。 注意:子进程会继承父进程的 所有锁与条件变量(包括他们的状态)。

关于返回值:父进程得到子进程的pid,子进程得到0。如果fork失败那么返回一个负值,并且子进程不会被创建。


僵尸进程,孤儿进程,守护进程是什么?

  • 孤儿进程

父进程提前退出,子进程仍然在运行,称子进程为孤儿进程孤儿进程对系统没有危害,产生孤儿进程后,有init进程来接管该孤儿进程(通过ps命令可以查看init进程的pid为1)。

  • 僵尸进程

子进程提前退出,父进程仍然在运行,称子进程为僵尸进程僵尸进程对系统有害,僵尸进程并不会释放拥有的进程号资源。如果出现了大量的僵尸进程占用资源,将会无法创建新的进程(通过ps命令可以查看僵尸进程的状态位z(zombie))。

解决僵尸进程的办法有两个:

  1. 是杀死父进程,僵尸进程将会转变为孤儿进程,此时init进程会来接管这些孤儿进程,资源得到回收。
  2. 父进程调用 wait 函数回收子进程资源;
  • 守护进程

一种特殊的孤儿进程,不论终端是否关闭,都会一直运行到系统关闭。

在Linux中我们可以使用top , ps 等指令查看进程的状态。


线程是什么?有哪几种线程?

线程是一种轻量级的进程是操作系统任务调度和执行的最小单位

线程有两种类型:用户级线程内核级线程

  1. 内核级线程:内核态使用的线程。
  2. 用户级线程:用户态使用的线程。

进程与线程的区别?(多进程与多线程的区别?)

用一个形象的例子可以说明进程与线程之间的关系,将进程比作火车线程比作火车车厢

  1. 本质 进程是运行中的程序,是操作系统分配资源的最小单位;线程是一种轻量级的进程,是操作系统任务调度和执行的最小单位。

  2. 联系 一个进程可以有多个线程,但至少有一个线程;一个线程只能属于一个进程。

  3. 数据的共享与同步 多进程的数据是分开的,共享较为困难,需要通过IPC,同步较为简单;多线程的数据是共享的,共享简单,但是同步困难。这一点各有优势。(好比不同的火车共享数据困难,同步简单;车厢之间共享数据简单,同步困难)。

  4. CPU与内存消耗 多进程CPU利用率低,内存消耗大(每一个进程都有独立的内存空间),切换复杂;多线程CPU利用率高,内存消耗小(线程共享同一个内存空间),切换简单。多线程占优。

  5. 创建销毁,切换 多进程创建,销毁,切换速度慢;多线程较快。多线程占优。

  6. 编程调试 多进程的编程,调试都简单;多线程的编程,调试都较复杂。多进程占优。

  7. 可靠性 多进程之间不会相互影响;多线程之间会相互影响,一个线程挂掉导致整个进程挂掉。多进程占优。

那么相比于进程,哪些东西又是线程私有的?请见下一个问题。


哪些是线程私有的?

  1. 线程id:每一个线程都有自己的线程id,可以通过pthread_self()查看。

  2. 寄存器:线程需要不断进行切换,需要使用寄存器存放旧线程的状态。

  3. 函数堆栈:线程需要拥有属于自己的函数堆栈,使得函数调用可以正常进行。

  4. errno:错误返回码

  5. 线程优先级


集群,分布式的区别?

  • 集群

同一个业务,部署在多个服务器上面(不同的服务器运行同样的代码,干同一件事)。

  • 分布式

一个业务拆分成多个子业务,部署在不同的服务器上面(不同的服务器运行不同的代码,为了同一个目的)。


多核是什么意思?

多核也就是多内核,是指在一个处理器(CPU)中集成多个完整的计算引擎。


并发与并行的区别

  • 并发

单核CPU根据时间片的划分,依次处理多任务。

  • 并行

多核CPU同时处理多个任务。


举个例子:吃饭的时候接到电话,接了电话后继续吃饭,这是并发;一般吃饭一边接电话,这是并行。


大内核与微内核

  • 大内核

将操作系统的主要功能模块作为一个紧密联系的整体运行在内核态,优点是效率高,缺点是代码量过大难以维护。

  • 微内核

随着操作系统内核越来越复杂难以维护,于是提出了微内核的概念;微内核是将最基本的功能留在内核态,而其他功能放在用户态,大大降低了内核的复杂性,从而增加了可维护性,但是由于用户态与内核态之间的频繁切换,效率大大降低。


分时系统与实时系统

  • 分时系统

CPU划分多个时间片并发执行任务,有较好的交互性与及时性。

  • 实时系统

规定截止时间内处理完任务并作出响应,有较高的及时性,安全性与可靠性,例如飞机自动驾驶,飞机订票,股票交易等。


32位的系统一个进程最多有多少内存空间?

32位系统意味着4G的寻址空间,在Linux中将其分为两个部分,0 ~ 3G为用户空间,3 ~ 4 G为内核空间。

补充:关于用户空间和内核空间的区别见下一个问题。


用户态与内核态的区别?(用户空间和内核空间的区别?)

内核态和用户态是操作系统运行的两种级别。在32位寻址的Linux系统中有4G的虚拟地址空间,0 ~ 3G分为用户空间,3 ~ 4G分为内核空间。

  • 内核态

内核空间存放的是内核代码和数据,权限较高,可以访问所有的内存空间和对象,CPU不会被抢占。如 系统调用 和 操作硬件 都处在内核态。

  • 用户态

用户空间存放的是用户程序的代码和数据,权限较低,能访问的内存空间和对象受限,CPU可被抢占。 大部分用户使用的应用程序都是在用户态。


库函数与系统调用的区别

  1. 本质

库函数是可以自己编写的函数,发生在用户地址空间;而系统调用属于内核提供的API,发生在内核空间。 如fread属于库函数,如read,write,open属于系统调用。

  1. 开销方面

库函数的开销较小;系统调用需要经过用户态,内核态,用户态的转换,所以开销较大。

  1. 移植性方面

库函数较容易移植,而系统调用由于不同操作系统之间的差异较大,移植较困难。


上下文切换

上下文切换是指CPU挂起一个进程/线程,去执行另一个进程/线程

上下文切换只能发生在内核态,是多任务操作系统的一个特点。不过由于上下文的高速切换,在用户眼中仿佛任务是同时处理的一样。


多线程锁的种类?(linux多线程锁?)

  1. 互斥锁(pthread_mutex_t)

最为常用的锁,任意时刻只能有一个线程能访问加锁资源。

  1. 递归锁(pthread_mutex_recursive)

相比于互斥锁无法对同一个资源多次加锁或解锁,递归锁可以对同一个资源进行多次加锁和解锁。

  1. 自旋锁(pthread_spinlock_t)

相比于互斥锁在阻塞状态会让出cpu去忙其他事务,自旋锁在阻塞状态下并不会让出cpu而是一直占用cpu直到得到锁,这样减小了cpu上下文切换的时间,多用于内核中消耗时间较少临界区。

  1. 读写锁(pthread_rdlock_t)

该锁区分读和写操作,加写锁时其他线程不能对资源进行操作,加读锁的时候多个线程可以对该临界资源加读锁。


什么是半双工管道?全双工管道?

  • 单工管道:只有一端可以使用,用作读或者写。

  • 半双工管道:两端都可以使用,但只能一端读一端写,数据单向流动。

  • 全双工管道:两端都可以使用,且每一端均可读写,数据双向流动。


进程间(IPC:Interprocess communication)通信

全部评论

(0) 回帖
加载中...
话题 回帖

近期热帖

近期精华帖

热门推荐