linux进程调用shmget(shared memory get,获取共享内存)来分配一个共享内存块。shmat(shared memory attach,绑定到共享内存)。shmctl("shared memory control",控制共享内存)函数会返回一个共享内存块的相关信息。
同时 shmctl 允许程序修改这些信息。
5)信号量。
6)套接字(socket)
三、linux调度程序理解。
1. linux使用内核函数goodness()对进程进行加权处理:
static inline goodness (struct task_struct * pint this_cpu, struct mm_struct *this_mm)
int weight;
weight=-1;
if (p->policy & sched_yield)//判断如果任务的调度策略被置为sched_yield的话,则置权值为-1,返回。
goto out;
if (p->policy==sched_other) /先对普通进程进行处理(由于多数是普通进程,这样做有利于提高系统效率)*/
weight=p->counter; /返回权值为进程的counter值*/
if (!weight)
goto out;
#ifdef config_smp
if (p->processor==this_cpu)
weight+=proc_change_penalty;
#endif
if (p->mm==this_mm||!p->mm)
weight+=1; /对进程权值进行微调,如果进程的内存空间使用当前正在运行的进程的内存空间,则权值额外加1*/
weight+=20-p->nice; /将权值加上20与进程优先级nice的差。普通进程的权值主要由counter值和nice值组成*/
goto out;
weight=1000+p->rt_priority; /对实时进程进行处理,返回权值为rt_priority+1000,确保优先级高于普通进程*/
out:return weight;}
#include<>
#include<>
int main()
int n,fd[2]; 这里的fd是文件描述符的数组,用于创建管道做准备的。
pid_t pid;
char line[100];
if(pipe(fd)<0) /创建管道。
printf("pipe create error/n");
if((pid=fork())0) /利用fork()创建新进程。
printf("fork error/n");
else if(pid>0){ 这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"
close(fd[0]);
write(fd[1],"hello word/n",11);
else{close(fd[1]);这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据。
n= read(fd[0],line,100);
write(stdout_fileno,line,n);
exit(0);
工作队列(work queue)是linux kernel中将工作推后执行的一种机制。这种机制和bh或tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。
工作队列是2.6内核开始引入的机制,在2.6.20之后,工作队列的数据结构发生了一些变化,数据结构:
structwork_struct {
unsigned longpending; pending是用来记录工作是否已经挂在队列上;
structlist_head entry; entry是循环链表结构;
void(*func)(void*);func作为函数指针,由用户实现;
void*data; data用来存储用户的私人数据,此数据即是func的参数;
void*wq_data; wq_data一般用来指向工作者线程(工作者线程参考下文);
structtimer_list timer; timer是推后执行的定时器。
工作队列(work queue)api:
1、init_work(_work, _func, _data);初始化指定工作,目的是把用户指定的函数_func及_func需要的参数_data赋给work_struct的func及data变量。
2、schedule_work(structwork_struct *work)对工作进行调度,即把给定工作的处理函数提交给缺省的工作队列和工作者线程。工作者线程本质上是一个普通的内核线程,在默认情况下,每个cpu均有一个类型为“events”的工作者线程,当调用schedule_work时,这个工作者线程会被唤醒去执行工作链表上的所有工作。
3、schedule_delayed_work(structwork_struct *work, unsigned longdelay);延迟执行工作,与schedule_work类似。
4、flush_scheduled_work(void);刷新缺省工作队列。此函数会一直等待,直到队列中的所有工作都被执行。
5、cancel_delayed_work(structwork_struct *work);并不取消任何延迟执行的工作,因此,如果要取消延迟工作,应该调用cancel_delayed_work。
针对linux内核,如下机制严重地影响了实时性。
linux实时改造后的系统实时性较好,典型代表有:
kurt-linux,red-linux,rt-linux、rtai和xenomai等。
rt-linux中的实时任务在运行过程当中总是处于以下三种状态之一:
安装rt-linux的方法和步骤。
在基于adeos的系统中,存在着a、b、c、d四种类型的交互。linux内核和xenomai分别作为adeos中的一个域存在。linux内核负责非实时任务的调度,而xenomai采用不同于linux的精度更高的定时中断来调度实时任务,实现更小的调度延时。
另外,xenomai域的优先级高于linux域。
xenomai除了在内核层利用adeos实现了硬实时外,它在用户空间也有很好的实时性。
xenomai的补丁及配置移植步骤。
rt-linux的实时内核的主要api
1)硬中断api
2)软中断api
3)内核实时线程编程api,主要有以下几个(在rtl_中声明):
4)要使用共享内存通信,需要在内核中插入模块,可以使用mubff_alloc() 和mbuff_free()函数申请和释放共享内存。
5)rt-linux提供的操作实时fifo的api主要有(在rtl_中声明):
几类常用的xenomai 的native api
1、任务管理。
2、内存堆服务。
3、信息管道服务。
嵌入式linux与嵌入式系统设计
ustc bbs embedded斑竹d j主讲。感谢hongtao chen以及networking斑竹jun zxjun的大量幕后工作!感谢james zhang以及网络中心提供聚会的场地和大力支持!欢迎访问我的主页。聚会详情如下 名称 嵌入式系统设计以及嵌入式linux展望 时间 本周星期天 ...
《嵌入式系统与开发》构建嵌入式Linux系统 实验报告
嵌入式qt编程设计 实验报告。学生姓名。学号。专业班级。指导教师。完成时间。实验4 嵌入式qt编程及使用。一。实验目的。理解qt信号和插槽机制,掌握利用qt creator进行图形软件设计的基本步骤,并掌握将编译好的可执行程序加载到嵌入式开发板并运行的方法。掌握qt应用程序操纵底层硬件设备的基本步骤...
嵌入式系统与开发》构建嵌入式Linux系统 实验报告
第三步,编译sqlite,命令为 make 编译过程中使用的编译器为 arm linux gcc 第四步,安装sqlit,命令为 make install 安装完成后到 opt sqlite 文件夹下去查看相关文件,可以看到该文件夹下有 bin include lib 和share文件夹,其中可执行...