持续更新版本 嵌入式工程师常见面试题( 二 )


综上所述,多进程和多线程在操作系统中都具有其优缺点 。在实际应用中,需要根据具体场景和需求来选择合适的进程模型 。在需要隔离和独立性要求较高的场景下,可以选择多进程;而在需要共享数据和协作频繁的场景下,可以选择多线程 。同时,需要注意多进程和多线程可能带来的上下文切换、同步问题、调度开销等挑战,以及如何进行有效的优化和管理 。
3、多进程、多线程同步(通讯)的方法?
多进程和多线程之间的同步和通信可以通过以下几种方法实现:
管道(Pipe):管道是一种进程间通信的方式,可以在不同进程之间传递数据 。可以使用管道函数如pipe()、read()和write()等来实现进程间通信 。共享内存( ):共享内存是一种高效的进程间通信方式,它可以让多个进程共享同一块内存区域,从而实现数据共享 。可以使用共享内存函数如()、shmat()和shmdt()等来实现进程间通信 。信号量():信号量是一种同步机制,它可以用于控制多个进程之间的访问权限 。可以使用信号量函数如()、()和semop()等来实现进程间同步 。消息队列( Queue):消息队列是一种进程间通信方式,它可以让不同进程之间传递消息,并且具有消息的优先级和缓冲机制 。可以使用消息队列函数如()、()和()等来实现进程间通信 。管道和共享内存的组合:管道和共享内存可以组合使用,例如使用管道将数据写入共享内存中,然后其他进程可以从共享内存中读取数据 。套接字():套接字是一种更为通用的进程间通信方式,可以在不同主机之间传递数据 。可以使用套接字函数如()、bind()、()和()等来实现进程间通信 。
需要注意的是,多进程和多线程之间的同步和通信往往比较复杂,需要结合具体的场景来选择合适的同步和通信方式,并注意避免死锁、竞争条件等问题 。
4、进程线程的状态转换图 。什么时候阻塞,什么时候就绪?
推荐博客地址:进程的状态转换 - LRH呀 - 博客园 ()
5、父进程、子进程的关系以及区别?
父进程和子进程之间的关系主要体现在子进程是由父进程通过操作系统提供的fork函数创建的 。在fork函数调用后,父进程会复制自己的内存空间和文件描述符等信息给子进程,使得子进程获得与父进程相似的运行环境 。
以下是父进程和子进程之间的区别:
ID:子进程有一个新的进程ID,而父进程的进程ID不同于子进程的进程ID 。内存空间:子进程拥有独立的内存空间,与父进程的内存空间不完全相同 。子进程的内存空间是父进程内存空间的一个副本,当父进程修改了某个内存地址上的数据后,子进程在同样的内存地址上的数据也会发生改变 。文件描述符:子进程继承了父进程的文件描述符,可以访问相同的文件 。状态和优先级:子进程继承了父进程的状态、优先级和信号屏蔽字等信息 。资源:子进程继承了父进程的资源,如打开的文件、信号量等 。父子进程之间是独立的,互相不共享代码段和数据段 。
补充说明:Linux 系统创建的第 1 个进程叫 init 进程,它是所有进程的祖宗,此进程pid为1 。有时候父子进程之间会出现,父进程运行结束了,在内存中销毁了 。而子进程还没运行结束,此时,linux会把子进程挂在linux中的init进程下 。
6、什么是进程上下文、中断上下文?
进程上下文和中断上下文是指在操作系统中执行程序时,处理器所维护的两个不同的执行环境 。
进程上下文:是在进程中执行的程序的上下文环境 。在进程上下文中,处理器保存了程序运行时的所有状态信息,包括程序计数器、寄存器、堆栈指针、内存映射等 。当一个进程被调度器调度时,操作系统会将进程的上下文保存到进程控制块(PCB)中,然后加载到内存中的适当位置,以便处理器可以正确地执行该进程 。