嵌入式总结8

嵌入式Linux多任务:进程、线程
硬件条件:单个CPU单个核
单任务:一个任务执行完毕之后下个任务才能执行;
多任务:任务的执行可以被中断,中断之后可以执行其他任务;(并发/并行)
单核CPU:并发
多核的CPU:并发、并行

进程实现多任务;特点:给每个进程分配独立的地址空间,4G的大小!(1G内核,3G用户空间:堆、栈、数据段、代码段);互不干扰;
进程创建方式:fork>exec函数族>system>vfork;
进程的退出:exit()库函数/清理缓冲 _exit()系统调用API/不清理缓冲;
进程等待:wait();解决:僵尸进程

<僵尸进程、孤儿进程、守护进程、控制台进程、后台进程>
学习目标:学会创建多任务程序:进程

进程间通信(IPC)

广义上的进程间通信:
A进程------文件------B进程
A进程------数据库------B进程

狭义上的真正的“进程间通信”方式:
管道、信号、消息队列、共享内存、信号量、套接字

管道

无名管道:内核会开辟一个“管道”,通信的进程通过共享这个管道,从而实现通信。

int pipe(int pipefd[2]);

特点:
管道只允许具有血缘关系的进程间通信,如子父进程间的通信;
管道只允许单向通信;
读管道时,如果没有数据的话,读操作会休眠(阻塞),写数据时,缓冲区写满会休眠(堵塞);

有名管道:

int mkfifo(const char *pathname,mode_t mode);

使用步骤:
进程调用mkfifo创建有名管道
open打开有名管道
read/write读写管道进行通信

特点:
任意两个进程通信
使用一个“有名管道”是无法实现双向通信的,因为也涉及到抢数据的问题

消息队列

消息的组成:
1)消息编号:识别消息用
2)消息正文:真正的信息内容

struct msgbuf
{
    long mtype;   /*放消息编号,必须>0*/
    char mtext[msgsz];/*消息内容(消息正文)*/
};

使用步骤:
使用msqID函数创建新的消息队列、或者获取已存在的某个消息队列,并返回唯一标识消息队列的标识符(msqID),后续收发消息就是使用这个标识符来实现的。
发送消息:(a)进程先封装一个消息包(b)调用相应的API发送消息
接收消息:调用API接收消息时,必须传递两个重要消息(a)消息队列标识符(b)你要接收消息的编号
使用msgctl函数,利用消息队列标识符删除消息队列

消息队列API

int msgget(ket_t key,int msgflg);
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
int msgctl(int msqid,int cmd,struct msqid_ds *buf);

特点:
传送有格式的消息流
多进程网状交叉通信时,消息队列是上上之选
能实现大规模数据的通信

共享内存

使用步骤:
进程调用shmget函数创建新的或获取已有共享内存
进程调用shmat函数,将物理内存映射到自己的进程空间
shmdt函数,取消映射
调用shmctl函数释放开辟的那片物理内存空间

共享API

int shmget(key_t key,size_t size,int shmflg);
void *shmat(int shmid,const void *shmadder,int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid,int cmd,struct shmid_ds *buf);

共享内存的特点:

减少进入内核空间的次数
直接使用地址来读写缓存时,效率会更高,适用于大数据量的通信

信号量

当多个进程/线程进行共享操作时,用于资源保护,以防止出现相互干扰的情况

资源保护的操作:

互斥:对于互斥操作来说,多进程共享操作时,多个进程间不关心谁先操作、谁后操作的先后顺序问题,它们只关心一件事,那就是我在操作时别人不能操作。
同步:多个共享操作时,进程必须要有统一操作的步骤,按照一定的顺序来操作
解决办法:加锁

信号量API:

int semget(key_t key,int nsms,int semflg);
int semctl(int semid,int semnum,int cmd,...);
int semop(int semid,struct sembuf *sops,unsigned nsops);

信号量实现进程同步:
有多少个进程需要同步,我们在集合中就需要创建对应数量的信号量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值