笔记 --持续更新

1、地址总线,控制总线,数据操作,用于cpu控制内存。

系统结构:

I/O桥南桥接低速,北桥接高速设备。

实际场景:当我们运行一个程序,cpu发中断信号,然后首先把程序读到内存中来。

读到内存这一步不需要cpu干预,由dma机制(直接内存存取)完成,磁盘控制器通过dma控制器接管总线从

磁盘中读数据到内存。

2.一开始没有进程的概念,有了中断之后出现分时操作系统。  任务可以轮转,故产生了进程的概念。

3.程序出错有致命性的和非致命性的。 

4.随着用户登录都会有一个用户id和组id,用来检查权限是否合格。root的id是0,看到root不进行检查直接通行。id和用户名都有文件的映射。

5.信号机制signal,当发生某种状况时时系统发送信号通知进程。

进程有三种处理方法:忽略,系统默认(多数结束该进程),提供函数处理。   

即对抛出异常的处理,产生信号多种方式。ctrl+c中断等等。

time函数可以测试出用户cpu时间和系统cpu时间

我们调用库函数,库函数再去进行系统调用,比如说malloc函数。 每一个文件夹都有一个.和..文件名标识父目录和父父目录。

6.perror和strerror的区别。

都是根据errno(整型,描述出错类型)。 perror先输出执行信息,再根据erno报错,seterror直接是后一步。

7、系统会为每个进程维护一个文件描述符表。

根据这个文件描述符可以对映射的文件进行操作,文件描述符表是进程级别的。

比如   int a=open(filename,2);  会返回3,因为每个程序打开时本身就有三个,0,1,2,标准输入输出需要的。

文件描述符维护:

指针指向:

8、Windows的文件系统采用ntfs格式。  文件系统即文件结构的组成方法,有ntfs,fat等。  各有优缺点。

https://blog.csdn.net/SouthWind0/article/details/80934257

文件系统是操作系统用于明确存储设备(磁盘、固态硬盘)上组织文件的方法。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。

9、当前文件偏移量,即即将插入字符的位置,一般用来度量从文件开始处计算的字节数。可通过lseek移动等,打开文件一般默认为0.

10、od -c 文件名可以查看文件内容(自动帮你省略一些内容),-c以字符形式显示

read和write函数:

11、

文件描述符表,文件表,v-node结构。这个图不错,文件描述符是进程中维护的,文件表项是内核维护的。

每个打开文件维护了v-node结构,包含了指向的操作函数地址,也包含了i-node(i-node包含了文件的元信息,用stat -filename可以进行查看)。

如果两个进程打开了一个文件,此时文件标识符和文件表项都是两个。 为什么会有两个文件表项,因为这两个进程对文件的偏移量可能不同。  但是文件的v节点结构是唯一的。

扩展:  一个进程修改了该文件,另一个进程会立即感知到。  这点我不理解其原理,自己的强行解释:inode的最后修改时间发生变化然后你想要修改的时候,和你这个文件的打开时间对比下(存储在文件表项)。  这点如果有理解的,敬请留言。

12、unix对文件时设置o_append标记,每次写入的时候都会从文件末尾开始。这就防止了对seek函数定位到文件末尾的脏数据。

13、延迟写即是运用了缓冲区的原理,写到队首再更新。 

14、dup函数系列即复制文件描述符,多个文件描述符指向同一个文件。所以共用一个文件偏移位置。lseek

  atoi将ascii转化成数字。

文件状态标志很秀,用二进制位标识每个状态。 所以只要进行或,与等操作就可以为文件设置标志。

15、关于sync,fsync等

向文件中写数据时,首先写进缓冲区(内存块高速缓存),然后进入写队列,然后就是写入操作。

sync即刷新缓冲区,fsync和fdatesync保证执行完该文件写操作,不然一直时阻塞状态,先刷新缓冲区中该文件相关,然后等待写操作完成。  名为update每个30s会刷新缓冲区。

所有磁盘I/O都要经过块缓冲区(告诉缓冲区)

文件类型标志:

