linux相关知识
专栏地址:嵌入式面经地址
1:进程和线程的区别
①进程是系统资源分配的最小单位,线程是程序执行的最小单位,一个进程可以有多个线程,一个线程只属于一个进程。
②系统开销和资源共享:进程拥有自己独立的地址空间,每次启动一个进程系统会为它分配数据段、代码段、堆栈段,而线程与进程共享相同资源,仅仅拥有自己的局部变量(栈)和寄存器,共享全局变量、堆和文件等公共资源,因此cpu开销线程明显小于进程
③消息通信:线程之间的通信很方便,但要注意互斥和同步,进程间通信用到IPC,主要有FIFO,socket,管道pipe,信号量
④健壮性:多进程程序不容易崩溃,多线程程序会因为某一线程掉线而崩溃
2:进程间通信
目的:
数据传输:一个进程需要将它的数据发送给另一个进程。
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
1:管道:
一个进程通过调用管程的一个过程进入管程。在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。
(1)无名管道(内存文件):是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。
(2)有名管道(FIFO文件,借助文件系统):也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,先进先出的通信方式。
2:共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。
3:消息队列:消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号:传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4:套接字socket:适用于不同机器间进程通信,在本地也可作为两个进程通信的方式。
5:信号:用于通知接收进程某个事件已经发生,比如按下ctrl + C就是信号。
6:信号量:是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,实 现进程、线程的对临界区的同步及互斥访问。
3:线程间通信
线程间的同步方式包括互斥锁、信号量、条件锁、读写锁
①互斥锁,保证在任何时刻,都只有一个线程访问该资源,当获取锁操作失败时,线程进入阻塞,等待锁释放。
②读写锁,分为读锁和写锁,处于读操作时,可以运行多个线程同时读,但写操作同一时刻只有一个线程获得写锁。
**互斥锁和读写锁的区别:
(a)读写锁区分读锁和写锁,互斥锁不区分;
(b)互斥锁同一时刻允许一个线程访问,无论读写;读写锁同一时刻只允许一个线程写,但可以多个线程读。
③自旋锁:在任何时刻只能有一个线程访问资源,但获取锁操作失败时,不会进行睡眠,而是原地自旋,直到锁被释放。优点:节省了线程从睡眠到被唤醒的时间消耗,提高效率。
④条件锁:某一线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态,一旦条件满足,即可唤醒该线程(常与互斥锁配合使用)
⑤信号量:计数器,允许多个线程同时访问同一个资源。
4:死锁
如果一组进程中的每个进程都在等待一个事件,而这个事件只能由改组的另一个进程触发,这种情况会导致死锁。简单理解为:死锁就是两个线程同时占用两个资源,但又在彼此等待对方释放锁。产生条件:
①互斥条件:
②不剥夺条件:
③请求和保持条件:
④循环等待条件:
5:嵌入式编程,大小端问题
①大端:低位字节存放在高地址,高位字节存放在低地址
②小端:高位字节存放在高地址,低位字节存放在低地址
STM32是小端模式,从低字节->高字节开始存放,而大端模式是从高字节->低字节开始存放
6:如何对绝对地址赋值
*(unsigned int*)0x1000000 = 1234;
如何将程序跳转到指定地址执行
typedef void (*)() voidfunc;
*((voidfunc)0x1000000)();
另外一种实现:*((void(*)()0x1000000)();
#软件开发薪资爆料##晒一晒我的offer##我的实习求职记录##23届找工作求助阵地##面经#