总结:IO进程

IO部分:

1.标准IO: 概念、特点、函数(fopen/freopen、fclose、fgetc/fputc、fgets/fputs、fread/fwrite、rewind/fseek/ftell)

练习:cat、wc -l、head、计算时间、cp

2.文件IO:概念、特点、函数(open、close、read、write、lseek)

练习:cp

3.文件属性获取:stat

4.目录操作: opendir、closedir、readdir、chdir

进程部分:

1.进程基础: 进程和程序的区别、特点、三个段、分类、状态、函数(fork、wait/waitpid、exit/_exit、getpid/getppid、exec函数组)、守护进程(特点、步骤)

练习: 父子进程实现cp

2.线程基础:和进程的区别、函数(pthread_create、pthread_join/pthread_detach、pthread_exit)、同步(信号量、函数sem_init/sem_wait/sem_post)、互斥(互斥锁、函数pthread_mutex_init/pthread_mutex_lock/pthread_mutex_unlock/phtread_mutex_destroy)、条件变量(和互斥锁搭配实现同步、函数pthread_cond_init/pthread_cond_wait/pthread_cond_signal/pthread_cond_destroy)

3.进程间通信:

无名管道:特点、pipe、步骤

有名管道:特点、mkfifo、步骤

信号:特点(异步)、信号处理方式、函数

共享内存:特点、步骤、函数

信号灯集:特点、步骤、函数

消息队列:特点、步骤、函数

面试题

  1. 标准IO和文件IO的区别是什么?
  2. 什么是库,静态库和动态库的区别?
  3. 什么是孤儿进程?什么是僵尸进程?
  4. 什么是守护进程?创建步骤?
  5. 进程和线程的区别?
  6. 线程的同步和互斥,怎么实现?什么是异步?什么是阻塞? 什么是非阻塞?
  7. 进程间通讯方式有哪些,分别描述一下?效率最高是哪种?
  8. 无名管道和有名管道的区别?

1.标准IO和文件IO的区别是什么? 

标准IO

文件IO

  1. 有缓冲机制
  2. 围绕流进行操作,FILE*
  3. 默认打开三个流:stdin/stdout/stderr
  4. 只能操作普通文件
  5. 程序可移植性较强
  1. 没有缓冲机制
  2. 围绕文件描述符进行操作,非负整数
  3. 默认打开三个文件描述符:0/1/2
  4. 可以操作除了目录以外其他类型文件
  5. 程序可移植性较弱

2. 什么是库,静态库和动态库的区别?

  • 库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。
  • 区别:

静态库:编译阶段,体积大,移植性好,升级麻烦,以.a结尾。

动态库: 运行阶段加载代码,体积小,移植性差,升级简单,以.so结尾。

3. 什么是孤儿进程?什么是僵尸进程?

 若父进程先结束,子进程成为孤儿进程,被init进程收养,子进程变成后台进程。

若子进程先结束,父进程如果没有及时回收资源,子进程变成僵尸进程(要避免僵尸进程产生)

4.什么是守护进程?创建步骤?

  • 守护进程?

守护进程是后台进程;

生命周期比较长,从系统启动时开启,系统关闭时结束;

它是脱离控制终端且周期执行的进程。

  • 步骤

1) 创建子进程,父进程退出,让子进程变成孤儿进程,成为后台进程: fork()

2) 在子进程中创建新会话:setsid()

3) 改变进程运行路径为根目录: chdir("/")

4) 重设文件权限掩码: umask(0)

5) 关闭文件描述符:close(

5.进程和线程的区别?

相同点

都为操作系统提供了并发执行能力

不同点:

调度和资源:线程是系统调度的最小单位; 进程是资源分配的最小单位

地址空间方面:同一个进程创建的多个线程共享该进程的资源;进程的地址空间相互独立

通信方面:线程通信相对简单,只需要通过全局变量可以实现,但是需要考虑临界资源访问的问题;进程通信比较复杂,需要借助进程间的通信机制(借助3g-4g内核空间)

安全性方面:线程安全性差一些,当进程结束时会导致所有线程退出;进程相对安全

6.线程的同步和互斥,怎么实现?什么是异步?什么是阻塞? 什么是非阻塞?

  • 什么是同步?什么是互斥?

同步: 指的是多个任务(线程)按照约定的顺序相互配合完成一件事情

互斥:多个线程在访问临界资源时,同一时间只能一个线程访问

  • 同步用什么实现? 接口哪些以及什么功能?

信号量:

sem_init: 信号量初始化

sem_wait: 申请资源,P操作, 如果没有资源可以用, 阻塞,-1

sem_post: 释放资源,V操作, 非阻塞 +1

  • 互斥用什么实现? 接口哪些以及什么功能?
互斥锁:

pthread_mutex_init 初始化

pthread_mutex_lock 上锁

pthread_mutex_unlock 解锁

pthread_mutex_destroy 销毁

  • 什么是阻塞和非阻塞?
阻塞(blocking)、非阻塞(non-blocking):可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,在等待的过程中可以做其它事情。否则就可以理解为非阻塞。

7.进程间通讯方式有哪些,分别描述一下?效率最高是哪种?

无名管道

  1. 只能用于具有亲缘关系的进程之间的通信
  2. 半双工的通信模式,具有固定的读端fd[0]和写端fd[1]。
  3. 管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。
  4. 管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符 fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

有名管道

  1. 有名管道可以使互不相关的两个进程互相通信。
  2. 有名管道可以通过路径名来指出,并且在文件系统中可见,但内容存放在内存中。但是读写数据不会存在文件中,而是在管道中。
  3. 进程通过文件IO来操作有名管道。
  4. 有名管道遵循先进先出规则
  5. 不支持如lseek() 操作

信号

        1.信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式

        2.信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

        3.如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

共享内存

        1.共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。

        2.为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程

将其映射到自己的私有地址空间。进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。

        3.由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等

信号灯集

信号灯(semaphore),也叫信号量,信号灯集是一个信号灯的集合。它是不同进程间或一个给定进程内部不同线程间同步的机制;

而Posix信号灯指的是单个计数信号灯:无名信号灯、有名信号灯。(咱们学的是无名信号灯)

System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。

通过信号灯集实现共享内存的同步操作

消息队列

消息队列是IPC对象(活动在内核级别的一种进程间通信的工具)的一种

一个消息队列由一个标识符 (即队列ID)来标识

消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等

消息队列可以按照类型(自己设一个值作为类型)来发送/接收消息

效率最高的为共享内存

8.无名管道和有名管道的区别?

无名管道

有名管道

使用场景

具有亲缘关系的进程间

不相干的进程可以通信

特点

半双工通信方式

固定的读端fd[0]和写端fd[1]

可以看作一种特殊的文件,通过文件IO进行操作

在文件系统中会存在管道文件,数据存放在内核空间

通过文件IO进程操作

不支持定位操作,遵循队列原则先进先出

函数

pipe()

直接read/write

mkfifo()

先打开open,然后read/write

读写特性

当管道中无数据读阻塞

当管道中写满数据时写阻塞

关闭读端往管道中写会导致管道破裂

以只读方式打开打开阻塞,直到另一个进程把写打开

以只写方式打开打开阻塞,直到另一个进程把读打开

可读可写的方式打开,如果没数据读阻塞

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值