
操作系统
文章平均质量分 53
Iovems
这个作者很懒,什么都没留下…
展开
-
1.文件IO-printf函数
Linux中printf函数的底层实现printf ,是C语言库函数,它的实现依赖于操作系统;在 linux 中,printf 的实现,实际上间接的调用了 linux 的系统调用接口,这类似于 windows api。那么 printf 调用了 linux 的哪个系统调用呢?我们来扒一扒源码(linux 0.11,为什么用这么老的版本,因为我们都是初学者,完不起太高大上的几百万行的linux 2....原创 2018-06-12 16:18:40 · 1934 阅读 · 1 评论 -
17.进程-无名管道
无名管道适合有亲缘关系的进程(通常是父子进程)间通信了;实际上,你或多或少的都用过管道这种通信方式,比如你在使用的 linux 命令中的管道连接符 |;什么是管道之前提到过的,使用本地文件进行进程间通信的方式,那么就可以把管道理解成位于进程的内核空间的“文件”;给文件加引号,是因为它和文件确实很像,因为它也有描述符。但是它确实又不是普通的本地文件,而是一种抽象的存在;当进程使用 pipe 函数,就...原创 2018-07-07 18:48:58 · 388 阅读 · 0 评论 -
16.进程-进程间通信概述
进程间通信,也就是大家常说的 IPC(Inter Process Communication),指的是不同的进程间进行交流,本质上就是进程之间发送和接收数据;本质上,信号也是属于进程间通信的一种,但信号能传递的信息量实在是太少太少了;不同进程间的进程空间是独立的。对于Linux 来说,进程的 0-3GB 空间是互不相干的,3GB-4GB 是内核空间,属于所有进程间共享地带;进程空间的独立性,以及内...原创 2018-07-07 16:47:05 · 598 阅读 · 0 评论 -
15.进程-孤儿进程与僵尸进程
正常情况下,子进程是通过父进程创建的,子进程再创建新的进程;子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束;当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态;孤儿进程:父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程;孤儿进程将被init进程(进程号为1)所收养,并由ini...原创 2018-07-07 15:11:42 · 259 阅读 · 0 评论 -
14.进程-fork函数与文件共享
提个问题:如果进程在fork之前打开了一些文件,那么 fork 完之后,这些文件的描述符是共享的,还是不共享的?父进程和子进程的空间是隔离的,所以,打开的文件也应该是不共享的吧?答案是NO;假设现在是Linux32位系统,进程空间有4G的大小;这4G空间并不是完全隔离的;实际上进程空间被分割为用户空间和内核空间。对于32 位 Linux 来说,从 0-3GB 的空间是用户空间,从 3GB - 4G...原创 2018-07-07 13:44:00 · 317 阅读 · 0 评论 -
操作系统(总结)
概述操作系统基本特征并发与并行并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令;并行需要硬件支持,如多流水线或者多处理器;操作系统通过引入进程和线程,使得程序能够并发运行;共享共享是指系统中的资源可以被多个并发进程共同使用;有两种共享方式:互斥共享和同时共享;互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需...原创 2018-08-13 08:48:32 · 1666 阅读 · 0 评论 -
13.进程-fork函数的原理和进程空间
进程空间这里说的进程空间,指的是进程虚拟地址空间;每个进程都有自己的4GB 虚拟地址空间,这里指的是32位系统下的进程;每个进程的进程虚拟地址空间是相互隔离的,互不影响;...原创 2018-06-29 22:44:04 · 377 阅读 · 0 评论 -
12.进程-进程的产生(fork函数)
上篇文章中的a.out进程实际上是由终端 bash 进程创造出来的;那 bash 进程的父进程又是谁呢?如果你不断追溯下去,你就会发现,最终的那个进程就是 pid 为1 的 init 进程,而 init 进程,又是由一个 pid 为 0 的进程通过系统调用 fork 生成的,它也是第一个由 fork 函数创造出来的进程;fork 是用户创建进程的唯一方法(万事都有特例,现阶段可忽略);fork函数...原创 2018-06-29 22:27:17 · 424 阅读 · 0 评论 -
11.进程-基础
当你编译完一段代码生成 a.out 后,在命令行键入 ./a.out,这时候,就有一个(或多个)新的进程产生了(前提你的 a.out 没问题^_^).在此之前,a.out 文件只是一份保存在你硬盘上的死物而已,它并不是进程。一旦你在你的终端里键入./a.out,你的终端 shell(它也是个进程,一个活物) 就会把 a.out 文件读到内存,一旦把控制权交给内存中的这段 a.out (称之为内存映...原创 2018-06-13 10:47:16 · 1157 阅读 · 0 评论 -
10.文件与目录- st_mode 与 chmod 函数
st_mode 与 chmod 函数原创 2018-06-12 22:03:54 · 933 阅读 · 0 评论 -
9.文件与目录-Linux中的时间
Linux中的时间原创 2018-06-12 22:03:14 · 718 阅读 · 0 评论 -
8.文件与目录-stat函数及结构体
stat函数及结构体原创 2018-06-12 22:02:10 · 815 阅读 · 0 评论 -
7.文件与目录-ext2文件系统及实验
ext2文件系统及实验原创 2018-06-12 22:00:42 · 924 阅读 · 0 评论 -
6.文件与目录-文件系统初探
文件系统初探原创 2018-06-12 21:59:37 · 1030 阅读 · 0 评论 -
5.文件IO-fcntl函数(修改文件表的 f_flags 标志)
阻塞与非阻塞是文件本身的属性;每个文件描述符是数组的一个索引,这个数组每个元素保存了一个指向文件表的指针;这个文件表的结构如下:原创 2018-06-12 21:58:38 · 1056 阅读 · 0 评论 -
4.文件IO-阻塞与非阻塞IO
通常来说,从普通文件读数据,无论你是采用 fscanf,fgets 也好,read 也好,一定会在有限的时间内返回;但是如果你从设备,比如终端(标准输入设备)读数据,只要没有遇到换行符('\n'),read 一定会“堵”在那而不返回;还有比如从网络读数据,如果网络一直没有数据到来,read 函数也会一直堵在那而不返回;read的这种行为,称之为block,一旦发生block,本进程将会被操作系统设置为睡眠,直到等待的事件发生(比如有数据到来),进程才会被唤醒;系统调用 write 同样有可能原创 2018-06-12 21:57:41 · 1187 阅读 · 0 评论 -
3.文件IO-文件描述符,文件表与lseek
文件描述符在上一篇博客当中,我们知道open函数会返回一个整数,它在本进程中唯一标识了一个文件;在一个进程中,存在着一个大数组,记录了打开的文件;这个数组的索引就是open函数返回的整数,而这个索引就是文件描述符;而这个数组的每一项,都记录了与打开的文件相关的信息;在操作系统当中,是通过进程控制块(PCB)来描述进程信息和相关资源的;实际上在Linux中,PCB就是一个巨大的结构体,即task_s...原创 2018-06-12 21:45:53 · 1023 阅读 · 0 评论 -
2.文件IO-read/write/open函数
用Linux接口实现文件拷贝#define BUFFERSIZE 4096int main(int argc, char* argv[]) { int srcfd = open(argv[1], O_RDONLY); // 用只读的方式打开一个已经存在的文件 //创建一个新的文件,这个文件只能写,权限是 0666 int dstfd = open(argv[2], O_CREAT ...原创 2018-06-12 16:56:07 · 1385 阅读 · 0 评论 -
18.进程-有名管道
有名管道打破了无名管道的限制,进化出了一个实实在在的 FIFO 类型的文件。这意味着即使没有亲缘关系的进程也可以互相通信了。所以,只要不同的进程打开 FIFO 文件,往此文件读写数据,就可以达到通信的目的;不过 FIFO 文件与我们最开始讲的本地文件通信还是有着本质的区别,它长着普通文件的脑袋,却有着无名管道的基因;FIFO文件的特性文件属性前面标注的文件类型是 p,代表管道文件大小是 0fifo...原创 2018-07-07 19:07:32 · 551 阅读 · 0 评论