全网最全嵌入式面经 < 2/30 >--进程、线程基础概念(二)(持续更新中,C/C++开发也可参考)

时间:2024-05-23 09:12:05

##本人是2020年毕业于广东工业大学研究生:CVTE许乔丹,签约CVTE嵌入式岗位,分享本人整理的嵌入式面经,整理不易,希望能帮助更多人。需要咨询或者内推CVTE,可加微信fighting19941203####等不及更新的童鞋可以看我目录自行百度,觉得有帮助,麻烦评论下或者点个赞????????##

1.1 进程线程的基本概念(本文讲1.1.4-1.1.6)

1.1.1什么是进程,线程,彼此有什么区别⭐⭐⭐⭐⭐
1.1.2多进程、多线程的优缺点⭐⭐⭐⭐
1.1.3什么时候用进程,什么时候用线程⭐⭐⭐

1.1.4多进程、多线程同步(通讯)的方法⭐⭐⭐⭐
1.1.5进程的空间模型⭐⭐⭐
1.1.6一个进程可以创建多少线程,和什么有关⭐⭐

1.1.7进程线程的状态转换图 什么时候阻塞,什么时候就绪⭐⭐
1.1.8父进程、子进程的关系以及区别⭐⭐⭐⭐⭐
1.1.9什么是进程上下文、中断上下文⭐⭐
*
1.2 并发,同步,异步,互斥,阻塞,非阻塞的理解
1.2.1并发,同步,异步,互斥,阻塞,非阻塞的理解⭐⭐⭐⭐⭐
1.2.2什么是线程同步和互斥⭐⭐⭐⭐⭐
1.2.3线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐

1.3 孤儿进程、僵尸进程、守护进程的概念
1.3.1 基本概念 ⭐⭐
1.3.2 如何创建守护进程:⭐⭐
1.3.3 正确处理孤儿进程、僵尸进程的方法⭐⭐⭐⭐⭐
*

1.1.4 多进程、多线程同步(通讯)的方法

:当我们在使用系统编程时,就会遇到多进程、多线程编程,所以必须知道在多个进程、多个线程之间都有什么常见的通讯机制,这也是嵌入式面试中高频问题之一。

进程间通讯:
(1)管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket

注意:临界区则是一种概念,指的是访问公共资源的程序片段,并不是一种通信方式。

线程通讯:

(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁
提问:互斥锁与信号量的区别?
:互斥锁用于线程的互斥,信号量用于线程的同步。这是互斥锁和信号量的根本区别,也就是互斥和同步之间的区别。同时互斥锁的作用域仅仅在于线程,信号量可以作用于线程和进程。

1.1.5 进程的空间模型

解析:32位系统中,当系统运行一个程序,就会创建一个进程,系统为其分配4G的虚拟地址空间,其中0-3G是用户空间,3-4G是内核空间,具体如图1-2,内核空间是受保护的,用户不能对该空间进行读写操作,否则可能出现段错误。其中栈空间有向下的箭头,代表数据地址增加的空间是往下的,新的数据的地址的值反而更小,堆空间则是往上。
全网最全嵌入式面经 < 2/30 >--进程、线程基础概念(二)(持续更新中,C/C++开发也可参考)
图1-2 Linux内核空间模型
1)栈区:由编译器自动分配和释放,存放函数的参数值(形参)、局部变量(int a =1;还有指针变量)等,其操作方式类似于数据结构中的栈,先进后出。

2)堆区:一般由程序员分配和释放,若程序员不释放,可能会造成内存泄漏,程序结束的时候可能由操作系统回收,注意它与数据结构中的堆是两回事,分配方式类似于链表。

3)全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss),程序结束后系统释放。

4)文字常量区:常量字符串放在这里,程序结束后有系统释放。

5)程序代码区(.text):存放函数体的二进制代码。

栈的空间有限,堆是很大的*存储区,程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也是在栈上进行。

注意:64位操作系统下的虚拟内存空间大小:地址空间大小不是232,也不是264,而一般是248。因为并不需要264那么大的寻址空间,过大的空间只会造成资源的浪费。所以64位Linux一般使用48位表示虚拟空间地址,40位标识物理地址。0x0000000000000000~0x00007fffffffffff表示用户空间, 0xFFFF800000000000~ 0xFFFFFFFFFFFFFFFF表示内核空间,共提供256TB(2^48)的寻址空间。

1.1.6 一个进程可以创建多少线程,和什么有关

:一个进程创建线程的个数由虚拟内存和分配给线程的调用栈大小决定。
解析
由1.1.5小节我们已经知道创建一个进程,系统会分配4G的虚拟内存,其中1G是内核空间,只有3G是用户空间,也就是我们可以利用来创建线程的空间大小,一个线程的栈的大小可以通过ulimit -s指令来查看,一般大多是8M-10M。

举个例子,这里不放假设我们创建一个线程的栈需要占用10M内存,因此在3G的空间大概可以创建300个线程。此时如果将线程栈大小增加到20M,那么个数就将减少。