进程间通信(IPC)媒介可表示为文件

16、

进程访问文件权限判定的过程

是root就不判了。 如果不是,若用户id所有者中包含,那就按位比较权限,可以就执行。

如果不包含,找组id,有效组和附加组,看组权限设置了没。最后看同组其他用户的权限。

17、 新文件或目录的id

可用access测试当前用户是否对某文件有权限。  access(filename,mode)

su - name 可以在linux切换用户。当前用户指的是执行这个文件的人,进程中的所有者。

chown函数系列可修改文件所属用户id,组id,但是一般系统都会对修改施加限制。

18、文件空洞的现象指的是移动指针超过文件末尾,中间的东西并没有被写入。

19、Unix文件系统:

i节点包含了文件大部分信息,没有包含i节点编号和文件名。   stat的信息基本都来自于i节点。

总结(关于什么叫文件的硬链接):https://blog.csdn.net/weixin_41033366/article/details/104593422

软链接类似于快捷方式,指向新的inode节点,这个inode节点指向的数据块存的是原来inode节点的地址。

ln -s 软连接方式。 不加s就是硬链接创建的方法。    

Ubuntu如果有一个进程正在打开文件,删除之后再保存会重新创建一个,inode节点都不一样了。

20、当前工作目录是进程的属性,起始目录是登录名带有的。

21、前面通过文件描述符进行,接下来通过流。

标准I/O库提供了缓冲机制,全缓冲,行缓冲,不缓冲(一般输出出错信息,及时输出)。

关于文件权限位:

用八进制表示,777就表示了所有用户都具有读写权限。  所以说一共有九个权限位。

22、fork子进程也复制父进程的缓冲区内容,如果没有刷新缓冲区可能写入两次。 比如说行缓冲,交互式输出直接就输出了,但是比如写进文件没有刷新的话就写两次。

原生的i/o函数不带缓冲区(read,write),printf,cout标准i/o带缓冲的。所以有时候就容易发生一些问题。

23、回忆起一点,frok之后复制的东西不是直接复制完的,是写复制的规则。  具体写的时候我再复制。

24、真正编程的时候必须注意,fork之后复制文件描述符,指向统一文件表项。 所以父子进程的文件表项变化都会相互影响,所以必须注意这一点。 可设置一些标志位比如每次写的时候指针自动指向最后。

25、vfork和fork,前者不开辟新的地址空间,和主进程共享,保证子进程先运行。

进程等待的情况:

26、exec函数族直接执行新程序取代进程环境,不是创建新进程,直接在当前进程这执行,执行完直接退出。

su - 用户名  切换用户

27、我们启动的终端也是程序,不同的操作系统有不同的创建方式。以BSD(伯克利的软件套件)为例,有一个init进程,创建一个exec函数init就会fork一个子进程然后这个子进程再exec终端程序。

fork两次可以处理僵尸进程的情况,可移步https://blog.csdn.net/weixin_41033366/article/details/104682732。

28、pthread创建新线程。   信号发给的目标是进程,任意一个线程可以接收到信号,只有一个线程。

目前的linux系统一般64个信号,用64位标识一位一个,信号有两种状态(成功抵达和未决即阻塞在路上了)。

多线程处理信号

每个线程都有自己的信号屏蔽字,指定线程忽略什么信号。 可以把处理信号理解为进程级别的,不能单独为某个线程设定处理函数。

扫描某个线程没有阻塞,直接处理信号。

29、多线程读取文件也可能出错,pread保证了文件偏移指针和读操作的原子性。  其实加锁也可以保证不会读到脏数据。

Linux很多守护进程负责很多功能,比如说init  1就是守护进程。

自举(bootstrap)计算机设备使用硬件加载的程序,用于初始化足够的软件来查找并加载功能完整的操作系统。也用来描述加载自举程序的过程

30、守护进程经常作为服务器进程,一直监听连接。

https://www.cnblogs.com/aspirant/p/9166944.html 。select,poll,epoll区别(搜狗面试).

差不多都是这个流程:

31、

发布了62 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41033366/article/details/104504796