嵌入式第八次课堂笔记

今日学习目标:
linux多任务:进程,线程
学会创建多任务程序:进程

硬件条件:单个CPU单个核
单任务:一个任务执行完毕之后下个任务才会执行
多任务:任务的执行可被中断,中断之后可以执行其他任务,可并行可并发
单核CPU:并发
多核CPU:并发并行
进程可以实现多任务:给每个进程分配独立的地址空间为4G大小,1G为内核,3G为用户空间,且互不干扰
进程创建:fork>exec函数族>system>vfork
进程退出:exit()库函数/清理缓冲
-exit()系统调用API/不清楚缓冲
进程等待:wait()
进程间通信-IPC
广义上的进程间通信:(1)A进程----文件----B进程
(2)A进程----数据库----B进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
狭义上的进程间通信:(1)管道
(2)信号
(3)消息序列
(4)共享内存
(5)信号量
(6)套接字
管道
1、无名管道:(只能用于父子之间进程通信)
(内核会开辟一个“管道”(管道文件),通信的进程通过共享这个管道,从而实现通信。)
Int pipe(int pipefd[2]); pipefd[0]----读 pipefd[1]------写
特点:管道只允许具有血缘关系的进程通信,如父子进程通信
管道只允许单向通信
读管道时:如果没有数据的话,读操作会休眠(阻塞),写数据时,缓冲区写满会休眠(阻塞)
2、有名管道:
int mkfifo(const char *pathname, mode_t mode);//系统执行后,文件会被自动清掉
参数:pathname:被创建管道文件的文件路径名。
mode:指定被创建时原始权限,一般为0664(110110100),必须包含读写权限。
返回值:成功返回0,失败则返回-1,并且errno被设置。
特点:任意两个进程通信
使用一个“有名管道”是无法实现双向通信的,因为也涉及到抢数据的问题
注意:“有名管道”这种特殊文件,只能使用mkfifo函数来创建,且为确保管道被创建,最好是两个进程都包含创建管道的代码,谁先运行就谁先创建,后运行的发现管道已经创建好了,直接open打开使用,不能以不能同时读写O_RDWR模式打开命名管道FIFO文件,否则其行为是未定义的,所以管道是单向的。

消息队列(进程较多)
消息队列本质是由内核创建的用于存放消息的链表,由于是存放消息的,所以将链表称为消息队列。
特点:传送有格式的消息流
多进程网状交叉通信时,消息队列是上上之选
能实现大规模数据的通信
消息队列组成:1)消息编号:识别消息用
2)消息正文:真正的信息内容
struct msgbuf //结构体
{
long mtype; /* 放消息编号,必须> 0 /
char mtext[msgsz]; /
消息内容(消息正文) */
};
使用msgget函数创建新的消息队列、或者获取已存在的某个消息队列,并返回唯一标识消息队列的
标识符(msqID),后续收发消息就是使用这个标识符来实现的。使用msgctl函数,利用消息队列标识符删除消息队列.
消息队列API:
int msgget(key_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);
共享内存
让同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新
步骤:进程调用shmget函数创建新的或获取已有共享内存
进程调用shmat函数,将物理内存映射到自己的进程空间
shmdt函数,取消映射
调用shmctl函数释放开辟的那片物理内存
共享内存的特点:
减少进入内核空间的次数
直接使用地址来读写缓存时,效率会更高,适用大数据量通信
共享内存API:
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值