嵌入式开发高频面试题——第一章 进程与线程(下)
1.2 并发,同步,异步,互斥,阻塞,非阻塞的理解?
1.2.1 什么是线程同步和互斥?⭐⭐⭐⭐⭐
- 同步:多个线程在协作时,某个线程需要等待其他线程完成某个任务后才能继续执行。通常用于确保任务按照预期的顺序执行。
- 互斥:用于防止多个线程同时访问共享资源,导致数据竞争或冲突。通过互斥锁来保证同一时刻只有一个线程可以访问资源。
1.2.2 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐⭐
- 线程同步与阻塞的关系:同步通常需要阻塞来等待某个条件的满足,因此同步操作常常导致线程阻塞。
- 同步一定阻塞吗?不一定。某些同步操作可以通过非阻塞机制来实现。
- 阻塞一定同步吗?不一定。阻塞是指线程因为某种原因无法继续执行,可能与同步无关(例如等待 I/O 完成)。
1.2.3 并发,同步,异步,互斥,阻塞,非阻塞的理解?⭐⭐⭐⭐⭐
- 并发:多个任务在同一时间段内交替执行。
- 同步:任务之间通过某种方式协调,确保按照特定的顺序执行。
- 异步:任务可以独立于其他任务执行,无需等待其他任务完成。
- 互斥:确保共享资源在任意时刻只被一个线程或进程访问。
- 阻塞:任务因为等待某个事件(如 I/O 操作)而暂停执行,直到事件发生。
- 非阻塞:任务可以立即执行,不需要等待其他事件。
1.3 孤儿进程、僵尸进程、守护进程的概念?
1.3.1 基本概念?⭐⭐⭐⭐⭐
孤儿进程:父进程先于子进程终止,子进程变为孤儿进程。孤儿进程会被
init
进程收养。僵尸进程:子进程结束后,父进程没有调用
wait()
函数,导致子进程的进程表项没有被清除,成为僵尸进程。守护进程:长时间运行在后台、不与终端直接交互的进程,通常用于执行系统服务。
1.3.2 如何创建守护进程?⭐⭐
- 创建守护进程的步骤包括:
- 调用
fork()
,使父进程终止,子进程继续运行。 - 使用
setsid()
创建新的会话并使子进程成为会话领导。 - 重设文件权限掩码、关闭文件描述符,进入守护进程状态。
- 调用
1.3.3 正确处理僵尸进程的方法?⭐⭐⭐⭐
- 处理僵尸进程的方法:
- 在父进程中调用
wait()
或waitpid()
来回收子进程的状态。 - 使用信号处理函数捕捉
SIGCHLD
信号,自动回收子进程。
- 在父进程中调用
https://chenchuanze123.github.io/2024/10/11/%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B-%E4%B8%8B/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CFuYuan'sBlog!