❝所有的操作系统在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。在Linux系统使用的这样的函数叫做“系统调用”,英文是systemcall。这些函数代表了从用户空间到内核空间的一种转换。
❞
❝什么是IO,通俗来讲就是输入输出
❞
标准IO:
1.标准IO是由ANSIC标准定义
2.跨平台,可以在windows下运行,也可以在Linux下运行
3.通过缓冲机制来减少系统调用,实现更高的效率
4.文件流 标准IO用结构体类型来存放文件的相关信息,标准IO所有操作围绕着FILE来操作。
文件IO:
1.文件IO是POSIX提供的一组函数
2.只能运行在可移植操作系统中,不能跨平台
3.没有缓冲机制
4.文件描述符是一个非负整数,每打开一个文件,系统会自动分配一个文件描述符(即从系统最小的且没有被用的描述符来分配)
❝原子在化学课程中是不可再分的颗粒。而对于Linux系统来说所谓原子操作是为了确保对一个整型数据的更改具有排他性。原子操作就是要么不执行,一旦执行就会执行完成,是不可被打断的一个,或一系列的动作,即在完成任务前不会被其他事件所打断,就像原子不可被分割成颗粒一样。单处理中,可以用单条指令完成的指令可以被看成是一个原子操作。软件中的原子操作依赖于硬件原子操作的支持。当然原子操作,也可以当引用计数使用。
❞
❝所谓线程安全,就是指代码可以在多线程环境下安全地执行,输出我们想要的结果。即符合正确的逻辑,是程序员期望的正常执行结果。为了实现线程安全,Linux系统提供一些列的方法,或者只能使用局部变量或资源,或者就是利用锁等同步机制,来实现全局变量或资源的访问。
❞
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
static int nCnt = 0;
void * Thread(void * arg)
{
for (int i = 0; i < 10000; ++i)
{
++nCnt;
}
return NULL;
}
int main()
{
pthread_t t1;
pthread_t t2;
/* 创建两个线程 */
pthread_create(&t1, NULL, thread, NULL);
pthread_create(&t2, NULL, thread, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("nCnt is %d by threads\n", nCnt);
return 0;
}
大家看出上面例子的问题了吗?
nCnt
的自增操作。这个例子中输出结果和我们想要的是不一样,就是因为nCnt
执行指令并不是原子的,两个个线程对nCnt
的并发访问出现了问题。我们利用锁就可以解决此问题。❝Linux环境编程中的阻塞与非阻塞,都是指I/O操作。而所有的I/O系统调用默认都是阻塞的。那什么是阻塞? 阻塞的系统调用是指当进行系统调用时除非出错或被信号打断,那么系统调用将会一直陷入内核态直到调用完成。非阻塞的系统调用是指无论I/O操作成功与否,调用都会立刻返回。阻塞和非阻塞IO是访问设备的两种模式,驱动程序可以灵活的支持这两种用户空间对设备的访问方式。
❞
IO操作
都是将进程阻塞,直到IO操作
完成❝同步与异步,也是指I/O操作。POSIX定义如下:A synchronous I/O operation causes the requesting process to beblocked until that I/O operation completes An asynchronous I/O operation does not cause the requesting processto be blocked
❞
两者的区别就在于同步IO做IO操作
时会将进程阻塞,而异步IO做IO操作
时不会阻塞进程
当把阻塞、非阻塞、同步和异步放在一起时,难免会出现混淆。同步是否就是阻塞,异步是否就是非阻塞?实际上在I/O操作中,它们是不同的概念。同步既可以是阻塞的,也可以是非阻塞的,而常用的Linux的I/O调用实际上都是同步的。这里的同步和异步,是指I/O数据的复制工作是否同步执行。
END
→点关注,不迷路←
文章引用微信公众号"嵌入式微处理器",如有侵权,请联系管理员删除!