初识嵌入式系列之进程与线程(三)

姓名:张硕 学院:电子工程学院 学号:19020100006

转自:https://blog.csdn.net/qq_46413242/article/details/104597045

嵌牛导读:本文主要介绍了嵌入式系统的多任务与单任务

嵌牛鼻子:嵌入式、Linux系统

嵌牛提问:如何使用有名管道?

嵌牛正文:

嵌入式Linux多任务:进程、线程

硬件条件:单个CPU单个核

单任务:一个任务执行完毕之后下个任务才能执行;

多任务:任务的执行可以被中断,中断之后可以执行其他任务;(并发/并行)

单核CPU:并发

多核的CPU:并发,并行

进程实现多任务;特点:给每个进程分配独立的地址空间,4G的大小! (1G内核, 3G用户空间:栈、堆、数据段、代码段) ;互环干扰

进程创建方式: fork > exec函数族> system > vfork;

进程的退出: exit()库函数/清理缓冲exit()系统调用API/不清理缓冲;

进程等待: wait(;解决:僵尸进程

<僵尸进程、孤儿进程、守护进程、控制台进程,后台进程>

学习目标:学会创建多任务程序:进程

一、嵌入式Linux多任务:进程、线程

1、

(1)单任务与多任务区别(前提:硬件条件:单个CPU单个核)

1)单任务:一个任务执行完毕之后下个任务才能执行;

2)多任务:任务的执行可以被中断,中断之后可以执行其他任务(并发/并行)。

(2)并发与并行区别

1)并发:指多个任务同时被触发(不一定同时执行);

2)并行:指多个任务同时进行。

(3)单核CPU与多核CPU区别

1)单核CPU:并发;

2)多核CPU:既存在并发,也存在并行。

2、

(1)进程:实现多任务

(2)特点

1)给每个进程分配独立的地址空间,4G大小(1G内核,3G用户空间:栈、堆、数据段、代码段);

2)互不干扰。

3、进程创建方式:fork>exec函数族 >system>vfork(按使用频率排序)

4、进程的退出:exit()、_exit()

(1)exit()与_exit()区别:

1)exit()是C语言提供的库函数,_exit()是系统调用API;

2)exit()清理缓冲,_exit()不清理缓冲。

5、进程等待:wait()

解决:僵尸进程

6、Linux下特殊进程:僵尸进程、孤儿进程、守护进程、控制台进程和后台进程

二、进程间通信(IPC)

1、广义上的进程间通信:通过文件、内存或数据库进行父子进程间的数据传输。

普通文件:

2、狭义上的真正的“进程间通信”(由内核提供的方法:内核作为中转池)

(1)管道

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

定义:int pipe(int pipefd[2]);

特点:

管道只允许具有血缘关系的进程间通信,如父子进程间的通信;

管道只允许单向通信;

读管道时,如果没有数据的话,读操作会休眠(阻塞),写数据时,缓冲区写满会休眠(阻塞)。

2)有名管道

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

使用步骤:

进程调用mkfifo创建有名管道;

open打开有名管道;

read/write读写管道进行通信。

特点:

任意两个进程通信;

使用一个“有名管道”是无法实现双向通信的,因为也涉及到抢数据的问题。

实现双向通信:创建两个管道,一个管道用来读,一个管道用来写

(2)消息队列:由内核创建的用于存放消息的链表。

1)消息组成:

消息编号:识别消息用;

消息正文:真正的信息内容。

2)使用步骤:

使用msgget函数创建新的消息队列、或者获取已存在的某个消息队列,并返回唯一标识消息队列的标识符,后续收发消息就是使用这个标识符来实现的;

收发消息;

使用msgctl函数,利用消息队列标识符删除消息队列。

3)消息队列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);

4)特点:

传送有格式的消息流;

多进程网状交叉通信时,消息队列是上上之选;

能实现大规模数据的通信。

(3)共享内存:让同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新。

1)使用步骤:

进程调用shmget函数创建新的或获取已有共享内存;

进程调用shmat函数,将物理内存映射到自己的进程空间;

shmdt函数,取消映射;

调用shmctl函数释放开辟的物理内存空间。

2)共享内存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);

3)特点:

减少进入内核空间的次数;

直接使用地址来读写缓存时,效率会更高,适用于大数据量的通信。

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

1)资源保护的操作:

互斥:多进程共享操作时,多个进程间不关心谁先操作、谁后操作的先后顺序问题,只关心一件事,即我操作时别人不能操作;

同步:多个共享操作时,进程必须要有同一操作的步调,按照一定顺序操作;

解决方法:加锁。

2)使用步骤:

进程调用semget函数创建新的信号量集合,或者获取已有的信号量集合;

调用semctl函数给集合中的每个信号量设置初始值;

调用semop函数,对集合中的信号量进行pv操作(加锁解锁);

调用semctl删除信号量集合。

3)信号量API:

int semget(key_t key, int nsems, int semflg);

int semctl(int semid, int semnum, int cmd, …);

int semop(int semid, struct sembuf *sops, unsigned nsops);

4)pv操作:

p操作(加锁):对信号量的值进行-1,如果信号量的值为0,p操作就会阻塞;

v操作(解锁):对信号量的值进行+1,v操作不存在阻塞问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容