Advertisement

嵌入式课堂笔记7

阅读量:

表头文件:#include <stdio.h>
声明函数:
int fprintf(FILE *stream, const char *format, ...);
函数说明:
fprintf()会根据指定格式字符串进行数据转换与格式化输出,并将结果写入到stream所指的文件中,在遇到字符串结束符(‘\0’)之前完成操作。
返回值:
若输出成功,则返回实际输出的字符数;若失败则返回-1,并将错误信息将被存储于errno变量中。

一个具有独立功能的任务被依次执行的过程也是系统资源分配的基本单位
一个过程由放置于磁盘中的可执行文件定义
指的是该可执行文件在其运行时的状态描述
一个过程代表系统的动态行为而一个程序则是系统中固定不变的功能实体
通常进程中不可在计算机之间迁移;而相应的存储位置则可以被重新利用
每个过程中包含一组特定的任务描述相关的数据存储以及控制块(即该过程的状态信息)
每个过程中包含一组特定的任务描述相关的数据存储以及控制块(即该过程的状态信息)
通过多次运行单个可执行文件可以生成多个不同的状态描述从而形成多个不同的操作系统环境
每个操作系统环境都由其独特的任务集数据集以及相应的控制参数所决定

在这里插入图片描述
在这里插入图片描述

过程生命周期如下:
生成阶段:每一个过程都源自其父过程;一个过程有能力生成子过程中另一个过程;而这个子过程又能生成自己的子过程中;
运行阶段:系统允许多个独立的过程同时运行;
终止阶段:任何一个过程都可以主动选择退出系统;
关于系统的运行状态:
执行中:该过程占用所有可用CPU资源;
完成前准备就绪:该过程已具备所有必要条件并处于等待获取时间片分配的状态;
等待中:该过程无法获得任何CPU资源用于执行当前任务;

在这里插入图片描述

Linux操作系统是一个支持多线程处理的系统

Process ID: 表示一个过程的独特数字。
Parent Process ID:
User ID:

进程互斥称为一种同步机制,在多线程或多处理器系统中被广泛应用。其基本原理是当多个进程同时请求共享资源时,则须遵循严格的时间优先顺序进行访问:任何一个时刻只有一个进程能够独占该资源;其余试图使用该资源的进程则需排队等待直至当前使用者释放该资源为止

关键资源
在操作系统中,在一个时间段内仅限一个进程同时使用的资源被称为关键资源。
关键区
当进程访问关键资源时所涉及的那段代码统称为关键区。
为了实现对关键 resource 的互斥访问,
必须确保各进程互斥地进入各自的关键区域。

并发行为
一组并发行为按照特定顺序依次完成的行为过程被称为同步行为。若具备同步关联的一组并发行为被定义为协作行为,则协作行为之间相互传递的信息即为消息或事件。
作业调度
根据预定算法从待执行作业中选择一个赋予CPU使用以实现资源的有效利用。
调度策略:可抢占(响应时间片),不可抢占(优先级驱动)

调度算法:
基于先 come, 先 serve原则的作业调度方法
采用短进程优先策略的资源分配方案
以高优先级任务为焦点的任务处理机制
基于时间片轮转的时间分配方式

死锁
由于多个进程在争夺资源而形成了某种僵局,在没有外部干预的情况下,这些进程将无法继续前进

获取本机ID

#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t pid; //此时仅有一个进程
pid=fork(); //此时已经有两个进程在同时运行
if(pid<0)
printf(“error in fork!”);
ese if(pid == 0)
printf(“I am the child process,ID is %d\n”,getpid());
else
printf(“I am the parent process,ID is %d\n”,getpid());
}
在pid=fork()之前,只有一个进程在执行,但在这条件语句执行之后,就变成两个进程在执行了,这两个进程的共享代码段,将要执行下一条语句都是if(pid==0)。
两个进程中,原来就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同

int main(void)
{
变量pid类型为pid_t;
计数器变量count初始化为0;
通过调用fork函数获取父进程与子进程的区分标识符;
if(标识符等于零)
{
计数器变量自增一次;
打印计数值;
}
else if(标识符大于零)
{
计数器变量自增一次;
打印计数值;
}
返回零;
}

#include<sys/types.h>
#include<unistd.h>
pid_t vfork(void)
功能:实现子进程的创建。
函数说明:
vfork()将产生一个新的子进程,并复制父进程的数据与堆栈空间等资源,并继承父进程的用户代码、组代码、环境变量、已打开的文件代码、工作目录以及资源限制等信息。然而,在这种情况下(即使用fork函数),子进程中不会继承父进程中未处理的信号以及文件锁定机制(Linux系统不保证这一点)。需要注意的是,在使用fork函数时(而不是Vfork),Linux系统并不保证新产生的子进程中会比父进程中先执行或最后执行;因此,在编写程序时需特别注意可能出现的死锁或竞争条件的情况。而Vfork则能确保新产生的子进程能够立即运行并分享内存。

fork与vfork的区别如下:

  1. fork时会进行操作:将父进程中存储的数据完全复制至新创建的子进程中;而使用vfork则意味着两过程会相互共享内存内容。
  2. fork操作中两过程的执行顺序并未预先确定;而采用vfork模式时,则会先启动子过程再启动父过程。

执行函数系列:
执行函数通过替代被调用的程序来实现功能。
其与 fork 操作的主要区别在于:
fork 操作生成独立的新进程并产生新的 PID;
而 exec 函数运行相应应用程序而不影响原有进程。
包含头文件:
#include <unistd.h>
定义执行函数:
int execI(const char* path, const char* arg1, …
其中 path 表示要运行的应用程序全路径。
arg1 至 argn表示被调用的应用程序所需命令行参数。
以空指针 NULL 结束输入。

#include<sys/types.h>
#include<sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options)
功能:该函数会被当前进程阻塞一段时间,并在接收到信号或子进程完成时解除封锁

全部评论 (0)

还没有任何评论哟~