操作系统——面试知识点精华

本文解释了僵尸进程和孤儿进程的基本概念、产生原因及危害,并提供了解决方法。
  1. 僵尸进程和孤儿进程
    引用地址http://www.cnblogs.com/Anker/p/3271773.html
    基本概念:
    孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
    僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
    产生原因:
     unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。
     任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
     危害:
      这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

      孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

      僵尸进程危害场景:

      例如有个进程,它定期的产 生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是,父进程只管生成新的子进程,至于子进程 退出之后的事情,则一概不闻不问,这样,系统运行上一段时间之后,系统中就会存在很多的僵死进程,倘若用ps命令查看的话,就会看到很多状态为Z的进程。 严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们寻求如何消灭系统中大量的僵死进程时,答案就是把产生大 量僵死进程的那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。枪毙了元凶进程之后,它产生的僵死进程就变成了孤儿进 程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经僵死的孤儿进程 就能瞑目而去了。
    解决方法:
    1 信号机制。 子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。
    2 fork()两次。 原本在子进程的任务,放到孙子进程中执行。父进程wait()子进程。这样孙子进程变成孤儿进程,孙子进程将有操作系统init进程接管。

  2. next
  3. 列表内容
### 计算机操作系统面试知识点及答案 #### 1. 操作系统的定义及其功能 操作系统是一种系统软件,它管理和控制计算机硬件和软件资源,并提供用户与这些资源之间的接口。其核心功能包括以下几个方面[^1]: - **进程管理**: 负责创建、终止以及调度进程。 - **存储管理**: 管理内存空间,确保不同进程之间互不干扰。 - **设备管理**: 控制外部设备的访问,协调它们的工作。 - **文件管理**: 提供文件的组织、存取方法。 #### 2. 微内核的概念 微内核是操作系统的一种设计架构,其中只有最基础的服务驻留在内核中,其余大部分功能被移到用户空间中的服务器实现。这种结构的优点在于提高了可靠性和灵活性,因为单个服务的失败不会影响整个系统。然而,由于所有的用户进程都需要通过微内核进行通信,这可能导致效率降低[^1]。 #### 3. Shell 的作用 Shell 是一种用户界面,提供了用户与操作系统交互的方式。对于普通用户而言,他们可以通过 Shell 输入命令来操作计算机,而无需编写复杂的程序或直接调用系统 API 接口。常见的 Shell 类型有两种:图形化界面(如 Windows Explorer)和命令行界面(如 Linux Bash)。 #### 4. 用户态与内核态切换 在外围设备完成特定操作并向 CPU 发送中断信号时,CPU 将暂停当前正在执行的任务并转向处理该中断事件。这一过程中可能会发生状态转换——从用户态进入内核态。例如,在硬盘读写完成后,系统会切换至相应的中断处理程序继续下一步动作[^2]。 #### 5. 吞吐量 (Throughput) 和带宽 (Bandwidth) 吞吐量指的是单位时间内成功传输的数据总量;而带宽则表示网络链路所能承载的最大数据速率。两者虽然都衡量性能指标,但侧重点有所不同:前者关注实际有效负载能力,后者更强调理论极限速度[^2]。 #### 6. 线程池的作用及相关概念 为了提高并发处理能力和减少频繁创建销毁线程带来的开销,引入了线程池技术。线程池是一个预先创建好的工作线程集合体,当有新任务到来时可以直接分配给空闲线程执行而不是每次都新建一个临时线程实例。此外,使用线程池还可以达到解耦目的,使应用程序的设计更为清晰简洁[^3]。 ```python import threading from queue import Queue class ThreadPool: def __init__(self, num_threads): self.tasks = Queue() self.workers = [] for _ in range(num_threads): worker = Worker(self.tasks) self.workers.append(worker) def add_task(self, task_func, *args, **kwargs): """Add a new task to the pool.""" self.tasks.put((task_func, args, kwargs)) def start_all_workers(self): """Start all workers in the thread pool.""" for w in self.workers: w.start() def join_all_workers(self): """Wait until all tasks are done and stop all workers.""" self.tasks.join() for w in self.workers: w.stop_flag.set() # Signal each worker to exit. w.join() class Worker(threading.Thread): def __init__(self, tasks_queue): super().__init__() self.tasks = tasks_queue self.stop_flag = threading.Event() def run(self): while not self.stop_flag.is_set(): try: func, args, kwargs = self.tasks.get(timeout=1) func(*args, **kwargs) self.tasks.task_done() except Exception as e: pass def example_task(x, y): print(f"Result of {x} + {y}: ", x+y) if __name__ == "__main__": tp = ThreadPool(5) for i in range(10): tp.add_task(example_task, i, i*2) tp.start_all_workers() tp.join_all_workers() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值